package sagan.blog.support;
import sagan.blog.Post;
import sagan.blog.PostCategory;
import sagan.support.DateFactory;
import sagan.support.DateTestUtils;
import sagan.team.MemberProfile;
import sagan.team.support.TeamRepository;
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 static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.*;
@RunWith(MockitoJUnitRunner.class)
public class PostFormAdapter_CreatePostTests {
public static final String RENDERED_HTML = "<p>Rendered HTML</p><p>from Markdown</p>";
public static final String RENDERED_SUMMARY = "<p>Rendered HTML</p>";
private static final String AUTHOR_USERNAME = "author";
private static final String AUTHOR_NAME = "mr author";
private Post post;
private String title = "Title";
private String content = "Rendered HTML\n\nfrom Markdown";
private PostCategory category = PostCategory.ENGINEERING;
private Date publishAt = DateTestUtils.getDate("2013-07-01 12:00");
private boolean broadcast = true;
private boolean draft = false;
private Date now = DateTestUtils.getDate("2013-07-01 13:00");
@Mock
private DateFactory dateFactory;
@Mock
private TeamRepository teamRepository;
@Mock
private PostSummary postSummary;
@Mock
private PostContentRenderer renderer;
@Rule
public ExpectedException expected = ExpectedException.none();
private PostForm postForm;
private PostFormAdapter adapter;
@Before
public void setup() {
MemberProfile profile = new MemberProfile();
profile.setUsername(AUTHOR_USERNAME);
profile.setName(AUTHOR_NAME);
given(teamRepository.findByUsername(AUTHOR_USERNAME)).willReturn(profile);
given(renderer.render(content)).willReturn(RENDERED_HTML);
given(postSummary.forContent(anyString(), anyInt())).willReturn(RENDERED_SUMMARY);
given(dateFactory.now()).willReturn(now);
adapter = new PostFormAdapter(renderer, postSummary, dateFactory, teamRepository);
postForm = new PostForm();
postForm.setTitle(title);
postForm.setContent(content);
postForm.setCategory(category);
postForm.setBroadcast(broadcast);
postForm.setPublishAt(publishAt);
post = adapter.createPostFromPostForm(postForm, AUTHOR_USERNAME);
}
@Test
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 postHasAuthor() {
assertThat(post.getAuthor().getName(), equalTo(AUTHOR_NAME));
}
@Test
public void postHasRenderedContent() {
assertThat(post.getRenderedContent(), equalTo(RENDERED_HTML));
}
@Test
public void postHasRenderedSummary() {
assertThat(post.getRenderedSummary(), equalTo(RENDERED_SUMMARY));
}
@Test
public void postHasPublicSlug() {
assertThat(post.getPublicSlug(), equalTo("2013/07/01/title"));
}
@Test
public void draftWithNullPublishDate() {
postForm.setDraft(true);
postForm.setPublishAt(null);
post = adapter.createPostFromPostForm(postForm, AUTHOR_USERNAME);
assertThat(post.getPublishAt(), is(nullValue()));
}
@Test
public void postWithNullPublishDateSetsPublishAtToNow() {
postForm.setDraft(false);
postForm.setPublishAt(null);
post = adapter.createPostFromPostForm(postForm, AUTHOR_USERNAME);
assertThat(post.getPublishAt(), equalTo(now));
}
@Test
public void postCreatedDateDefaultsToNow() throws Exception {
assertThat(post.getCreatedAt(), is(now));
}
@Test
public void postCreatedDateCanBeSetFromAPostForm() throws Exception {
Date createdAt = DateTestUtils.getDate("2013-05-23 22:58");
postForm.setCreatedAt(createdAt);
Post post = adapter.createPostFromPostForm(postForm, AUTHOR_USERNAME);
assertThat(post.getCreatedAt(), is(createdAt));
}
}