diff options
Diffstat (limited to 'subsonic-main/src/test/java/net/sourceforge/subsonic/dao')
7 files changed, 977 insertions, 0 deletions
diff --git a/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/DaoTestCaseBase.java b/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/DaoTestCaseBase.java new file mode 100644 index 00000000..8d3a7f88 --- /dev/null +++ b/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/DaoTestCaseBase.java @@ -0,0 +1,83 @@ +package net.sourceforge.subsonic.dao; + +import junit.framework.TestCase; +import net.sourceforge.subsonic.util.FileUtil; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.io.File; + +/** + * Superclass for all DAO test cases. + * Creates and configures the DAO's, and resets the test database. + * + * @author Sindre Mehus + */ +public abstract class DaoTestCaseBase extends TestCase { + + /** Do not re-create database if it is less than one hour old. */ + private static final long MAX_DB_AGE_MILLIS = 60L * 60 * 1000; + + static { + deleteDatabase(); + } + + private DaoHelper daoHelper; + protected PlayerDao playerDao; + protected InternetRadioDao internetRadioDao; + protected RatingDao ratingDao; + protected MusicFolderDao musicFolderDao; + protected UserDao userDao; + protected TranscodingDao transcodingDao; + protected PodcastDao podcastDao; + + protected DaoTestCaseBase() { + daoHelper = new DaoHelper(); + + playerDao = new PlayerDao(); + internetRadioDao = new InternetRadioDao(); + ratingDao = new RatingDao(); + musicFolderDao = new MusicFolderDao(); + userDao = new UserDao(); + transcodingDao = new TranscodingDao(); + podcastDao = new PodcastDao(); + + playerDao.setDaoHelper(daoHelper); + internetRadioDao.setDaoHelper(daoHelper); + ratingDao.setDaoHelper(daoHelper); + musicFolderDao.setDaoHelper(daoHelper); + userDao.setDaoHelper(daoHelper); + transcodingDao.setDaoHelper(daoHelper); + podcastDao.setDaoHelper(daoHelper); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + getJdbcTemplate().execute("shutdown"); + } + + protected JdbcTemplate getJdbcTemplate() { + return daoHelper.getJdbcTemplate(); + } + + private static void deleteDatabase() { + File subsonicHome = new File("/tmp/subsonic"); + File dbHome = new File(subsonicHome, "db"); + System.setProperty("subsonic.home", subsonicHome.getPath()); + + long now = System.currentTimeMillis(); + if (now - dbHome.lastModified() > MAX_DB_AGE_MILLIS) { + System.out.println("Resetting test database: " + dbHome); + delete(dbHome); + } + } + + private static void delete(File file) { + if (file.isDirectory()) { + for (File child : FileUtil.listFiles(file)) { + delete(child); + } + } + file.delete(); + } +} diff --git a/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/InternetRadioDaoTestCase.java b/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/InternetRadioDaoTestCase.java new file mode 100644 index 00000000..5e5c64e7 --- /dev/null +++ b/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/InternetRadioDaoTestCase.java @@ -0,0 +1,67 @@ +package net.sourceforge.subsonic.dao; + +import java.util.Date; + +import net.sourceforge.subsonic.domain.InternetRadio; + +/** + * Unit test of {@link InternetRadioDao}. + * + * @author Sindre Mehus + */ +public class InternetRadioDaoTestCase extends DaoTestCaseBase { + + protected void setUp() throws Exception { + getJdbcTemplate().execute("delete from internet_radio"); + } + + public void testCreateInternetRadio() { + InternetRadio radio = new InternetRadio("name", "streamUrl", "homePageUrl", true, new Date()); + internetRadioDao.createInternetRadio(radio); + + InternetRadio newRadio = internetRadioDao.getAllInternetRadios().get(0); + assertInternetRadioEquals(radio, newRadio); + } + + public void testUpdateInternetRadio() { + InternetRadio radio = new InternetRadio("name", "streamUrl", "homePageUrl", true, new Date()); + internetRadioDao.createInternetRadio(radio); + radio = internetRadioDao.getAllInternetRadios().get(0); + + radio.setName("newName"); + radio.setStreamUrl("newStreamUrl"); + radio.setHomepageUrl("newHomePageUrl"); + radio.setEnabled(false); + radio.setChanged(new Date(234234L)); + internetRadioDao.updateInternetRadio(radio); + + InternetRadio newRadio = internetRadioDao.getAllInternetRadios().get(0); + assertInternetRadioEquals(radio, newRadio); + } + + public void testDeleteInternetRadio() { + assertEquals("Wrong number of radios.", 0, internetRadioDao.getAllInternetRadios().size()); + + internetRadioDao.createInternetRadio(new InternetRadio("name", "streamUrl", "homePageUrl", true, new Date())); + assertEquals("Wrong number of radios.", 1, internetRadioDao.getAllInternetRadios().size()); + + internetRadioDao.createInternetRadio(new InternetRadio("name", "streamUrl", "homePageUrl", true, new Date())); + assertEquals("Wrong number of radios.", 2, internetRadioDao.getAllInternetRadios().size()); + + internetRadioDao.deleteInternetRadio(internetRadioDao.getAllInternetRadios().get(0).getId()); + assertEquals("Wrong number of radios.", 1, internetRadioDao.getAllInternetRadios().size()); + + internetRadioDao.deleteInternetRadio(internetRadioDao.getAllInternetRadios().get(0).getId()); + assertEquals("Wrong number of radios.", 0, internetRadioDao.getAllInternetRadios().size()); + } + + private void assertInternetRadioEquals(InternetRadio expected, InternetRadio actual) { + assertEquals("Wrong name.", expected.getName(), actual.getName()); + assertEquals("Wrong stream url.", expected.getStreamUrl(), actual.getStreamUrl()); + assertEquals("Wrong home page url.", expected.getHomepageUrl(), actual.getHomepageUrl()); + assertEquals("Wrong enabled state.", expected.isEnabled(), actual.isEnabled()); + assertEquals("Wrong changed date.", expected.getChanged(), actual.getChanged()); + } + + +}
\ No newline at end of file diff --git a/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/MusicFolderDaoTestCase.java b/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/MusicFolderDaoTestCase.java new file mode 100644 index 00000000..b65e8b17 --- /dev/null +++ b/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/MusicFolderDaoTestCase.java @@ -0,0 +1,85 @@ +/* + This file is part of Subsonic. + + Subsonic is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Subsonic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Subsonic. If not, see <http://www.gnu.org/licenses/>. + + Copyright 2009 (C) Sindre Mehus + */ +package net.sourceforge.subsonic.dao; + +import java.io.File; +import java.util.Date; + +import net.sourceforge.subsonic.domain.MusicFolder; + +/** + * Unit test of {@link MusicFolderDao}. + * + * @author Sindre Mehus + */ +public class MusicFolderDaoTestCase extends DaoTestCaseBase { + + @Override + protected void setUp() throws Exception { + getJdbcTemplate().execute("delete from music_folder"); + } + + public void testCreateMusicFolder() { + MusicFolder musicFolder = new MusicFolder(new File("path"), "name", true, new Date()); + musicFolderDao.createMusicFolder(musicFolder); + + MusicFolder newMusicFolder = musicFolderDao.getAllMusicFolders().get(0); + assertMusicFolderEquals(musicFolder, newMusicFolder); + } + + public void testUpdateMusicFolder() { + MusicFolder musicFolder = new MusicFolder(new File("path"), "name", true, new Date()); + musicFolderDao.createMusicFolder(musicFolder); + musicFolder = musicFolderDao.getAllMusicFolders().get(0); + + musicFolder.setPath(new File("newPath")); + musicFolder.setName("newName"); + musicFolder.setEnabled(false); + musicFolder.setChanged(new Date(234234L)); + musicFolderDao.updateMusicFolder(musicFolder); + + MusicFolder newMusicFolder = musicFolderDao.getAllMusicFolders().get(0); + assertMusicFolderEquals(musicFolder, newMusicFolder); + } + + public void testDeleteMusicFolder() { + assertEquals("Wrong number of music folders.", 0, musicFolderDao.getAllMusicFolders().size()); + + musicFolderDao.createMusicFolder(new MusicFolder(new File("path"), "name", true, new Date())); + assertEquals("Wrong number of music folders.", 1, musicFolderDao.getAllMusicFolders().size()); + + musicFolderDao.createMusicFolder(new MusicFolder(new File("path"), "name", true, new Date())); + assertEquals("Wrong number of music folders.", 2, musicFolderDao.getAllMusicFolders().size()); + + musicFolderDao.deleteMusicFolder(musicFolderDao.getAllMusicFolders().get(0).getId()); + assertEquals("Wrong number of music folders.", 1, musicFolderDao.getAllMusicFolders().size()); + + musicFolderDao.deleteMusicFolder(musicFolderDao.getAllMusicFolders().get(0).getId()); + assertEquals("Wrong number of music folders.", 0, musicFolderDao.getAllMusicFolders().size()); + } + + private void assertMusicFolderEquals(MusicFolder expected, MusicFolder actual) { + assertEquals("Wrong name.", expected.getName(), actual.getName()); + assertEquals("Wrong path.", expected.getPath(), actual.getPath()); + assertEquals("Wrong enabled state.", expected.isEnabled(), actual.isEnabled()); + assertEquals("Wrong changed date.", expected.getChanged(), actual.getChanged()); + } + + +}
\ No newline at end of file diff --git a/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/PlayerDaoTestCase.java b/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/PlayerDaoTestCase.java new file mode 100644 index 00000000..9bf949f5 --- /dev/null +++ b/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/PlayerDaoTestCase.java @@ -0,0 +1,165 @@ +package net.sourceforge.subsonic.dao; + +import java.util.Date; +import java.util.List; + +import net.sourceforge.subsonic.domain.CoverArtScheme; +import net.sourceforge.subsonic.domain.Player; +import net.sourceforge.subsonic.domain.PlayerTechnology; +import net.sourceforge.subsonic.domain.PlayQueue; +import net.sourceforge.subsonic.domain.TranscodeScheme; + +/** + * Unit test of {@link PlayerDao}. + * + * @author Sindre Mehus + */ +public class PlayerDaoTestCase extends DaoTestCaseBase { + + @Override + protected void setUp() throws Exception { + getJdbcTemplate().execute("delete from player"); + } + + public void testCreatePlayer() { + Player player = new Player(); + player.setName("name"); + player.setType("type"); + player.setUsername("username"); + player.setIpAddress("ipaddress"); + player.setDynamicIp(false); + player.setAutoControlEnabled(false); + player.setTechnology(PlayerTechnology.EXTERNAL_WITH_PLAYLIST); + player.setClientId("android"); + player.setLastSeen(new Date()); + player.setCoverArtScheme(CoverArtScheme.LARGE); + player.setTranscodeScheme(TranscodeScheme.MAX_160); + + playerDao.createPlayer(player); + Player newPlayer = playerDao.getAllPlayers().get(0); + assertPlayerEquals(player, newPlayer); + + Player newPlayer2 = playerDao.getPlayerById(newPlayer.getId()); + assertPlayerEquals(player, newPlayer2); + } + + public void testDefaultValues() { + playerDao.createPlayer(new Player()); + Player player = playerDao.getAllPlayers().get(0); + + assertTrue("Player should have dynamic IP by default.", player.isDynamicIp()); + assertTrue("Player should be auto-controlled by default.", player.isAutoControlEnabled()); + assertNull("Player client ID should be null by default.", player.getClientId()); + } + + public void testIdentity() { + Player player = new Player(); + + playerDao.createPlayer(player); + assertEquals("Wrong ID", "1", player.getId()); + assertEquals("Wrong number of players.", 1, playerDao.getAllPlayers().size()); + + playerDao.createPlayer(player); + assertEquals("Wrong ID", "2", player.getId()); + assertEquals("Wrong number of players.", 2, playerDao.getAllPlayers().size()); + + playerDao.createPlayer(player); + assertEquals("Wrong ID", "3", player.getId()); + assertEquals("Wrong number of players.", 3, playerDao.getAllPlayers().size()); + + playerDao.deletePlayer("3"); + playerDao.createPlayer(player); + assertEquals("Wrong ID", "3", player.getId()); + assertEquals("Wrong number of players.", 3, playerDao.getAllPlayers().size()); + + playerDao.deletePlayer("2"); + playerDao.createPlayer(player); + assertEquals("Wrong ID", "4", player.getId()); + assertEquals("Wrong number of players.", 3, playerDao.getAllPlayers().size()); + } + + public void testPlaylist() { + Player player = new Player(); + playerDao.createPlayer(player); + PlayQueue playQueue = player.getPlayQueue(); + assertNotNull("Missing playlist.", playQueue); + + playerDao.deletePlayer(player.getId()); + playerDao.createPlayer(player); + assertNotSame("Wrong playlist.", playQueue, player.getPlayQueue()); + } + + public void testGetPlayersForUserAndClientId() { + Player player = new Player(); + player.setUsername("sindre"); + playerDao.createPlayer(player); + player = playerDao.getAllPlayers().get(0); + + List<Player> players = playerDao.getPlayersForUserAndClientId("sindre", null); + assertFalse("Error in getPlayersForUserAndClientId().", players.isEmpty()); + assertPlayerEquals(player, players.get(0)); + assertTrue("Error in getPlayersForUserAndClientId().", playerDao.getPlayersForUserAndClientId("sindre", "foo").isEmpty()); + + player.setClientId("foo"); + playerDao.updatePlayer(player); + + players = playerDao.getPlayersForUserAndClientId("sindre", null); + assertTrue("Error in getPlayersForUserAndClientId().", players.isEmpty()); + players = playerDao.getPlayersForUserAndClientId("sindre", "foo"); + assertFalse("Error in getPlayersForUserAndClientId().", players.isEmpty()); + assertPlayerEquals(player, players.get(0)); + } + + public void testUpdatePlayer() { + Player player = new Player(); + playerDao.createPlayer(player); + assertPlayerEquals(player, playerDao.getAllPlayers().get(0)); + + player.setName("name"); + player.setType("Winamp"); + player.setTechnology(PlayerTechnology.WEB); + player.setClientId("foo"); + player.setUsername("username"); + player.setIpAddress("ipaddress"); + player.setDynamicIp(true); + player.setAutoControlEnabled(false); + player.setLastSeen(new Date()); + player.setCoverArtScheme(CoverArtScheme.LARGE); + player.setTranscodeScheme(TranscodeScheme.MAX_160); + + playerDao.updatePlayer(player); + Player newPlayer = playerDao.getAllPlayers().get(0); + assertPlayerEquals(player, newPlayer); + } + + public void testDeletePlayer() { + assertEquals("Wrong number of players.", 0, playerDao.getAllPlayers().size()); + + playerDao.createPlayer(new Player()); + assertEquals("Wrong number of players.", 1, playerDao.getAllPlayers().size()); + + playerDao.createPlayer(new Player()); + assertEquals("Wrong number of players.", 2, playerDao.getAllPlayers().size()); + + playerDao.deletePlayer("1"); + assertEquals("Wrong number of players.", 1, playerDao.getAllPlayers().size()); + + playerDao.deletePlayer("2"); + assertEquals("Wrong number of players.", 0, playerDao.getAllPlayers().size()); + } + + private void assertPlayerEquals(Player expected, Player actual) { + assertEquals("Wrong ID.", expected.getId(), actual.getId()); + assertEquals("Wrong name.", expected.getName(), actual.getName()); + assertEquals("Wrong technology.", expected.getTechnology(), actual.getTechnology()); + assertEquals("Wrong client ID.", expected.getClientId(), actual.getClientId()); + assertEquals("Wrong type.", expected.getType(), actual.getType()); + assertEquals("Wrong username.", expected.getUsername(), actual.getUsername()); + assertEquals("Wrong IP address.", expected.getIpAddress(), actual.getIpAddress()); + assertEquals("Wrong dynamic IP.", expected.isDynamicIp(), actual.isDynamicIp()); + assertEquals("Wrong auto control enabled.", expected.isAutoControlEnabled(), actual.isAutoControlEnabled()); + assertEquals("Wrong last seen.", expected.getLastSeen(), actual.getLastSeen()); + assertEquals("Wrong cover art scheme.", expected.getCoverArtScheme(), actual.getCoverArtScheme()); + assertEquals("Wrong transcode scheme.", expected.getTranscodeScheme(), actual.getTranscodeScheme()); + } +}
\ No newline at end of file diff --git a/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/PodcastDaoTestCase.java b/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/PodcastDaoTestCase.java new file mode 100644 index 00000000..f5952c3e --- /dev/null +++ b/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/PodcastDaoTestCase.java @@ -0,0 +1,214 @@ +package net.sourceforge.subsonic.dao; + +import java.util.Date; +import java.util.List; + +import net.sourceforge.subsonic.domain.PodcastChannel; +import net.sourceforge.subsonic.domain.PodcastEpisode; +import net.sourceforge.subsonic.domain.PodcastStatus; + +/** + * Unit test of {@link PodcastDao}. + * + * @author Sindre Mehus + */ +public class PodcastDaoTestCase extends DaoTestCaseBase { + + @Override + protected void setUp() throws Exception { + getJdbcTemplate().execute("delete from podcast_channel"); + } + + 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); + } + + 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"))); + } + + 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.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); + } + + 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()); + } + + 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); + } + + 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); + } + + 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)); + } + + + 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); + } + + 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()); + } + + + 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()); + 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()); + } + +} diff --git a/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/TranscodingDaoTestCase.java b/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/TranscodingDaoTestCase.java new file mode 100644 index 00000000..9cf4441b --- /dev/null +++ b/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/TranscodingDaoTestCase.java @@ -0,0 +1,133 @@ +package net.sourceforge.subsonic.dao; + +import java.util.List; + +import net.sourceforge.subsonic.domain.Player; +import net.sourceforge.subsonic.domain.Transcoding; + +/** + * Unit test of {@link TranscodingDao}. + * + * @author Sindre Mehus + */ +public class TranscodingDaoTestCase extends DaoTestCaseBase { + + @Override + protected void setUp() throws Exception { + getJdbcTemplate().execute("delete from transcoding2"); + } + + public void testCreateTranscoding() { + Transcoding transcoding = new Transcoding(null, "name", "sourceFormats", "targetFormat", "step1", "step2", "step3", false); + transcodingDao.createTranscoding(transcoding); + + Transcoding newTranscoding = transcodingDao.getAllTranscodings().get(0); + assertTranscodingEquals(transcoding, newTranscoding); + } + + public void testUpdateTranscoding() { + Transcoding transcoding = new Transcoding(null, "name", "sourceFormats", "targetFormat", "step1", "step2", "step3", false); + transcodingDao.createTranscoding(transcoding); + transcoding = transcodingDao.getAllTranscodings().get(0); + + transcoding.setName("newName"); + transcoding.setSourceFormats("newSourceFormats"); + transcoding.setTargetFormat("newTargetFormats"); + transcoding.setStep1("newStep1"); + transcoding.setStep2("newStep2"); + transcoding.setStep3("newStep3"); + transcoding.setDefaultActive(true); + transcodingDao.updateTranscoding(transcoding); + + Transcoding newTranscoding = transcodingDao.getAllTranscodings().get(0); + assertTranscodingEquals(transcoding, newTranscoding); + } + + public void testDeleteTranscoding() { + assertEquals("Wrong number of transcodings.", 0, transcodingDao.getAllTranscodings().size()); + + transcodingDao.createTranscoding(new Transcoding(null, "name", "sourceFormats", "targetFormat", "step1", "step2", "step3", true)); + assertEquals("Wrong number of transcodings.", 1, transcodingDao.getAllTranscodings().size()); + + transcodingDao.createTranscoding(new Transcoding(null, "name", "sourceFormats", "targetFormat", "step1", "step2", "step3", true)); + assertEquals("Wrong number of transcodings.", 2, transcodingDao.getAllTranscodings().size()); + + transcodingDao.deleteTranscoding(transcodingDao.getAllTranscodings().get(0).getId()); + assertEquals("Wrong number of transcodings.", 1, transcodingDao.getAllTranscodings().size()); + + transcodingDao.deleteTranscoding(transcodingDao.getAllTranscodings().get(0).getId()); + assertEquals("Wrong number of transcodings.", 0, transcodingDao.getAllTranscodings().size()); + } + + public void testPlayerTranscoding() { + Player player = new Player(); + playerDao.createPlayer(player); + + transcodingDao.createTranscoding(new Transcoding(null, "name", "sourceFormats", "targetFormat", "step1", "step2", "step3", false)); + transcodingDao.createTranscoding(new Transcoding(null, "name", "sourceFormats", "targetFormat", "step1", "step2", "step3", false)); + transcodingDao.createTranscoding(new Transcoding(null, "name", "sourceFormats", "targetFormat", "step1", "step2", "step3", false)); + Transcoding transcodingA = transcodingDao.getAllTranscodings().get(0); + Transcoding transcodingB = transcodingDao.getAllTranscodings().get(1); + Transcoding transcodingC = transcodingDao.getAllTranscodings().get(2); + + List<Transcoding> activeTranscodings = transcodingDao.getTranscodingsForPlayer(player.getId()); + assertEquals("Wrong number of transcodings.", 0, activeTranscodings.size()); + + transcodingDao.setTranscodingsForPlayer(player.getId(), new int[]{transcodingA.getId()}); + activeTranscodings = transcodingDao.getTranscodingsForPlayer(player.getId()); + assertEquals("Wrong number of transcodings.", 1, activeTranscodings.size()); + assertTranscodingEquals(transcodingA, activeTranscodings.get(0)); + + transcodingDao.setTranscodingsForPlayer(player.getId(), new int[]{transcodingB.getId(), transcodingC.getId()}); + activeTranscodings = transcodingDao.getTranscodingsForPlayer(player.getId()); + assertEquals("Wrong number of transcodings.", 2, activeTranscodings.size()); + assertTranscodingEquals(transcodingB, activeTranscodings.get(0)); + assertTranscodingEquals(transcodingC, activeTranscodings.get(1)); + + transcodingDao.setTranscodingsForPlayer(player.getId(), new int[0]); + activeTranscodings = transcodingDao.getTranscodingsForPlayer(player.getId()); + assertEquals("Wrong number of transcodings.", 0, activeTranscodings.size()); + } + + public void testCascadingDeletePlayer() { + Player player = new Player(); + playerDao.createPlayer(player); + + transcodingDao.createTranscoding(new Transcoding(null, "name", "sourceFormats", "targetFormat", "step1", "step2", "step3", true)); + Transcoding transcoding = transcodingDao.getAllTranscodings().get(0); + + transcodingDao.setTranscodingsForPlayer(player.getId(), new int[]{transcoding.getId()}); + List<Transcoding> activeTranscodings = transcodingDao.getTranscodingsForPlayer(player.getId()); + assertEquals("Wrong number of transcodings.", 1, activeTranscodings.size()); + + playerDao.deletePlayer(player.getId()); + activeTranscodings = transcodingDao.getTranscodingsForPlayer(player.getId()); + assertEquals("Wrong number of transcodings.", 0, activeTranscodings.size()); + } + + public void testCascadingDeleteTranscoding() { + Player player = new Player(); + playerDao.createPlayer(player); + + transcodingDao.createTranscoding(new Transcoding(null, "name", "sourceFormats", "targetFormat", "step1", "step2", "step3", true)); + Transcoding transcoding = transcodingDao.getAllTranscodings().get(0); + + transcodingDao.setTranscodingsForPlayer(player.getId(), new int[]{transcoding.getId()}); + List<Transcoding> activeTranscodings = transcodingDao.getTranscodingsForPlayer(player.getId()); + assertEquals("Wrong number of transcodings.", 1, activeTranscodings.size()); + + transcodingDao.deleteTranscoding(transcoding.getId()); + activeTranscodings = transcodingDao.getTranscodingsForPlayer(player.getId()); + assertEquals("Wrong number of transcodings.", 0, activeTranscodings.size()); + } + + private void assertTranscodingEquals(Transcoding expected, Transcoding actual) { + assertEquals("Wrong name.", expected.getName(), actual.getName()); + assertEquals("Wrong source formats.", expected.getSourceFormats(), actual.getSourceFormats()); + assertEquals("Wrong target format.", expected.getTargetFormat(), actual.getTargetFormat()); + assertEquals("Wrong step 1.", expected.getStep1(), actual.getStep1()); + assertEquals("Wrong step 2.", expected.getStep2(), actual.getStep2()); + assertEquals("Wrong step 3.", expected.getStep3(), actual.getStep3()); + assertEquals("Wrong default active.", expected.isDefaultActive(), actual.isDefaultActive()); + } +} diff --git a/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/UserDaoTestCase.java b/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/UserDaoTestCase.java new file mode 100644 index 00000000..24dc9ec5 --- /dev/null +++ b/subsonic-main/src/test/java/net/sourceforge/subsonic/dao/UserDaoTestCase.java @@ -0,0 +1,230 @@ +package net.sourceforge.subsonic.dao; + +import java.util.Date; +import java.util.Locale; + +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.jdbc.core.JdbcTemplate; + +import net.sourceforge.subsonic.domain.AvatarScheme; +import net.sourceforge.subsonic.domain.TranscodeScheme; +import net.sourceforge.subsonic.domain.User; +import net.sourceforge.subsonic.domain.UserSettings; + +/** + * Unit test of {@link UserDao}. + * + * @author Sindre Mehus + */ +public class UserDaoTestCase extends DaoTestCaseBase { + + @Override + protected void setUp() throws Exception { + JdbcTemplate template = getJdbcTemplate(); + template.execute("delete from user_role"); + template.execute("delete from user"); + } + + public void testCreateUser() { + User user = new User("sindre", "secret", "sindre@activeobjects.no", false, 1000L, 2000L, 3000L); + user.setAdminRole(true); + user.setCommentRole(true); + user.setCoverArtRole(true); + user.setDownloadRole(false); + user.setPlaylistRole(true); + user.setUploadRole(false); + user.setPodcastRole(true); + user.setStreamRole(true); + user.setJukeboxRole(true); + user.setSettingsRole(true); + userDao.createUser(user); + + User newUser = userDao.getAllUsers().get(0); + assertUserEquals(user, newUser); + } + + public void testUpdateUser() { + User user = new User("sindre", "secret", null); + user.setAdminRole(true); + user.setCommentRole(true); + user.setCoverArtRole(true); + user.setDownloadRole(false); + user.setPlaylistRole(true); + user.setUploadRole(false); + user.setPodcastRole(true); + user.setStreamRole(true); + user.setJukeboxRole(true); + user.setSettingsRole(true); + userDao.createUser(user); + + user.setPassword("foo"); + user.setEmail("sindre@foo.bar"); + user.setLdapAuthenticated(true); + user.setBytesStreamed(1); + user.setBytesDownloaded(2); + user.setBytesUploaded(3); + user.setAdminRole(false); + user.setCommentRole(false); + user.setCoverArtRole(false); + user.setDownloadRole(true); + user.setPlaylistRole(false); + user.setUploadRole(true); + user.setPodcastRole(false); + user.setStreamRole(false); + user.setJukeboxRole(false); + user.setSettingsRole(false); + userDao.updateUser(user); + + User newUser = userDao.getAllUsers().get(0); + assertUserEquals(user, newUser); + assertEquals("Wrong bytes streamed.", 1, newUser.getBytesStreamed()); + assertEquals("Wrong bytes downloaded.", 2, newUser.getBytesDownloaded()); + assertEquals("Wrong bytes uploaded.", 3, newUser.getBytesUploaded()); + } + + public void testGetUserByName() { + User user = new User("sindre", "secret", null); + userDao.createUser(user); + + User newUser = userDao.getUserByName("sindre"); + assertNotNull("Error in getUserByName().", newUser); + assertUserEquals(user, newUser); + + assertNull("Error in getUserByName().", userDao.getUserByName("sindre2")); + assertNull("Error in getUserByName().", userDao.getUserByName("sindre ")); + assertNull("Error in getUserByName().", userDao.getUserByName("bente")); + assertNull("Error in getUserByName().", userDao.getUserByName("")); + assertNull("Error in getUserByName().", userDao.getUserByName(null)); + } + + public void testDeleteUser() { + assertEquals("Wrong number of users.", 0, userDao.getAllUsers().size()); + + userDao.createUser(new User("sindre", "secret", null)); + assertEquals("Wrong number of users.", 1, userDao.getAllUsers().size()); + + userDao.createUser(new User("bente", "secret", null)); + assertEquals("Wrong number of users.", 2, userDao.getAllUsers().size()); + + userDao.deleteUser("sindre"); + assertEquals("Wrong number of users.", 1, userDao.getAllUsers().size()); + + userDao.deleteUser("bente"); + assertEquals("Wrong number of users.", 0, userDao.getAllUsers().size()); + } + + public void testGetRolesForUser() { + User user = new User("sindre", "secret", null); + user.setAdminRole(true); + user.setCommentRole(true); + user.setPodcastRole(true); + user.setStreamRole(true); + user.setSettingsRole(true); + userDao.createUser(user); + + String[] roles = userDao.getRolesForUser("sindre"); + assertEquals("Wrong number of roles.", 5, roles.length); + assertEquals("Wrong role.", "admin", roles[0]); + assertEquals("Wrong role.", "comment", roles[1]); + assertEquals("Wrong role.", "podcast", roles[2]); + assertEquals("Wrong role.", "stream", roles[3]); + assertEquals("Wrong role.", "settings", roles[4]); + } + + public void testUserSettings() { + assertNull("Error in getUserSettings.", userDao.getUserSettings("sindre")); + + try { + userDao.updateUserSettings(new UserSettings("sindre")); + fail("Expected DataIntegrityViolationException."); + } catch (DataIntegrityViolationException x) { + } + + userDao.createUser(new User("sindre", "secret", null)); + assertNull("Error in getUserSettings.", userDao.getUserSettings("sindre")); + + userDao.updateUserSettings(new UserSettings("sindre")); + UserSettings userSettings = userDao.getUserSettings("sindre"); + assertNotNull("Error in getUserSettings().", userSettings); + assertNull("Error in getUserSettings().", userSettings.getLocale()); + assertNull("Error in getUserSettings().", userSettings.getThemeId()); + assertFalse("Error in getUserSettings().", userSettings.isFinalVersionNotificationEnabled()); + assertFalse("Error in getUserSettings().", userSettings.isBetaVersionNotificationEnabled()); + assertFalse("Error in getUserSettings().", userSettings.isLastFmEnabled()); + assertNull("Error in getUserSettings().", userSettings.getLastFmUsername()); + assertNull("Error in getUserSettings().", userSettings.getLastFmPassword()); + assertSame("Error in getUserSettings().", TranscodeScheme.OFF, userSettings.getTranscodeScheme()); + assertFalse("Error in getUserSettings().", userSettings.isShowNowPlayingEnabled()); + assertEquals("Error in getUserSettings().", -1, userSettings.getSelectedMusicFolderId()); + assertFalse("Error in getUserSettings().", userSettings.isPartyModeEnabled()); + assertFalse("Error in getUserSettings().", userSettings.isNowPlayingAllowed()); + assertSame("Error in getUserSettings().", AvatarScheme.NONE, userSettings.getAvatarScheme()); + assertNull("Error in getUserSettings().", userSettings.getSystemAvatarId()); + + UserSettings settings = new UserSettings("sindre"); + settings.setLocale(Locale.SIMPLIFIED_CHINESE); + settings.setThemeId("midnight"); + settings.setBetaVersionNotificationEnabled(true); + settings.getMainVisibility().setCaptionCutoff(42); + settings.getMainVisibility().setBitRateVisible(true); + settings.getPlaylistVisibility().setCaptionCutoff(44); + settings.getPlaylistVisibility().setYearVisible(true); + settings.setLastFmEnabled(true); + settings.setLastFmUsername("last_user"); + settings.setLastFmPassword("last_pass"); + settings.setTranscodeScheme(TranscodeScheme.MAX_192); + settings.setShowNowPlayingEnabled(false); + settings.setSelectedMusicFolderId(3); + settings.setPartyModeEnabled(true); + settings.setNowPlayingAllowed(true); + settings.setAvatarScheme(AvatarScheme.SYSTEM); + settings.setSystemAvatarId(1); + settings.setChanged(new Date(9412L)); + + userDao.updateUserSettings(settings); + userSettings = userDao.getUserSettings("sindre"); + assertNotNull("Error in getUserSettings().", userSettings); + assertEquals("Error in getUserSettings().", Locale.SIMPLIFIED_CHINESE, userSettings.getLocale()); + assertEquals("Error in getUserSettings().", false, userSettings.isFinalVersionNotificationEnabled()); + assertEquals("Error in getUserSettings().", true, userSettings.isBetaVersionNotificationEnabled()); + assertEquals("Error in getUserSettings().", "midnight", userSettings.getThemeId()); + assertEquals("Error in getUserSettings().", 42, userSettings.getMainVisibility().getCaptionCutoff()); + assertEquals("Error in getUserSettings().", true, userSettings.getMainVisibility().isBitRateVisible()); + assertEquals("Error in getUserSettings().", 44, userSettings.getPlaylistVisibility().getCaptionCutoff()); + assertEquals("Error in getUserSettings().", true, userSettings.getPlaylistVisibility().isYearVisible()); + assertEquals("Error in getUserSettings().", true, userSettings.isLastFmEnabled()); + assertEquals("Error in getUserSettings().", "last_user", userSettings.getLastFmUsername()); + assertEquals("Error in getUserSettings().", "last_pass", userSettings.getLastFmPassword()); + assertSame("Error in getUserSettings().", TranscodeScheme.MAX_192, userSettings.getTranscodeScheme()); + assertFalse("Error in getUserSettings().", userSettings.isShowNowPlayingEnabled()); + assertEquals("Error in getUserSettings().", 3, userSettings.getSelectedMusicFolderId()); + assertTrue("Error in getUserSettings().", userSettings.isPartyModeEnabled()); + assertTrue("Error in getUserSettings().", userSettings.isNowPlayingAllowed()); + assertSame("Error in getUserSettings().", AvatarScheme.SYSTEM, userSettings.getAvatarScheme()); + assertEquals("Error in getUserSettings().", 1, userSettings.getSystemAvatarId().intValue()); + assertEquals("Error in getUserSettings().", new Date(9412L), userSettings.getChanged()); + + userDao.deleteUser("sindre"); + assertNull("Error in cascading delete.", userDao.getUserSettings("sindre")); + } + + private void assertUserEquals(User expected, User actual) { + assertEquals("Wrong name.", expected.getUsername(), actual.getUsername()); + assertEquals("Wrong password.", expected.getPassword(), actual.getPassword()); + assertEquals("Wrong email.", expected.getEmail(), actual.getEmail()); + assertEquals("Wrong LDAP auth.", expected.isLdapAuthenticated(), actual.isLdapAuthenticated()); + assertEquals("Wrong bytes streamed.", expected.getBytesStreamed(), actual.getBytesStreamed()); + assertEquals("Wrong bytes downloaded.", expected.getBytesDownloaded(), actual.getBytesDownloaded()); + assertEquals("Wrong bytes uploaded.", expected.getBytesUploaded(), actual.getBytesUploaded()); + assertEquals("Wrong admin role.", expected.isAdminRole(), actual.isAdminRole()); + assertEquals("Wrong comment role.", expected.isCommentRole(), actual.isCommentRole()); + assertEquals("Wrong cover art role.", expected.isCoverArtRole(), actual.isCoverArtRole()); + assertEquals("Wrong download role.", expected.isDownloadRole(), actual.isDownloadRole()); + assertEquals("Wrong playlist role.", expected.isPlaylistRole(), actual.isPlaylistRole()); + assertEquals("Wrong upload role.", expected.isUploadRole(), actual.isUploadRole()); + assertEquals("Wrong upload role.", expected.isUploadRole(), actual.isUploadRole()); + assertEquals("Wrong stream role.", expected.isStreamRole(), actual.isStreamRole()); + assertEquals("Wrong jukebox role.", expected.isJukeboxRole(), actual.isJukeboxRole()); + assertEquals("Wrong settings role.", expected.isSettingsRole(), actual.isSettingsRole()); + } +}
\ No newline at end of file |