def test_create_from_input_col_specified(self): # Setup cmd_name = "setup dailys field" cmd_args = "sleep" evt = EventMessage( self.server, self.test_chan, self.test_user, "{} {}".format(cmd_name, cmd_args), ) evt.split_command_text(cmd_name, cmd_args) spreadsheet = DailysSpreadsheetMock(self.test_user, self.test_chan) # Create from input field = DailysSleepField.create_from_input(evt, spreadsheet) assert field.spreadsheet == spreadsheet
def test_create_from_input_password_first(self): # Setup cmd_name = "setup dailys field" cmd_args = "duolingo {} {}".format(self.TEST_PASSWORD, self.TEST_USERNAME) evt = EventMessage( self.server, self.test_chan, self.test_user, "{} {}".format(cmd_name, cmd_args), ) evt.split_command_text(cmd_name, cmd_args) spreadsheet = DailysSpreadsheetMock(self.test_user, self.test_chan) # Create from input field = DailysDuolingoField.create_from_input(evt, spreadsheet) assert field.spreadsheet == spreadsheet assert field.username == self.TEST_USERNAME assert field.password == self.TEST_PASSWORD
def test_create_from_input(hallo_getter): hallo, test_server, test_chan, test_user = hallo_getter({"dailys"}) # Setup cmd_name = "setup dailys field" cmd_args = "dream" evt = EventMessage( test_server, test_chan, test_user, "{} {}".format(cmd_name, cmd_args), ) evt.split_command_text(cmd_name, cmd_args) spreadsheet = DailysSpreadsheetMock(test_user, test_chan) # Create from input field = DailysDreamField.create_from_input(evt, spreadsheet) assert field.spreadsheet == spreadsheet assert field.type_name == "dreams"
def test_create_from_input(hallo_getter): hallo_obj, test_server, test_chan, test_user = hallo_getter({"dailys"}) # Setup cmd_name = "setup dailys field" cmd_args = "furaffinity" evt = EventMessage( test_server, test_chan, test_user, "{} {}".format(cmd_name, cmd_args), ) evt.split_command_text(cmd_name, cmd_args) spreadsheet = DailysSpreadsheetMock(test_user, test_chan) # Setup an FA key, doesn't matter if it works udp = UserDataParser() key = FAKeyData("cookie_a", "cookie_b") udp.set_user_data(test_user, key) # Create from input field = DailysFAField.create_from_input(evt, spreadsheet) assert field.spreadsheet == spreadsheet
def test_create_from_input__no_static_data(hallo_getter, requests_mock): # Setup stuff command_name = "setup dailys field" command_args = "mood" hallo_obj, test_server, test_chan, test_user = hallo_getter({"dailys"}) evt = EventMessage( test_server, test_chan, test_user, "{} {}".format(command_name, command_args), ) evt.split_command_text(command_name, command_args) spreadsheet = DailysSpreadsheetMock(test_user, test_chan) requests_mock.get("{}/stats/mood/static/".format(spreadsheet.dailys_url), json=[]) # Try and create dailys field with pytest.raises(hallo.modules.dailys.dailys_field.DailysException) as e: DailysMoodField.create_from_input(evt, spreadsheet) assert "mood field static data has not been set up on dailys system" in str( e.value).lower()
def test_create_from_input_no_fa_data(hallo_getter): hallo_obj, test_server, test_chan, test_user = hallo_getter({"dailys"}) # Setup cmd_name = "setup dailys field" cmd_args = "furaffinity" evt = EventMessage( test_server, test_chan, test_user, "{} {}".format(cmd_name, cmd_args), ) evt.split_command_text(cmd_name, cmd_args) spreadsheet = DailysSpreadsheetMock(test_user, test_chan) # Create from input try: DailysFAField.create_from_input(evt, spreadsheet) assert ( False ), "Should have failed to create DailysFAField due to missing FA login info." except hallo.modules.dailys.dailys_field.DailysException as e: assert ("no fa data" in str(e).lower( )), "Exception did not mention that there was no FA data set up."
def test_create_from_input(hallo_getter, requests_mock): dailys_times = ["WakeUpTime", "12:00:00", "SleepTime"] dailys_moods = ["happiness", "anger", "tiredness", "boisterousness"] # Setup stuff command_name = "setup dailys field" command_args = "mood" hallo_obj, test_server, test_chan, test_user = hallo_getter({"dailys"}) evt = EventMessage( test_server, test_chan, test_user, "{} {}".format(command_name, command_args), ) evt.split_command_text(command_name, command_args) spreadsheet = DailysSpreadsheetMock(test_user, test_chan) requests_mock.get("{}/stats/mood/static/".format(spreadsheet.dailys_url), json=[{ "date": "static", "source": "Mock test data", "stat_name": "mood", "data": { "moods": dailys_moods, "times": dailys_times } }]) # Try and create dailys field field = DailysMoodField.create_from_input(evt, spreadsheet) assert field.spreadsheet == spreadsheet assert isinstance(field.times, list) assert len(field.times) == 3 assert DailysMoodField.TIME_WAKE in field.times assert DailysMoodField.TIME_SLEEP in field.times assert time(12, 0, 0) in field.times assert isinstance(field.moods, list) assert len(field.moods) == 4 assert field.moods == dailys_moods
def test_create_from_input_no_password(self): # Setup cmd_name = "setup dailys field" cmd_args = "duolingo {}".format(self.TEST_USERNAME) evt = EventMessage( self.server, self.test_chan, self.test_user, "{} {}".format(cmd_name, cmd_args), ) evt.split_command_text(cmd_name, cmd_args) spreadsheet = DailysSpreadsheetMock(self.test_user, self.test_chan) # Create from input try: DailysDuolingoField.create_from_input(evt, spreadsheet) assert ( False ), "Should have failed to create DailysDuolingoField due to missing password." except DailysException as e: assert ( "you must specify both a duolingo username, and password" in str(e).lower() ), "Exception did not prompt to specify a username and password."
def test_create_from_input_invalid_password(self): # Setup cmd_name = "setup dailys field" cmd_args = "duolingo {} {}".format(self.TEST_USERNAME, "NoTAreaLPasSWorD") evt = EventMessage( self.server, self.test_chan, self.test_user, "{} {}".format(cmd_name, cmd_args), ) evt.split_command_text(cmd_name, cmd_args) spreadsheet = DailysSpreadsheetMock(self.test_user, self.test_chan) # Create from input try: DailysDuolingoField.create_from_input(evt, spreadsheet) assert ( False ), "Should have failed to create DailysDuolingoField due to incorrect password." except DailysException as e: assert ( "could not access a duolingo account with that username and password" in str(e).lower() ), "Exception didn't clarify that password and username do not work."
def dispatch(self, event: EventMessage, flag_list: List[str] = None) -> None: """ Sends the function call out to whichever function, if one is found :param event: The message event which has triggered the function dispatch :param flag_list: List of flags to apply to function call """ if flag_list is None: flag_list = [] # Find the function name. Try joining each amount of words in the message until you find a valid function name function_message_split = event.command_text.split() if not function_message_split: function_message_split = [""] function_class_test = None function_name_test = "" function_args_test = "" for function_name_test in [ " ".join(function_message_split[:x + 1]) for x in range(len(function_message_split))[::-1] ]: function_class_test = self.get_function_by_name(function_name_test) function_args_test = " ".join( function_message_split)[len(function_name_test):].strip() if function_class_test is not None: break # If function isn't found, output a not found message if function_class_test is None: if EventMessage.FLAG_HIDE_ERRORS not in flag_list: event.reply( event.create_response( "Error, this is not a recognised function.")) error = FunctionNotFoundError(self, event) logger.error(error.get_log_line()) return function_class = function_class_test event.split_command_text(function_name_test, function_args_test) # Check function rights and permissions if not self.check_function_permissions(function_class, event.server, event.user, event.channel): event.reply( event.create_response( "You do not have permission to use this function.")) error = FunctionNotAllowedError(self, function_class, event) logger.error(error.get_log_line()) return # If persistent, get the object, otherwise make one function_obj = self.get_function_object(function_class) # Try running the function, if it fails, return an error message try: response = function_obj.run(event) if response is not None: event.reply(response) else: event.reply( event.create_response("The function returned no value.")) return except Exception as e: error = FunctionError(e, self, function_obj, event) e_str = (str(e)[:250] + "..") if len(str(e)) > 250 else str(e) event.reply( event.create_response( "Function failed with error message: {}".format(e_str))) logger.error(error.get_log_line()) return