package br.com.caelum.vraptor.musicjungle.controller; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import br.com.caelum.vraptor.musicjungle.dao.MusicDao; import br.com.caelum.vraptor.musicjungle.dao.UserDao; import br.com.caelum.vraptor.musicjungle.enums.MusicType; import br.com.caelum.vraptor.musicjungle.files.Musics; import br.com.caelum.vraptor.musicjungle.interceptor.UserInfo; import br.com.caelum.vraptor.musicjungle.model.Music; import br.com.caelum.vraptor.musicjungle.model.User; import br.com.caelum.vraptor.musicjungle.util.model.MusicBuilder; import br.com.caelum.vraptor.musicjungle.util.model.UserBuilder; import br.com.caelum.vraptor.observer.upload.UploadedFile; import br.com.caelum.vraptor.util.test.MockHttpResult; import br.com.caelum.vraptor.util.test.MockSerializationResult; import br.com.caelum.vraptor.util.test.MockValidator; public class MusicControllerTest { private MockSerializationResult result; private MockValidator validator; private MusicController controller; private Music music; private User user; @Mock private UserInfo userInfo; @Mock private MusicDao dao; @Mock private Musics musics; @Mock private UploadedFile uploadFile; @Mock private UserDao userDao; @Before public void setUp() { MockitoAnnotations.initMocks(this); result = new MockSerializationResult(); validator = new MockValidator(); controller = new MusicController(dao, userInfo, result, validator, musics, userDao); music = new MusicBuilder().withId(1L).withType(MusicType.ROCK).withTitle("Some Music").withDescription("Some description").build(); user = new UserBuilder().withName("Renan").withLogin("renanigt").withPassword("1234").build(); } @Test public void shouldAddMusic() { when(userInfo.getUser()).thenReturn(user); controller.add(music, uploadFile); verify(dao).add(music); verify(musics).save(uploadFile, music); assertThat(result.included().get("notice").toString(), is(music.getTitle() + " music added")); } @Test public void shouldShowMusicWhenExists() { when(dao.load(music)).thenReturn(music); controller.show(music); assertNotNull(result.included().get("music")); assertThat((Music) result.included().get("music"), is(music)); } @Test public void shouldNotShowMusicWhenDoesNotExists() { when(dao.load(music)).thenReturn(null); controller.show(music); assertNull(result.included().get("music")); } @SuppressWarnings("unchecked") @Test public void shouldReturnMusicList() { when(dao.searchSimilarTitle(music.getTitle())).thenReturn(Arrays.asList(music)); controller.search(music); assertThat((List<Music>) result.included().get("musics"), contains(music)); } @SuppressWarnings("unchecked") @Test public void shouldReturnEmptyList() { when(dao.searchSimilarTitle(music.getTitle())).thenReturn(new ArrayList<Music>()); controller.search(music); List<Music> musics = (List<Music>) result.included().get("musics"); assertThat(musics, empty()); } @Test public void shouldNotDownloadMusicWhenDoesNotExist() { when(dao.load(music)).thenReturn(music); when(musics.getFile(music)).thenReturn(new File("/tmp/uploads/Music_" + music.getId() + ".mp3")); try { controller.download(music); fail("Should throw an exception."); } catch (FileNotFoundException e) { verify(musics).getFile(music); } } @Test public void shouldShowAllMusicsAsJSON() throws Exception { when(dao.listAll()).thenReturn(Arrays.asList(music)); controller.showAllMusicsAsJSON(); assertThat(result.serializedResult(), is("{\"list\":[{\"id\":1,\"title\":\"Some Music\"," + "\"description\":\"Some description\",\"type\":\"ROCK\"}]}")); } @Test public void shouldShowAllMusicsAsXML() throws Exception { when(dao.listAll()).thenReturn(Arrays.asList(music)); controller.showAllMusicsAsXML(); assertThat(result.serializedResult(), is("<list><music><id>1</id><title>Some Music</title><description>Some description</description><type>ROCK</type></music></list>")); } @Test public void shouldShowAllMusicsAsHTTP() { MockHttpResult mockHttpResult = new MockHttpResult(); controller = new MusicController(dao, userInfo, mockHttpResult, validator, musics, userDao); when(dao.listAll()).thenReturn(Arrays.asList(music)); controller.showAllMusicsAsHTTP(); assertThat(mockHttpResult.getBody(), is("<p class=\"content\">"+ Arrays.asList(music).toString()+"</p>")); } @Test public void shouldListAs() throws Exception { when(dao.listAll()).thenReturn(Arrays.asList(music)); controller.listAs(); assertThat(result.serializedResult(), is("<list><music><id>1</id><title>Some Music</title><description>Some description</description><type>ROCK</type></music></list>")); } }