Skip to content

Commit

Permalink
Adding basic tests and fixtures for SavedSearchService.
Browse files Browse the repository at this point in the history
Also moving out object creation from resource to service and removing
reference to implementation class.
  • Loading branch information
dennisoelkers committed Mar 18, 2015
1 parent 2cc39c7 commit 6ae60b8
Show file tree
Hide file tree
Showing 6 changed files with 137 additions and 11 deletions.
Expand Up @@ -32,7 +32,6 @@
import org.graylog2.plugin.Tools;
import org.graylog2.rest.resources.search.requests.CreateSavedSearchRequest;
import org.graylog2.savedsearches.SavedSearch;
import org.graylog2.savedsearches.SavedSearchImpl;
import org.graylog2.savedsearches.SavedSearchService;
import org.graylog2.shared.security.RestPermissions;

Expand Down Expand Up @@ -72,14 +71,7 @@ public SavedSearchesResource(Searches searches,
@Produces(MediaType.APPLICATION_JSON)
public Response create(@ApiParam(name = "JSON body", required = true)
@Valid CreateSavedSearchRequest cr) throws ValidationException {
// Create saved search
final Map<String, Object> searchData = ImmutableMap.of(
"title", cr.title(),
"query", cr.query(),
"creator_user_id", getCurrentUser().getName(),
"created_at", Tools.iso8601());

final SavedSearch search = new SavedSearchImpl(searchData);
final SavedSearch search = savedSearchService.create(cr.title(), cr.query(), getCurrentUser().getName(), Tools.iso8601());
final String id = savedSearchService.save(search);

final URI searchUri = getUriBuilderToSelf().path(SavedSearchesResource.class)
Expand Down
Expand Up @@ -18,8 +18,10 @@

import org.graylog2.database.NotFoundException;
import org.graylog2.plugin.database.PersistedService;
import org.joda.time.DateTime;

import java.util.List;
import java.util.Map;

/**
* @author Dennis Oelkers <dennis@torch.sh>
Expand All @@ -29,5 +31,7 @@ public interface SavedSearchService extends PersistedService {
List<SavedSearch> all();

@SuppressWarnings("unchecked")
SavedSearchImpl load(String id) throws NotFoundException;
SavedSearch load(String id) throws NotFoundException;

SavedSearch create(String title, Map<String, Object> query, String creatorUserId, DateTime createdAt);
}
Expand Up @@ -16,16 +16,20 @@
*/
package org.graylog2.savedsearches;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import org.bson.types.ObjectId;
import org.graylog2.database.MongoConnection;
import org.graylog2.database.NotFoundException;
import org.graylog2.database.PersistedServiceImpl;
import org.graylog2.plugin.Tools;
import org.joda.time.DateTime;

import javax.inject.Inject;
import java.util.List;
import java.util.Map;

public class SavedSearchServiceImpl extends PersistedServiceImpl implements SavedSearchService {
@Inject
Expand All @@ -49,7 +53,7 @@ public List<SavedSearch> all() {

@Override
@SuppressWarnings("unchecked")
public SavedSearchImpl load(String id) throws NotFoundException {
public SavedSearch load(String id) throws NotFoundException {
BasicDBObject o = (BasicDBObject) get(SavedSearchImpl.class, id);

if (o == null) {
Expand All @@ -58,4 +62,16 @@ public SavedSearchImpl load(String id) throws NotFoundException {

return new SavedSearchImpl((ObjectId) o.get("_id"), o.toMap());
}

@Override
public SavedSearch create(String title, Map<String, Object> query, String creatorUserId, DateTime createdAt) {
// Create saved search
final Map<String, Object> searchData = ImmutableMap.of(
"title", title,
"query", query,
"creator_user_id", creatorUserId,
"created_at", createdAt);

return new SavedSearchImpl(searchData);
}
}
@@ -0,0 +1,104 @@
package org.graylog2.savedsearches;

import com.lordofthejars.nosqlunit.annotation.UsingDataSet;
import com.lordofthejars.nosqlunit.core.LoadStrategyEnum;
import com.lordofthejars.nosqlunit.mongodb.InMemoryMongoDb;
import org.graylog2.database.MongoConnectionRule;
import org.graylog2.database.NotFoundException;
import org.graylog2.plugin.Tools;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;

import java.util.Collections;
import java.util.List;
import java.util.Map;

import static com.lordofthejars.nosqlunit.mongodb.InMemoryMongoDb.InMemoryMongoRuleBuilder.newInMemoryMongoDbRule;
import static org.junit.Assert.*;

public class SavedSearchServiceImplTest {
@ClassRule
public static final InMemoryMongoDb IN_MEMORY_MONGO_DB = newInMemoryMongoDbRule().build();

@Rule
public MongoConnectionRule mongoRule = MongoConnectionRule.build("test");

private SavedSearchService savedSearchService;

@Before
public void setUpService() throws Exception {
this.savedSearchService = new SavedSearchServiceImpl(mongoRule.getMongoConnection());
}

@Test
@UsingDataSet(loadStrategy = LoadStrategyEnum.DELETE_ALL)
public void testAllEmptyCollection() throws Exception {
final List<SavedSearch> savedSearches = this.savedSearchService.all();

assertNotNull("Returned list should not be null", savedSearches);
assertEquals("Returned list should contain exactly one saved search", 0, savedSearches.size());
}

@Test
@UsingDataSet(locations = "savedSearchSingleDocument.json", loadStrategy = LoadStrategyEnum.CLEAN_INSERT)
public void testAllSingleDocumentInCollection() throws Exception {
final List<SavedSearch> savedSearches = this.savedSearchService.all();

assertNotNull("Returned list should not be null", savedSearches);
assertEquals("Returned list should contain exactly one saved search", 1, savedSearches.size());
}

@Test
@UsingDataSet(locations = {"savedSearchSingleDocument.json", "savedSearchSingleDocument2.json"}, loadStrategy = LoadStrategyEnum.CLEAN_INSERT)
public void testAllMultipleDocumentsInCollection() throws Exception {
final List<SavedSearch> savedSearches = this.savedSearchService.all();

assertNotNull("Returned list should not be null", savedSearches);
assertEquals("Returned list should contain exactly one saved search", 2, savedSearches.size());
}

@Test
@UsingDataSet(locations = {"savedSearchSingleDocument.json", "savedSearchSingleDocument2.json"}, loadStrategy = LoadStrategyEnum.CLEAN_INSERT)
public void testLoad() throws Exception {
final String id1 = "5400deadbeefdeadbeefaffe";
final SavedSearch savedSearch = savedSearchService.load(id1);

assertNotNull("Should return a saved search", savedSearch);
assertEquals("Should return the saved search with the correct id", id1, savedSearch.getId());

final String id2 = "54e3deadbeefdeadbeefaffe";
final SavedSearch savedSearch2 = savedSearchService.load(id2);

assertNotNull("Should return a saved search", savedSearch2);
assertEquals("Should return the saved search with the correct id", id2, savedSearch2.getId());
}

@Test(expected = NotFoundException.class)
@UsingDataSet(loadStrategy = LoadStrategyEnum.DELETE_ALL)
public void testLoadNonexisting() throws Exception {
savedSearchService.load("54e3deadbeefdeadbeefaffe");
}

@Test(expected = IllegalArgumentException.class)
@UsingDataSet(loadStrategy = LoadStrategyEnum.DELETE_ALL)
public void testLoadInvalidId() throws Exception {
savedSearchService.load("foobar");
}

@Test
@UsingDataSet(loadStrategy = LoadStrategyEnum.DELETE_ALL)
public void testCreate() throws Exception {
final String title = "Example Title";
final Map<String, Object> query =Collections.emptyMap();
final String creatorUserId = "someuser";
final DateTime createdAt = Tools.iso8601();

final SavedSearch savedSearch = savedSearchService.create(title, query, creatorUserId, createdAt);

assertNotNull("Should have returned a SavedSearch", savedSearch);
assertEquals("Collection should still be empty", 0, savedSearchService.all().size());
}
}
@@ -0,0 +1,5 @@
{
"saved_searches" : [
{"_id" : {"$oid": "54e3deadbeefdeadbeefaffe"}, "title" : "Example Saved Search", "query" : {}, "creator_user_id" : "someuser", "created_at" : { "$date" : "2015-03-14T15:09:26.540Z" }}
]
}
@@ -0,0 +1,5 @@
{
"saved_searches" : [
{"_id" : {"$oid": "5400deadbeefdeadbeefaffe"}, "title" : "Another sample Saved Search", "query" : {}, "creator_user_id" : "someuser", "created_at" : { "$date" : "2015-03-14T15:09:26.540Z" }}
]
}

0 comments on commit 6ae60b8

Please sign in to comment.