package sagan.blog.support; import sagan.blog.Post; import sagan.blog.PostBuilder; import sagan.search.types.SearchEntry; import sagan.search.SearchException; import sagan.search.support.SearchService; import sagan.support.DateFactory; import sagan.support.DateTestUtils; import java.util.Date; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.test.util.ReflectionTestUtils; import static org.mockito.BDDMockito.*; import static org.mockito.Matchers.anyObject; @RunWith(MockitoJUnitRunner.class) public class BlogService_ValidPostTests { private static final String AUTHOR_USERNAME = "username"; private Post post; private PostForm postForm = new PostForm(); private Date publishAt = DateTestUtils.getDate("2013-07-01 12:00"); private Date now = DateTestUtils.getDate("2013-07-01 13:00"); @Mock private PostRepository postRepository; @Mock private PostFormAdapter postFormAdapter; @Mock private DateFactory dateFactory; @Mock private SearchService searchService; @Rule public ExpectedException expected = ExpectedException.none(); private BlogService service; @Before public void setup() { given(dateFactory.now()).willReturn(now); given(postRepository.save((Post) anyObject())).will(invocation -> { Post post = (Post) invocation.getArguments()[0]; ReflectionTestUtils.setField(post, "id", 123L); return post; }); post = PostBuilder.post().publishAt(publishAt).build(); given(postFormAdapter.createPostFromPostForm(postForm, AUTHOR_USERNAME)).willReturn(post); service = new BlogService(postRepository, postFormAdapter, dateFactory, searchService); service.addPost(postForm, AUTHOR_USERNAME); } @Test public void createsAPost() { verify(postFormAdapter).createPostFromPostForm(postForm, AUTHOR_USERNAME); } @Test public void postIsPersisted() { verify(postRepository).save((Post) anyObject()); } @Test public void creatingABlogPost_addsThatPostToTheSearchIndexIfPublished() { verify(searchService).saveToIndex((SearchEntry) anyObject()); } @Test public void blogIsSavedWhenSearchServiceIsDown() { reset(postRepository); willThrow(SearchException.class).given(searchService).saveToIndex((SearchEntry) anyObject()); post = service.addPost(postForm, AUTHOR_USERNAME); verify(postRepository).save(post); } @Test public void creatingABlogPost_doesNotSaveToSearchIndexIfNotLive() throws Exception { reset(searchService); PostForm draftPostForm = new PostForm(); draftPostForm.setDraft(true); Post draft = PostBuilder.post().draft().build(); given(postFormAdapter.createPostFromPostForm(draftPostForm, AUTHOR_USERNAME)).willReturn(draft); service.addPost(draftPostForm, AUTHOR_USERNAME); verifyZeroInteractions(searchService); } }