package sagan.blog.support;
import sagan.blog.Post;
import sagan.blog.PostBuilder;
import sagan.blog.PostCategory;
import sagan.support.DateFactory;
import sagan.support.DateTestUtils;
import sagan.team.support.TeamRepository;
import java.util.Date;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.*;
@RunWith(MockitoJUnitRunner.class)
public class PostFormAdapter_UpdatePostTests {
public static final String RENDERED_HTML = "<p>Rendered HTML</p><p>from Markdown</p>";
public static final String SUMMARY = "<p>Rendered HTML</p>";
private Post post;
private String title = "Title";
private String content = "Rendered HTML\n\nfrom Markdown";
private PostCategory category = PostCategory.ENGINEERING;
private boolean broadcast = true;
private boolean draft = false;
private Date publishAt = DateTestUtils.getDate("2013-07-01 12:00");
private Date now = DateTestUtils.getDate("2013-07-01 13:00");
private PostForm postForm;
private String ORIGINAL_AUTHOR = "original author";
@Mock
private DateFactory dateFactory;
@Mock
private TeamRepository teamRepository;
@Mock
private PostContentRenderer renderer;
@Mock
private PostSummary postSummary;
private PostFormAdapter postFormAdapter;
@Before
public void setup() {
given(dateFactory.now()).willReturn(now);
given(postSummary.forContent(anyString(), anyInt())).willReturn(SUMMARY);
given(renderer.render(content)).willReturn(RENDERED_HTML);
post = PostBuilder.post().id(123L).author("author_id", ORIGINAL_AUTHOR).build();
postForm = new PostForm(post);
postForm.setTitle(title);
postForm.setContent(content);
postForm.setCategory(category);
postForm.setBroadcast(broadcast);
postForm.setPublishAt(publishAt);
postFormAdapter = new PostFormAdapter(renderer, postSummary, dateFactory, teamRepository);
postFormAdapter.updatePostFromPostForm(post, postForm);
}
public void postHasCorrectUserEnteredValues() {
assertThat(post.getTitle(), equalTo(title));
assertThat(post.getRawContent(), equalTo(content));
assertThat(post.getCategory(), equalTo(category));
assertThat(post.isBroadcast(), equalTo(broadcast));
assertThat(post.isDraft(), equalTo(draft));
assertThat(post.getPublishAt(), equalTo(publishAt));
}
@Test
public void postRetainsOriginalAuthor() {
assertThat(post.getAuthor().getName(), equalTo(ORIGINAL_AUTHOR));
}
@Test
public void postHasRenderedContent() {
assertThat(post.getRenderedContent(), equalTo(RENDERED_HTML));
}
@Test
public void postHasRenderedSummary() {
assertThat(post.getRenderedSummary(), equalTo(SUMMARY));
}
@Test
public void draftWithNullPublishDate() {
postForm.setDraft(true);
postForm.setPublishAt(null);
postFormAdapter.updatePostFromPostForm(post, postForm);
assertThat(post.getPublishAt(), is(nullValue()));
}
@Test
public void postWithNullPublishDateSetsPublishAtToNow() {
postForm.setDraft(false);
postForm.setPublishAt(null);
postFormAdapter.updatePostFromPostForm(post, postForm);
assertThat(post.getPublishAt(), equalTo(now));
}
@Test
public void updatingABlogPost_doesNotChangeItsCreatedDateByDefault() throws Exception {
Date originalDate = DateTestUtils.getDate("2009-11-20 07:00");
Post post = PostBuilder.post().createdAt(originalDate).build();
postFormAdapter.updatePostFromPostForm(post, postForm);
assertThat(post.getCreatedAt(), is(originalDate));
}
@Test
public void updatingABlogPost_usesTheCreatedDateFromThePostFormIfPresent() throws Exception {
Date originalDate = DateTestUtils.getDate("2009-11-20 07:00");
Post post = PostBuilder.post().createdAt(originalDate).build();
Date newDate = DateTestUtils.getDate("2010-01-11 03:00");
postForm.setCreatedAt(newDate);
postFormAdapter.updatePostFromPostForm(post, postForm);
assertThat(post.getCreatedAt(), is(newDate));
}
}