From 1baa85bff11c9091de70f4290640ca30646156b3 Mon Sep 17 00:00:00 2001 From: Dan Helfman Date: Tue, 4 Nov 2008 17:01:07 -0800 Subject: [PATCH] Most unit tests for controller.Forums(). Still need unit tests for controller.Forum.create_thread(). --- controller/Forums.py | 9 +- controller/test/Test_forums.py | 427 ++++++++++++++++++++++++++++++++- 2 files changed, 433 insertions(+), 3 deletions(-) diff --git a/controller/Forums.py b/controller/Forums.py index 73806ba..de69911 100644 --- a/controller/Forums.py +++ b/controller/Forums.py @@ -97,10 +97,17 @@ class Forum( object ): ) def index( self, start = 0, count = 50, user_id = None ): """ - Provide the information necessary to display the current threads within a forum. + Provide the information necessary to display the current threads within a forum (in reverse + chronological order). + @type start: integer or NoneType + @param start: index of first forum thread to display (optional, defaults to 0) + @type count: integer or NoneType + @param count: how many forum threads to display (optional, defaults to quite a few) @type user_id: unicode or NoneType @param user_id: id of the current user + @rtype: unicode + @return: rendered HTML page """ result = self.__users.current( user_id ) parents = [ notebook for notebook in result[ u"notebooks" ] if notebook.trash_id and not notebook.deleted ] diff --git a/controller/test/Test_forums.py b/controller/test/Test_forums.py index 4234d15..68f4228 100644 --- a/controller/test/Test_forums.py +++ b/controller/test/Test_forums.py @@ -1,7 +1,10 @@ +import urllib import cherrypy +from datetime import datetime from model.Note import Note from model.Notebook import Notebook from model.User import User +from model.Tag import Tag from Test_controller import Test_controller @@ -40,16 +43,436 @@ class Test_forums( Test_controller ): self.database.save( self.anonymous ) self.database.execute( self.anonymous.sql_save_notebook( self.anon_notebook.object_id ) ) - def XXXtest_index( self ): # TODO + tag_id = self.database.next_id( Tag, commit = False ) + self.forum_tag = Tag.create( + tag_id, + notebook_id = None, # this tag is not in the namespace of a single notebook + user_id = self.user.object_id, + name = u"forum", + description = u"a discussion forum" + ) + self.database.save( self.forum_tag ) + + self.general_thread = Notebook.create( self.database.next_id( Notebook ), u"Welcome to the general forum!" ) + self.database.save( self.general_thread ) + self.database.execute( + self.anonymous.sql_save_notebook( self.general_thread.object_id, read_write = Notebook.READ_WRITE_FOR_OWN_NOTES ), + ) + self.database.execute( + self.anonymous.sql_save_notebook_tag( self.general_thread.object_id, self.forum_tag.object_id, value = u"general" ), + ) + + self.support_thread = Notebook.create( self.database.next_id( Notebook ), u"Welcome to the support forum!" ) + self.database.save( self.support_thread ) + self.database.execute( + self.anonymous.sql_save_notebook( self.support_thread.object_id, read_write = Notebook.READ_WRITE_FOR_OWN_NOTES ), + ) + self.database.execute( + self.anonymous.sql_save_notebook_tag( self.support_thread.object_id, self.forum_tag.object_id, value = u"support" ), + ) + + def test_index( self ): result = self.http_get( "/forums/" ) assert result assert result.get( u"redirect" ) is None assert result[ u"user" ].username == u"anonymous" - assert len( result[ u"notebooks" ] ) == 1 + assert len( result[ u"notebooks" ] ) == 3 assert result[ u"first_notebook" ] == None assert result[ u"login_url" ] == u"https://luminotes.com/notebooks/%s?note_id=%s" % ( self.anon_notebook.object_id, self.login_note.object_id, ) assert result[ u"logout_url" ] == u"https://luminotes.com/users/logout" assert result[ u"rate_plan" ] + + def test_index_with_login( self ): + self.login() + + result = self.http_get( "/forums/", session_id = self.session_id ) + + assert result + assert result.get( u"redirect" ) is None + assert result[ u"user" ].username == self.user.username + assert len( result[ u"notebooks" ] ) == 4 + assert result[ u"first_notebook" ].object_id == self.notebook.object_id + assert result[ u"login_url" ] == None + assert result[ u"logout_url" ] == u"https://luminotes.com/users/logout" + assert result[ u"rate_plan" ] + + @staticmethod + def __assert_threads_equal( thread1, thread2 ): + assert thread1.object_id == thread2.object_id + assert thread1.revision == thread2.revision + assert thread1.name == thread2.name + assert thread1.trash_id == thread2.trash_id + assert thread1.read_write == thread2.read_write + assert thread1.owner == thread2.owner + assert thread1.deleted == thread2.deleted + assert thread1.user_id == thread2.user_id + assert thread1.rank == thread2.rank + + def test_general( self ): + result = self.http_get( "/forums/general/" ) + + assert result[ u"forum_name" ] == u"general" + assert len( result[ u"threads" ] ) == 1 + + self.__assert_threads_equal( result[ u"threads" ][ 0 ], self.general_thread ) + + assert result[ u"start" ] == 0 + assert result[ u"count" ] == 50 + assert result[ u"total_thread_count" ] == 1 + + def test_support( self ): + result = self.http_get( "/forums/support/" ) + + assert result[ u"forum_name" ] == u"support" + assert len( result[ u"threads" ] ) == 1 + + self.__assert_threads_equal( result[ u"threads" ][ 0 ], self.support_thread ) + + assert result[ u"start" ] == 0 + assert result[ u"count" ] == 50 + assert result[ u"total_thread_count" ] == 1 + + def test_unknown_forum( self ): + result = self.http_get( "/forums/unknown/" ) + + assert u"404" in result[ "body" ][ 0 ] + + def __make_extra_threads( self ): + self.general_thread2 = Notebook.create( self.database.next_id( Notebook ), u"How does this thing work?" ) + self.database.save( self.general_thread2 ) + self.database.execute( + self.anonymous.sql_save_notebook( self.general_thread2.object_id, read_write = Notebook.READ_WRITE_FOR_OWN_NOTES ), + ) + self.database.execute( + self.anonymous.sql_save_notebook_tag( self.general_thread2.object_id, self.forum_tag.object_id, value = u"general" ), + ) + + self.general_thread3 = Notebook.create( self.database.next_id( Notebook ), u"I have a problem with my pantalones." ) + self.database.save( self.general_thread3 ) + self.database.execute( + self.anonymous.sql_save_notebook( self.general_thread3.object_id, read_write = Notebook.READ_WRITE_FOR_OWN_NOTES ), + ) + self.database.execute( + self.anonymous.sql_save_notebook_tag( self.general_thread3.object_id, self.forum_tag.object_id, value = u"general" ), + ) + + def test_general_several_threads( self ): + self.__make_extra_threads() + + result = self.http_get( "/forums/general/" ) + + assert result[ u"forum_name" ] == u"general" + assert len( result[ u"threads" ] ) == 3 + + self.__assert_threads_equal( result[ u"threads" ][ 0 ], self.general_thread3 ) + self.__assert_threads_equal( result[ u"threads" ][ 1 ], self.general_thread2 ) + self.__assert_threads_equal( result[ u"threads" ][ 2 ], self.general_thread ) + + assert result[ u"start" ] == 0 + assert result[ u"count" ] == 50 + assert result[ u"total_thread_count" ] == 3 + + def test_general_several_threads_with_start( self ): + self.__make_extra_threads() + + result = self.http_get( "/forums/general/?start=1" ) + + assert result[ u"forum_name" ] == u"general" + assert len( result[ u"threads" ] ) == 2 + + self.__assert_threads_equal( result[ u"threads" ][ 0 ], self.general_thread2 ) + self.__assert_threads_equal( result[ u"threads" ][ 1 ], self.general_thread ) + + assert result[ u"start" ] == 1 + assert result[ u"count" ] == 50 + assert result[ u"total_thread_count" ] == 3 + + def test_general_several_threads_with_count( self ): + self.__make_extra_threads() + + result = self.http_get( "/forums/general/?count=2" ) + + assert result[ u"forum_name" ] == u"general" + assert len( result[ u"threads" ] ) == 2 + + self.__assert_threads_equal( result[ u"threads" ][ 0 ], self.general_thread3 ) + self.__assert_threads_equal( result[ u"threads" ][ 1 ], self.general_thread2 ) + + assert result[ u"start" ] == 0 + assert result[ u"count" ] == 2 + assert result[ u"total_thread_count" ] == 3 + + def test_general_several_threads_with_start_and_count( self ): + self.__make_extra_threads() + + result = self.http_get( "/forums/general/?start=1&count=1" ) + + assert result[ u"forum_name" ] == u"general" + assert len( result[ u"threads" ] ) == 1 + + self.__assert_threads_equal( result[ u"threads" ][ 0 ], self.general_thread2 ) + + assert result[ u"start" ] == 1 + assert result[ u"count" ] == 1 + assert result[ u"total_thread_count" ] == 3 + + def test_general_thread_default( self ): + result = self.http_get( "/forums/general/%s" % self.general_thread.object_id ) + + assert result.get( u"user" ).object_id == self.anonymous.object_id + assert len( result.get( u"notebooks" ) ) == 3 + assert result.get( u"notebooks" )[ 0 ].object_id == self.anon_notebook.object_id + assert result.get( u"login_url" ) + assert result.get( u"logout_url" ) + assert result.get( u"rate_plan" ) + assert result.get( u"notebook" ).object_id == self.general_thread.object_id + assert len( result.get( u"startup_notes" ) ) == 0 + assert result.get( u"notes" ) == [] + assert result.get( u"parent_id" ) == None + assert result.get( u"note_read_write" ) in ( None, True ) + assert result.get( u"total_notes_count" ) == 0 + + invites = result[ "invites" ] + assert len( invites ) == 0 + + user = self.database.load( User, self.user.object_id ) + assert user.storage_bytes == 0 + + def test_general_thread_default_with_login( self ): + self.login() + + result = self.http_get( + "/forums/general/%s" % self.general_thread.object_id, + session_id = self.session_id, + ) + + assert result.get( u"user" ).object_id == self.user.object_id + assert len( result.get( u"notebooks" ) ) == 4 + assert result.get( u"notebooks" )[ 0 ].object_id == self.notebook.object_id + assert result.get( u"login_url" ) is None + assert result.get( u"logout_url" ) + assert result.get( u"rate_plan" ) + assert result.get( u"notebook" ).object_id == self.general_thread.object_id + assert len( result.get( u"startup_notes" ) ) == 0 + assert result.get( u"notes" ) == [] + assert result.get( u"parent_id" ) == None + assert result.get( u"note_read_write" ) in ( None, True ) + assert result.get( u"total_notes_count" ) == 0 + + invites = result[ "invites" ] + assert len( invites ) == 0 + + user = self.database.load( User, self.user.object_id ) + assert user.storage_bytes == 0 + + def test_general_thread_default_with_unknown_thread_id( self ): + path = "/forums/general/unknownthreadid" + result = self.http_get( path ) + + headers = result.get( "headers" ) + assert headers + assert headers.get( "Location" ) == u"http:///login?after_login=%s" % urllib.quote( path ) + + def __make_notes( self ): + note_id = self.database.next_id( Note, commit = False ) + note = Note.create( + note_id, + u"

