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 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.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.ui.ExtendedModelMap;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.eq;
public class BlogController_PublishedPostsTests {
private static final int TEST_PAGE = 1;
@Mock
private BlogService blogService;
private MockHttpServletRequest request = new MockHttpServletRequest();
private BlogController controller;
private DateFactory dateFactory = new DateFactory();
private ExtendedModelMap model = new ExtendedModelMap();
private List<PostView> posts = new ArrayList<>();
private Page<PostView> page;
private String viewName;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
controller = new BlogController(blogService, dateFactory);
List<Post> posts = new ArrayList<>();
posts.add(PostBuilder.post().title("post title").build());
Page<Post> postsPage = new PageImpl<>(posts, new PageRequest(TEST_PAGE, 10), 20);
Pageable testPageable = PageableFactory.forLists(TEST_PAGE);
page = new PageImpl<>(new ArrayList<>(), testPageable, 1);
given(blogService.getPublishedPosts(eq(testPageable))).willReturn(postsPage);
request.setServletPath("/blog");
viewName = controller.listPublishedPosts(model, TEST_PAGE);
}
@Test
public void providesAllCategoriesInModel() {
assertThat(model.get("categories"), is(PostCategory.values()));
}
@Test
public void providesPaginationInfoInModel() {
assertThat(model.get("paginationInfo"), notNullValue());
}
@Test
public void viewNameIsIndex() {
assertThat(viewName, is("blog/index"));
}
@SuppressWarnings("unchecked")
@Test
public void postsInModel() {
assertThat(((List<PostView>) model.get("posts")).get(0).getTitle(), is("post title"));
}
}