def setUp(self): self._scenarios = [ Scenario([ Request('asker', 'hello', 'link', 'https://some_link.com'), Request('agent', 'world', 'same', ''), ]), Scenario([ Request('asker', 'question_scenario_2', 'link', 'some_url_scenario_2'), ]) ] self._mock_get_suggestions = Mock() self._mock_get_suggestions.side_effect = [[ Suggestion('link', 'some_url'), Suggestion('link', 'another_url') ], [Suggestion('link', 'url_of_a_different_suggestions_response') ], [Suggestion('link', 'some_url_of_suggestion_scenario_2')]] self._mock_get_time = Mock() self._mock_get_time.side_effect = [ datetime(2005, 12, 30, 6, 45, 1), datetime(2005, 12, 30, 6, 45, 2), datetime(2005, 12, 30, 6, 45, 4), datetime(2005, 12, 30, 6, 45, 7), datetime(2005, 12, 30, 6, 45, 11), datetime(2005, 12, 30, 6, 45, 16) ] self._scenario_runner = ScenariosRunner(self._mock_get_suggestions, self._mock_get_time)
def test_fail_when_expected_link_and_no_suggestion_contains_the_link(self): request = Request(None, None, "link", "expected_link") suggestions = [ Suggestion("link", "not_the_expected_link"), Suggestion("question", "question_data") ] self.assertFalse( analyse_link_or_question_with_request_data(request, suggestions))
def test_fail_when_expected_question_and_no_suggestion_is_a_question(self): request = Request(None, None, "question", "") suggestions = [ Suggestion("link", "someLink"), Suggestion("link", "someOtherLink") ] self.assertFalse( analyse_link_or_question_without_request_data( request, suggestions))
def test_fail_when_expected_notlink_and_suggestion_contains_the_forbidden_link( self): request = Request(None, None, "notlink", "forbidden_url") suggestions = [ Suggestion("link", "urlA"), Suggestion("link", "forbidden_url"), Suggestion("link", "urlC") ] self.assertFalse( analyse_notlink_with_request_data(request, suggestions))
def test_pass_when_expected_notlink_and_suggestion_does_not_contain_the_forbidden_link( self): request = Request(None, None, "notlink", "url_not_in_the_suggestions") suggestions = [ Suggestion("link", "urlA"), Suggestion("link", "urlB"), Suggestion("link", "urlC") ] self.assertTrue(analyse_notlink_with_request_data( request, suggestions))
def test_when_not_found_then_get_selected_suggestion_returns_none(self): suggestions = [ Suggestion("link", "some_dummy_url"), Suggestion("link", "more_dummy_url"), Suggestion("link", "another_dummy_url") ] request = Request(None, None, "link", "some_expected_url") actual_selected_suggestion = get_selected_suggestion( suggestions, request) self.assertIsNone(actual_selected_suggestion)
def test_pass_when_expected_question_and_one_suggestion_is_a_question( self): request = Request(None, None, "question", "") suggestions = [ Suggestion("link", "someLink"), Suggestion("question", "question_data") ] self.assertTrue( analyse_link_or_question_without_request_data( request, suggestions))
def test_pass_when_expected_same_and_suggestions_are_the_same(self): request = Request(None, None, "same", "") previous_suggestions = [ Suggestion("link", "urlA"), Suggestion("question", "question_data") ] current_suggestions = [ Suggestion("link", "urlA"), Suggestion("question", "question_data") ] self.assertTrue( analyse_same(request, current_suggestions, previous_suggestions))
def test_fail_when_expected_same_and_suggestions_are_different(self): request = Request(None, None, "same", "") previous_suggestions = [ Suggestion("link", "urlA"), Suggestion("question", "question_data") ] current_suggestions = [ Suggestion("link", "different_url"), Suggestion("question", "question_data") ] self.assertFalse( analyse_same(request, current_suggestions, previous_suggestions))
def test_when_expecting_question_get_selected_suggestion_returns_first_question_and_position_one( self): suggestions = [ Suggestion("link", "some_dummy_url"), Suggestion("link", "more_dummy_url"), Suggestion("question", "question_data") ] request = Request(None, None, "question", "") selected_suggestion = get_selected_suggestion(suggestions, request) self.assertIsNotNone(selected_suggestion) self.assertEquals(1, selected_suggestion[0]) self.assertEquals(Suggestion("question", "question_data"), selected_suggestion[1])
def test_when_expecting_notlink_get_selected_suggestion_returns_first_nonforbidden_link_and_position( self): suggestions = [ Suggestion("question", "dummy_question_data"), Suggestion("link", "forbidden_url"), Suggestion("link", "first_non_forbidden_url") ] request = Request(None, None, "notlink", "forbidden_url_not_in_suggestions forbidden_url") selected_suggestion = get_selected_suggestion(suggestions, request) self.assertIsNotNone(selected_suggestion) self.assertEquals(2, selected_suggestion[0]) self.assertEquals(Suggestion("link", "first_non_forbidden_url"), selected_suggestion[1])
def test_when_expecting_link_get_selected_suggestion_returns_first_matching_link_and_position( self): suggestions = [ Suggestion("question", "dummy_question_data"), Suggestion("link", "some_dummy_url"), Suggestion("link", "expected_url") ] request = Request(None, None, "link", "some_url_not_found expected_url") selected_suggestion = get_selected_suggestion(suggestions, request) self.assertIsNotNone(selected_suggestion) self.assertEquals(2, selected_suggestion[0]) self.assertEquals(Suggestion("link", "expected_url"), selected_suggestion[1])
def test_when_found_then_get_selected_suggestion_returns_matching_suggestion( self): suggestions = [ Suggestion("link", "some_dummy_url"), Suggestion("link", "some_expected_url"), Suggestion("link", "another_dummy_url") ] request = Request(None, None, "link", "some_expected_url") actual_selected_suggestion = get_selected_suggestion( suggestions, request) self.assertIsNotNone(actual_selected_suggestion) self.assertEquals(2, actual_selected_suggestion[0]) self.assertEquals(Suggestion("link", "some_expected_url"), actual_selected_suggestion[1])
def test_getters(self): suggestions = [ Suggestion('link', 'some_url'), Suggestion('link', 'another_url') ] suggestions_response = SuggestionsResponse(suggestions, timedelta(seconds=42)) self.assertEquals('link', suggestions_response.get_suggestions()[0].get_type()) self.assertEquals('some_url', suggestions_response.get_suggestions()[0].get_data()) self.assertEquals('link', suggestions_response.get_suggestions()[1].get_type()) self.assertEquals('another_url', suggestions_response.get_suggestions()[1].get_data()) self.assertEquals(timedelta(seconds=42), suggestions_response.get_response_time_duration())
def test_analyze_with_one_successful_suggestions_response(self): expected_analysis = ['success(1-1)'] request = Request('asker', 'What is Coveo?', 'link', 'https://www.coveo.com/') suggestion = Suggestion('link', 'https://www.coveo.com/') suggestions_responses_analyzer = SuggestionsResponsesAnalyzer( [Scenario([request])], [[SuggestionsResponse([suggestion], timedelta(seconds=0))]]) self.assertEquals(expected_analysis, suggestions_responses_analyzer.analyze_scenarios())
def setUp(self): self._suggestions_3_links = [ Suggestion('link', 'https://blog.coveo.com/goodbye-gsa-hello-intelligent-search-in-the-cloud/'), Suggestion('link', 'https://coveo.github.io/search-ui/interfaces/isearchendpointoptions.html'), Suggestion('link', 'https://onlinehelp.coveo.com/en/ces/7.0/administrator/about_net_conversion_scripts.htm') ] self._suggestions_3_questions = [ Suggestion('question', 'What is your name?'), Suggestion('question', 'Did you try this?'), Suggestion('question', 'Hello?') ] suggestions_responses_for_each_scenario = [ [ SuggestionsResponse(self._suggestions_3_questions, timedelta(seconds=49)), SuggestionsResponse(self._suggestions_3_links, timedelta(seconds=49)) ], [ SuggestionsResponse(self._suggestions_3_questions, timedelta(seconds=54)), SuggestionsResponse(self._suggestions_3_questions, timedelta(seconds=48)), SuggestionsResponse(self._suggestions_3_questions, timedelta(seconds=48)), SuggestionsResponse(self._suggestions_3_links, timedelta(seconds=48)), SuggestionsResponse(self._suggestions_3_links, timedelta(seconds=48)) ] ] self._scenarios = get_scenarios_from_csv_file(SCENARIO_FILE_PATH) self._metrics_analyzer = MetricsAnalyzer(self._scenarios, suggestions_responses_for_each_scenario) empty_suggestions_suggestions_responses_for_each_scenario = [ [ SuggestionsResponse([], timedelta(seconds=0)), SuggestionsResponse([], timedelta(seconds=0)) ], [ SuggestionsResponse([], timedelta(seconds=0)), SuggestionsResponse([], timedelta(seconds=0)), SuggestionsResponse([], timedelta(seconds=0)), SuggestionsResponse([], timedelta(seconds=0)), SuggestionsResponse([], timedelta(seconds=0)) ] ] self._no_suggestions_responses_metrics_analyzer = \ MetricsAnalyzer(self._scenarios, empty_suggestions_suggestions_responses_for_each_scenario) self._immediate_response_metrics_analyzer = \ MetricsAnalyzer(self._scenarios, empty_suggestions_suggestions_responses_for_each_scenario)
def test_average_selected_suggestion_position_only_counts_questions_when_expecting_questions(self): suggestions = [ Suggestion('link', 'dummy_urlA'), Suggestion('link', 'dummy_urlB'), Suggestion('link', 'dummy_urlC'), Suggestion('question', 'dummy_questionA'), Suggestion('question', 'dummy_questionB'), Suggestion('question', 'dummy_questionC') ] request = Request( None, None, "question", "" ) scenarios = [Scenario([request])] suggestions_responses_for_each_scenario = [[ SuggestionsResponse( suggestions, timedelta(seconds=42) ) ]] metrics_analyzer = MetricsAnalyzer(scenarios, suggestions_responses_for_each_scenario) self.assertEquals(1, metrics_analyzer.calculate_mean_position_of_selected_suggestions())
def setUp(self): self._scenarios = get_scenarios_from_csv_file(SCENARIO_FILE_PATH) self._scenarios_starting_with_same = get_scenarios_from_csv_file( SCENARIOS_STARTING_WITH_SAME_FILE_PATH) suggestions_3_links = [ Suggestion( 'link', 'https://blog.coveo.com/goodbye-gsa-hello-intelligent-search-in-the-cloud/' ), Suggestion( 'link', 'https://coveo.github.io/search-ui/interfaces/isearchendpointoptions.html' ), Suggestion( 'link', 'https://onlinehelp.coveo.com/en/ces/7.0/administrator/about_net_conversion_scripts.htm' ) ] suggestions_3_questions = [ Suggestion('question', 'What is your name?'), Suggestion('question', 'Did you try this?'), Suggestion('question', 'Hello?') ] suggestions_2_last_links = suggestions_3_links[1:] self._suggestions_responses_for_each_scenario = [ [ SuggestionsResponse(suggestions_3_questions, timedelta(seconds=49)) ], [ SuggestionsResponse(suggestions_3_links, timedelta(seconds=49)), SuggestionsResponse(suggestions_3_links, timedelta(seconds=49)), SuggestionsResponse(suggestions_3_links, timedelta(seconds=49)), SuggestionsResponse(suggestions_3_questions, timedelta(seconds=54)), SuggestionsResponse(suggestions_3_questions, timedelta(seconds=48)), SuggestionsResponse(suggestions_3_links, timedelta(seconds=48)), SuggestionsResponse(suggestions_3_links, timedelta(seconds=48)), SuggestionsResponse(suggestions_2_last_links, timedelta(seconds=48)), SuggestionsResponse(suggestions_3_links, timedelta(seconds=48)), SuggestionsResponse(suggestions_3_links, timedelta(seconds=48)) ], [ SuggestionsResponse(suggestions_3_questions, timedelta(seconds=48)), SuggestionsResponse(suggestions_3_questions, timedelta(seconds=48)), SuggestionsResponse(suggestions_3_links, timedelta(seconds=48)), SuggestionsResponse(suggestions_3_links, timedelta(seconds=48)), SuggestionsResponse(suggestions_3_questions, timedelta(seconds=48)), SuggestionsResponse(suggestions_3_questions, timedelta(seconds=48)), SuggestionsResponse(suggestions_3_questions, timedelta(seconds=48)), SuggestionsResponse(suggestions_3_links, timedelta(seconds=48)), SuggestionsResponse(suggestions_3_links, timedelta(seconds=48)), SuggestionsResponse(suggestions_3_questions, timedelta(seconds=48)) ] ] self._suggestions_responses_starting_with_same = [ [SuggestionsResponse(suggestions_3_links, timedelta(seconds=49))], [ SuggestionsResponse([], timedelta(seconds=49)), SuggestionsResponse(suggestions_3_links, timedelta(seconds=49)) ], [SuggestionsResponse(suggestions_3_links, timedelta(seconds=49))] ]
def json_link_to_suggestion(json_link): return Suggestion('link', json_link['printableUri'])
def json_question_to_suggestion(json_question): return Suggestion('question', json_question['text'])
def get_suggestion(json_suggestion): is_link = 'printableUri' in json_suggestion suggestion_type = 'link' if is_link else 'question' data_json_field = 'printableUri' if is_link else 'title' return Suggestion(suggestion_type, json_suggestion[data_json_field])
def json_link_to_suggestion(json_link): return Suggestion('link', json_link['uri'])