def test_basics(self) -> None: """ Verifies the basic behavior of modifying alert words. Also verifies the cache-flushing behavior. """ user = self.example_user('cordelia') realm_alert_words = alert_words_in_realm(user.realm) self.assert_length(realm_alert_words, 0) # Add several words, including multi-word and non-ascii words. add_user_alert_words(user, self.interesting_alert_word_list) words = user_alert_words(user) self.assertEqual(set(words), set(self.interesting_alert_word_list)) realm_alert_words = alert_words_in_realm(user.realm) self.assert_length(realm_alert_words[user.id], 3) # Test the case-insensitivity of adding words add_user_alert_words(user, set(["ALert", "ALERT"])) words = user_alert_words(user) self.assertEqual(set(words), set(self.interesting_alert_word_list)) realm_alert_words = alert_words_in_realm(user.realm) self.assert_length(realm_alert_words[user.id], 3) # Test the case-insensitivity of removing words remove_user_alert_words(user, set(["ALert"])) words = user_alert_words(user) self.assertEqual(set(words), set(self.interesting_alert_word_list) - {'alert'}) realm_alert_words = alert_words_in_realm(user.realm) self.assert_length(realm_alert_words[user.id], 2)
def test_json_list_nonempty(self) -> None: hamlet = self.example_user('hamlet') add_user_alert_words(hamlet, ['one', 'two', 'three']) self.login(self.example_email('hamlet')) result = self.client_get('/json/users/me/alert_words') self.assert_json_success(result) self.assertEqual(result.json()['alert_words'], ['one', 'two', 'three'])
def test_add_word(self) -> None: """ add_user_alert_words can add multiple alert words at once. """ user = self.example_user('cordelia') # Add several words, including multi-word and non-ascii words. add_user_alert_words(user, self.interesting_alert_word_list) words = user_alert_words(user) self.assertEqual(words, self.interesting_alert_word_list)
def test_add_word(self): # type: () -> None """ add_user_alert_words can add multiple alert words at once. """ email = "*****@*****.**" user = get_user_profile_by_email(email) # Add several words, including multi-word and non-ascii words. add_user_alert_words(user, self.interesting_alert_word_list) words = user_alert_words(user) self.assertEqual(words, self.interesting_alert_word_list)
def test_remove_word(self) -> None: """ Removing alert words works via remove_user_alert_words, even for multi-word and non-ascii words. """ user = self.example_user('cordelia') expected_remaining_alerts = set(self.interesting_alert_word_list) add_user_alert_words(user, self.interesting_alert_word_list) for alert_word in self.interesting_alert_word_list: remove_user_alert_words(user, [alert_word]) expected_remaining_alerts.remove(alert_word) actual_remaining_alerts = user_alert_words(user) self.assertEqual(set(actual_remaining_alerts), expected_remaining_alerts)
def test_remove_word(self) -> None: """ Removing alert words works via remove_user_alert_words, even for multi-word and non-ascii words. """ user = self.example_user('cordelia') add_user_alert_words(user, self.interesting_alert_word_list) theoretical_remaining_alerts = self.interesting_alert_word_list[:] for alert_word in self.interesting_alert_word_list: remove_user_alert_words(user, alert_word) theoretical_remaining_alerts.remove(alert_word) actual_remaining_alerts = user_alert_words(user) self.assertEqual(actual_remaining_alerts, theoretical_remaining_alerts)
def test_realm_words(self) -> None: """ We can gather alert words for an entire realm via alert_words_in_realm. Alerts added for one user do not impact other users. """ user1 = self.example_user('cordelia') add_user_alert_words(user1, self.interesting_alert_word_list) user2 = self.example_user('othello') add_user_alert_words(user2, ['another']) realm_words = alert_words_in_realm(user2.realm) self.assertEqual(len(realm_words), 2) self.assertEqual(list(realm_words.keys()), [user1.id, user2.id]) self.assertEqual(realm_words[user1.id], self.interesting_alert_word_list) self.assertEqual(realm_words[user2.id], ['another'])
def test_remove_word(self): # type: () -> None """ Removing alert words works via remove_user_alert_words, even for multi-word and non-ascii words. """ email = "*****@*****.**" user = get_user_profile_by_email(email) add_user_alert_words(user, self.interesting_alert_word_list) theoretical_remaining_alerts = self.interesting_alert_word_list[:] for alert_word in self.interesting_alert_word_list: remove_user_alert_words(user, alert_word) theoretical_remaining_alerts.remove(alert_word) actual_remaining_alerts = user_alert_words(user) self.assertEqual(actual_remaining_alerts, theoretical_remaining_alerts)
def test_realm_words(self): # type: () -> None """ We can gather alert words for an entire realm via alert_words_in_realm. Alerts added for one user do not impact other users. """ email = "*****@*****.**" user1 = get_user_profile_by_email(email) add_user_alert_words(user1, self.interesting_alert_word_list) email = "*****@*****.**" user2 = get_user_profile_by_email(email) add_user_alert_words(user2, ['another']) realm_words = alert_words_in_realm(user2.realm) self.assertEqual(len(realm_words), 2) self.assertEqual(list(realm_words.keys()), [user1.id, user2.id]) self.assertEqual(realm_words[user1.id], self.interesting_alert_word_list) self.assertEqual(realm_words[user2.id], ['another'])
def do_add_alert_words(user_profile: UserProfile, alert_words: Iterable[str]) -> None: words = add_user_alert_words(user_profile, alert_words) notify_alert_words(user_profile, words)