Skip to content

Commit

Permalink
simple unit tests for FedoraFieldSearch
Browse files Browse the repository at this point in the history
  • Loading branch information
barmintor committed Mar 25, 2013
1 parent c268085 commit ea30113
Show file tree
Hide file tree
Showing 4 changed files with 187 additions and 13 deletions.
36 changes: 23 additions & 13 deletions fcrepo-http-api/src/main/java/org/fcrepo/api/FedoraFieldSearch.java
Expand Up @@ -12,6 +12,8 @@
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.ValueFactory;
import javax.jcr.query.InvalidQueryException;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
Expand Down Expand Up @@ -39,8 +41,8 @@ public class FedoraFieldSearch extends AbstractResource implements
FedoraJcrTypes {

private static final Logger logger = getLogger(FedoraFieldSearch.class);

private QueryResult queryResults = null;
private static final String QUERY_STRING = buildQueryString();

@GET
@Produces(TEXT_HTML)
Expand All @@ -57,17 +59,12 @@ public String searchSubmit(@FormParam("terms")

final Session session = repo.login();
QueryManager queryManager = session.getWorkspace().getQueryManager();
ValueFactory valueFactory = session.getValueFactory();
VelocityViewer view = new VelocityViewer();

logger.debug("Searching for " + terms);

//TODO expand to more fields
String sqlExpression = "SELECT * FROM [" + FEDORA_OBJECT + "] WHERE";
sqlExpression += " [" + DC_IDENTIFIER + "] like $sterm";
sqlExpression += " OR [" + DC_TITLE + "] like $sterm";
Query query = queryManager.createQuery(sqlExpression, JCR_SQL2);
query.bindValue("sterm", session.getValueFactory().createValue(
"%" + terms + "%"));
Query query = getQuery(queryManager, valueFactory, terms);
logger.debug("statement is " + query.getStatement());

if (offSet == null) {
Expand All @@ -82,6 +79,14 @@ public String searchSubmit(@FormParam("terms")

return view.getFieldSearch(fsr);
}

Query getQuery(QueryManager queryManager, ValueFactory valueFactory, String terms) throws InvalidQueryException, RepositoryException {
Query query = queryManager.createQuery(QUERY_STRING, JCR_SQL2);
query.bindValue("sterm", valueFactory.createValue(
"%" + terms + "%"));
logger.debug("statement is " + query.getStatement());
return query;
}

/**
* Searches the repository using JCR SQL2 queries and returns a FieldSearchResult object
Expand All @@ -97,10 +102,7 @@ public FieldSearchResult search(Query query, int offSet, int maxResults)

ImmutableList.Builder<ObjectFields> fieldObjects = builder();

//if offSet is 0, we assume it's the first query and set the queryResults
if (offSet == 0) {
queryResults = query.execute();
}
QueryResult queryResults = query.execute();

NodeIterator nodeIter = queryResults.getNodes();
int size = (int) nodeIter.getSize();
Expand Down Expand Up @@ -130,4 +132,12 @@ public FieldSearchResult search(Query query, int offSet, int maxResults)

return fsr;
}

public static String buildQueryString() {
//TODO expand to more fields
String sqlExpression = "SELECT * FROM [" + FEDORA_OBJECT + "] WHERE ["
+ DC_IDENTIFIER + "] like $sterm OR ["
+ DC_TITLE + "] like $sterm";
return sqlExpression;
}
}
@@ -0,0 +1,93 @@
package org.fcrepo.api;

import static org.fcrepo.api.TestHelpers.getQueryMock;
import static org.fcrepo.api.TestHelpers.getQuerySessionMock;
import static org.fcrepo.api.TestHelpers.getUriInfoImpl;

import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import static org.mockito.Mockito.*;

import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;
import javax.jcr.ValueFactory;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;

import org.fcrepo.jaxb.search.FieldSearchResult;
import org.fcrepo.jaxb.search.ObjectFields;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.modeshape.jcr.api.Repository;

public class FedoraFieldSearchTest {

FedoraFieldSearch testObj;

Repository mockRepo;

Session mockSession;

@Before
public void setUp(){
mockRepo = mock(Repository.class);
mockSession = getQuerySessionMock();
testObj = new FedoraFieldSearch();
try {
when(mockRepo.login()).thenReturn(mockSession);
} catch (RepositoryException e) {
e.printStackTrace();
}
testObj.setRepository(mockRepo);
}

@After
public void tearDown() {

}

@Test
public void testSearchSubmit() throws RepositoryException {
String actual = testObj.searchSubmit("foo", "1", "1");
assertTrue("actual.length = " + actual.length() + "; expected > 0", actual.length() > 0);
}

@Test
public void testGetQuery() throws RepositoryException {
QueryManager queryManager = mock(QueryManager.class);
ValueFactory valueFactory = mock(ValueFactory.class);
Value mockValue = mock(Value.class);
String terms = "foo";
Query mockQuery = mock(Query.class);
when(queryManager.createQuery(anyString(), eq(Query.JCR_SQL2))).thenReturn(mockQuery);
when(valueFactory.createValue("%" + terms + "%")).thenReturn(mockValue);
Query actual = testObj.getQuery(queryManager, valueFactory, terms);
assertNotNull(actual);
verify(queryManager).createQuery(anyString(), eq(Query.JCR_SQL2));
verify(valueFactory).createValue("%" + terms + "%");
verify(mockQuery).bindValue("sterm", mockValue);
}

@Test
public void testSearch() throws RepositoryException {
Query mockQ = getQueryMock();
NodeIterator mockNodes = mockQ.execute().getNodes();
FieldSearchResult actual = testObj.search(mockQ, 1, 1);
List<ObjectFields> oFieldsList = actual.getObjectFieldsList();
assertEquals(1, oFieldsList.size());
ObjectFields oFields = oFieldsList.get(0);
// because the mock nodeIterator doesn't respond to skip
assertEquals("node1",oFields.getPid());
// the first time, unfortunately, is at the beginning of this test to get the NodeIterator mock
verify(mockQ, times(2)).execute();
verify(mockNodes).skip(1);
}
}
57 changes: 57 additions & 0 deletions fcrepo-http-api/src/test/java/org/fcrepo/api/TestHelpers.java
@@ -1,12 +1,23 @@
package org.fcrepo.api;

import static org.mockito.Mockito.*;

import java.io.InputStream;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.UnsupportedRepositoryOperationException;
import javax.jcr.ValueFactory;
import javax.jcr.Workspace;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
import javax.ws.rs.core.PathSegment;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
Expand All @@ -16,6 +27,7 @@
import org.apache.tika.io.IOUtils;
import org.jboss.resteasy.specimpl.PathSegmentImpl;
import org.jboss.resteasy.specimpl.UriInfoImpl;
import org.modeshape.jcr.query.QueryResults;

public abstract class TestHelpers {
public static UriInfo getUriInfoImpl() {
Expand All @@ -41,4 +53,49 @@ public static List<Attachment> getStringsAsAttachments(Map<String, String> conte
}
return results;
}

public static Query getQueryMock() {
Query mockQ = mock(Query.class);
QueryResult mockResults = mock(QueryResult.class);
NodeIterator mockNodes = mock(NodeIterator.class);
when(mockNodes.getSize()).thenReturn(2L);
when(mockNodes.hasNext()).thenReturn(true, true, false);
Node node1 = mock(Node.class);
Node node2 = mock(Node.class);
try{
when(node1.getName()).thenReturn("node1");
when(node2.getName()).thenReturn("node2");
} catch (RepositoryException e){
e.printStackTrace();
}
when(mockNodes.nextNode()).thenReturn(node1, node2).thenThrow(IndexOutOfBoundsException.class);
try {
when(mockResults.getNodes()).thenReturn(mockNodes);
when(mockQ.execute()).thenReturn(mockResults);
} catch (RepositoryException e) {
e.printStackTrace();
}
return mockQ;
}

public static Session getQuerySessionMock() {
Session mock = mock(Session.class);
Workspace mockWS = mock(Workspace.class);
QueryManager mockQM = mock(QueryManager.class);
try {
Query mockQ = getQueryMock();
when(mockQM.createQuery(anyString(), anyString())).thenReturn(mockQ);
when(mockWS.getQueryManager()).thenReturn(mockQM);
} catch (RepositoryException e) {
e.printStackTrace();
}
when(mock.getWorkspace()).thenReturn(mockWS);
ValueFactory mockVF = mock(ValueFactory.class);
try {
when(mock.getValueFactory()).thenReturn(mockVF);
} catch (RepositoryException e) {
e.printStackTrace();
}
return mock;
}
}
Expand Up @@ -32,4 +32,18 @@ public void testSearchSubmit() throws Exception {
assertEquals(200, getStatus(method));

}

@Test
public void testSearchSubmitPaging() throws Exception {
final HttpPost method = new HttpPost(serverAddress + "search");
List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>();

list.add(new BasicNameValuePair("terms", ""));
list.add(new BasicNameValuePair("offset", "1"));
list.add(new BasicNameValuePair("maxResults", "1"));
final UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(list);
method.setEntity(formEntity);
assertEquals(200, getStatus(method));

}
}

0 comments on commit ea30113

Please sign in to comment.