package com.collabinate.server.resources; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import org.junit.Test; import org.restlet.Request; import org.restlet.data.Method; import org.restlet.data.Status; import com.collabinate.server.activitystreams.ActivityStreamsCollection; /** * Tests for the Likes Resource * * @author mafuba * */ public class LikesResourceTest extends GraphResourceTest { @Test public void get_likes_for_nonexistent_activity_should_return_404() { assertEquals(Status.CLIENT_ERROR_NOT_FOUND, get().getStatus()); } @Test public void get_likes_for_existing_activity_should_return_200() { addActivity(); assertEquals(Status.SUCCESS_OK, get().getStatus()); } @Test public void likes_for_never_liked_activity_should_be_empty() { addActivity(); ActivityStreamsCollection likes = new ActivityStreamsCollection(get().getEntityAsText()); assertEquals(0, likes.size()); } @Test public void likes_for_liked_activity_should_have_item() { addActivity(); // make user user like activity Request request = new Request(Method.PUT, "riap://application/1/tenant/users/user/likes/entity/activity"); component.handle(request); ActivityStreamsCollection likes = new ActivityStreamsCollection(get().getEntityAsText()); assertEquals(1, likes.size()); } @Test public void likes_for_activity_liked_by_user_should_contain_user_id() { addActivity(); // make user user like activity Request request = new Request(Method.PUT, "riap://application/1/tenant/users/user/likes/entity/activity"); component.handle(request); assertThat(get().getEntityAsText(), containsString("user")); } @Test public void likes_should_not_contain_user_that_unliked_entity() { addActivity(); // make user user1 like activity Request request = new Request(Method.PUT, "riap://application/1/tenant/users/user1/likes/entity/activity"); component.handle(request); // make user user2 like activity request = new Request(Method.PUT, "riap://application/1/tenant/users/user2/likes/entity/activity"); component.handle(request); // make user user1 unlike activity request = new Request(Method.DELETE, "riap://application/1/tenant/users/user1/likes/entity/activity"); component.handle(request); assertThat(get().getEntityAsText(), not(containsString("user1"))); } @Test public void collection_should_include_total_items_property() { addActivity(); assertThat(get().getEntityAsText(), containsString("totalItems")); } @Test public void collection_should_include_zero_count_for_no_likes() { addActivity(); ActivityStreamsCollection likes = new ActivityStreamsCollection(get().getEntityAsText()); assertEquals(0, likes.getTotalItems()); } @Test public void collection_should_include_count_that_matches_likes() { addActivity(); // make user user1 like activity Request request = new Request(Method.PUT, "riap://application/1/tenant/users/user1/likes/entity/activity"); component.handle(request); // make user user2 like activity request = new Request(Method.PUT, "riap://application/1/tenant/users/user2/likes/entity/activity"); component.handle(request); ActivityStreamsCollection likes = new ActivityStreamsCollection(get().getEntityAsText()); assertEquals(2, likes.getTotalItems()); } @Test public void collection_count_should_account_for_unlikes() { addActivity(); // make user user1 like activity Request request = new Request(Method.PUT, "riap://application/1/tenant/users/user1/likes/entity/activity"); component.handle(request); // make user user2 like activity request = new Request(Method.PUT, "riap://application/1/tenant/users/user2/likes/entity/activity"); component.handle(request); // make user user1 unlike activity request = new Request(Method.DELETE, "riap://application/1/tenant/users/user1/likes/entity/activity"); component.handle(request); ActivityStreamsCollection likes = new ActivityStreamsCollection(get().getEntityAsText()); assertEquals(1, likes.getTotalItems()); } /** * Prepares for like work by creating an activity. */ private void addActivity() { component.handle(new Request(Method.PUT, "riap://application/1/tenant/entities/entity/stream/activity")); } @Override protected String getResourcePath() { return "/1/tenant/entities/entity/stream/activity/likes"; } }