]> git.openstreetmap.org Git - rails.git/blob - test/models/user_notification_preferences_test.rb
Merge remote-tracking branch 'upstream/pull/7110'
[rails.git] / test / models / user_notification_preferences_test.rb
1 # frozen_string_literal: true
2
3 require "test_helper"
4
5 class UserNotificationPreferencesTest < ActiveSupport::TestCase
6   def test_all_enabled_by_default
7     preferences = UserNotificationPreferences.new(create(:user))
8     assert_equal ["email"], preferences.changeset_comment
9     assert_equal ["email"], preferences.diary_comment
10     assert_equal ["email"], preferences.direct_message
11     assert_equal ["email"], preferences.gpx_import_failure
12     assert_equal ["email"], preferences.gpx_import_success
13     assert_equal ["email"], preferences.new_follower
14     assert_equal ["email"], preferences.note_comment
15   end
16
17   def test_update
18     preferences = UserNotificationPreferences.new(create(:user))
19     preferences.update(
20       "changeset_comment" => ["email"],
21       "diary_comment" => [],
22       "direct_message" => ["email"],
23       "gpx_import_failure" => ["email"],
24       "gpx_import_success" => nil,
25       "new_follower" => []
26     )
27
28     assert_equal ["email"], preferences.changeset_comment
29     assert_equal [], preferences.diary_comment
30     assert_equal ["email"], preferences.direct_message
31     assert_equal ["email"], preferences.gpx_import_failure
32     assert_equal [], preferences.gpx_import_success
33     assert_equal [], preferences.new_follower
34
35     # Default value
36     assert_equal ["email"], preferences.note_comment
37   end
38
39   def test_update_ignore_invalid_values
40     preferences = UserNotificationPreferences.new(create(:user))
41
42     preferences.update("changeset_comment" => ["whatsapp"])
43     assert_equal [], preferences.changeset_comment
44     assert_equal 0, UserPreference.where("k LIKE '%whatsapp%'").count
45
46     preferences.update("changeset_comment" => %w[whatsapp email])
47     assert_equal ["email"], preferences.changeset_comment
48     assert_equal 0, UserPreference.where("k LIKE '%whatsapp%'").count
49
50     preferences.update("imaginary_event" => ["email"])
51     assert_equal 0, UserPreference.where("k LIKE '%imaginary_event%'").count
52   end
53
54   def test_update_ignore_unmentioned_events
55     preferences = UserNotificationPreferences.new(create(:user))
56     preferences.update(
57       "changeset_comment" => ["email"],
58       "diary_comment" => []
59     )
60     assert_equal 1, count_event_preferences_in_db("changeset_comment")
61     assert_equal 1, count_event_preferences_in_db("diary_comment")
62     assert_equal 0, count_event_preferences_in_db("direct_message")
63     assert_equal 0, count_event_preferences_in_db("gpx_import_failure")
64     assert_equal 0, count_event_preferences_in_db("gpx_import_success")
65     assert_equal 0, count_event_preferences_in_db("new_follower")
66     assert_equal 0, count_event_preferences_in_db("note_comment")
67     assert_equal 0, count_event_preferences_in_db("note_comment")
68   end
69
70   private
71
72   def count_event_preferences_in_db(event_name)
73     # A bit paranoid, but want to avoid misspellings, etc that produce
74     # false positives.
75     raise "Unknown event #{event_name.inspect}" unless UserNotificationPreferences::EVENTS.include?(event_name)
76
77     UserPreference.where("k LIKE 'notification.#{event_name}.%'").count
78   end
79 end