package sagan.blog.support;
import sagan.blog.Post;
import sagan.blog.PostBuilder;
import sagan.blog.PostCategory;
import sagan.support.DateFactory;
import sagan.support.nav.PageableFactory;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.ui.ExtendedModelMap;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static sagan.blog.PostCategory.ENGINEERING;
/**
* Unit tests for {@link AtomFeedController}.
*/
public class AtomFeedControllerTests {
public static final PostCategory TEST_CATEGORY = ENGINEERING;
@Mock
private BlogService blogService;
@Mock
private SiteUrl siteUrl;
@Mock
private DateFactory dateFactory;
private AtomFeedController controller;
private ExtendedModelMap model = new ExtendedModelMap();
private Page<Post> page;
private List<Post> posts = new ArrayList<>();
private HttpServletResponse response = new MockHttpServletResponse();
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
controller = new AtomFeedController(blogService, siteUrl, dateFactory);
posts.add(PostBuilder.post().build());
page = new PageImpl<>(posts, mock(Pageable.class), 20);
given(blogService.getPublishedPosts(eq(PageableFactory.forFeeds()))).willReturn(page);
given(blogService.getPublishedPosts(eq(TEST_CATEGORY), eq(PageableFactory.forFeeds()))).willReturn(page);
given(blogService.getPublishedBroadcastPosts(eq(PageableFactory.forFeeds()))).willReturn(page);
}
@SuppressWarnings("unchecked")
@Test
public void postsInModelForAllPublishedPosts() {
controller.listPublishedPosts(model, response);
assertThat((List<Post>) model.get("posts"), is(posts));
}
@Test
public void feedMetadataInModelForAllPublishedPosts() {
controller.listPublishedPosts(model, response);
assertThat((String) model.get("feed-title"), is("Spring"));
assertThat((String) model.get("feed-path"), is("/blog.atom"));
assertThat((String) model.get("blog-path"), is("/blog"));
}
@SuppressWarnings("unchecked")
@Test
public void postsInModelForPublishedCategoryPosts() {
controller.listPublishedPostsForCategory(TEST_CATEGORY, model, response);
assertThat((List<Post>) model.get("posts"), is(posts));
}
@Test
public void feedMetadataInModelForCategoryPosts() {
controller.listPublishedPostsForCategory(TEST_CATEGORY, model, response);
assertThat((String) model.get("feed-title"), is("Spring " + TEST_CATEGORY.getDisplayName()));
assertThat((String) model.get("feed-path"), is("/blog/category/" + TEST_CATEGORY.getUrlSlug() + ".atom"));
assertThat((String) model.get("blog-path"), is("/blog/category/" + TEST_CATEGORY.getUrlSlug()));
}
@SuppressWarnings("unchecked")
@Test
public void postsInModelForPublishedBroadcastPosts() {
controller.listPublishedBroadcastPosts(model, response);
assertThat((List<Post>) model.get("posts"), is(posts));
}
@Test
public void feedMetadataInModelForBroadcastPosts() {
controller.listPublishedBroadcastPosts(model, response);
assertThat((String) model.get("feed-title"), is("Spring Broadcasts"));
assertThat((String) model.get("feed-path"), is("/blog/broadcasts.atom"));
assertThat((String) model.get("blog-path"), is("/blog/broadcasts"));
}
}