def test_pause_subscription__case_insensitive(mock_client): api = MockExportAPI() watcher = SubscriptionWatcher(api, mock_client) watcher.subscriptions.add(Subscription("EXAMPLE", 18749)) watcher.subscriptions.add(Subscription("TEST", 18749)) func = SubscriptionFunctionality(watcher) list_subs = MockMethod("Listing subscriptions") func._list_subs = list_subs.call resp = func._pause_subscription(18749, "test") assert f"Paused subscription: \"test\"." in resp assert list_subs.called assert list_subs.args[0] == 18749 assert "Listing subscriptions" in resp assert len(watcher.subscriptions) == 2 sub1, sub2 = watcher.subscriptions if sub1.query_str != "TEST": sub1, sub2 = sub2, sub1 assert sub1.query_str == "TEST" assert sub1.destination == 18749 assert sub1.paused is True assert sub2.query_str == "EXAMPLE" assert sub2.destination == 18749 assert sub2.paused is False
def test_remove_sub__removes_subscription_case_insensitive(mock_client): api = MockExportAPI() watcher = SubscriptionWatcher(api, mock_client) watcher.subscriptions.add(Subscription("example", 18749)) watcher.subscriptions.add(Subscription("test", 18747)) new_sub = Subscription("test", 18749) new_sub.latest_update = datetime.datetime.now() watcher.subscriptions.add(new_sub) func = SubscriptionFunctionality(watcher) list_subs = MockMethod("Listing subscriptions") func._list_subs = list_subs.call resp = func._remove_sub(18749, "TEST") assert "Removed subscription: \"TEST\"." in resp assert list_subs.called assert list_subs.args[0] == 18749 assert "Listing subscriptions" in resp assert len(watcher.subscriptions) == 2 subscriptions = list(watcher.subscriptions) if subscriptions[0].query_str == "test": assert subscriptions[0].destination == 18747 assert subscriptions[1].query_str == "example" assert subscriptions[1].destination == 18749 else: assert subscriptions[0].query_str == "example" assert subscriptions[0].destination == 18749 assert subscriptions[1].query_str == "test" assert subscriptions[1].destination == 18747
def test_to_json__paused(): sub = Subscription("test query", -12322) sub.paused = True data = sub.to_json() assert data["paused"] is True
def test_pause_destination__not_in_other_destination(mock_client): api = MockExportAPI() watcher = SubscriptionWatcher(api, mock_client) watcher.subscriptions.add(Subscription("test", 18749)) watcher.subscriptions.add(Subscription("example", 12345)) func = SubscriptionFunctionality(watcher) list_subs = MockMethod("Listing subscriptions") func._list_subs = list_subs.call resp = func._pause_destination(18749) assert "Paused all subscriptions." in resp assert len(watcher.subscriptions) == 2 assert list_subs.called assert list_subs.args[0] == 18749 assert "Listing subscriptions" in resp sub1, sub2 = list(watcher.subscriptions)[:2] if sub1.destination != 18749: sub2, sub1 = sub1, sub2 assert sub1.destination == 18749 assert sub1.query_str == "test" assert sub1.paused is True assert sub2.destination == 12345 assert sub2.query_str == "example" assert sub2.paused is False
async def test_send_updates__gathers_subscriptions(mock_client): api = MockExportAPI() watcher = SubscriptionWatcher(api, mock_client) subscription1 = Subscription("test", 12345) subscription2 = Subscription("test2", 12345) subscription3 = Subscription("test", 54321) submission = SubmissionBuilder().build_mock_submission() await watcher._send_updates([subscription1, subscription2, subscription3], submission) assert submission._send_message.call_count == 2 call_list = submission._send_message.call_args_list # Indifferent to call order, so figure out the order here call1 = call_list[0] call2 = call_list[1] if call1[0][1] != 12345: call1 = call_list[1] call2 = call_list[0] args1, kwargs1 = call1 args2, kwargs2 = call2 # Check call matching two subscriptions assert args1[0] == mock_client assert args2[0] == mock_client assert args1[1] == 12345 assert args2[1] == 54321 assert "update" in kwargs1['prefix'].lower() assert "\"test\", \"test2\"" in kwargs1['prefix'] assert "subscriptions:" in kwargs1['prefix'].lower() # And check the one subscription call assert "update" in kwargs2['prefix'].lower() assert "\"test\"" in kwargs2['prefix'] assert "subscription:" in kwargs2['prefix'].lower()
def test_to_json_no_updates(): sub = Subscription("test query", -12322) data = sub.to_json() assert "query" in data assert data["query"] == "test query" assert "latest_update" in data assert data["latest_update"] is None
def test_matches_result__suffix_doesnt_match_term(): query = "*taur" subscription = Subscription(query, 12432) submission = SubmissionBuilder( title="taur plays in woods").build_full_submission() match = subscription.matches_result(submission, AndQuery([])) assert not match
def test_matches_result__regex_matches_case_insensitive(): query = "d*taur" subscription = Subscription(query, 12432) submission = SubmissionBuilder( title="DeerTaur plays in woods").build_full_submission() match = subscription.matches_result(submission, AndQuery([])) assert match
def test_matches_result__prefix_matches(): query = "deer*" subscription = Subscription(query, 12432) submission = SubmissionBuilder( title="deertaur plays in woods").build_full_submission() match = subscription.matches_result(submission, AndQuery([])) assert match
def test_to_json_and_back_no_update(): sub = Subscription("an example", -63939) data = sub.to_json() new_sub = Subscription.from_json_new_format(data, -63939) assert new_sub.query_str == sub.query_str assert new_sub.destination == sub.destination assert new_sub.latest_update == sub.latest_update
def test_matches_not_negative_rating(): query = "deer -rating:general" subscription = Subscription(query, 12432) submission = SubmissionBuilder( title="Deer plays in woods", rating=Rating.GENERAL).build_full_submission() match = subscription.matches_result(submission, AndQuery([])) assert not match
def test_to_json(): sub = Subscription("test query", -12322) sub.latest_update = datetime.datetime(2019, 9, 17, 21, 8, 35) data = sub.to_json() assert "query" in data assert data["query"] == "test query" assert "latest_update" in data assert data["latest_update"] == "2019-09-17T21:08:35" assert data["paused"] is False
def test_to_json_and_back(mock_client): test_watcher_file = "./test_subscription_watcher.json" if os.path.exists(test_watcher_file): os.remove(test_watcher_file) old_filename = SubscriptionWatcher.FILENAME SubscriptionWatcher.FILENAME = test_watcher_file api = MockExportAPI() latest_submissions = [ SubmissionBuilder(submission_id="123243").build_short_submission(), SubmissionBuilder(submission_id="123242").build_short_submission(), SubmissionBuilder(submission_id="123240").build_short_submission() ] subscription1 = Subscription("query", 1234) subscription2 = Subscription("example", 5678) watcher = SubscriptionWatcher(api, mock_client) watcher._update_latest_ids(latest_submissions) watcher.subscriptions.add(subscription1) watcher.subscriptions.add(subscription2) watcher.blocklists[3452] = {"test", "example"} watcher.blocklists[1453] = {"ych"} try: watcher.save_to_json() new_watcher = SubscriptionWatcher.load_from_json(api, mock_client) assert len(new_watcher.latest_ids) == 3 assert "123243" in new_watcher.latest_ids assert "123242" in new_watcher.latest_ids assert "123240" in new_watcher.latest_ids assert list(watcher.latest_ids) == list(new_watcher.latest_ids) assert len(new_watcher.subscriptions) == 2 list_subs = list(new_watcher.subscriptions) if list_subs[0].query_str == "query": assert list_subs[0].destination == 1234 assert list_subs[1].query_str == "example" assert list_subs[1].destination == 5678 else: assert list_subs[0].query_str == "example" assert list_subs[0].destination == 5678 assert list_subs[1].query_str == "query" assert list_subs[1].destination == 1234 assert len(new_watcher.blocklists) == 2 assert 3452 in new_watcher.blocklists assert len(new_watcher.blocklists[3452]) == 2 assert isinstance(new_watcher.blocklists[3452], set) assert "test" in new_watcher.blocklists[3452] assert "example" in new_watcher.blocklists[3452] assert 1453 in new_watcher.blocklists assert len(new_watcher.blocklists[1453]) == 1 assert isinstance(new_watcher.blocklists[1453], set) assert "ych" in new_watcher.blocklists[1453] finally: SubscriptionWatcher.FILENAME = old_filename os.remove(test_watcher_file)
def test_remove_sub__non_existent_subscription(mock_client): api = MockExportAPI() watcher = SubscriptionWatcher(api, mock_client) watcher.subscriptions.add(Subscription("example", 18749)) watcher.subscriptions.add(Subscription("test", 18747)) func = SubscriptionFunctionality(watcher) resp = func._remove_sub(18749, "test") assert resp == "There is not a subscription for \"test\" in this chat." assert len(watcher.subscriptions) == 2
def test_matches_result__two_words_in_description_matches(): query = "example submission" subscription = Subscription(query, 12432) submission = SubmissionBuilder( title="test", description="this submission is just an example", keywords=["example", "keywords"]).build_full_submission() match = subscription.matches_result(submission, AndQuery([])) assert match
def test_matches_result__keywords_not_phrase(): query = "\"hello world\"" subscription = Subscription(query, 12432) submission = SubmissionBuilder( title="Test submission", description="this submission says hello to the world", keywords=["example", "hello", "world"]).build_full_submission() match = subscription.matches_result(submission, AndQuery([])) assert not match
def test_matches_word_in_tag(): query = "deer" subscription = Subscription(query, 12432) submission = SubmissionBuilder( title="Test submission", description="this submission is <b>deer</b>", keywords=["example", "submission", "keywords"]).build_full_submission() match = subscription.matches_result(submission, AndQuery([])) assert match
def test_matches_result__doesnt_match_except_quote(): query = "taur except \"no taur\"" subscription = Subscription(query, 12432) submission = SubmissionBuilder( title="Test submission", description="this submission contains no taur", keywords=["example", "submission", "keywords"]).build_full_submission() match = subscription.matches_result(submission, AndQuery([])) assert not match
def test_matches_result__keyword_field(): query = "keywords:deer" subscription = Subscription(query, 12432) submission = SubmissionBuilder( title="Test submission", description="this submission has no deer and will not be tagged deer", keywords=["example", "submission", "keywords"]).build_full_submission() match = subscription.matches_result(submission, AndQuery([])) assert not match
def test_matches_result__matches_query_with_hyphen(): query = "an-example" subscription = Subscription(query, 12432) submission = SubmissionBuilder( title="Test submission", description="this submission is just an-example", keywords=["example", "submission", "keywords"]).build_full_submission() match = subscription.matches_result(submission, AndQuery([])) assert match
def test_matches_result__does_not_match_query_with_applicable_negated_query(): query = "test -example" subscription = Subscription(query, 12432) submission = SubmissionBuilder( title="Test submission", description="this submission is just an example", keywords=["example", "submission", "keywords"]).build_full_submission() match = subscription.matches_result(submission, AndQuery([])) assert not match
def test_matches_result__case_insensitive_query(): query = "SUBMISSION" subscription = Subscription(query, 12432) submission = SubmissionBuilder( title="test submission", description="this submission is just an example", keywords=["example", "submission", "keywords"]).build_full_submission() match = subscription.matches_result(submission, AndQuery([])) assert match
def test_save_to_json(mock_client): test_watcher_file = "./test_subscription_watcher.json" if os.path.exists(test_watcher_file): os.remove(test_watcher_file) api = MockExportAPI() latest_submissions = [ SubmissionBuilder(submission_id="123243").build_short_submission(), SubmissionBuilder(submission_id="123242").build_short_submission(), SubmissionBuilder(submission_id="123240").build_short_submission() ] subscription1 = Subscription("query", 1234) subscription2 = Subscription("example", 5678) watcher = SubscriptionWatcher(api, mock_client) watcher._update_latest_ids(latest_submissions) watcher.subscriptions.add(subscription1) watcher.subscriptions.add(subscription2) watcher.blocklists[3452] = {"test", "example"} watcher.blocklists[1453] = {"ych"} watcher.FILENAME = test_watcher_file try: watcher.save_to_json() assert os.path.exists(test_watcher_file) with open(test_watcher_file, "r") as f: data = json.load(f) assert data is not None assert len(data['latest_ids']) == 3 assert "123240" in data['latest_ids'] assert "123242" in data['latest_ids'] assert "123243" in data['latest_ids'] assert len(data["destinations"]) == 4 assert len(data["destinations"]["1234"]["subscriptions"]) == 1 assert data["destinations"]["1234"]["subscriptions"][0][ "query"] == "query" assert len(data["destinations"]["1234"]["blocks"]) == 0 assert len(data["destinations"]["5678"]["subscriptions"]) == 1 assert data["destinations"]["5678"]["subscriptions"][0][ "query"] == "example" assert len(data["destinations"]["5678"]["blocks"]) == 0 assert len(data["destinations"]["3452"]["subscriptions"]) == 0 assert len(data["destinations"]["3452"]["blocks"]) == 2 assert set([ block["query"] for block in data["destinations"]["3452"]["blocks"] ]) == {"test", "example"} assert len(data["destinations"]["1453"]["subscriptions"]) == 0 assert len(data["destinations"]["1453"]["blocks"]) == 1 assert data["destinations"]["1453"]["blocks"][0]["query"] == "ych" finally: os.remove(test_watcher_file)
def test_list_subs__alphabetical_case_insensitive(mock_client): api = MockExportAPI() watcher = SubscriptionWatcher(api, mock_client) watcher.subscriptions.add(Subscription("Example", 18749)) watcher.subscriptions.add(Subscription("test", 18749)) watcher.subscriptions.add(Subscription("deer", 18749)) func = SubscriptionFunctionality(watcher) resp = func._list_subs(18749) assert "Current subscriptions in this chat:" in resp assert "- deer\n- Example\n- test" in resp
def test_matches_result__substring_in_keywords_no_match(): query = "keyword" subscription = Subscription(query, 12432) submission = SubmissionBuilder( title="test submission", description="this submission is just an example", keywords=["example", "submission", "keywords"]).build_full_submission() match = subscription.matches_result(submission, AndQuery([])) assert not match
def test_matches_result__doesnt_match_except_bracket_clause(): query = "multi* except (multicol* or multitude)" subscription = Subscription(query, 12432) submission = SubmissionBuilder( title="Test submission", description= "this submission is just an example of a multitude of multicoloured things", keywords=["example", "submission", "keywords"]).build_full_submission() match = subscription.matches_result(submission, AndQuery([])) assert not match
def test_matches_result__doesnt_match_blocklisted_tag(): query = "an-example" subscription = Subscription(query, 12432) submission = SubmissionBuilder( title="Test submission", description="this submission is just an-example", keywords=["example", "submission", "keywords"]).build_full_submission() match = subscription.matches_result(submission, NotQuery(WordQuery("test"))) assert not match
def test_matches_result__doesnt_match_except_field(): query = "keywords:(multi* except (multitude multiple multicol*))" subscription = Subscription(query, 12432) submission = SubmissionBuilder( title="Test submission", description= "this submission is about multiplication but not tagged like that", keywords=["multitude", "multiple", "multicoloured", "multicolors"]).build_full_submission() match = subscription.matches_result(submission, AndQuery([])) assert not match
def test_matches_result__except_matches_other_match(): query = "multi* except multitude" subscription = Subscription(query, 12432) submission = SubmissionBuilder( title="Test submission", description= "this submission is just an example of a multitude of multiple things", keywords=["example", "submission", "keywords"]).build_full_submission() match = subscription.matches_result(submission, AndQuery([])) assert match
def test_matches_result__not_when_paused(): query = "test" subscription = Subscription(query, 12432) subscription.paused = True submission = SubmissionBuilder( title="test submission", description="this submission is just an example", keywords=["example", "submission", "keywords"]).build_full_submission() match = subscription.matches_result(submission, AndQuery([])) assert not match