package de.asideas.crowdsource.service;
import de.asideas.crowdsource.domain.model.CommentEntity;
import de.asideas.crowdsource.domain.model.FinancingRoundEntity;
import de.asideas.crowdsource.domain.model.ProjectEntity;
import de.asideas.crowdsource.domain.model.UserEntity;
import de.asideas.crowdsource.presentation.Comment;
import de.asideas.crowdsource.presentation.project.Project;
import de.asideas.crowdsource.domain.service.user.UserNotificationService;
import de.asideas.crowdsource.repository.CommentRepository;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.util.Collections;
import java.util.List;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class CommentServiceTest {
public static final String EXISTING_USER_MAIL = "test.name@test.de";
private final static String EXISTING_PROJECT_ID = "TEST_PROJECT_ID";
private ProjectEntity projectEntity;
private UserEntity userEntity;
private CommentEntity aComment;
@InjectMocks
private CommentService commentService;
@Mock
private ProjectService projectService;
@Mock
private CommentRepository commentRepository;
@Mock
private UserNotificationService userNotificationService;
@Mock
private UserService userService;
@Before
public void init(){
reset(projectService, userService, commentRepository);
projectEntity = new ProjectEntity(userEntity, new Project(), new FinancingRoundEntity());
userEntity = new UserEntity("test.name@test.de", "password");
aComment = new CommentEntity(projectEntity, userEntity, "some comment");
}
@Test
public void addComment_ShouldPersistCommentAndNotifyCreator() throws Exception {
Comment comment = new Comment(null, null, "Awesome project, dude!");
prepareProjectServiceMock();
prepareUserServiceMock();
commentService.addComment(comment, EXISTING_PROJECT_ID, EXISTING_USER_MAIL);
final CommentEntity expectedComment2BPersisted = new CommentEntity(projectEntity, userEntity, comment.getComment());
verify(commentRepository).save(expectedComment2BPersisted);
verify(userNotificationService).notifyCreatorOnComment(expectedComment2BPersisted);
}
@Test
public void loadCommentsByProject_ShouldReturnViewRepresentation() throws Exception {
prepareProjectServiceMock();
prepareCommentRepositoryMock();
final List<Comment> res = commentService.loadCommentsByProject(EXISTING_PROJECT_ID);
assertThat(res.size(), is(1));
assertThat(res.get(0), is(new Comment(aComment)));
}
private void prepareUserServiceMock() {
when(userService.getUserByEmail(EXISTING_USER_MAIL)).thenReturn(userEntity);
}
private void prepareCommentRepositoryMock() {
when(commentRepository.findByProject(projectEntity)).thenReturn(Collections.singletonList(aComment));
}
private void prepareProjectServiceMock() {
when(projectService.loadProjectEntity(EXISTING_PROJECT_ID)).thenReturn(projectEntity);
}
}