package com.pugh.sockso.web.action;
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.TestLocale;
import com.pugh.sockso.tests.TestRequest;
import com.pugh.sockso.tests.TestResponse;
import com.pugh.sockso.tests.TestUtils;
import com.pugh.sockso.web.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class JsonerTest extends SocksoTestCase {
private TestDatabase db;
private Jsoner js;
private Properties p;
private TestResponse res;
private TestRequest req;
@Override
public void setUp() {
p = new StringProperties();
p.set( Constants.WWW_BROWSE_FOLDERS_ENABLED, Properties.YES );
db = new TestDatabase();
res = new TestResponse();
req = new TestRequest( "GET / HTTP/1.1" );
js = new Jsoner( null, null );
js.setRequest( req );
js.setResponse( res );
js.setLocale( new TestLocale() );
js.setProperties( p );
js.setDatabase( db );
}
public void testConvertPath() {
// check forward slashes are preserved
System.setProperty( "file.separator", "/" );
String path = "/Users/test/some/path";
assertEquals( path, Jsoner.convertPath(path) );
// check backslashes are converted back
System.setProperty( "file.separator", "\\" );
String path2 = "c:/users/test/";
assertEquals( "c:\\users\\test\\", Jsoner.convertPath(path2) );
}
public void testShowTracks() throws IOException {
final List<Track> tracks = new ArrayList<Track>();
final Jsoner j = new Jsoner( null, null );
final Response res = new TestResponse();
final Track track = TestUtils.getTrack();
tracks.add( track );
j.setResponse( res );
j.showTracks( tracks );
}
public void testGetOrderedFiles() throws Exception {
final Jsoner j = new Jsoner( null, null );
final File[] unordered = new File[] {
new File( "first.mp3" ),
new File( "second.mp3" ),
new File( "abba.mp3" ),
new File( "1 - a.mp3" ),
new File( "10 - a.mp3" )
};
final File[] ordered = j.getOrderedFiles( unordered );
assertEquals( ordered[0], unordered[3] );
assertEquals( ordered[1], unordered[4] );
assertEquals( ordered[2], unordered[2] );
assertEquals( ordered[3], unordered[0] );
assertEquals( ordered[4], unordered[1] );
}
public void testReturningJsonServerInfoIncludesAllRequiredFields() throws Exception {
Properties p = new StringProperties();
p.set( Constants.WWW_TITLE, "THEtitle" );
p.set( Constants.WWW_TAGLINE, "THEtagline" );
TestResponse res = new TestResponse();
Jsoner j = new Jsoner( null, null );
j.setProperties( p );
j.setResponse( res );
j.serverinfo();
String data = res.getOutput();
assertContains( data, "title" );
assertContains( data, "THEtitle" );
assertContains( data, "tagline" );
assertContains( data, "THEtagline" );
assertContains( data, "version" );
//assertContains( data, Sockso.VERSION ); // ?
assertContains( data, "requiresLogin" );
assertContains( data, "0" );
}
public void testServerInfoReturnsRequireLoginAsOneWhenItIsEnabled() throws Exception {
Properties p = new StringProperties();
p.set( Constants.WWW_USERS_REQUIRE_LOGIN, Properties.YES );
TestResponse res = new TestResponse();
Jsoner j = new Jsoner( null, null );
j.setResponse( res );
j.setProperties( p );
j.serverinfo();
String data = res.getOutput();
assertContains( data, "requiresLogin\":\"1\"" );
}
public void testDoubleQuotesAreEscapedInServerInfoStrings() throws Exception {
Properties p = new StringProperties();
p.set( Constants.WWW_TITLE, "THE\"title" );
p.set( Constants.WWW_TAGLINE, "THE\"tagline" );
TestResponse res = new TestResponse();
Jsoner j = new Jsoner( null, null );
j.setProperties( p );
j.setResponse( res );
j.serverinfo();
String data = res.getOutput();
assertContains( data, "THE\\\"title" );
assertContains( data, "THE\\\"tagline" );
}
public void testLoginNotRequiredWhenServerInfoRequested() {
Request req = new TestRequest( "GET /json/serverinfo HTTP/1.1" );
Jsoner j = new Jsoner( null, null );
j.setRequest( req );
assertFalse( j.requiresLogin() );
}
protected String getTracksForPath() throws Exception {
db.fixture( "tracksForPath" );
req.setArgument( "path", "/music/" );
js.tracksForPath();
return res.getOutput();
}
public void testGettingTracksForAPathOutputsAllThatMatch() throws Exception {
String json = getTracksForPath();
assertContains( json, "\"1\"" );
assertContains( json, "\"2\"" );
}
public void testGettingTracksForAPathDoesntReturnTracksThatDontMatch() throws Exception {
String json = getTracksForPath();
assertNotContains( json, "\"3\"" );
}
public void testGettingTracksForAPathReturnsTheTracksOrderedByTheFullPath() throws Exception {
String json = getTracksForPath();
if ( json.indexOf("\"2\"") > json.indexOf("\"1\"") ) {
fail( "Track 2 should have been ordered before track 1" );
}
}
public void testTrackSearchResultsIncludeTheArtist() throws Exception {
db.fixture( "singleTrack" );
js.setRequest(getRequest( "/json/search/My+Track" ));
js.handleRequest();
assertContains( res.getOutput(), "My Artist" );
}
public void testTrackSearchResultsIncludeTheAlbum() throws Exception {
db.fixture( "singleTrack" );
js.setRequest(getRequest( "/json/search/My+Track" ));
js.handleRequest();
assertContains( res.getOutput(), "My Album" );
}
public void testAlbumSearchResultsIncludeTheArtist() throws Exception {
db.fixture( "singleTrack" );
js.setRequest(getRequest( "/json/search/My+Album" ));
js.handleRequest();
assertContains( res.getOutput(), "My Artist" );
}
}