package com.pugh.sockso.music;
import com.pugh.sockso.Constants;
import com.pugh.sockso.Properties;
import com.pugh.sockso.StringProperties;
import com.pugh.sockso.db.Database;
import com.pugh.sockso.tests.SocksoTestCase;
import com.pugh.sockso.tests.TestDatabase;
import com.pugh.sockso.web.BadRequestException;
import com.pugh.sockso.web.User;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import static junit.framework.Assert.assertEquals;
import static org.easymock.EasyMock.*;
public class TrackTest extends SocksoTestCase {
private Track track;
private Properties p;
private User user;
@Override
public void setUp() {
final int artistId = 1, albumId = 1, trackId = 1, genreId = 1;
final String artistName = "foo-%/", albumName = "bar", albumYear="baz", trackName = "oof%%^\\+", trackPath = "rab";
final String genreName = "rock";
final int trackNumber = 1;
final Date dateAdded = new Date();
final Artist artist = new Artist.Builder()
.id(artistId)
.name(artistName)
.build();
final Album album = new Album.Builder()
.artist(artist)
.id(albumId)
.name(albumName)
.year(albumYear)
.build();
track = new Track.Builder()
.artist(artist)
.album(album)
.genre(new Genre( genreId, genreName ))
.id(trackId)
.name(trackName)
.number(trackNumber)
.path(trackPath)
.dateAdded(dateAdded)
.build();
p = new StringProperties();
user = new User( 1, "name", null, null, 123, "ABC", true );
}
public void testGetters() {
final int artistId = -1, albumId = -1, trackId = -1, genreId = -1;
final String artistName = "foo", albumName = "bar", albumYear = "baz", trackName = "oof", trackPath = "rab";
final String genreName = "rock";
final int trackNumber = 1;
final Date dateAdded = new Date();
final Artist artist = new Artist.Builder()
.id(artistId)
.name(artistName)
.build();
final Album album = new Album.Builder()
.artist(artist)
.id(albumId)
.name(albumName)
.year(albumYear)
.build();
final Genre genre = new Genre( genreId, genreName );
Track.Builder builder = new Track.Builder();
builder.artist(artist)
.album(album)
.genre(genre)
.id(trackId)
.name(trackName)
.number(trackNumber)
.path(trackPath)
.dateAdded(dateAdded);
track = builder.build();
assertEquals( artist, track.getArtist() );
assertEquals( album, track.getAlbum() );
assertEquals( genre, track.getGenre() );
assertEquals( trackPath, track.getPath() );
assertEquals( trackNumber, track.getNumber() );
}
public void testSetPlayCount() {
final int playCount = 456;
Track.Builder builder = new Track.Builder();
builder.album(null)
.artist(null)
.album(null)
.genre(null)
.id(-1)
.name("")
.number(-1)
.path("")
.dateAdded(null);
track = builder.build();
assertEquals( 0, track.getPlayCount() );
track.setPlayCount( playCount );
assertEquals( playCount, track.getPlayCount() );
}
public void testCreateFromResultSet() {
final ResultSet rs = createNiceMock( ResultSet.class );
replay( rs );
try {
final Track track = Track.createFromResultSet( rs );
assertNotNull( track );
}
catch ( SQLException e ) {
fail( e.getMessage() );
}
}
public void testCreateListFromResultSet() throws SQLException {
final String albumName = "my album name";
final String albumYear = "1984";
final String genre = "rock";
// set up result set to return the info for 1 track
final ResultSet rs = createMock( ResultSet.class );
expect( rs.next() ).andReturn( true );
expect( rs.getInt("artistId") ).andReturn( -1 );
expect( rs.getString("artistName") ).andReturn( albumName );
expect( rs.getDate("artistDateAdded") ).andReturn( null ).times( 1 );
expect( rs.getInt("albumId") ).andReturn( -1 );
expect( rs.getString("albumName") ).andReturn( albumName );
expect( rs.getString("albumYear") ).andReturn( albumYear );
expect( rs.getDate("albumDateAdded") ).andReturn( null ).times( 1 );
expect( rs.getInt("genreId") ).andReturn( -1 );
expect( rs.getString("genreName") ).andReturn( genre );
expect( rs.getInt("trackId") ).andReturn( -1 );
expect( rs.getString((String)anyObject()) ).andReturn( "1" ).times( 2 );
expect( rs.getInt("trackNo") ).andReturn( 1 ).times( 1 );
expect( rs.getDate("dateAdded") ).andReturn( null ).times( 1 );
expect( rs.next() ).andReturn( false );
replay( rs );
try {
final List<Track> tracks = Track.createListFromResultSet( rs );
assertNotNull( tracks );
assertEquals( 1, tracks.size() );
final Track track = tracks.get( 0 );
assertEquals( albumName, track.getAlbum().getName() );
assertEquals( albumYear, track.getAlbum().getYear() );
assertEquals( genre, track.getGenre().getName() );
verify( rs );
}
catch ( SQLException e ) {
fail( e.getMessage() );
}
}
public void testGetSelectSql() {
final String sql = Track.getSelectSql();
assertNotNull( sql );
assertTrue( sql.length() > 0 );
assertTrue( sql.matches(".*select.*") );
}
public void testGetSelectFromSql() {
final String sql = Track.getSelectFromSql();
assertNotNull( sql );
assertTrue( sql.length() > 0 );
assertTrue( sql.matches(".*select.*") );
assertTrue( sql.matches(".*from tracks.*") );
}
public void testTracks() throws SQLException {
final ResultSet rs = createMock( ResultSet.class );
expect( rs.next() ).andReturn( false );
rs.close();
replay( rs );
final PreparedStatement st = createMock( PreparedStatement.class );
expect( st.executeQuery() ).andReturn( rs );
st.close();
replay( st );
final Database db = createMock( Database.class );
expect( db.prepare((String)anyObject()) ).andReturn( st );
replay( db );
try {
final List<Track> tracks = Track.getTracks( db, "ar", -1 );
verify( rs );
verify( db );
}
catch ( BadRequestException e ) {
fail ( e.getMessage() );
}
catch ( SQLException e ) {
fail( e.getMessage() );
}
}
public void getTracksFromPlayArgs() throws SQLException {
final ResultSet rs = createMock( ResultSet.class );
expect( rs.next() ).andReturn( false );
rs.close();
replay( rs );
final PreparedStatement st = createMock( PreparedStatement.class );
expect( st.executeQuery() ).andReturn( rs );
st.close();
replay( st );
final Database db = createMock( Database.class );
expect( db.prepare((String)anyObject()) ).andReturn( st );
replay( db );
try {
final String[] args = { "ar123" };
final List<Track> tracks = Track.getTracksFromPlayArgs( db, args );
verify( rs );
verify( db );
}
catch ( BadRequestException e ) {
fail ( e.getMessage() );
}
catch ( SQLException e ) {
fail( e.getMessage() );
}
}
public void testGetStreamUrlIncludesSessionDataIfAuthIsRequiredWhenStreaming() {
p.set( Constants.WWW_USERS_REQUIRE_LOGIN, Properties.YES );
p.set( Constants.STREAM_REQUIRE_LOGIN, Properties.YES );
String url = track.getStreamUrl( p, user );
assertContains( url, "sessionId=123" );
assertContains( url, "sessionCode=ABC" );
}
public void testGetStreamUrlDoesntIncludeSessionDataWhenNotRequired() {
p.set( Constants.WWW_USERS_REQUIRE_LOGIN, Properties.NO );
p.set( Constants.STREAM_REQUIRE_LOGIN, Properties.NO );
String url = track.getStreamUrl( p, user );
assertNotContains( url, "sessionId=123" );
assertNotContains( url, "sessionCode=ABC" );
}
public void testGetStreamUrlReturnsUrlWithTrackId() {
assertContains( track.getStreamUrl(p,user), "/stream/" +track.getId() );
}
public void testGetStreamUrlReturnsUrlWithArtistNameAndTrackNameWithSpecialCharactersRemoved() {
assertEquals( track.getStreamUrl(p,user), "/stream/" +track.getId()+ "/foo-oof" );
}
public void testBasePathIsIncludedInGeneratedStreamUrls() {
p.set( Constants.SERVER_BASE_PATH, "/foo" );
assertContains( track.getStreamUrl(p,user), "/foo/stream/" );
}
public void testGettingTracksForAPathReturnsThoseInThatFolderAndSubFolders() throws Exception {
TestDatabase db = new TestDatabase();
db.fixture( "tracksForPath" );
List<Track> tracks = Track.getTracksFromPath( db, "/music" );
assertEquals( 2, tracks.size() );
}
public void testFindingTrackWithNonExistantIdReturnsNull() throws Exception {
assertNull( Track.find(new TestDatabase(),1) );
}
public void testFindingTrackReturnsIt() throws Exception {
TestDatabase db = new TestDatabase();
db.fixture( "singleTrack" );
Track track = Track.find( db, 1 );
assertEquals( "My Track", track.getName() );
}
public void testFindingTrackReturnsArtistObjectWithTrack() throws Exception {
TestDatabase db = new TestDatabase();
db.fixture( "singleTrack" );
Track track = Track.find( db, 1 );
assertEquals( "My Album", track.getAlbum().getName() );
}
public void testFindingTrackReturnsAlbumObjectWithTrack() throws Exception {
TestDatabase db = new TestDatabase();
db.fixture( "singleTrack" );
Track track = Track.find( db, 1 );
assertEquals( "My Artist", track.getArtist().getName() );
}
public void testFindallReturnsAllTracksRequested() throws Exception {
TestDatabase db = new TestDatabase();
db.fixture( "artistsAlbumsAndTracks" );
List<Track> tracks = Track.findAll( db, 100, 0 );
assertEquals( 3, tracks.size() );
}
public void testFindallCanBeLimited() throws Exception {
TestDatabase db = new TestDatabase();
db.fixture( "artistsAlbumsAndTracks" );
List<Track> tracks = Track.findAll( db, 2, 0 );
assertEquals( 2, tracks.size() );
}
public void testFindallCanBeOffset() throws Exception {
TestDatabase db = new TestDatabase();
db.fixture( "artistsAlbumsAndTracks" );
List<Track> tracks = Track.findAll( db, 100, 1 );
assertEquals( 2, tracks.size() );
}
public void testFindallWithLimitOfMinusOneMeansNoLimit() throws Exception {
TestDatabase db = new TestDatabase();
db.fixture( "artistsAlbumsAndTracks" );
List<Track> tracks = Track.findAll( db, -1, 0 );
assertEquals( 3, tracks.size() );
}
public void testTracksAreEqualWhenTheyHaveTheSameId() {
Track.Builder builder = new Track.Builder();
builder.artist(null)
.album(null)
.genre(null)
.id(1)
.name("")
.number(0)
.path("")
.dateAdded(new Date());
Track track1 = builder.build();
Track track2 = builder.dateAdded(new Date()).build();
assertTrue( track1.equals(track2) );
}
public void testTracksAreNotEqualWhenTheyHaveDifferentIds() {
Track.Builder builder = new Track.Builder();
builder.artist(null)
.album(null)
.genre(null)
.id(1)
.name("")
.number(0)
.path("")
.dateAdded(new Date());
Track track1 = builder.build();
Track track2 = builder.id(2).dateAdded(new Date()).build();
assertFalse( track1.equals(track2) );
}
public void testTracksAreNotEqualToOtherObjects() {
Track.Builder builder = new Track.Builder();
builder.artist(null)
.album(null)
.genre(null)
.id(1)
.name("")
.number(0)
.path("")
.dateAdded(new Date());
track = builder.build();
Album album = new Album.Builder().build();
assertFalse( track.equals(album) );
}
}