Auto-indexing service and GraphQL API for AT Protocol Records
quickslice.slices.network/
atproto
gleam
graphql
1/// Integration tests for label preferences
2///
3/// Tests the label preference system including:
4/// - Setting label preferences
5/// - Getting label preferences for a user
6/// - Non-system label filtering
7/// - Validation of visibility values
8import database/repositories/label_definitions
9import database/repositories/label_preferences
10import gleam/list
11import gleam/option
12import gleam/string
13import gleeunit/should
14import test_helpers
15
16// =============================================================================
17// Label Definitions Repository Tests (with default_visibility)
18// =============================================================================
19
20pub fn label_definitions_get_includes_default_visibility_test() {
21 let assert Ok(db) = test_helpers.create_test_db()
22 let assert Ok(_) = test_helpers.create_moderation_tables(db)
23
24 // Get a label definition
25 let assert Ok(option.Some(def)) = label_definitions.get(db, "spam")
26
27 // Should have default_visibility field
28 def.val |> should.equal("spam")
29 def.default_visibility |> should.equal("warn")
30}
31
32pub fn label_definitions_get_non_system_excludes_system_labels_test() {
33 let assert Ok(db) = test_helpers.create_test_db()
34 let assert Ok(_) = test_helpers.create_moderation_tables(db)
35
36 // Get non-system labels
37 let assert Ok(defs) = label_definitions.get_non_system(db)
38
39 // Should have at least some labels
40 list.length(defs) |> should.not_equal(0)
41
42 // None should start with !
43 list.all(defs, fn(def) { !string.starts_with(def.val, "!") })
44 |> should.be_true()
45}
46
47pub fn label_definitions_get_non_system_includes_content_labels_test() {
48 let assert Ok(db) = test_helpers.create_test_db()
49 let assert Ok(_) = test_helpers.create_moderation_tables(db)
50
51 // Get non-system labels
52 let assert Ok(defs) = label_definitions.get_non_system(db)
53
54 // Should include porn, spam, etc.
55 let vals = list.map(defs, fn(d) { d.val })
56
57 vals |> list.contains("porn") |> should.be_true()
58 vals |> list.contains("spam") |> should.be_true()
59 vals |> list.contains("sexual") |> should.be_true()
60 vals |> list.contains("nudity") |> should.be_true()
61}
62
63// =============================================================================
64// Label Preferences Repository Tests
65// =============================================================================
66
67pub fn label_preferences_set_and_get_test() {
68 let assert Ok(db) = test_helpers.create_test_db()
69 let assert Ok(_) = test_helpers.create_moderation_tables(db)
70
71 let did = "did:plc:user123"
72 let label_val = "spam"
73 let visibility = "hide"
74
75 // Set a preference
76 let assert Ok(pref) = label_preferences.set(db, did, label_val, visibility)
77
78 pref.did |> should.equal(did)
79 pref.label_val |> should.equal(label_val)
80 pref.visibility |> should.equal(visibility)
81
82 // Get the preference
83 let assert Ok(option.Some(found)) = label_preferences.get(db, did, label_val)
84
85 found.visibility |> should.equal(visibility)
86}
87
88pub fn label_preferences_get_by_did_returns_all_user_prefs_test() {
89 let assert Ok(db) = test_helpers.create_test_db()
90 let assert Ok(_) = test_helpers.create_moderation_tables(db)
91
92 let did = "did:plc:user123"
93
94 // Set multiple preferences
95 let assert Ok(_) = label_preferences.set(db, did, "spam", "hide")
96 let assert Ok(_) = label_preferences.set(db, did, "porn", "warn")
97 let assert Ok(_) = label_preferences.set(db, did, "nudity", "ignore")
98
99 // Get all preferences for user
100 let assert Ok(prefs) = label_preferences.get_by_did(db, did)
101
102 prefs |> list.length() |> should.equal(3)
103
104 // Verify each preference exists
105 let vals = list.map(prefs, fn(p) { p.label_val })
106 vals |> list.contains("spam") |> should.be_true()
107 vals |> list.contains("porn") |> should.be_true()
108 vals |> list.contains("nudity") |> should.be_true()
109}
110
111pub fn label_preferences_set_updates_existing_test() {
112 let assert Ok(db) = test_helpers.create_test_db()
113 let assert Ok(_) = test_helpers.create_moderation_tables(db)
114
115 let did = "did:plc:user123"
116 let label_val = "spam"
117
118 // Set initial preference
119 let assert Ok(_) = label_preferences.set(db, did, label_val, "warn")
120
121 // Update preference
122 let assert Ok(updated) = label_preferences.set(db, did, label_val, "hide")
123
124 updated.visibility |> should.equal("hide")
125
126 // Verify only one preference exists
127 let assert Ok(prefs) = label_preferences.get_by_did(db, did)
128 prefs |> list.length() |> should.equal(1)
129}
130
131pub fn label_preferences_delete_removes_preference_test() {
132 let assert Ok(db) = test_helpers.create_test_db()
133 let assert Ok(_) = test_helpers.create_moderation_tables(db)
134
135 let did = "did:plc:user123"
136 let label_val = "spam"
137
138 // Set a preference
139 let assert Ok(_) = label_preferences.set(db, did, label_val, "hide")
140
141 // Delete the preference
142 let assert Ok(_) = label_preferences.delete(db, did, label_val)
143
144 // Should no longer exist
145 let assert Ok(option.None) = label_preferences.get(db, did, label_val)
146}
147
148pub fn label_preferences_different_users_have_separate_prefs_test() {
149 let assert Ok(db) = test_helpers.create_test_db()
150 let assert Ok(_) = test_helpers.create_moderation_tables(db)
151
152 let user1 = "did:plc:user1"
153 let user2 = "did:plc:user2"
154
155 // Set different preferences for different users
156 let assert Ok(_) = label_preferences.set(db, user1, "spam", "hide")
157 let assert Ok(_) = label_preferences.set(db, user2, "spam", "warn")
158
159 // Get user1's preference
160 let assert Ok(option.Some(pref1)) = label_preferences.get(db, user1, "spam")
161 pref1.visibility |> should.equal("hide")
162
163 // Get user2's preference
164 let assert Ok(option.Some(pref2)) = label_preferences.get(db, user2, "spam")
165 pref2.visibility |> should.equal("warn")
166}
167
168pub fn label_preferences_get_returns_none_when_not_set_test() {
169 let assert Ok(db) = test_helpers.create_test_db()
170 let assert Ok(_) = test_helpers.create_moderation_tables(db)
171
172 // Get a preference that doesn't exist
173 let assert Ok(option.None) =
174 label_preferences.get(db, "did:plc:user123", "spam")
175}
176
177pub fn label_preferences_get_by_did_returns_empty_for_new_user_test() {
178 let assert Ok(db) = test_helpers.create_test_db()
179 let assert Ok(_) = test_helpers.create_moderation_tables(db)
180
181 // Get preferences for a user with no preferences
182 let assert Ok(prefs) = label_preferences.get_by_did(db, "did:plc:newuser")
183
184 prefs |> list.length() |> should.equal(0)
185}