package com.pugh.sockso.web; import com.pugh.sockso.Constants; import com.pugh.sockso.Properties; import com.pugh.sockso.StringProperties; import com.pugh.sockso.music.Track; import com.pugh.sockso.tests.SocksoTestCase; import com.pugh.sockso.tests.TestDatabase; import com.pugh.sockso.tests.TestRequest; import java.util.Arrays; public class TracksRequestTest extends SocksoTestCase { private Properties p; private TestDatabase db; private TestRequest req; @Override protected void setUp() { p = new StringProperties(); p.set( Constants.WWW_BROWSE_FOLDERS_ENABLED, Properties.YES ); db = new TestDatabase(); } protected TracksRequest getInstance( final String resource ) throws Exception { req = new TestRequest( "GET " +resource+ " HTTP/1.1" ); db.fixture( "artistsAlbumsAndTracks" ); return new TracksRequest( req, db, p ); } public void testTracksAreFetchedFromUrlParameters() throws Exception { TracksRequest tr = getInstance( "/foo/tr1/tr2" ); Track[] tracks = tr.getRequestedTracks(); assertEquals( 2, tracks.length ); } public void testTracksAreFetchedFromThePathArgument() throws Exception { TracksRequest tr = getInstance( "/foo?path=%2Fmusic%2Ffolder" ); Track[] tracks = tr.getRequestedTracks(); assertEquals( 2, tracks.length ); } public void testPathArgumentIgnoredWhenFolderBrowsingIsNotEnabled() throws Exception { p.set( Constants.WWW_BROWSE_FOLDERS_ENABLED, Properties.NO ); TracksRequest tr = getInstance( "/foo?path=%2Fmusic%2Ffolder" ); Track[] tracks = tr.getRequestedTracks(); assertEquals( 0, tracks.length ); } public void testTracksCanBeRandomisedUsingOrderbyParameter() throws Exception { assertTrue( doRandomTest("random") ); } public void testTracksNotRandomisedByDefault() throws Exception { assertFalse( doRandomTest("") ); } // this method tests randomizing of requested tracks. it tries a maximum of // 100 times fetching 2 samples and checking if they're as expected. this // could *possibly* fail, and 100 might need to be increased to provide // sufficiently low probability of this (or develop a better way of testing // the randomness. protected boolean doRandomTest( final String orderBy ) throws Exception { boolean wereDifferent = false; for ( int i=0; i<100; i++ ) { db = new TestDatabase(); TracksRequest tr = getInstance( "/tr1/tr2/tr3" ); req.setArgument( "orderBy", orderBy ); Track[] first = tr.getRequestedTracks(); Track[] second = tr.getRequestedTracks(); if ( !Arrays.equals(first,second) ) { wereDifferent = true; } } return wereDifferent; } public void testRandomTracksReturnedUseRandomLimitProperty() throws Exception { p.set( Constants.WWW_RANDOM_TRACK_LIMIT, 2 ); TracksRequest tr = getInstance( "/" ); Track[] tracks = tr.getRandomTracks(); assertEquals( 2, tracks.length ); } public void testRandomTracksReturnedUseDefaultLimitWhenNotSpecifiedByAProperty() throws Exception { TracksRequest tr = getInstance( "/" ); Track[] tracks = tr.getRandomTracks(); assertEquals( 3, tracks.length ); } public void testRandomTracksReturnedCanBeFilteredByType() throws Exception { TracksRequest tr = getInstance( "" ); db.update( " update tracks set path = '/music/track.ogg' where id = 2 " ); req.setArgument( "trackType", "mp3" ); Track[] tracks = tr.getRandomTracks(); assertEquals( 2, tracks.length ); } }