package annotatedspring.episodes;
import annotatedspring.Application;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import java.util.ArrayList;
import java.util.List;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.standaloneSetup;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {Application.class})
@WebAppConfiguration
public class EpisodesControllerTest {
@InjectMocks
private EpisodesController episodesController;
@Mock
private EpisodesService episodesService;
private MockMvc mockMvc;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mockMvc = standaloneSetup(episodesController).build();
}
@Test
public void episodeIndex_rendersIndex() throws Exception {
List<Episode> publishedEpisodes = new ArrayList<>();
when(episodesService.published()).thenReturn(publishedEpisodes);
mockMvc.perform(get("/"))
.andExpect(status().isOk())
.andExpect(view().name("episodes/index"))
.andExpect(model().attribute("episodes", publishedEpisodes));
}
@Test
public void showEpisodes_validEpisode_rendersShow() throws Exception {
Episode episode = mock(Episode.class);
when(episodesService.find(1)).thenReturn(episode);
mockMvc.perform(get("/episodes/1"))
.andExpect(status().isOk())
.andExpect(view().name("episodes/show"))
.andExpect(model().attribute("episode", episode));
}
@Test
public void showEpisode_withSeoPath_rendersShow() throws Exception {
Episode episode = mock(Episode.class);
when(episodesService.find(1)).thenReturn(episode);
mockMvc.perform(get("/episodes/1/episode-title"))
.andExpect(status().isOk())
.andExpect(view().name("episodes/show"))
.andExpect(model().attribute("episode", episode));
}
@Test
public void showEpisode_invalidEpisode_throwsEpisodeNotFound() throws Exception {
when(episodesService.find(1)).thenReturn(null);
mockMvc.perform(get("/episodes/1/episode-title"))
.andExpect(status().isNotFound());
}
}