def setUp(self): """ Sets up testing environment """ self.player = create.create_player("TestPlayer", email="*****@*****.**", password="******", typeclass=self.player_typeclass) self.player2 = create.create_player("TestPlayer2", email="*****@*****.**", password="******", typeclass=self.player_typeclass) self.room1 = create.create_object(self.room_typeclass, key="Room", nohome=True) self.room1.db.desc = "room_desc" settings.DEFAULT_HOME = "#%i" % self.room1.id # we must have a default home self.room2 = create.create_object(self.room_typeclass, key="Room2") self.exit = create.create_object(self.exit_typeclass, key='out', location=self.room1, destination=self.room2) self.obj1 = create.create_object(self.object_typeclass, key="Obj", location=self.room1, home=self.room1) self.obj2 = create.create_object(self.object_typeclass, key="Obj2", location=self.room1, home=self.room1) self.char1 = create.create_object(self.character_typeclass, key="Char", location=self.room1, home=self.room1) self.char1.permissions.add("Immortals") self.char2 = create.create_object(self.character_typeclass, key="Char2", location=self.room1, home=self.room1) self.char1.player = self.player self.player.db._last_puppet = self.char1 self.char2.player = self.player2 self.player2.db._last_puppet = self.char2 self.script = create.create_script(self.script_typeclass, key="Script") self.player.permissions.add("Immortals") # set up a fake session session = ServerSession() session.init_session("telnet", ("localhost", "testmode"), SESSIONS) session.sessid = 1 SESSIONS.portal_connect(session.get_sync_data()) SESSIONS.login(SESSIONS.session_from_sessid(1), self.player, testmode=True) self.session = session
def setUp(self): """ Sets up testing environment """ self.account = create.create_account("TestAccount", email="*****@*****.**", password="******", typeclass=self.account_typeclass) self.account2 = create.create_account("TestAccount2", email="*****@*****.**", password="******", typeclass=self.account_typeclass) self.room1 = create.create_object(self.room_typeclass, key="Room", nohome=True) self.room1.db.desc = "room_desc" settings.DEFAULT_HOME = "#%i" % self.room1.id # we must have a default home # Set up fake prototype module for allowing tests to use named prototypes. settings.PROTOTYPE_MODULES = "evennia.utils.tests.data.prototypes_example" self.room2 = create.create_object(self.room_typeclass, key="Room2") self.exit = create.create_object(self.exit_typeclass, key='out', location=self.room1, destination=self.room2) self.obj1 = create.create_object(self.object_typeclass, key="Obj", location=self.room1, home=self.room1) self.obj2 = create.create_object(self.object_typeclass, key="Obj2", location=self.room1, home=self.room1) self.char1 = create.create_object(self.character_typeclass, key="Char", location=self.room1, home=self.room1) self.char1.permissions.add("Developer") self.char2 = create.create_object(self.character_typeclass, key="Char2", location=self.room1, home=self.room1) self.char1.account = self.account self.account.db._last_puppet = self.char1 self.char2.account = self.account2 self.account2.db._last_puppet = self.char2 self.script = create.create_script(self.script_typeclass, key="Script") self.account.permissions.add("Developer") # set up a fake session dummysession = ServerSession() dummysession.init_session("telnet", ("localhost", "testmode"), SESSIONS) dummysession.sessid = 1 SESSIONS.portal_connect(dummysession.get_sync_data()) # note that this creates a new Session! session = SESSIONS.session_from_sessid(1) # the real session SESSIONS.login(session, self.account, testmode=True) self.session = session
def setUp(self): """ Sets up testing environment """ self.player = create.create_player("TestPlayer", email="*****@*****.**", password="******", typeclass=self.player_typeclass) self.player2 = create.create_player("TestPlayer2", email="*****@*****.**", password="******", typeclass=self.player_typeclass) self.room1 = create.create_object(self.room_typeclass, key="Room", nohome=True) self.room1.db.desc = "room_desc" settings.DEFAULT_HOME = "#%i" % self.room1.id # we must have a default home self.room2 = create.create_object(self.room_typeclass, key="Room2") self.exit = create.create_object(self.exit_typeclass, key='out', location=self.room1, destination=self.room2) self.obj1 = create.create_object(self.object_typeclass, key="Obj", location=self.room1, home=self.room1) self.obj2 = create.create_object(self.object_typeclass, key="Obj2", location=self.room1, home=self.room1) self.char1 = create.create_object(self.character_typeclass, key="Char", location=self.room1, home=self.room1) self.char1.permissions.add("Immortals") self.char2 = create.create_object(self.character_typeclass, key="Char2", location=self.room1, home=self.room1) self.char1.player = self.player self.player.db._last_puppet = self.char1 self.char2.player = self.player2 self.player2.db._last_puppet = self.char2 self.script = create.create_script(self.script_typeclass, key="Script") self.player.permissions.add("Immortals") # set up a fake session dummysession = ServerSession() dummysession.init_session("telnet", ("localhost", "testmode"), SESSIONS) dummysession.sessid = 1 SESSIONS.portal_connect(dummysession.get_sync_data()) # note that this creates a new Session! session = SESSIONS.session_from_sessid(1) # the real session SESSIONS.login(session, self.player, testmode=True) self.session = session
def setUp(self): """ Sets up testing environment """ self.account = create.create_account("TestAccount", email="*****@*****.**", password="******", typeclass=self.account_typeclass) self.account2 = create.create_account("TestAccount2", email="*****@*****.**", password="******", typeclass=self.account_typeclass) self.room1 = create.create_object(self.room_typeclass, key="Room", nohome=True) self.room1.db.desc = "room_desc" settings.DEFAULT_HOME = "#%i" % self.room1.id # we must have a default home # Set up fake prototype module for allowing tests to use named prototypes. settings.PROTOTYPE_MODULES = "evennia.utils.tests.data.prototypes_example" self.room2 = create.create_object(self.room_typeclass, key="Room2") self.exit = create.create_object(self.exit_typeclass, key='out', location=self.room1, destination=self.room2) self.obj1 = create.create_object(self.object_typeclass, key="Obj", location=self.room1, home=self.room1) self.obj2 = create.create_object(self.object_typeclass, key="Obj2", location=self.room1, home=self.room1) self.char1 = create.create_object(self.character_typeclass, key="Char", location=self.room1, home=self.room1) self.char1.permissions.add("Developer") self.char2 = create.create_object(self.character_typeclass, key="Char2", location=self.room1, home=self.room1) self.char1.account = self.account self.account.db._last_puppet = self.char1 self.char2.account = self.account2 self.account2.db._last_puppet = self.char2 self.script = create.create_script(self.script_typeclass, key="Script") self.account.permissions.add("Developer") # set up a fake session dummysession = ServerSession() dummysession.init_session("telnet", ("localhost", "testmode"), SESSIONS) dummysession.sessid = 1 SESSIONS.portal_connect(dummysession.get_sync_data() ) # note that this creates a new Session! session = SESSIONS.session_from_sessid(1) # the real session SESSIONS.login(session, self.account, testmode=True) self.session = session
def call(self, cmdobj, args, msg=None, cmdset=None, noansi=True, caller=None, receiver=None, cmdstring=None, obj=None): """ Test a command by assigning all the needed properties to cmdobj and running cmdobj.at_pre_cmd() cmdobj.parse() cmdobj.func() cmdobj.at_post_cmd() The msgreturn value is compared to eventual output sent to caller.msg in the game Returns: msg (str): The received message that was sent to the caller. """ caller = caller if caller else self.char1 receiver = receiver if receiver else caller cmdobj.caller = caller cmdobj.cmdstring = cmdstring if cmdstring else cmdobj.key cmdobj.args = args cmdobj.cmdset = cmdset cmdobj.session = SESSIONS.session_from_sessid(1) cmdobj.account = self.account cmdobj.raw_string = cmdobj.key + " " + args cmdobj.obj = obj or (caller if caller else self.char1) # test old_msg = receiver.msg try: receiver.msg = Mock() if cmdobj.at_pre_cmd(): return cmdobj.parse() cmdobj.func() cmdobj.at_post_cmd() except Exception: import traceback receiver.msg(traceback.format_exc()) finally: # clean out prettytable sugar. We only operate on text-type stored_msg = [args[0] if args and args[0] else kwargs.get("text", utils.to_str(kwargs, force_string=True)) for name, args, kwargs in receiver.msg.mock_calls] # Get the first element of a tuple if msg received a tuple instead of a string stored_msg = [smsg[0] if hasattr(smsg, '__iter__') else smsg for smsg in stored_msg] if msg is not None: returned_msg = self.format_returned_msg(stored_msg, noansi) if msg == "" and returned_msg or returned_msg != msg.strip(): sep1 = "\n" + "="*30 + "Wanted message" + "="*34 + "\n" sep2 = "\n" + "="*30 + "Returned message" + "="*32 + "\n" sep3 = "\n" + "="*78 # important - use raw strings for wanted/returned messages so we can see whitespace retval = "%s%r%s%r%s" % (sep1, msg.strip(), sep2, returned_msg, sep3) raise AssertionError(retval) else: returned_msg = "\n".join(str(msg) for msg in stored_msg) returned_msg = ansi.parse_ansi(returned_msg, strip_ansi=noansi).strip() receiver.msg = old_msg return returned_msg
def call(self, cmdobj, args, msg=None, cmdset=None, noansi=True, caller=None, receiver=None, cmdstring=None, obj=None): """ Test a command by assigning all the needed properties to cmdobj and running cmdobj.at_pre_cmd() cmdobj.parse() cmdobj.func() cmdobj.at_post_cmd() The msgreturn value is compared to eventual output sent to caller.msg in the game Returns: msg (str): The received message that was sent to the caller. """ caller = caller if caller else self.char1 receiver = receiver if receiver else caller cmdobj.caller = caller cmdobj.cmdstring = cmdstring if cmdstring else cmdobj.key cmdobj.args = args cmdobj.cmdset = cmdset cmdobj.session = SESSIONS.session_from_sessid(1) cmdobj.player = self.player cmdobj.raw_string = cmdobj.key + " " + args cmdobj.obj = obj or (caller if caller else self.char1) # test old_msg = receiver.msg returned_msg = "" try: receiver.msg = Mock() cmdobj.at_pre_cmd() cmdobj.parse() cmdobj.func() cmdobj.at_post_cmd() except InterruptCommand: pass finally: # clean out prettytable sugar. We only operate on text-type stored_msg = [args[0] if args and args[0] else kwargs.get("text",utils.to_str(kwargs, force_string=True)) for name, args, kwargs in receiver.msg.mock_calls] # Get the first element of a tuple if msg received a tuple instead of a string stored_msg = [smsg[0] if isinstance(smsg, tuple) else smsg for smsg in stored_msg] if msg is not None: returned_msg = "||".join(_RE.sub("", mess) for mess in stored_msg) returned_msg = ansi.parse_ansi(returned_msg, strip_ansi=noansi).strip() 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) else: returned_msg = "\n".join(str(msg) for msg in stored_msg) returned_msg = ansi.parse_ansi(returned_msg, strip_ansi=noansi).strip() receiver.msg = old_msg return returned_msg
def call(self, cmdobj, args, msg=None, cmdset=None, noansi=True, caller=None, receiver=None): """ Test a command by assigning all the needed properties to cmdobj and running cmdobj.at_pre_cmd() cmdobj.parse() cmdobj.func() cmdobj.at_post_cmd() The msgreturn value is compared to eventual output sent to caller.msg in the game """ caller = caller if caller else self.char1 receiver = receiver if receiver else caller cmdobj.caller = caller cmdobj.cmdstring = cmdobj.key cmdobj.args = args cmdobj.cmdset = cmdset cmdobj.session = SESSIONS.session_from_sessid(1) cmdobj.player = self.player cmdobj.raw_string = cmdobj.key + " " + args cmdobj.obj = caller if caller else self.char1 # test old_msg = receiver.msg try: receiver.msg = Mock() cmdobj.at_pre_cmd() cmdobj.parse() cmdobj.func() cmdobj.at_post_cmd() # clean out prettytable sugar. We only operate on text-type stored_msg = [ args[0] if args and args[0] else kwargs.get( "text", utils.to_str(kwargs, force_string=True)) for name, args, kwargs in receiver.msg.mock_calls ] returned_msg = "||".join(_RE.sub("", mess) for mess in stored_msg) returned_msg = ansi.parse_ansi(returned_msg, strip_ansi=noansi).strip() if msg is not 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) finally: receiver.msg = old_msg
def execute_cmd(self, session, oobfuncname, *args, **kwargs): """ Execute an oob command Args: session (Session or int): Session or Session.sessid calling the oob command oobfuncname (str): The name of the oob command (case sensitive) Notes: If the oobfuncname is a valid oob function, `args` and `kwargs` are passed into the oob command. """ if isinstance(session, int): # a sessid. Convert to a session session = SESSIONS.session_from_sessid(session) if not session: errmsg = "OOB Error: execute_cmd(%s,%s,%s,%s) - no valid session" % \ (session, oobfuncname, args, kwargs) raise RuntimeError(errmsg) #print "execute_oob:", session, oobfuncname, args, kwargs try: oobfunc = _OOB_FUNCS[oobfuncname] except Exception: errmsg = "'%s' is not a valid OOB command. Commands available:\n %s" % ( oobfuncname, ", ".join(_OOB_FUNCS)) if _OOB_ERROR: _OOB_ERROR(session, errmsg, *args, **kwargs) errmsg = "OOB ERROR: %s" % errmsg logger.log_trace(errmsg) return # we found an oob command. Execute it. try: oobfunc(session, *args, **kwargs) except Exception, err: errmsg = "Exception in %s(*%s, **%s):\n%s" % (oobfuncname, args, kwargs, err) if _OOB_ERROR: _OOB_ERROR(session, errmsg, *args, **kwargs) errmsg = "OOB ERROR: %s" % errmsg logger.log_trace(errmsg)
def call(self, cmdobj, args, msg=None, cmdset=None, noansi=True, caller=None, receiver=None): """ Test a command by assigning all the needed properties to cmdobj and running cmdobj.at_pre_cmd() cmdobj.parse() cmdobj.func() cmdobj.at_post_cmd() The msgreturn value is compared to eventual output sent to caller.msg in the game """ caller = caller if caller else self.char1 receiver = receiver if receiver else caller cmdobj.caller = caller cmdobj.cmdstring = cmdobj.key cmdobj.args = args cmdobj.cmdset = cmdset cmdobj.sessid = 1 cmdobj.session = SESSIONS.session_from_sessid(1) cmdobj.player = self.player cmdobj.raw_string = cmdobj.key + " " + args cmdobj.obj = caller if caller else self.char1 # test old_msg = receiver.msg try: receiver.msg = Mock() cmdobj.at_pre_cmd() cmdobj.parse() cmdobj.func() cmdobj.at_post_cmd() # clean out prettytable sugar stored_msg = [args[0] for name, args, kwargs in receiver.msg.mock_calls] returned_msg = "|".join(_RE.sub("", mess) for mess in stored_msg) returned_msg = ansi.parse_ansi(returned_msg, strip_ansi=noansi).strip() if msg is not 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) finally: receiver.msg = old_msg
def execute_cmd(self, session, oobfuncname, *args, **kwargs): """ Execute an oob command Args: session (Session or int): Session or Session.sessid calling the oob command oobfuncname (str): The name of the oob command (case sensitive) Notes: If the oobfuncname is a valid oob function, `args` and `kwargs` are passed into the oob command. """ if isinstance(session, int): # a sessid. Convert to a session session = SESSIONS.session_from_sessid(session) if not session: errmsg = "OOB Error: execute_cmd(%s,%s,%s,%s) - no valid session" % \ (session, oobfuncname, args, kwargs) raise RuntimeError(errmsg) #print "execute_oob:", session, oobfuncname, args, kwargs try: oobfunc = _OOB_FUNCS[oobfuncname] except Exception: errmsg = "'%s' is not a valid OOB command. Commands available:\n %s" % (oobfuncname, ", ".join(_OOB_FUNCS)) if _OOB_ERROR: _OOB_ERROR(session, errmsg, *args, **kwargs) errmsg = "OOB ERROR: %s" % errmsg logger.log_trace(errmsg) return # we found an oob command. Execute it. try: oobfunc(session, *args, **kwargs) except Exception, err: errmsg = "Exception in %s(*%s, **%s):\n%s" % (oobfuncname, args, kwargs, err) if _OOB_ERROR: _OOB_ERROR(session, errmsg, *args, **kwargs) errmsg = "OOB ERROR: %s" % errmsg logger.log_trace(errmsg)
def call(self, cmdobj, args, msg=None, cmdset=None, noansi=True, caller=None, receiver=None, cmdstring=None, obj=None): """ Test a command by assigning all the needed properties to cmdobj and running cmdobj.at_pre_cmd() cmdobj.parse() cmdobj.func() cmdobj.at_post_cmd() The msgreturn value is compared to eventual output sent to caller.msg in the game Returns: msg (str): The received message that was sent to the caller. """ caller = caller if caller else self.char1 receiver = receiver if receiver else caller cmdobj.caller = caller cmdobj.cmdname = cmdstring if cmdstring else cmdobj.key cmdobj.raw_cmdname = cmdobj.cmdname cmdobj.cmdstring = cmdobj.cmdname # deprecated cmdobj.args = args cmdobj.cmdset = cmdset cmdobj.session = SESSIONS.session_from_sessid(1) cmdobj.account = self.account cmdobj.raw_string = cmdobj.key + " " + args cmdobj.obj = obj or (caller if caller else self.char1) # test old_msg = receiver.msg returned_msg = "" try: receiver.msg = Mock() cmdobj.at_pre_cmd() cmdobj.parse() ret = cmdobj.func() if isinstance(ret, types.GeneratorType): ret.next() cmdobj.at_post_cmd() except StopIteration: pass except InterruptCommand: pass finally: # clean out evtable sugar. We only operate on text-type stored_msg = [args[0] if args and args[0] else kwargs.get("text", utils.to_str(kwargs, force_string=True)) for name, args, kwargs in receiver.msg.mock_calls] # Get the first element of a tuple if msg received a tuple instead of a string stored_msg = [smsg[0] if isinstance(smsg, tuple) else smsg for smsg in stored_msg] if msg is not None: returned_msg = "||".join(_RE.sub("", mess) for mess in stored_msg) returned_msg = ansi.parse_ansi(returned_msg, strip_ansi=noansi).strip() 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) else: returned_msg = "\n".join(str(msg) for msg in stored_msg) returned_msg = ansi.parse_ansi(returned_msg, strip_ansi=noansi).strip() receiver.msg = old_msg return returned_msg
def call( self, cmdobj, args, msg=None, cmdset=None, noansi=True, caller=None, receiver=None, cmdstring=None, obj=None, inputs=None, raw_string=None, ): """ Test a command by assigning all the needed properties to cmdobj and running cmdobj.at_pre_cmd() cmdobj.parse() cmdobj.func() cmdobj.at_post_cmd() The msgreturn value is compared to eventual output sent to caller.msg in the game Returns: msg (str): The received message that was sent to the caller. """ caller = caller if caller else self.char1 receiver = receiver if receiver else caller cmdobj.caller = caller cmdobj.cmdname = cmdstring if cmdstring else cmdobj.key cmdobj.raw_cmdname = cmdobj.cmdname cmdobj.cmdstring = cmdobj.cmdname # deprecated cmdobj.args = args cmdobj.cmdset = cmdset cmdobj.session = SESSIONS.session_from_sessid(1) cmdobj.account = self.account cmdobj.raw_string = raw_string if raw_string is not None else cmdobj.key + " " + args cmdobj.obj = obj or (caller if caller else self.char1) # test old_msg = receiver.msg inputs = inputs or [] try: receiver.msg = Mock() if cmdobj.at_pre_cmd(): return cmdobj.parse() ret = cmdobj.func() # handle func's with yield in them (generators) if isinstance(ret, types.GeneratorType): while True: try: inp = inputs.pop() if inputs else None if inp: try: ret.send(inp) except TypeError: next(ret) ret = ret.send(inp) else: next(ret) except StopIteration: break cmdobj.at_post_cmd() except StopIteration: pass except InterruptCommand: pass # clean out evtable sugar. We only operate on text-type stored_msg = [ args[0] if args and args[0] else kwargs.get( "text", utils.to_str(kwargs)) for name, args, kwargs in receiver.msg.mock_calls ] # Get the first element of a tuple if msg received a tuple instead of a string stored_msg = [ str(smsg[0]) if isinstance(smsg, tuple) else str(smsg) for smsg in stored_msg ] if msg is not None: msg = str(msg) # to be safe, e.g. `py` command may return ints # set our separator for returned messages based on parsing ansi or not msg_sep = "|" if noansi else "||" # Have to strip ansi for each returned message for the regex to handle it correctly returned_msg = msg_sep.join( _RE.sub("", ansi.parse_ansi(mess, strip_ansi=noansi)) for mess in stored_msg).strip() 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) else: returned_msg = "\n".join(str(msg) for msg in stored_msg) returned_msg = ansi.parse_ansi(returned_msg, strip_ansi=noansi).strip() receiver.msg = old_msg return returned_msg
def call(self, cmdobj, args, msg=None, cmdset=None, noansi=True, caller=None, receiver=None, cmdstring=None, obj=None, inputs=None): """ Test a command by assigning all the needed properties to cmdobj and running cmdobj.at_pre_cmd() cmdobj.parse() cmdobj.func() cmdobj.at_post_cmd() The msgreturn value is compared to eventual output sent to caller.msg in the game Returns: msg (str): The received message that was sent to the caller. """ caller = caller if caller else self.char1 receiver = receiver if receiver else caller cmdobj.caller = caller cmdobj.cmdname = cmdstring if cmdstring else cmdobj.key cmdobj.raw_cmdname = cmdobj.cmdname cmdobj.cmdstring = cmdobj.cmdname # deprecated cmdobj.args = args cmdobj.cmdset = cmdset cmdobj.session = SESSIONS.session_from_sessid(1) cmdobj.account = self.account cmdobj.raw_string = cmdobj.key + " " + args cmdobj.obj = obj or (caller if caller else self.char1) # test old_msg = receiver.msg inputs = inputs or [] try: receiver.msg = Mock() if cmdobj.at_pre_cmd(): return cmdobj.parse() ret = cmdobj.func() # handle func's with yield in them (generators) if isinstance(ret, types.GeneratorType): while True: try: inp = inputs.pop() if inputs else None if inp: try: ret.send(inp) except TypeError: ret.next() ret = ret.send(inp) else: ret.next() except StopIteration: break cmdobj.at_post_cmd() except StopIteration: pass except InterruptCommand: pass # clean out evtable sugar. We only operate on text-type stored_msg = [args[0] if args and args[0] else kwargs.get("text", utils.to_str(kwargs, force_string=True)) for name, args, kwargs in receiver.msg.mock_calls] # Get the first element of a tuple if msg received a tuple instead of a string stored_msg = [smsg[0] if isinstance(smsg, tuple) else smsg for smsg in stored_msg] if msg is not None: # set our separator for returned messages based on parsing ansi or not msg_sep = "|" if noansi else "||" # Have to strip ansi for each returned message for the regex to handle it correctly returned_msg = msg_sep.join(_RE.sub("", ansi.parse_ansi(mess, strip_ansi=noansi)) for mess in stored_msg).strip() 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) else: returned_msg = "\n".join(str(msg) for msg in stored_msg) returned_msg = ansi.parse_ansi(returned_msg, strip_ansi=noansi).strip() receiver.msg = old_msg return returned_msg