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 static org.hamcrest.CoreMatchers.*; import static org.mockito.Matchers.any; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; 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 EpisodesAdminControllerTest { @InjectMocks private EpisodesAdminController episodesAdminController; @Mock private EpisodesService episodesService; private MockMvc mockMvc; @Before public void setup() { MockitoAnnotations.initMocks(this); mockMvc = standaloneSetup(episodesAdminController).build(); } @Test public void newEpisode_rendersNewForm() throws Exception { mockMvc.perform(get("/admin/episodes/new")) .andExpect(status().isOk()) .andExpect(view().name("admin/episodes/new")) .andExpect(model().attribute(("episode"), is(not(nullValue())))); } @Test public void createEpisode_redirectsToEpisodeShow() throws Exception { Episode persistedEpisode = new Episode(); persistedEpisode.setId(42); when(episodesService.create(any(Episode.class))).thenReturn(persistedEpisode); mockMvc.perform(post("/admin/episodes").param("title", "episode title")) .andExpect(redirectedUrl("/episodes/42")); verify(episodesService, times(1)).create(any(Episode.class)); } @Test public void editEpisode_rendersEditForm() throws Exception { Episode episode = mock(Episode.class); when(episodesService.find(1)).thenReturn(episode); mockMvc.perform(get("/admin/episodes/1/edit")) .andExpect(status().isOk()) .andExpect(view().name("admin/episodes/edit")) .andExpect(model().attribute("episode", episode)); } @Test public void updateEpisode_validEpisode_updatesEpisode() throws Exception { mockMvc.perform(put("/admin/episodes/1").param("title", "episode title")) .andExpect(redirectedUrl("/episodes/1")); verify(episodesService, times(1)).update(any(Episode.class)); } @Test public void updatedEpisode_invalidEpisode_rendersEditForm() throws Exception { mockMvc.perform(put("/admin/episodes/1").param("duration", "42")).andDo(print()) .andExpect(view().name("admin/episodes/edit")) .andExpect(model().attribute("episode", notNullValue())); } }