foo

bar", + self.general_thread.object_id, + startup = True, + rank = 0, + user_id = self.anonymous.object_id, + creation = datetime.now(), + ) + self.database.save( note, commit = False ) + self.note = note + + note_id = self.database.next_id( Note, commit = False ) + note = Note.create( + note_id, + u"

bar

baz", + self.general_thread.object_id, + startup = True, + rank = 0, + user_id = self.anonymous.object_id, + creation = datetime.now(), + ) + self.database.save( note, commit = False ) + + note_id = self.database.next_id( Note, commit = False ) + note = Note.create( + note_id, + u"

baz

quux", + self.general_thread.object_id, + startup = True, + rank = 0, + user_id = self.anonymous.object_id, + creation = datetime.now(), + ) + self.database.save( note, commit = False ) + + self.database.commit() + + def test_general_thread_default_with_notes( self ): + self.__make_notes() + + result = self.http_get( "/forums/general/%s" % self.general_thread.object_id ) + + assert result.get( u"user" ).object_id == self.anonymous.object_id + assert len( result.get( u"notebooks" ) ) == 3 + assert result.get( u"notebooks" )[ 0 ].object_id == self.anon_notebook.object_id + assert result.get( u"login_url" ) + assert result.get( u"logout_url" ) + assert result.get( u"rate_plan" ) + assert result.get( u"notebook" ).object_id == self.general_thread.object_id + assert len( result.get( u"startup_notes" ) ) == 3 + assert result[ u"startup_notes" ][ 0 ].title == u"foo" + assert result[ u"startup_notes" ][ 1 ].title == u"bar" + assert result[ u"startup_notes" ][ 2 ].title == u"baz" + assert len( result.get( u"notes" ) ) == 3 + assert result[ u"notes" ][ 0 ].title == u"foo" + assert result[ u"notes" ][ 1 ].title == u"bar" + assert result[ u"notes" ][ 2 ].title == u"baz" + assert result.get( u"parent_id" ) == None + assert result.get( u"note_read_write" ) in ( None, True ) + assert result.get( u"total_notes_count" ) == 3 + + invites = result[ "invites" ] + assert len( invites ) == 0 + + user = self.database.load( User, self.user.object_id ) + assert user.storage_bytes == 0 + + def test_general_thread_default_with_notes_and_start( self ): + self.__make_notes() + + result = self.http_get( "/forums/general/%s?start=1" % self.general_thread.object_id ) + + assert result.get( u"user" ).object_id == self.anonymous.object_id + assert len( result.get( u"notebooks" ) ) == 3 + assert result.get( u"notebooks" )[ 0 ].object_id == self.anon_notebook.object_id + assert result.get( u"login_url" ) + assert result.get( u"logout_url" ) + assert result.get( u"rate_plan" ) + assert result.get( u"notebook" ).object_id == self.general_thread.object_id + assert len( result.get( u"startup_notes" ) ) == 3 + assert result[ u"startup_notes" ][ 0 ].title == u"foo" + assert result[ u"startup_notes" ][ 1 ].title == u"bar" + assert result[ u"startup_notes" ][ 2 ].title == u"baz" + assert len( result.get( u"notes" ) ) == 2 + assert result[ u"notes" ][ 0 ].title == u"bar" + assert result[ u"notes" ][ 1 ].title == u"baz" + assert result.get( u"parent_id" ) == None + assert result.get( u"note_read_write" ) in ( None, True ) + assert result.get( u"total_notes_count" ) == 3 + + invites = result[ "invites" ] + assert len( invites ) == 0 + + user = self.database.load( User, self.user.object_id ) + assert user.storage_bytes == 0 + + def test_general_thread_default_with_notes_and_count( self ): + self.__make_notes() + + result = self.http_get( "/forums/general/%s?count=2" % self.general_thread.object_id ) + + assert result.get( u"user" ).object_id == self.anonymous.object_id + assert len( result.get( u"notebooks" ) ) == 3 + assert result.get( u"notebooks" )[ 0 ].object_id == self.anon_notebook.object_id + assert result.get( u"login_url" ) + assert result.get( u"logout_url" ) + assert result.get( u"rate_plan" ) + assert result.get( u"notebook" ).object_id == self.general_thread.object_id + assert len( result.get( u"startup_notes" ) ) == 3 + assert result[ u"startup_notes" ][ 0 ].title == u"foo" + assert result[ u"startup_notes" ][ 1 ].title == u"bar" + assert result[ u"startup_notes" ][ 2 ].title == u"baz" + assert len( result.get( u"notes" ) ) == 2 + assert result[ u"notes" ][ 0 ].title == u"foo" + assert result[ u"notes" ][ 1 ].title == u"bar" + assert result.get( u"parent_id" ) == None + assert result.get( u"note_read_write" ) in ( None, True ) + assert result.get( u"total_notes_count" ) == 3 + + invites = result[ "invites" ] + assert len( invites ) == 0 + + user = self.database.load( User, self.user.object_id ) + assert user.storage_bytes == 0 + + def test_general_thread_default_with_notes_and_start_and_count( self ): + self.__make_notes() + + result = self.http_get( "/forums/general/%s?start=1&count=1" % self.general_thread.object_id ) + + assert result.get( u"user" ).object_id == self.anonymous.object_id + assert len( result.get( u"notebooks" ) ) == 3 + assert result.get( u"notebooks" )[ 0 ].object_id == self.anon_notebook.object_id + assert result.get( u"login_url" ) + assert result.get( u"logout_url" ) + assert result.get( u"rate_plan" ) + assert result.get( u"notebook" ).object_id == self.general_thread.object_id + assert len( result.get( u"startup_notes" ) ) == 3 + assert result[ u"startup_notes" ][ 0 ].title == u"foo" + assert result[ u"startup_notes" ][ 1 ].title == u"bar" + assert result[ u"startup_notes" ][ 2 ].title == u"baz" + assert len( result.get( u"notes" ) ) == 1 + assert result[ u"notes" ][ 0 ].title == u"bar" + assert result.get( u"parent_id" ) == None + assert result.get( u"note_read_write" ) in ( None, True ) + assert result.get( u"total_notes_count" ) == 3 + + invites = result[ "invites" ] + assert len( invites ) == 0 + + user = self.database.load( User, self.user.object_id ) + assert user.storage_bytes == 0 + + def test_general_thread_default_with_notes_and_note_id( self ): + self.__make_notes() + + result = self.http_get( "/forums/general/%s?note_id=%s" % ( self.general_thread.object_id, self.note.object_id ) ) + + assert result.get( u"user" ).object_id == self.anonymous.object_id + assert len( result.get( u"notebooks" ) ) == 3 + assert result.get( u"notebooks" )[ 0 ].object_id == self.anon_notebook.object_id + assert result.get( u"login_url" ) + assert result.get( u"logout_url" ) + assert result.get( u"rate_plan" ) + assert result.get( u"notebook" ).object_id == self.general_thread.object_id + assert len( result.get( u"startup_notes" ) ) == 3 + assert result[ u"startup_notes" ][ 0 ].title == u"foo" + assert result[ u"startup_notes" ][ 1 ].title == u"bar" + assert result[ u"startup_notes" ][ 2 ].title == u"baz" + assert len( result.get( u"notes" ) ) == 1 + assert result[ u"notes" ][ 0 ].title == u"foo" + assert result[ u"notes" ][ 0 ].object_id == self.note.object_id + assert result.get( u"parent_id" ) == None + assert result.get( u"note_read_write" ) in ( None, True ) + assert result.get( u"total_notes_count" ) == 3 + + invites = result[ "invites" ] + assert len( invites ) == 0 + + user = self.database.load( User, self.user.object_id ) + assert user.storage_bytes == 0 + + def login( self ): + result = self.http_post( "/users/login", dict( + username = self.username, + password = self.password, + login_button = u"login", + ) ) + self.session_id = result[ u"session_id" ] + + def login2( self ): + result = self.http_post( "/users/login", dict( + username = self.username2, + password = self.password2, + login_button = u"login", + ) ) + self.session_id = result[ u"session_id" ]