@Provides public UserActionsToRequestsApplier userActionsToRequestsApplier() { return new UserActionsToRequestsApplier(); }
private List<RequestEntity> applyUserActionsToRequests(List<RequestEntity> requests) { List<UserActionEntity> userActions = mUserActionsRetriever.getAllUserActions(); if (userActions.isEmpty() || requests.isEmpty()) return requests; Collections.sort(requests, mComparator); // sort in order to be able to use binary search List<RequestEntity> updatedRequests = new ArrayList<>(requests); RequestEntity updatedRequest; for (UserActionEntity userAction : userActions) { if (mUserActionsToRequestsApplier.isUserActionAffectingRequest(userAction)) { // find the request affected by user action, and if it is found - apply the action to it int affectedEntityPos = Collections.binarySearch( requests, RequestEntity.getBuilder().setId(userAction.getEntityId()).build(), mComparator); if (affectedEntityPos >= 0) { updatedRequest = mUserActionsToRequestsApplier.applyUserActionToRequest( userAction, requests.get(affectedEntityPos)); updatedRequests.set(affectedEntityPos, updatedRequest); } } } return updatedRequests; }
/** * * @param userAction the user action which should be applied to request * @param requestEntity the request on which to apply the user action * @return new request which is the merge of the provided request and the information from * user action * @throws IllegalArgumentException if the provided user action is not applicable to the * provided request */ public RequestEntity applyUserActionToRequest(@NonNull UserActionEntity userAction, @NonNull RequestEntity requestEntity) { if (!userAction.getEntityType().equals(UserActions.ENTITY_TYPE_REQUEST) || !userAction.getEntityId().equals(requestEntity.getId())) { throw new IllegalArgumentException("user action is not related to the request"); } if (userAction.getActionType().equals(UserActions.ACTION_TYPE_CLOSE_REQUEST)) { return closeRequest(CloseRequestUserActionEntity.fromUserAction(userAction), requestEntity); } else if (userAction.getActionType().equals(UserActions.ACTION_TYPE_PICKUP_REQUEST)) { return pickUpRequest(PickUpRequestUserActionEntity.fromUserAction(userAction), requestEntity); } else if (userAction.getActionType().equals(UserActions.ACTION_TYPE_CREATE_REQUEST)) { // this action is just a "marker" - the actual data has already been written to requests cache return requestEntity; } else if (userAction.getActionType().equals(UserActions.ACTION_TYPE_VOTE_FOR_REQUEST)) { return voteForRequest(VoteForRequestUserActionEntity.fromUserAction(userAction), requestEntity); } else { throw new RuntimeException("invalid user action: " + userAction); } }
@Test(expected = IllegalArgumentException.class) public void applyUserActionToRequest_userActionDoesNotAffectRequestsInGeneral_exceptionThrown() { // Arrange RequestEntity requestEntity = RequestEntityProvider.getClosedRequestEntity(); UserActionEntity dummyUserAction = new UserActionEntity("1000", "bla", "1", "blabla", "bla", "bla"); // Act SUT.applyUserActionToRequest(dummyUserAction, requestEntity); // Assert }
@Test(expected = IllegalArgumentException.class) public void applyUserActionToRequest_closeRequestUserActionOnNewRequest_exceptionThrown() { // Arrange String userId = "testUserId"; String closedComment = "closed comment"; List<String> closedPictures = Arrays.asList("picture1", "picture2"); RequestEntity requestEntity = RequestEntityProvider.getNewRequestEntity(); UserActionEntity closeUserAction = mUserActionEntityFactory.newCloseRequest( requestEntity.getId(), userId, closedComment, closedPictures); // Act SUT.applyUserActionToRequest(closeUserAction, requestEntity); // Assert }
@Test(expected = IllegalArgumentException.class) public void applyUserActionToRequest_closeRequestUserActionOnClosedRequest_exceptionThrown() { // Arrange String userId = "testUserId"; String closedComment = "closed comment"; List<String> closedPictures = Arrays.asList("picture1", "picture2"); RequestEntity requestEntity = RequestEntityProvider.getClosedRequestEntity(); UserActionEntity closeUserAction = mUserActionEntityFactory.newCloseRequest( requestEntity.getId(), userId, closedComment, closedPictures); // Act SUT.applyUserActionToRequest(closeUserAction, requestEntity); // Assert }
@Before public void setup() throws Exception { SUT = new UserActionsToRequestsApplier(); }
@Test(expected = IllegalArgumentException.class) public void applyUserActionToRequest_voteDownForClosedUserActionOnNonClosedRequest_exceptionThrown() { // Arrange RequestEntity requestEntity = RequestEntityProvider.getPickedUpRequestEntity(); UserActionEntity voteDownClosedEntity = mUserActionEntityFactory.newVoteDownForRequestClosed(requestEntity.getId()); // Act SUT.applyUserActionToRequest(voteDownClosedEntity, requestEntity); // Assert }
@Test(expected = IllegalArgumentException.class) public void applyUserActionToRequest_voteUpForClosedUserActionOnNonClosedRequest_exceptionThrown() { // Arrange RequestEntity requestEntity = RequestEntityProvider.getPickedUpRequestEntity(); UserActionEntity voteDownClosedEntity = mUserActionEntityFactory.newVoteUpForRequestClosed(requestEntity.getId()); // Act SUT.applyUserActionToRequest(voteDownClosedEntity, requestEntity); // Assert }
@Test public void applyUserActionToRequest_voteUpForCreatedUserAction_requestAffected() throws Exception { // Arrange RequestEntity requestEntity = RequestEntityProvider.getClosedRequestEntity(); UserActionEntity voteUpCreatedEntity = mUserActionEntityFactory.newVoteUpForRequestCreated(requestEntity.getId()); // Act RequestEntity resultRequestEntity = SUT.applyUserActionToRequest(voteUpCreatedEntity, requestEntity); // Assert assertThat(resultRequestEntity.getCreatedVotes(), is(RequestEntityProvider.REQUEST_CREATED_VOTES + 1)); }
@Test(expected = IllegalArgumentException.class) public void applyUserActionToRequest_userActionAffectsOtherRequest_exceptionThrown() { // Arrange RequestEntity requestEntity = RequestEntityProvider.getClosedRequestEntity(); UserActionEntity dummyUserAction = mUserActionEntityFactory.newVoteUpForRequestCreated(requestEntity.getId() + 1); // Act SUT.applyUserActionToRequest(dummyUserAction, requestEntity); // Assert }
@Test(expected = IllegalArgumentException.class) public void applyUserActionToRequest_pickUpRequestUserActionOnPickedUpRequest_exceptionThrown() { // Arrange String userId = "testUserId"; RequestEntity requestEntity = RequestEntityProvider.getPickedUpRequestEntity(); UserActionEntity pickupUserAction = mUserActionEntityFactory.newPickUpRequest(requestEntity.getId(), userId); // Act SUT.applyUserActionToRequest(pickupUserAction, requestEntity); // Assert }
@Test public void applyUserActionToRequest_voteUpForClosedUserAction_requestAffected() throws Exception { // Arrange RequestEntity requestEntity = RequestEntityProvider.getClosedRequestEntity(); UserActionEntity voteUpClosedEntity = mUserActionEntityFactory.newVoteUpForRequestClosed(requestEntity.getId()); // Act RequestEntity resultRequestEntity = SUT.applyUserActionToRequest(voteUpClosedEntity, requestEntity); // Assert assertThat(resultRequestEntity.getClosedVotes(), is(RequestEntityProvider.REQUEST_CLOSED_VOTES + 1)); }
@Test public void applyUserActionToRequest_voteDownForCreatedUserAction_requestAffected() throws Exception { // Arrange RequestEntity requestEntity = RequestEntityProvider.getClosedRequestEntity(); UserActionEntity voteDownCreatedEntity = mUserActionEntityFactory.newVoteDownForRequestCreated(requestEntity.getId()); // Act RequestEntity resultRequestEntity = SUT.applyUserActionToRequest(voteDownCreatedEntity, requestEntity); // Assert assertThat(resultRequestEntity.getCreatedVotes(), is(RequestEntityProvider.REQUEST_CREATED_VOTES -1)); }
@Test public void applyUserActionToRequest_voteDownForClosedUserAction_requestAffected() throws Exception { // Arrange RequestEntity requestEntity = RequestEntityProvider.getClosedRequestEntity(); UserActionEntity voteDownClosedEntity = mUserActionEntityFactory.newVoteDownForRequestClosed(requestEntity.getId()); // Act RequestEntity resultRequestEntity = SUT.applyUserActionToRequest(voteDownClosedEntity, requestEntity); // Assert assertThat(resultRequestEntity.getClosedVotes(), is(RequestEntityProvider.REQUEST_CLOSED_VOTES - 1)); }
@Test public void applyUserActionToRequest_pickUpRequestUserActionOnNewRequest_requestAffected() { // Arrange String userId = "testUserId"; RequestEntity originalRequestEntity = RequestEntityProvider.getNewRequestEntity(); UserActionEntity pickupUserAction = mUserActionEntityFactory.newPickUpRequest(originalRequestEntity.getId(), userId); // Act RequestEntity resultRequestEntity = SUT.applyUserActionToRequest(pickupUserAction, originalRequestEntity); // Assert assertThat(resultRequestEntity.getPickedUpBy(), is(userId)); assertThat(resultRequestEntity.getPickedUpAt(), is(DEFAULT_TIMESTAMP)); }
@Test public void applyUserActionToRequest_createRequestUserAction_sameRequestReturned() { // Arrange String userId = "testUserId"; RequestEntity originalRequestEntity = RequestEntityProvider.getNewRequestEntity(); UserActionEntity pickupUserAction = mUserActionEntityFactory.newCreateRequest(originalRequestEntity.getId(), userId); // Act RequestEntity resultRequestEntity = SUT.applyUserActionToRequest(pickupUserAction, originalRequestEntity); // Assert assertTrue(resultRequestEntity == originalRequestEntity); } }
@Test public void applyUserActionToRequest_closeRequestUserActionOnPickedUpRequest_requestAffected() { // Arrange String userId = RequestEntityProvider.REQUEST_PICKED_UP_BY; String closedComment = "closed comment"; List<String> closedPictures = Arrays.asList("picture1", "picture2"); RequestEntity originalRequestEntity = RequestEntityProvider.getPickedUpRequestEntity(); UserActionEntity closeUserAction = mUserActionEntityFactory.newCloseRequest( originalRequestEntity.getId(), userId, closedComment, closedPictures); // Act RequestEntity resultRequestEntity = SUT.applyUserActionToRequest(closeUserAction, originalRequestEntity); // Assert assertThat(resultRequestEntity.getClosedBy(), is(userId)); assertThat(resultRequestEntity.getClosedAt(), is(DEFAULT_TIMESTAMP)); assertThat(resultRequestEntity.getClosedComment(), is(closedComment)); assertEquals(resultRequestEntity.getClosedPictures(), closedPictures); assertThat(resultRequestEntity.getClosedVotes(), is(0)); }