package org.libresonic.player.dao; import org.junit.Before; import org.junit.Test; import org.libresonic.player.domain.PodcastChannel; import org.libresonic.player.domain.PodcastEpisode; import org.libresonic.player.domain.PodcastStatus; import org.springframework.beans.factory.annotation.Autowired; import java.util.Date; import java.util.List; import static org.junit.Assert.*; /** * Unit test of {@link PodcastDao}. * * @author Sindre Mehus */ public class PodcastDaoTestCase extends DaoTestCaseBean2 { @Autowired PodcastDao podcastDao; @Before public void setUp() throws Exception { getJdbcTemplate().execute("delete from podcast_channel"); } @Test public void testCreateChannel() { PodcastChannel channel = new PodcastChannel("http://foo"); podcastDao.createChannel(channel); PodcastChannel newChannel = podcastDao.getAllChannels().get(0); assertNotNull("Wrong ID.", newChannel.getId()); assertChannelEquals(channel, newChannel); } @Test public void testChannelId() { int channelId = podcastDao.createChannel(new PodcastChannel("http://foo")); assertEquals("Error in createChannel.", channelId + 1, podcastDao.createChannel(new PodcastChannel("http://foo"))); assertEquals("Error in createChannel.", channelId + 2, podcastDao.createChannel(new PodcastChannel("http://foo"))); assertEquals("Error in createChannel.", channelId + 3, podcastDao.createChannel(new PodcastChannel("http://foo"))); podcastDao.deleteChannel(channelId + 1); assertEquals("Error in createChannel.", channelId + 4, podcastDao.createChannel(new PodcastChannel("http://foo"))); podcastDao.deleteChannel(channelId + 4); assertEquals("Error in createChannel.", channelId + 5, podcastDao.createChannel(new PodcastChannel("http://foo"))); } @Test public void testUpdateChannel() { PodcastChannel channel = new PodcastChannel("http://foo"); podcastDao.createChannel(channel); channel = podcastDao.getAllChannels().get(0); channel.setUrl("http://bar"); channel.setTitle("Title"); channel.setDescription("Description"); channel.setImageUrl("http://foo/bar.jpg"); channel.setStatus(PodcastStatus.ERROR); channel.setErrorMessage("Something went terribly wrong."); podcastDao.updateChannel(channel); PodcastChannel newChannel = podcastDao.getAllChannels().get(0); assertEquals("Wrong ID.", channel.getId(), newChannel.getId()); assertChannelEquals(channel, newChannel); } @Test public void testDeleteChannel() { assertEquals("Wrong number of channels.", 0, podcastDao.getAllChannels().size()); PodcastChannel channel = new PodcastChannel("http://foo"); podcastDao.createChannel(channel); assertEquals("Wrong number of channels.", 1, podcastDao.getAllChannels().size()); podcastDao.createChannel(channel); assertEquals("Wrong number of channels.", 2, podcastDao.getAllChannels().size()); podcastDao.deleteChannel(podcastDao.getAllChannels().get(0).getId()); assertEquals("Wrong number of channels.", 1, podcastDao.getAllChannels().size()); podcastDao.deleteChannel(podcastDao.getAllChannels().get(0).getId()); assertEquals("Wrong number of channels.", 0, podcastDao.getAllChannels().size()); } @Test public void testCreateEpisode() { int channelId = createChannel(); PodcastEpisode episode = new PodcastEpisode(null, channelId, "http://bar", "path", "title", "description", new Date(), "12:34", null, null, PodcastStatus.NEW, null); podcastDao.createEpisode(episode); PodcastEpisode newEpisode = podcastDao.getEpisodes(channelId).get(0); assertNotNull("Wrong ID.", newEpisode.getId()); assertEpisodeEquals(episode, newEpisode); } @Test public void testGetEpisode() { assertNull("Error in getEpisode()", podcastDao.getEpisode(23)); int channelId = createChannel(); PodcastEpisode episode = new PodcastEpisode(null, channelId, "http://bar", "path", "title", "description", new Date(), "12:34", 3276213L, 2341234L, PodcastStatus.NEW, "error"); podcastDao.createEpisode(episode); int episodeId = podcastDao.getEpisodes(channelId).get(0).getId(); PodcastEpisode newEpisode = podcastDao.getEpisode(episodeId); assertEpisodeEquals(episode, newEpisode); } @Test public void testGetEpisodes() { int channelId = createChannel(); PodcastEpisode a = new PodcastEpisode(null, channelId, "a", null, null, null, new Date(3000), null, null, null, PodcastStatus.NEW, null); PodcastEpisode b = new PodcastEpisode(null, channelId, "b", null, null, null, new Date(1000), null, null, null, PodcastStatus.NEW, "error"); PodcastEpisode c = new PodcastEpisode(null, channelId, "c", null, null, null, new Date(2000), null, null, null, PodcastStatus.NEW, null); PodcastEpisode d = new PodcastEpisode(null, channelId, "c", null, null, null, null, null, null, null, PodcastStatus.NEW, ""); podcastDao.createEpisode(a); podcastDao.createEpisode(b); podcastDao.createEpisode(c); podcastDao.createEpisode(d); List<PodcastEpisode> episodes = podcastDao.getEpisodes(channelId); assertEquals("Error in getEpisodes().", 4, episodes.size()); assertEpisodeEquals(a, episodes.get(0)); assertEpisodeEquals(c, episodes.get(1)); assertEpisodeEquals(b, episodes.get(2)); assertEpisodeEquals(d, episodes.get(3)); } @Test public void testUpdateEpisode() { int channelId = createChannel(); PodcastEpisode episode = new PodcastEpisode(null, channelId, "http://bar", null, null, null, null, null, null, null, PodcastStatus.NEW, null); podcastDao.createEpisode(episode); episode = podcastDao.getEpisodes(channelId).get(0); episode.setUrl("http://bar"); episode.setPath("c:/tmp"); episode.setTitle("Title"); episode.setDescription("Description"); episode.setPublishDate(new Date()); episode.setDuration("1:20"); episode.setBytesTotal(87628374612L); episode.setBytesDownloaded(9086L); episode.setStatus(PodcastStatus.DOWNLOADING); episode.setErrorMessage("Some error"); podcastDao.updateEpisode(episode); PodcastEpisode newEpisode = podcastDao.getEpisodes(channelId).get(0); assertEquals("Wrong ID.", episode.getId(), newEpisode.getId()); assertEpisodeEquals(episode, newEpisode); } @Test public void testDeleteEpisode() { int channelId = createChannel(); assertEquals("Wrong number of episodes.", 0, podcastDao.getEpisodes(channelId).size()); PodcastEpisode episode = new PodcastEpisode(null, channelId, "http://bar", null, null, null, null, null, null, null, PodcastStatus.NEW, null); podcastDao.createEpisode(episode); assertEquals("Wrong number of episodes.", 1, podcastDao.getEpisodes(channelId).size()); podcastDao.createEpisode(episode); assertEquals("Wrong number of episodes.", 2, podcastDao.getEpisodes(channelId).size()); podcastDao.deleteEpisode(podcastDao.getEpisodes(channelId).get(0).getId()); assertEquals("Wrong number of episodes.", 1, podcastDao.getEpisodes(channelId).size()); podcastDao.deleteEpisode(podcastDao.getEpisodes(channelId).get(0).getId()); assertEquals("Wrong number of episodes.", 0, podcastDao.getEpisodes(channelId).size()); } @Test public void testCascadingDelete() { int channelId = createChannel(); PodcastEpisode episode = new PodcastEpisode(null, channelId, "http://bar", null, null, null, null, null, null, null, PodcastStatus.NEW, null); podcastDao.createEpisode(episode); podcastDao.createEpisode(episode); assertEquals("Wrong number of episodes.", 2, podcastDao.getEpisodes(channelId).size()); podcastDao.deleteChannel(channelId); assertEquals("Wrong number of episodes.", 0, podcastDao.getEpisodes(channelId).size()); } private int createChannel() { PodcastChannel channel = new PodcastChannel("http://foo"); podcastDao.createChannel(channel); channel = podcastDao.getAllChannels().get(0); return channel.getId(); } private void assertChannelEquals(PodcastChannel expected, PodcastChannel actual) { assertEquals("Wrong URL.", expected.getUrl(), actual.getUrl()); assertEquals("Wrong title.", expected.getTitle(), actual.getTitle()); assertEquals("Wrong description.", expected.getDescription(), actual.getDescription()); assertEquals("Wrong image URL.", expected.getImageUrl(), actual.getImageUrl()); assertSame("Wrong status.", expected.getStatus(), actual.getStatus()); assertEquals("Wrong error message.", expected.getErrorMessage(), actual.getErrorMessage()); } private void assertEpisodeEquals(PodcastEpisode expected, PodcastEpisode actual) { assertEquals("Wrong URL.", expected.getUrl(), actual.getUrl()); assertEquals("Wrong path.", expected.getPath(), actual.getPath()); assertEquals("Wrong title.", expected.getTitle(), actual.getTitle()); assertEquals("Wrong description.", expected.getDescription(), actual.getDescription()); assertEquals("Wrong date.", expected.getPublishDate(), actual.getPublishDate()); assertEquals("Wrong duration.", expected.getDuration(), actual.getDuration()); assertEquals("Wrong bytes total.", expected.getBytesTotal(), actual.getBytesTotal()); assertEquals("Wrong bytes downloaded.", expected.getBytesDownloaded(), actual.getBytesDownloaded()); assertSame("Wrong status.", expected.getStatus(), actual.getStatus()); assertEquals("Wrong error message.", expected.getErrorMessage(), actual.getErrorMessage()); } }