/* * UsererTest.java * * Created on Aug 4, 2007, 10:38:33 AM * * Tests the Userer class * */ 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.Utils; import com.pugh.sockso.auth.DBAuthenticator; import com.pugh.sockso.db.Database; import com.pugh.sockso.music.Album; import com.pugh.sockso.music.Artist; import com.pugh.sockso.music.Genre; import com.pugh.sockso.music.Track; import com.pugh.sockso.resources.Locale; 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.BadRequestException; import com.pugh.sockso.web.HttpResponseCookie; import com.pugh.sockso.web.Request; import com.pugh.sockso.web.Response; import com.pugh.sockso.web.Submission; import com.pugh.sockso.web.User; import java.io.IOException; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.List; import static junit.framework.Assert.assertTrue; import static org.easymock.EasyMock.*; public class UsererTest extends SocksoTestCase { private Properties testProperties; private Locale testLocale; private User testUser; private Database db; private Properties p; private TestRequest req; private TestResponse resp; private Userer u; @Override public void setUp() { testLocale = createNiceMock( Locale.class ); replay( testLocale ); testProperties = createNiceMock( Properties.class ); expect( testProperties.get((String)anyObject()) ).andReturn( "" ).anyTimes(); expect( testProperties.getProperties() ).andReturn( new String[] {} ); replay( testProperties ); testUser = new User( -1, "foo" ); db = new TestDatabase(); p = new StringProperties(); req = new TestRequest( "" ); resp = new TestResponse(); u = new Userer(); u.addAuthenticator( new DBAuthenticator(db) ); u.setDatabase( db ); u.setRequest( req ); u.setProperties( p ); u.setResponse( resp ); u.setLocale( new TestLocale() ); } public void testRegisterUser() throws Exception { req.setArgument("name", "foo"); req.setArgument("name", "foo" ); req.setArgument("pass1", "p1" ); req.setArgument("pass2", "p1" ); req.setArgument("email", "ps@ubm.com" ); u.registerUser(); User user = User.find( db, 0 ); assertEquals("foo", user.getName()); assertEquals("ps@ubm.com", user.getEmail()); } public void testNewUsersAreCreatedAsActiveByDefault() throws Exception { req.setArgument( "name", "foobar" ); req.setArgument( "pass1", "abc" ); req.setArgument( "pass2", "abc" ); req.setArgument( "email", "test@foo.com" ); u.registerUser(); User user = User.find( db, 0 ); assertTrue( user.isActive() ); } public void testUsersAreCreatedAsInactiveWhenActivationIsRequired() throws Exception { p.set( Constants.WWW_USERS_REQUIRE_ACTIVATION, Properties.YES ); req.setArgument( "name", "foobar" ); req.setArgument( "pass1", "abc" ); req.setArgument( "pass2", "abc" ); req.setArgument( "email", "test@foo.com" ); u.registerUser(); User user = User.find( db, 0 ); assertFalse( user.isActive() ); } public void testNoSessionCreatedForUserWhenTheyNeedToBeActivated() throws Exception { p.set( Constants.WWW_USERS_REQUIRE_ACTIVATION, Properties.YES ); req.setArgument( "name", "foobar" ); req.setArgument( "pass1", "abc" ); req.setArgument( "pass2", "abc" ); req.setArgument( "email", "test@foo.com" ); u.registerUser(); User user = User.find( db, 0 ); assertEquals( "", user.getSessionCode() ); assertEquals( -1, user.getSessionId() ); } public void testUserLoginFailsWhenUserIsNotActive() throws Exception { boolean gotException = false; try { User user = new User( -1, "foo", "bar", "doo@dpp.com" ); user.setActive( false ); user.save( db ); u.loginUser( "foo", "bar" ); } catch ( Exception e ) { gotException = true; } finally { assertTrue( gotException ); } } public void testLogout() throws IOException { Database db = createMock( Database.class ); Request req = new TestRequest( "/" ); Response res = createMock( Response.class ); Locale locale = createNiceMock( Locale.class ); Userer u = new Userer(); u.setRequest( req ); u.setResponse( res ); u.setLocale( locale ); u.setProperties( new StringProperties() ); res.addCookie( (HttpResponseCookie) anyObject() ); res.addCookie( (HttpResponseCookie) anyObject() ); res.redirect( "/" ); replay( res ); u.logout(); verify( res ); } public void testRequireLoginNoRedirect() throws IOException { final Response res = createMock( Response.class ); replay( res ); final Userer u = new Userer(); u.setUser( new User(1,"foo") ); u.setResponse( res ); u.requireLogin(); verify( res ); } public void testRequireLoginWithRedirect() throws IOException { final Response res = createMock( Response.class ); res.redirect( "/user/login" ); replay( res ); final Userer u = new Userer(); u.setUser( null ); u.setResponse( res ); u.setProperties( new StringProperties() ); u.requireLogin(); verify( res ); } public void testUpdateUser() throws SQLException { final User user = new User( 1, "bar" ); final Request req = createMock( Request.class ); expect( req.getArgument("email") ).andReturn( "foo@bar.com" ); expect( req.getArgument("pass1") ).andReturn( "secret" ); replay( req ); final PreparedStatement st = createMock( PreparedStatement.class ); st.setString( 1, "foo@bar.com" ); st.setString( 2, Utils.md5("secret") ); st.setInt( 3, user.getId() ); expect( st.execute() ).andReturn( true ); st.close(); replay( st ); final Database db = createMock( Database.class ); expect( db.prepare((String)anyObject()) ).andReturn( st ).times( 1 ); replay( db ); final Userer u = new Userer(); u.setDatabase( db ); u.setUser( user ); u.setRequest( req ); u.updateUser(); verify( db ); verify( st ); verify( req ); } public void testShowUserUpdated() throws Exception { final User user = new User( 1, "foo" ); final Userer u = new Userer(); final TestResponse res = new TestResponse(); u.setResponse( res ); u.showUserUpdated(); final String data = res.getOutput(); assertTrue( data.length() > 0 ); } public void testShowUserEdit() throws Exception { final Userer u = new Userer(); final TestResponse res = new TestResponse(); u.setResponse( res ); u.showUserEdit(); final String data = res.getOutput(); assertTrue( data.length() > 0 ); } public void testShowUserRegister() throws Exception { final Userer u = new Userer(); final TestResponse res = new TestResponse(); u.setResponse( res ); u.showUserRegister(); final String data = res.getOutput(); assertTrue( data.length() > 0 ); } public void testShowUserLogin() throws Exception { final Userer u = new Userer(); final TestResponse res = new TestResponse(); u.setResponse( res ); u.showUserLogin(); final String data = res.getOutput(); assertTrue( data.length() > 0 ); } public void testShowUserRegistered() throws Exception { final Userer u = new Userer(); final TestResponse res = new TestResponse(); res.setUser( null ); u.setResponse( res ); u.showUserRegistered( testUser ); final String data = res.getOutput(); assertTrue( data.length() > 0 ); assertTrue( data.contains(testUser.getName()) ); } public void testGetUpdateSubmission() { final Request req = createMock( Request.class ); expect( req.getArgument("email") ).andReturn( "foo@bar.com" ); expect( req.getArgument("pass1") ).andReturn( "one" ); expect( req.getArgument("pass2") ).andReturn( "" ); replay( req ); final Userer u = new Userer(); u.setRequest( req ); u.setLocale( testLocale ); final Submission s = u.getUpdateSubmission(); verify( req ); } public void testMatchingPasswordsRequiredIfSpecified() { final Userer u = new Userer(); final Request req = createMock( Request.class ); expect( req.getArgument("email") ).andReturn( "foo@bar.com" ); expect( req.getArgument("pass1") ).andReturn( "one" ); expect( req.getArgument("pass2") ).andReturn( "" ); replay( req ); u.setRequest( req ); u.setLocale( testLocale ); final Submission s = u.getUpdateSubmission(); boolean gotException = false; try { s.validate(); } catch ( Exception e ) { gotException = true; } assertTrue( gotException ); } public void testGetNonScrobbledTracks() throws SQLException { final User user = new User( 1, "foo" ); final ResultSet rs = createNiceMock( ResultSet.class ); expect( rs.next() ).andReturn( true ).times( 2 ); expect( rs.next() ).andReturn( false ).times( 1 ); rs.close(); replay( rs ); final PreparedStatement st = createMock( PreparedStatement.class ); st.setInt( 1, user.getId() ); expect( st.executeQuery() ).andReturn( rs ); st.close(); replay( st ); final Database db = createMock( Database.class ); expect( db.prepare((String)anyObject()) ).andReturn( st ); replay( db ); final Userer u = new Userer(); u.setDatabase( db ); final List<Track> tracks = u.getNonScrobbledTracks( user ); assertNotNull( tracks ); assertEquals( 2, tracks.size() ); verify( db ); verify( st ); verify( rs ); } public void testGetNonScrobbledTracksQuery() throws Exception { final User user = new User( -1, "foo" ); final Userer u = new Userer(); final Database db = new TestDatabase(); u.setDatabase( db ); u.getNonScrobbledTracks( user ); } public void testMarkUsersTracksScrobbled() throws Exception { final User user = new User( -1, "foo" ); final PreparedStatement st = createMock( PreparedStatement.class ); st.setInt( 1, user.getId() ); expect( st.executeUpdate() ).andReturn( 1 ).times( 1 ); st.close(); replay( st ); final Database db = createMock( Database.class ); expect( db.prepare((String)anyObject()) ).andReturn( st ).times( 1 ); replay( db ); final Userer u = new Userer(); u.setDatabase( db ); u.markUsersTracksScrobbled( user ); verify( db ); verify( st ); } public void testMarkUsersTracksScrobbledQuery() throws Exception { final User user = new User( -1, "foo" ); final Userer u = new Userer(); final Database db = new TestDatabase(); u.setDatabase( db ); u.markUsersTracksScrobbled( user ); } public void testShowScrobbleLog() throws Exception { final TestResponse res = new TestResponse(); final Userer u = new Userer(); final List<Track> tracks = new ArrayList<Track>(); final Artist artist = TestUtils.getArtist(); final Album album = TestUtils.getAlbum(artist); final Genre genre = TestUtils.getGenre(); final Track track = TestUtils.getTrack(artist, album, genre); tracks.add( track ); u.setResponse( res ); u.showScrobbleLog( tracks ); final String data = res.getOutput(); // http headers assertTrue( data.contains("Content-Disposition") ); assertTrue( data.contains(".scrobbler.log") ); // file headers assertTrue( data.contains("#AUDIOSCROBBLER/1.1") ); assertTrue( data.contains("#TZ") ); assertTrue( data.contains("#CLIENT") ); // track info assertTrue( data.contains(artist.getName()) ); assertTrue( data.contains(album.getName()) ); assertTrue( data.contains(track.getName()) ); } public void testUserIsCreatedIfTheyDontExist() throws Exception { final Userer u = new Userer(); final Database db = new TestDatabase(); u.setDatabase( db ); /////// assertTableSize( db, "users", 0 ); u.findOrCreateUser( "foo", "bar" ); assertTableSize( db, "users", 1 ); } public void testExistingUserIsReturnedWhenDoesntExist() throws Exception { final Userer u = new Userer(); final TestDatabase db = new TestDatabase(); db.fixture( "singleUser" ); u.setDatabase( db ); /////// assertTableSize( db, "users", 1 ); assertNotNull( u.findOrCreateUser( "foo", "q" ) ); assertTableSize( db, "users", 1 ); } public void testBadRequestExceptionThrownWhenInvalidLogin() throws Exception { final Userer u = new Userer(); u.setLocale( createNiceMock(Locale.class) ); boolean gotException = false; try { u.loginUser( "invalid", "user" ); } catch ( final BadRequestException e ) { gotException = true; } assertTrue( gotException ); } }