diff --git a/evennia/accounts/tests.py b/evennia/accounts/tests.py new file mode 100644 index 0000000000..039a25601f --- /dev/null +++ b/evennia/accounts/tests.py @@ -0,0 +1,160 @@ +from mock import Mock +from random import randint +from unittest import TestCase + +from evennia.accounts.accounts import AccountSessionHandler +from evennia.accounts.accounts import DefaultAccount +from evennia.server.session import Session +from evennia.utils import create + +from django.conf import settings + + +class TestAccountSessionHandler(TestCase): + "Check AccountSessionHandler class" + + def setUp(self): + self.account = create.create_account("TestAccount%s" % randint(0, 999999), email="test@test.com", password="testpassword", typeclass=DefaultAccount) + self.handler = AccountSessionHandler(self.account) + + def test_get(self): + "Check get method" + self.assertEqual(self.handler.get(), []) + self.assertEqual(self.handler.get(100), []) + + import evennia.server.sessionhandler + + s1 = Session() + s1.logged_in = True + s1.uid = self.account.uid + evennia.server.sessionhandler.SESSIONS[s1.uid] = s1 + + s2 = Session() + s2.logged_in = True + s2.uid = self.account.uid + 1 + evennia.server.sessionhandler.SESSIONS[s2.uid] = s2 + + s3 = Session() + s3.logged_in = False + s3.uid = self.account.uid + 2 + evennia.server.sessionhandler.SESSIONS[s3.uid] = s3 + + self.assertEqual(self.handler.get(), [s1]) + self.assertEqual(self.handler.get(self.account.uid), [s1]) + self.assertEqual(self.handler.get(self.account.uid + 1), []) + + def test_all(self): + "Check all method" + self.assertEqual(self.handler.get(), self.handler.all()) + + def test_count(self): + "Check count method" + self.assertEqual(self.handler.count(), len(self.handler.get())) + +class TestDefaultAccount(TestCase): + "Check DefaultAccount class" + + def setUp(self): + self.s1 = Session() + self.s1.sessid = 0 + + def test_puppet_object_no_object(self): + "Check puppet_object method called with no object param" + + try: + DefaultAccount().puppet_object(self.s1, None) + self.fail("Expected error: 'Object not found'") + except RuntimeError as re: + self.assertEqual("Object not found", re.message) + + def test_puppet_object_no_session(self): + "Check puppet_object method called with no session param" + + try: + DefaultAccount().puppet_object(None, Mock()) + self.fail("Expected error: 'Session not found'") + except RuntimeError as re: + self.assertEqual("Session not found", re.message) + + def test_puppet_object_already_puppeting(self): + "Check puppet_object method called, already puppeting this" + + import evennia.server.sessionhandler + + account = create.create_account("TestAccount%s" % randint(0, 999999), email="test@test.com", password="testpassword", typeclass=DefaultAccount) + self.s1.uid = account.uid + evennia.server.sessionhandler.SESSIONS[self.s1.uid] = self.s1 + + self.s1.logged_in = True + self.s1.data_out = Mock(return_value=None) + + obj = Mock() + self.s1.puppet = obj + account.puppet_object(self.s1, obj) + self.s1.data_out.assert_called_with(options=None, text="You are already puppeting this object.") + self.assertIsNone(obj.at_post_puppet.call_args) + + def test_puppet_object_no_permission(self): + "Check puppet_object method called, no permission" + + import evennia.server.sessionhandler + + account = create.create_account("TestAccount%s" % randint(0, 999999), email="test@test.com", password="testpassword", typeclass=DefaultAccount) + self.s1.uid = account.uid + evennia.server.sessionhandler.SESSIONS[self.s1.uid] = self.s1 + + self.s1.puppet = None + self.s1.logged_in = True + self.s1.data_out = Mock(return_value=None) + + obj = Mock() + obj.access = Mock(return_value=False) + + account.puppet_object(self.s1, obj) + + self.assertTrue(self.s1.data_out.call_args[1]['text'].startswith("You don't have permission to puppet")) + self.assertIsNone(obj.at_post_puppet.call_args) + + def test_puppet_object_joining_other_session(self): + "Check puppet_object method called, joining other session" + + import evennia.server.sessionhandler + + account = create.create_account("TestAccount%s" % randint(0, 999999), email="test@test.com", password="testpassword", typeclass=DefaultAccount) + self.s1.uid = account.uid + evennia.server.sessionhandler.SESSIONS[self.s1.uid] = self.s1 + + self.s1.puppet = None + self.s1.logged_in = True + self.s1.data_out = Mock(return_value=None) + + obj = Mock() + obj.access = Mock(return_value=True) + obj.account = account + + account.puppet_object(self.s1, obj) + # works because django.conf.settings.MULTISESSION_MODE is not in (1, 3) + self.assertTrue(self.s1.data_out.call_args[1]['text'].endswith("from another of your sessions.")) + self.assertTrue(obj.at_post_puppet.call_args[1] == {}) + + def test_puppet_object_already_puppeted(self): + "Check puppet_object method called, already puppeted" + + import evennia.server.sessionhandler + + account = create.create_account("TestAccount%s" % randint(0, 999999), email="test@test.com", password="testpassword", typeclass=DefaultAccount) + self.s1.uid = account.uid + evennia.server.sessionhandler.SESSIONS[self.s1.uid] = self.s1 + + self.s1.puppet = None + self.s1.logged_in = True + self.s1.data_out = Mock(return_value=None) + + obj = Mock() + obj.access = Mock(return_value=True) + obj.account = Mock() + obj.at_post_puppet = Mock() + + account.puppet_object(self.s1, obj) + self.assertTrue(self.s1.data_out.call_args[1]['text'].endswith("is already puppeted by another Account.")) + self.assertIsNone(obj.at_post_puppet.call_args)