Beispiel #1
0
 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
Beispiel #2
0
 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"
Beispiel #4
0
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
Beispiel #5
0
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()
Beispiel #6
0
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."
Beispiel #7
0
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
Beispiel #8
0
 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."
Beispiel #9
0
 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."
Beispiel #10
0
 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