diff --git a/src/commands/default/admin.py b/src/commands/default/admin.py index f2b8cca0db..4eb8e6ec7e 100644 --- a/src/commands/default/admin.py +++ b/src/commands/default/admin.py @@ -427,7 +427,7 @@ class CmdEmit(MuxCommand): else: caller.msg("Emitted to %s." % objname) else: - caller.msg("You are not allowed to send to %s." % objname) + caller.msg("You are not allowed to emit to %s." % objname) @@ -547,10 +547,6 @@ class CmdPerm(MuxCommand): # add a new permission permissions = obj.permissions - caller.permissions - - - for perm in self.rhslist: # don't allow to set a permission higher in the hierarchy than the one the @@ -589,4 +585,5 @@ class CmdWall(MuxCommand): self.caller.msg("Usage: @wall ") return message = "%s shouts \"%s\"" % (self.caller.name, self.args) + self.msg("Announcing to all connected players ...") SESSIONS.announce_all(message) diff --git a/src/commands/default/batchprocess.py b/src/commands/default/batchprocess.py index 447e241421..9830b6de31 100644 --- a/src/commands/default/batchprocess.py +++ b/src/commands/default/batchprocess.py @@ -10,7 +10,7 @@ containing a list of in-game commands and executes them in sequence as if they had been entered in the game (including permission checks etc). -Example batch-command file: game/gamesrc/commands/examples/example_batch_cmd.ev +Example batch-command file: game/gamesrc/commands/examples/batch_cmds.ev Batch-code is a full-fledged python code interpreter that reads blocks of python code (*.py) and executes them in sequence. This allows for @@ -18,7 +18,7 @@ much more power than Batch-command, but requires knowing Python and the Evennia API. It is also a severe security risk and should therefore always be limited to superusers only. -Example batch-code file: game/gamesrc/commands/examples/example_batch_code.py +Example batch-code file: game/gamesrc/commands/examples/batch_code.py """ from traceback import format_exc diff --git a/src/commands/default/building.py b/src/commands/default/building.py index 9320935818..7a62aa917e 100644 --- a/src/commands/default/building.py +++ b/src/commands/default/building.py @@ -1643,9 +1643,9 @@ class CmdExamine(ObjManipCommand): if things: string += "\n{wContents{n: %s" % ", ".join([cont.name for cont in obj.contents if cont not in exits and cont not in pobjs]) - separater = "="*78 + separator = "-"*78 #output info - return '%s\n%s\n%s' % ( separater, string.strip(), separater ) + return '%s\n%s\n%s' % ( separator, string.strip(), separator ) def func(self): "Process command" diff --git a/src/commands/default/comms.py b/src/commands/default/comms.py index ed44da347b..45e3598a29 100644 --- a/src/commands/default/comms.py +++ b/src/commands/default/comms.py @@ -166,7 +166,7 @@ class CmdDelCom(MuxCommand): else: self.msg("You had no such alias defined for this channel.") -class CmdAllCom(MuxCommand): +class CmdAllCom(MuxPlayerCommand): """ allcom - operate on all channels @@ -227,7 +227,7 @@ class CmdAllCom(MuxCommand): # wrong input self.msg("Usage: allcom on | off | who | clear") -class CmdChannels(MuxCommand): +class CmdChannels(MuxPlayerCommand): """ @clist @@ -280,7 +280,7 @@ class CmdChannels(MuxCommand): chan.desc]) caller.msg("\n{wAvailable channels{n (use {wcomlist{n,{waddcom{n and {wdelcom{n to manage subscriptions):\n%s" % comtable) -class CmdCdestroy(MuxCommand): +class CmdCdestroy(MuxPlayerCommand): """ @cdestroy @@ -316,7 +316,7 @@ class CmdCdestroy(MuxCommand): CHANNELHANDLER.update() self.msg("%s was destroyed." % channel) -class CmdCBoot(MuxCommand): +class CmdCBoot(MuxPlayerCommand): """ @cboot @@ -375,7 +375,7 @@ class CmdCBoot(MuxCommand): channel.disconnect_from(player) CHANNELHANDLER.update() -class CmdCemit(MuxCommand): +class CmdCemit(MuxPlayerCommand): """ @cemit - send a message to channel @@ -422,7 +422,7 @@ class CmdCemit(MuxCommand): string = "Sent to channel %s: %s" % (channel.key, message) self.msg(string) -class CmdCWho(MuxCommand): +class CmdCWho(MuxPlayerCommand): """ @cwho @@ -458,7 +458,7 @@ class CmdCWho(MuxCommand): string += " " self.msg(string.strip()) -class CmdChannelCreate(MuxCommand): +class CmdChannelCreate(MuxPlayerCommand): """ @ccreate channelcreate @@ -505,7 +505,7 @@ class CmdChannelCreate(MuxCommand): self.msg("Created channel %s and connected to it." % new_chan.key) -class CmdCset(MuxCommand): +class CmdCset(MuxPlayerCommand): """ @cset - changes channel access restrictions @@ -551,7 +551,7 @@ class CmdCset(MuxCommand): self.msg(string) -class CmdCdesc(MuxCommand): +class CmdCdesc(MuxPlayerCommand): """ @cdesc - set channel description @@ -579,8 +579,8 @@ class CmdCdesc(MuxCommand): self.msg("Channel '%s' not found." % self.lhs) return #check permissions - if not caller.access(caller, 'control'): - self.msg("You cant admin this channel.") + if not channel.access(caller, 'control'): + self.msg("You cannot admin this channel.") return # set the description channel.desc = self.rhs diff --git a/src/commands/default/player.py b/src/commands/default/player.py index feb88a9b95..ad578e5ca0 100644 --- a/src/commands/default/player.py +++ b/src/commands/default/player.py @@ -24,8 +24,8 @@ from src.utils import utils, create, search, prettytable from settings import MAX_NR_CHARACTERS, MULTISESSION_MODE # limit symbol import for API -__all__ = ("CmdOOCLook", "CmdIC", "CmdOOC", "CmdPassword", "CmdQuit", - "CmdEncoding", "CmdSessions", "CmdWho", "CmdColorTest") +__all__ = ("CmdOOCLook", "CmdIC", "CmdOOC", "CmdPassword", "CmdQuit", "CmdCharCreate", + "CmdEncoding", "CmdSessions", "CmdWho", "CmdColorTest", "CmdQuell") # force max nr chars to 1 if mode is 0 or 1 MAX_NR_CHARACTERS = MULTISESSION_MODE < 2 and 1 or MAX_NR_CHARACTERS diff --git a/src/commands/default/tests.py b/src/commands/default/tests.py index 94d9936510..d2002bbbd3 100644 --- a/src/commands/default/tests.py +++ b/src/commands/default/tests.py @@ -12,51 +12,48 @@ main test suite started with """ -#import re, time -#from django.conf import settings -#from src.utils import create, ansi -#from src.server import serversession, sessionhandler -#from src.locks.lockhandler import LockHandler -#from src.server.models import ServerConfig -#from src.comms.models import Channel, Msg, PlayerChannelConnection, ExternalChannelConnection -#from django.contrib.auth.models import User -#from src.players.models import PlayerDB -#from src.objects.models import ObjectDB - +import re +from django.conf import settings from django.utils.unittest import TestCase from src.players.player import Player -#from src.objects.Objects import Character from src.utils import create, utils, ansi +_RE = re.compile(r"^\+|-+\+|\+-+|--*|\|", re.MULTILINE) + #------------------------------------------------------------ # Command testing # ------------------------------------------------------------ -class TestPlayer(Player): +class TestPlayerClass(Player): def msg(self, message, **kwargs): "test message" - #print "in testing msg():", message if not self.ndb.stored_msg: self.ndb.stored_msg = [] self.ndb.stored_msg.append(message) + def _get_superuser(self): + "test with superuser flag" + return self.ndb.is_superuser + is_superuser = property(_get_superuser) class CommandTest(TestCase): """ Tests a command """ - CID = 0 + CID = 0 # we must set a different CID in every test to avoid unique-name collisions creating the objects def setUp(self): "sets up testing environment" self.room1 = create.create_object("src.objects.objects.Room", key="Room%i"%self.CID) self.room1.db.desc = "room_desc" - self.room2 = create.create_object("src.objects.objects.Room", key="Room%ib"%self.CID) - self.obj1 = create.create_object("src.objects.objects.Object", key="Obj%i"%self.CID, location=self.room1, home=self.room1) - self.obj2 = create.create_object("src.objects.objects.Object", key="Obj%ib"%self.CID, location=self.room1, home=self.room1) + self.room2 = create.create_object("src.objects.objects.Room", key="Room%ib" % self.CID) + self.obj1 = create.create_object("src.objects.objects.Object", key="Obj%i" % self.CID, location=self.room1, home=self.room1) + self.obj2 = create.create_object("src.objects.objects.Object", key="Obj%ib" % self.CID, location=self.room1, home=self.room1) self.char1 = create.create_object("src.objects.objects.Character", key="Char%i" % self.CID, location=self.room1, home=self.room1) self.char2 = create.create_object("src.objects.objects.Character", key="Char%ib" % self.CID, location=self.room1, home=self.room1) - self.script = create.create_script("src.scripts.scripts.Script", key="Script%i"%self.CID) - self.player = create.create_player("TestPlayer%i"%self.CID, "test@test.com", "testpassword", typeclass=TestPlayer) + self.script = create.create_script("src.scripts.scripts.Script", key="Script%i" % self.CID) + self.player = create.create_player("TestPlayer%i" % self.CID, "test@test.com", "testpassword", typeclass=TestPlayerClass) + self.player2 = create.create_player("TestPlayer%ib" % self.CID, "test@test.com", "testpassword", typeclass=TestPlayerClass) + self.player.permissions = "Immortals" self.char1.player = self.player self.char1.sessid = 1 @@ -71,7 +68,6 @@ class CommandTest(TestCase): The msgreturn value is compared to eventual output sent to caller.msg in the game """ - cmdobj.caller = self.char1 cmdobj.cmdstring = cmdobj.key cmdobj.args = args @@ -85,20 +81,22 @@ class CommandTest(TestCase): cmdobj.parse() cmdobj.func() cmdobj.at_post_cmd() - for msg in self.char1.player.ndb.stored_msg: - # clean out prettytable sugar - pass - returned_msg = "|".join(self.char1.player.ndb.stored_msg) + # clean out prettytable sugar + returned_msg = "|".join(_RE.sub("", mess) for mess in self.char1.player.ndb.stored_msg) + #returned_msg = "|".join(self.char1.player.ndb.stored_msg) returned_msg = ansi.parse_ansi(returned_msg, strip_ansi=noansi).strip() - if msg != None and not returned_msg.startswith(msg.strip()): - sep1 = "\n" + "="*30 + "Wanted message" + "="*34 + "\n" - sep2 = "\n" + "="*30 + "Returned message" + "="*32 + "\n" - sep3 = "\n" + "="*78 - retval = sep1 + msg.strip() + sep2 + returned_msg + sep3 - raise AssertionError(retval) + if msg != None: + if msg == "" and returned_msg or not returned_msg.startswith(msg.strip()): + sep1 = "\n" + "="*30 + "Wanted message" + "="*34 + "\n" + sep2 = "\n" + "="*30 + "Returned message" + "="*32 + "\n" + sep3 = "\n" + "="*78 + retval = sep1 + msg.strip() + sep2 + returned_msg + sep3 + raise AssertionError(retval) +#------------------------------------------------------------ # Individual module Tests +#------------------------------------------------------------ from src.commands.default import general class TestGeneral(CommandTest): @@ -106,34 +104,28 @@ class TestGeneral(CommandTest): def test_cmds(self): self.call(general.CmdLook(), "here", "Room1\n room_desc") self.call(general.CmdHome(), "", "You are already home") - self.call(general.CmdPassword(), "testpassword = testpassword", "") self.call(general.CmdInventory(), "", "You are not carrying anything.") - self.call(general.CmdPose(), "looks around", "Caller1 looks around") + self.call(general.CmdPose(), "looks around", "Char1 looks around") self.call(general.CmdHome(), "", "You are already home") self.call(general.CmdNick(), "testalias = testaliasedstring1", "Nick set:") self.call(general.CmdNick(), "/player testalias = testaliasedstring2", "Nick set:") self.call(general.CmdNick(), "/object testalias = testaliasedstring3", "Nick set:") - self.assertEqual(u"testaliasedstring1", self.caller.nicks.get("testalias")) - self.assertEqual(u"testaliasedstring2", self.caller.nicks.get("testalias", nick_type="player")) - self.assertEqual(u"testaliasedstring3", self.caller.nicks.get("testalias", nick_type="object")) + self.assertEqual(u"testaliasedstring1", self.char1.nicks.get("testalias")) + self.assertEqual(u"testaliasedstring2", self.char1.nicks.get("testalias", nick_type="player")) + self.assertEqual(u"testaliasedstring3", self.char1.nicks.get("testalias", nick_type="object")) self.call(general.CmdGet(), "Obj1", "You pick up Obj1.") self.call(general.CmdDrop(), "Obj1", "You drop Obj1.") - self.call(general.CmdWho(), "", "Player Name") self.call(general.CmdSay(), "Testing", "You say, \"Testing\"") self.call(general.CmdAccess(), "", "Permission Hierarchy (climbing):") - #self.call(general.CmdEncoding(), "", "Default encoding:") - #self.call(general.CmdQuit(), "", "You are already home") from src.commands.default import help from src.commands.default.cmdset_character import CharacterCmdSet class TestHelp(CommandTest): CID = 2 def test_cmds(self): - sep = "-"*78 + "\n" - self.call(help.CmdHelp(), "", sep + " Command help entries", cmdset=CharacterCmdSet()) + self.call(help.CmdHelp(), "", "Command help entries", cmdset=CharacterCmdSet()) self.call(help.CmdSetHelp(), "testhelp, General = This is a test", "Topic 'testhelp' was successfully created.") - self.call(help.CmdHelp(), "testhelp", sep + "Help topic for testhelp", cmdset=CharacterCmdSet()) - + self.call(help.CmdHelp(), "testhelp", "Help topic for testhelp", cmdset=CharacterCmdSet()) from src.commands.default import system class TestSystem(CommandTest): @@ -143,473 +135,89 @@ class TestSystem(CommandTest): # since the server is not running during these tests. self.call(system.CmdPy(), "1+2", ">>> 1+2|<<< 3") self.call(system.CmdScripts(), "", "id ") - self.call(system.CmdObjects(), "", "Database totals:") + self.call(system.CmdObjects(), "", "Object subtype totals") self.call(system.CmdAbout(), "", None) - self.call(system.CmdServerLoad(), "", "Server load (1 min):") - + self.call(system.CmdServerLoad(), "", "Server CPU and Memory load:") from src.commands.default import admin class TestAdmin(CommandTest): CID = 4 def test_cmds(self): # not testing CmdBoot, CmdDelPlayer, CmdNewPassword - self.call(admin.CmdEmit(), "Char4 = Test", "Test|Emitted to Char4.") - self.call(admin.CmdPerm(), "Obj1 = Builders", "Permission 'Builders' given to Obj1.") - self.call(admin.CmdWall(), "Test", "Caller4 shouts \"Test\"") + self.call(admin.CmdEmit(), "Char4b = Test", "Emitted to Char4b.") + self.call(admin.CmdPerm(), "Obj4 = Builders", "Permission 'Builders' given to Obj4.") + self.call(admin.CmdWall(), "Test", "Announcing to all connected players ...") + self.call(admin.CmdPerm(), "Char4b = Builders","Permission 'Builders' given to Char4b.") + self.call(admin.CmdBan(), "Char4", "NameBan char4 was added.") +from src.commands.default import player +class TestPlayer(CommandTest): + CID = 5 + def test_cmds(self): + self.call(player.CmdOOCLook(), "", "Account TestPlayer5 (you are OutofCharacter)") + self.call(player.CmdIC(), "Char5","Char5 is now acted from another") + self.call(player.CmdOOC(), "", "You are already") + self.call(player.CmdPassword(), "testpassword = testpassword", "Password changed.") + self.call(player.CmdEncoding(), "", "Default encoding:") + self.call(player.CmdWho(), "", "Players:") + self.call(player.CmdQuit(), "", "Quitting. Hope to see you soon again.") + self.call(player.CmdSessions(), "", "Your current session(s):") + self.call(player.CmdColorTest(), "ansi", "ANSI colors:") + self.call(player.CmdCharCreate(), "Test1=Test char","Created new character Test1. Use @ic Test1 to enter the game") + self.call(player.CmdQuell(), "", "Quelling Player permissions (Immortals).") +from src.commands.default import building +class TestBuilding(CommandTest): + CID = 6 + def test_cmds(self): + self.call(building.CmdCreate(), "/drop TestObj1", "You create a new Object: TestObj1.") + self.call(building.CmdSetObjAlias(), "TestObj1 = TestObj1b","Aliases for 'TestObj1' are now set to testobj1b.") + self.call(building.CmdCopy(), "TestObj1 = TestObj2;TestObj2b, TestObj3;TestObj3b", "Copied TestObj1 to 'TestObj3' (aliases: ['TestObj3b']") + self.call(building.CmdSetAttribute(), "Obj6/test1=\"value1\"", "Created attribute Obj6/test1 = \"value1\"") + self.call(building.CmdSetAttribute(), "Obj6b/test2=\"value2\"", "Created attribute Obj6b/test2 = \"value2\"") + self.call(building.CmdMvAttr(), "Obj6b/test2 = Obj6/test3", "Moving Obj6b/test2 (with value value2) ...\nMoved Obj6b.test2") + self.call(building.CmdCpAttr(), "Obj6/test1 = Obj6b/test3", "Copying Obj6/test1 (with value value1) ...\nCopied Obj6.test1") + self.call(building.CmdName(), "Obj6b=Obj6c", "Object's name changed to 'Obj6c'.") + self.call(building.CmdDesc(), "Obj6c=TestDesc", "The description was set on Obj6c.") + self.call(building.CmdWipe(), "Obj6c/test2/test3", "Wiped attributes test2,test3 on Obj6c.") + self.call(building.CmdDestroy(), "TestObj1","TestObj1 was destroyed.") + self.call(building.CmdDig(), "TestRoom1=testroom;tr,back;b", "Created room TestRoom1") + self.call(building.CmdTunnel(), "n = TestRoom2;test2", "Created room TestRoom2") + self.call(building.CmdOpen(), "TestExit1=Room6b", "Created new Exit 'TestExit1' from Room6 to Room6b") + self.call(building.CmdLink(),"TestExit1 = TestRoom1","Link created TestExit1 > TestRoom1 (one way).") + self.call(building.CmdUnLink(), "TestExit1", "Former exit TestExit1 no longer links anywhere.") + self.call(building.CmdSetHome(), "Obj6 = Room6b", "Obj6's home location was changed from Room6") + self.call(building.CmdListCmdSets(), "", ":") + self.call(building.CmdTypeclass(), "Obj6 = src.objects.objects.Character", "Obj6's changed typeclass from src.objects.objects.Object to") + self.call(building.CmdLock(), "Obj6 = test:perm(Immortals)", "Added lock 'test:perm(Immortals)' to Obj6.") + self.call(building.CmdExamine(), "Obj6", "Name/key: Obj6") + self.call(building.CmdFind(), "TestRoom1", "One Match") + self.call(building.CmdScript(), "Obj6 = src.scripts.scripts.Script", "Script src.scripts.scripts.Script successfully added") + self.call(building.CmdTeleport(), "TestRoom1", "TestRoom1\nExits: back|Teleported to TestRoom1.") +from src.commands.default import comms +class TestComms(CommandTest): + CID = 7 + def test_cmds(self): + # not testing the irc/imc2/rss commands here since testing happens offline + self.call(comms.CmdChannelCreate(), "testchan;test=Test Channel", "Created channel testchan and connected to it.") + self.call(comms.CmdAddCom(), "tc = testchan", "You are already connected to channel testchan. You can now") + self.call(comms.CmdDelCom(), "tc", "Your alias 'tc' for channel testchan was cleared.") + self.call(comms.CmdChannels(), "" ,"Available channels (use comlist,addcom and delcom to manage") + self.call(comms.CmdAllCom(), "", "Available channels (use comlist,addcom and delcom to manage") + self.call(comms.CmdCset(), "testchan=send:all()", "Lock(s) applied. Current locks on testchan:") + self.call(comms.CmdCdesc(), "testchan = Test Channel", "Description of channel 'testchan' set to 'Test Channel'.") + self.call(comms.CmdCemit(), "testchan = Test Message", "Sent to channel testchan: [testchan] Test Message") + self.call(comms.CmdCWho(), "testchan", "Channel subscriptions\ntestchan:\n TestPlayer7") + self.call(comms.CmdPage(), "TestPlayer7b = Test", "You paged TestPlayer7b with: 'Test'.") + self.call(comms.CmdCBoot(), "", "Usage: @cboot[/quiet] = [:reason]") # noone else connected to boot + self.call(comms.CmdCdestroy(), "testchan" ,"Channel 'testchan' (Test Channel) was destroyed.") -## print all feedback from test commands (can become very verbose!) -#VERBOSE = True -#NOMANGLE = True # mangle command input for extra testing -# -#def cleanup(): -# User.objects.all().delete() -# PlayerDB.objects.all().delete() -# ObjectDB.objects.all().delete() -# Channel.objects.all().delete() -# Msg.objects.all().delete() -# PlayerChannelConnection.objects.all().delete() -# ExternalChannelConnection.objects.all().delete() -# ServerConfig.objects.all().delete() -# -#class FakeSessionHandler(sessionhandler.ServerSessionHandler): -# """ -# Fake sessionhandler, without an amp connection -# """ -# def portal_shutdown(self): -# pass -# def disconnect(self, session, reason=""): -# pass -# def login(self, session): -# pass -# def session_sync(self): -# pass -# def data_out(self, session, string="", data=""): -# return string -# -#SESSIONS = FakeSessionHandler() -# -#class FakeSession(serversession.ServerSession): -# """ -# A fake session that -# implements dummy versions of the real thing; this is needed to -# mimic a logged-in player. -# """ -# protocol_key = "TestProtocol" -# sessdict = {'protocol_key':'telnet', 'address':('0.0.0.0','5000'), 'sessid':2, 'uid':2, 'uname':None, -# 'logged_in':False, 'cid':None, 'ndb':{}, 'encoding':'utf-8', -# 'conn_time':time.time(), 'cmd_last':time.time(), 'cmd_last_visible':time.time(), 'cmd_total':1} -# -# def connectionMade(self): -# self.load_sync_data(self.sessdict) -# self.sessionhandler = SESSIONS -# def disconnectClient(self): -# pass -# def lineReceived(self, raw_string): -# pass -# def msg(self, message, data=None): -# global VERBOSE -# if message.startswith("Traceback (most recent call last):"): -# #retval = "Traceback last line: %s" % message.split('\n')[-4:] -# raise AssertionError(message) -# if self.player.character.ndb.return_string != None: -# return_list = self.player.character.ndb.return_string -# if hasattr(return_list, '__iter__'): -# rstring = return_list.pop(0) -# self.player.character.ndb.return_string = return_list -# else: -# rstring = return_list -# self.player.character.ndb.return_string = None -# message_noansi = ansi.parse_ansi(message, strip_ansi=True).strip() -# rstring = rstring.strip() -# if not message_noansi.startswith(rstring): -# sep1 = "\n" + "="*30 + "Wanted message" + "="*34 + "\n" -# sep2 = "\n" + "="*30 + "Returned message" + "="*32 + "\n" -# sep3 = "\n" + "="*78 -# retval = sep1 + rstring + sep2 + message_noansi + sep3 -# raise AssertionError(retval) -# if VERBOSE: -# print message -## setting up objects -# -#class CommandTest(TestCase): -# """ -# Sets up the basics of testing the default commands and the generic things -# that should always be present in a command. -# -# Inherit new tests from this. -# """ -# -# def setUp(self): -# "sets up the testing environment" -# #ServerConfig.objects.conf("default_home", 2) -# self.addCleanup(cleanup) -# self.room1 = create.create_object(settings.BASE_ROOM_TYPECLASS, key="room1") -# self.room2 = create.create_object(settings.BASE_ROOM_TYPECLASS, key="room2") -# # create a faux player/character for testing. -# self.char1 = create.create_player("TestChar", "testplayer@test.com", "testpassword", character_location=self.room1) -# self.char1.player.user.is_superuser = True -# self.char1.lock_storage = "" -# self.char1.locks = LockHandler(self.char1) -# self.char1.ndb.return_string = None -# self.sess1 = FakeSession() -# self.sess1.connectionMade() -# self.sess1.session_login(self.char1.player) -# # create second player -# self.char2 = create.create_player("TestChar2", "testplayer2@test.com", "testpassword2", character_location=self.room1) -# self.char2.player.user.is_superuser = False -# self.char2.lock_storage = "" -# self.char2.locks = LockHandler(self.char2) -# self.char2.ndb.return_string = None -# self.sess2 = FakeSession() -# self.sess2.connectionMade() -# self.sess2.session_login(self.char2.player) -# # A non-player-controlled character -# self.char3 = create.create_object(settings.BASE_CHARACTER_TYPECLASS, key="TestChar3", location=self.room1) -# # create some objects -# self.obj1 = create.create_object(settings.BASE_OBJECT_TYPECLASS, key="obj1", location=self.room1) -# self.obj2 = create.create_object(settings.BASE_OBJECT_TYPECLASS, key="obj2", location=self.room1) -# self.exit1 = create.create_object(settings.BASE_EXIT_TYPECLASS, key="exit1", location=self.room1) -# self.exit2 = create.create_object(settings.BASE_EXIT_TYPECLASS, key="exit2", location=self.room2) -# -# def get_cmd(self, cmd_class, argument_string=""): -# """ -# Obtain a cmd instance from a class and an input string -# Note: This does not make use of the cmdhandler functionality. -# """ -# cmd = cmd_class() -# cmd.caller = self.char1 -# cmd.cmdstring = cmd_class.key -# cmd.args = argument_string -# cmd.cmdset = None -# cmd.obj = self.char1 -# return cmd -# -# def execute_cmd(self, raw_string, wanted_return_string=None, nomangle=False): -# """ -# Creates the command through faking a normal command call; -# This also mangles the input in various ways to test if the command -# will be fooled. -# """ -# if not nomangle and not VERBOSE and not NOMANGLE: -# # only mangle if not VERBOSE, to make fewer return lines -# test1 = re.sub(r'\s', '', raw_string) # remove all whitespace inside it -# test2 = "%s/åäö öäö;-:$£@*~^' 'test" % raw_string # inserting weird characters in call -# test3 = "%s %s" % (raw_string, raw_string) # multiple calls -# self.char1.execute_cmd(test1) -# self.char1.execute_cmd(test2) -# self.char1.execute_cmd(test3) -# # actual call, we potentially check so return is ok. -# self.char1.ndb.return_string = wanted_return_string -# try: -# self.char1.execute_cmd(raw_string) -# except AssertionError, e: -# self.fail(e) -# self.char1.ndb.return_string = None -# -#class BuildTest(CommandTest): -# """ -# We need to turn of mangling for build commands since -# it creates arbitrary objects that mess up tests later. -# """ -# NOMANGLE = True -# -# -##------------------------------------------------------------ -## Default set Command testing -##------------------------------------------------------------ -# -## # general.py tests -# -#class TestLook(CommandTest): -# def test_call(self): -# self.execute_cmd("look here") -#class TestHome(CommandTest): -# def test_call(self): -# self.char1.location = self.room1 -# self.char1.home = self.room2 -# self.execute_cmd("home") -# self.assertEqual(self.char1.location, self.room2) -#class TestPassword(CommandTest): -# def test_call(self): -# self.execute_cmd("@password testpassword = newpassword") -#class TestInventory(CommandTest): -# def test_call(self): -# self.execute_cmd("inv") -#class TestQuit(CommandTest): -# def test_call(self): -# self.execute_cmd("@quit") -#class TestPose(CommandTest): -# def test_call(self): -# self.execute_cmd("pose is testing","TestChar is testing") -#class TestNick(CommandTest): -# def test_call(self): -# self.char1.player.user.is_superuser = False -# self.execute_cmd("nickname testalias = testaliasedstring1") -# self.execute_cmd("nickname/player testalias = testaliasedstring2") -# self.execute_cmd("nickname/object testalias = testaliasedstring3") -# self.assertEqual(u"testaliasedstring1", self.char1.nicks.get("testalias")) -# self.assertEqual(u"testaliasedstring2", self.char1.nicks.get("testalias",nick_type="player")) -# self.assertEqual(u"testaliasedstring3", self.char1.nicks.get("testalias",nick_type="object")) -#class TestGet(CommandTest): -# def test_call(self): -# self.obj1.location = self.room1 -# self.execute_cmd("get obj1", "You pick up obj1.") -#class TestDrop(CommandTest): -# def test_call(self): -# self.obj1.location = self.char1 -# self.execute_cmd("drop obj1", "You drop obj1.") -#class TestWho(CommandTest): -# def test_call(self): -# self.execute_cmd("who") -#class TestSay(CommandTest): -# def test_call(self): -# self.execute_cmd("say Hello", 'You say, "Hello') -#class TestAccess(CommandTest): -# def test_call(self): -# self.execute_cmd("access") -#class TestEncoding(CommandTest): -# def test_call(self): -# global NOMANGLE -# NOMANGLE = True -# self.char1.db.encoding="utf-8" -# self.execute_cmd("@encoding", "Default encoding:") -# NOMANGLE = False -# -## help.py command tests -# -#class TestHelpSystem(CommandTest): -# def test_call(self): -# self.NOMANGLE = True -# sep = "-"*78 + "\n" -# self.execute_cmd("@help/add TestTopic,TestCategory = Test1", ) -# self.execute_cmd("help TestTopic",sep + "Help topic for Testtopic\nTest1" + "\n" + sep) -# self.execute_cmd("@help/merge TestTopic = Test2", "Added the new text right after") -# self.execute_cmd("help TestTopic", sep + "Help topic for Testtopic\nTest1 Test2") -# self.execute_cmd("@help/append TestTopic = Test3", "Added the new text as a") -# self.execute_cmd("help TestTopic",sep + "Help topic for Testtopic\nTest1 Test2\n\nTest3") -# self.execute_cmd("@help/delete TestTopic","Deleted the help entry") -# self.execute_cmd("help TestTopic","No help entry found for 'TestTopic'") -# -## system.py command tests -#class TestPy(CommandTest): -# def test_call(self): -# self.execute_cmd("@py 1+2", [">>> 1+2", "<<< 3"]) -#class TestScripts(CommandTest): -# def test_call(self): -# script = create.create_script(None, "test") -# self.execute_cmd("@scripts", "id") -#class TestObjects(CommandTest): -# def test_call(self): -# self.execute_cmd("@objects", "Database totals") -## Cannot be tested since we don't have an active server running at this point. -## class TestListService(CommandTest): -## def test_call(self): -## self.execute_cmd("@service/list", "---") -#class TestVersion(CommandTest): -# def test_call(self): -# self.execute_cmd("@version", '---') -#class TestTime(CommandTest): -# def test_call(self): -# self.execute_cmd("@time", "Current server uptime") -#class TestServerLoad(CommandTest): -# def test_call(self): -# self.execute_cmd("@serverload", "Server load") -#class TestPs(CommandTest): -# def test_call(self): -# self.execute_cmd("@ps","Non-timed scripts") -# -## admin.py command tests -# -#class TestBoot(CommandTest): -# def test_call(self): -# self.execute_cmd("@boot TestChar2","You booted TestChar2.") -#class TestDelPlayer(CommandTest): -# def test_call(self): -# self.execute_cmd("@delplayer TestChar2","Booting and informing player ...") -#class TestEmit(CommandTest): -# def test_call(self): -# self.execute_cmd("@emit Test message", "Emitted to room1.") -#class TestUserPassword(CommandTest): -# def test_call(self): -# self.execute_cmd("@userpassword TestChar2 = newpass", "TestChar2 - new password set to 'newpass'.") -#class TestPerm(CommandTest): -# def test_call(self): -# self.execute_cmd("@perm TestChar2 = Builders", "Permission 'Builders' given to") -## cannot test this here; screws up the test suite -##class TestPuppet(CommandTest): -## def test_call(self): -## self.execute_cmd("@puppet TestChar3", "You now control TestChar3.") -## self.execute_cmd("@puppet TestChar", "You now control TestChar.") -#class TestWall(CommandTest): -# def test_call(self): -# self.execute_cmd("@wall = This is a test message", "TestChar shouts") -# -# -## building.py command tests -# -#class TestObjAlias(BuildTest): -# def test_call(self): -# self.execute_cmd("@alias obj1 = obj1alias, obj1alias2", "Aliases for") -# self.execute_cmd("look obj1alias2", "obj1") -#class TestCopy(BuildTest): -# def test_call(self): -# self.execute_cmd("@copy obj1 = obj1_copy;alias1;alias2", "Copied obj1 to 'obj1_copy'") -# self.execute_cmd("look alias2","obj1_copy") -#class TestSet(BuildTest): -# def test_call(self): -# self.execute_cmd("@set obj1/test = value", "Created attribute obj1/test = value") -# self.execute_cmd("@set obj1/test", "Attribute obj1/test = value") -# self.assertEqual(self.obj1.db.test, u"value") -#class TestCpAttr(BuildTest): -# def test_call(self): -# self.execute_cmd("@set obj1/test = value") -# self.execute_cmd("@set obj2/test2 = value2") -# #self.execute_cmd("@cpattr obj1/test = obj2/test") # can't be tested since instances changes -# #self.assertEqual(self.obj2.db.test, u"value") -#class TestMvAttr(BuildTest): -# def test_call(self): -# self.execute_cmd("@set obj1/test = value") -# self.execute_cmd("@mvattr obj1/test = obj2") -# #self.assertEqual(self.obj2.db.test, u"value") -# #self.assertEqual(self.obj1.db.test, None) -#class TestCreate(BuildTest): -# def test_call(self): -# self.execute_cmd("@create testobj;alias1;alias2") -# self.execute_cmd("look alias1", "testobj") -#class TestDebug(BuildTest): -# def test_call(self): -# self.execute_cmd("@debug/obj obj1") -#class TestDesc(BuildTest): -# def test_call(self): -# self.execute_cmd("@desc obj1 = Test object", "The description was set on") -# #self.assertEqual(self.obj1.db.desc, u"Test object") -#class TestDestroy(BuildTest): -# def test_call(self): -# self.execute_cmd("@destroy obj1, obj2", "obj1 was destroyed.\nobj2 was destroyed.") -#class TestFind(BuildTest): -# def test_call(self): -# self.execute_cmd("@find obj1", "One Match") -#class TestDig(BuildTest): -# def test_call(self): -# self.execute_cmd("@dig room3;roomalias1;roomalias2 = north;n,south;s") -# self.execute_cmd("@find room3", "One Match") -# self.execute_cmd("@find roomalias1", "One Match") -# self.execute_cmd("@find roomalias2", "One Match") -# self.execute_cmd("@find/room roomalias2", "One Match") -# self.execute_cmd("@find/exit south", "One Match") -# self.execute_cmd("@find/exit n", "One Match") -#class TestUnLink(BuildTest): -# def test_call(self): -# self.execute_cmd("@dig room3;roomalias1, north, south") -# self.execute_cmd("@unlink north") -#class TestLink(BuildTest): -# def test_call(self): -# self.execute_cmd("@dig room3;roomalias1, north, south") -# self.execute_cmd("@unlink north") -# self.execute_cmd("@link north = room3") -#class TestHome(BuildTest): -# def test_call(self): -# self.obj1.db_home = self.obj2.dbobj -# self.obj1.save() -# self.execute_cmd("@home obj1") -# self.assertEqual(self.obj1.db_home, self.obj2.dbobj) -#class TestCmdSets(BuildTest): -# def test_call(self): -# self.execute_cmd("@cmdsets") -# self.execute_cmd("@cmdsets obj1") -#class TestName(BuildTest): -# def test_call(self): -# self.execute_cmd("@name obj1 = Test object", "Object's name changed to 'Test object'.") -# #self.assertEqual(self.obj1.key, u"Test object") -#class TestOpen(BuildTest): -# def test_call(self): -# self.execute_cmd("@dig room4;roomalias4") -# self.execute_cmd("@open testexit4;aliasexit4 = roomalias4", "Created new Exit") -#class TestTypeclass(BuildTest): -# def test_call(self): -# self.execute_cmd("@typeclass obj1 = src.objects.objects.Character", "obj's type is now") -# #self.assertEqual(self.obj1.db_typeclass_path, u"src.objects.objects.Character") -#class TestSet(BuildTest): -# def test_call(self): -# self.execute_cmd("@set box1/test = value") -# self.execute_cmd("@wipe box1", "Wiped") -# self.assertEqual(self.obj1.db.all, []) -#class TestLock(BuildTest): -# # lock functionality itseld is tested separately -# def test_call(self): -# self.char1.permissions = ["TestPerm"] -# self.execute_cmd("@lock obj1 = test:perm(TestPerm)") -# #self.assertEqual(True, self.obj1.access(self.char1, u"test")) -#class TestExamine(BuildTest): -# def test_call(self): -# self.execute_cmd("examine obj1", "------------") -#class TestTeleport(BuildTest): -# def test_call(self): -# self.execute_cmd("@tel obj1 = room1") -# self.assertEqual(self.obj1.location.key, self.room1.key) -#class TestScript(BuildTest): -# def test_call(self): -# self.execute_cmd("@script TestChar = examples.bodyfunctions.BodyFunctions", "Script successfully added") -# -## Comms commands -# -#class TestChannelCreate(CommandTest): -# def test_call(self): -# self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel") -# self.execute_cmd("testchan1 Hello", "[testchannel1] TestChar: Hello") -#class TestAddCom(CommandTest): -# def test_call(self): -# self.execute_cmd("@cdestroy testchannel1", "Channel 'testchannel1'") -# self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel") -# self.execute_cmd("addcom chan1 = testchannel1") -# self.execute_cmd("addcom chan2 = testchan1") -# self.execute_cmd("delcom testchannel1") -# self.execute_cmd("addcom testchannel1" "You now listen to the channel channel.") -#class TestDelCom(CommandTest): -# def test_call(self): -# self.execute_cmd("@cdestroy testchannel1", "Channel 'testchannel1'") -# self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel") -# self.execute_cmd("addcom chan1 = testchan1") -# self.execute_cmd("addcom chan2 = testchan1b") -# self.execute_cmd("addcom chan3 = testchannel1") -# self.execute_cmd("delcom chan1", "Your alias 'chan1' for ") -# self.execute_cmd("delcom chan2", "Your alias 'chan2' for ") -# self.execute_cmd("delcom testchannel1" "You stop listening to") -#class TestAllCom(CommandTest): -# def test_call(self): -# self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel") -# self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel") -# self.execute_cmd("allcom off") -# self.execute_cmd("allcom on") -# self.execute_cmd("allcom destroy") -#class TestChannels(CommandTest): -# def test_call(self): -# self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel") -# self.execute_cmd("@cdestroy testchannel1", "Channel 'testchannel1'") -#class TestCBoot(CommandTest): -# def test_call(self): -# self.execute_cmd("@cdestroy testchannel1", "Channel 'testchannel1'") -# self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel") -# self.execute_cmd("addcom testchan = testchannel1") -# self.execute_cmd("@cboot testchannel1 = TestChar", "TestChar boots TestChar from channel.") -#class TestCemit(CommandTest): -# def test_call(self): -# self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel") -# self.execute_cmd("@cemit testchan1 = Testing!", "[testchannel1] Testing!") -#class TestCwho(CommandTest): -# def test_call(self): -# self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel") -# self.execute_cmd("@cwho testchan1b", "Channel subscriptions") -# -# OOC commands - -#class TestOOC_and_IC(CommandTest): # can't be tested it seems, causes errors in other commands (?) -# def test_call(self): -# self.execute_cmd("@ooc", "\nYou go OOC.") -# self.execute_cmd("@ic", "\nYou become TestChar") - -# Unloggedin commands -# these cannot be tested from here. +from src.commands.default import batchprocess +class TestBatchProcess(CommandTest): + CID = 8 + def test_cmds(self): + # cannot test batchcode here, it must run inside the server process + self.player.ndb.is_superuser = True + self.call(batchprocess.CmdBatchCommands(), "examples.batch_cmds", "Running Batchcommand processor Automatic mode for examples.batch_cmds") + #self.call(batchprocess.CmdBatchCode(), "examples.batch_code", "") diff --git a/src/comms/models.py b/src/comms/models.py index bbb7c06a46..16b363c1ca 100644 --- a/src/comms/models.py +++ b/src/comms/models.py @@ -610,6 +610,7 @@ class Channel(SharedMemoryModel): "Connect the user to this channel" if not self.access(player, 'listen'): return False + player = player.dbobj conn = PlayerChannelConnection.objects.create_connection(player, self) if conn: return True diff --git a/src/objects/manager.py b/src/objects/manager.py index 711d6c7855..1432ee1401 100644 --- a/src/objects/manager.py +++ b/src/objects/manager.py @@ -308,7 +308,7 @@ class ObjectManager(TypedObjectManager): # def copy_object(self, original_object, new_key=None, - new_location=None, new_player=None, new_home=None, + new_location=None, new_home=None, new_permissions=None, new_locks=None, new_aliases=None, new_destination=None): """ Create and return a new object as a copy of the original object. All will @@ -331,8 +331,6 @@ class ObjectManager(TypedObjectManager): new_location = original_object.location if not new_home: new_home = original_object.home - if not new_player: - new_player = original_object.player if not new_aliases: new_aliases = original_object.aliases if not new_locks: @@ -346,7 +344,7 @@ class ObjectManager(TypedObjectManager): from src.utils import create from src.scripts.models import ScriptDB new_object = create.create_object(typeclass_path, key=new_key, location=new_location, - home=new_home, player=new_player, permissions=new_permissions, + home=new_home, permissions=new_permissions, locks=new_locks, aliases=new_aliases, destination=new_destination) if not new_object: return None diff --git a/src/objects/objects.py b/src/objects/objects.py index bba4e45549..f67491882b 100644 --- a/src/objects/objects.py +++ b/src/objects/objects.py @@ -419,6 +419,7 @@ class Object(TypeClass): "delete:perm(Wizards)", # delete object "get:all()", # pick up object "call:true()", # allow to call commands on this object + "tell:perm(Wizards)", # allow emits to this object "puppet:id(%s) or perm(Immortals) or pperm(Immortals)" % dbref])) # restricts puppeting of this object def basetype_posthook_setup(self):