Auto-indexing service and GraphQL API for AT Protocol Records
quickslice.slices.network/
atproto
gleam
graphql
1/// Integration tests for admin connection pagination
2///
3/// Tests that labels and reports return proper connection structure
4/// with edges, pageInfo, and totalCount
5import database/repositories/labels
6import database/repositories/reports
7import gleam/list
8import gleam/option
9import gleeunit/should
10import test_helpers
11
12// =============================================================================
13// Labels Connection Pagination Tests
14// =============================================================================
15
16pub fn labels_get_paginated_returns_correct_structure_test() {
17 let assert Ok(db) = test_helpers.create_test_db()
18 let assert Ok(_) = test_helpers.create_moderation_tables(db)
19
20 let src = "did:plc:admin123"
21
22 // Insert 5 labels
23 let assert Ok(_) =
24 labels.insert(
25 db,
26 src,
27 "at://did:plc:user1/app.bsky.feed.post/1",
28 option.None,
29 "spam",
30 option.None,
31 )
32 let assert Ok(_) =
33 labels.insert(
34 db,
35 src,
36 "at://did:plc:user2/app.bsky.feed.post/2",
37 option.None,
38 "spam",
39 option.None,
40 )
41 let assert Ok(_) =
42 labels.insert(
43 db,
44 src,
45 "at://did:plc:user3/app.bsky.feed.post/3",
46 option.None,
47 "spam",
48 option.None,
49 )
50 let assert Ok(_) =
51 labels.insert(
52 db,
53 src,
54 "at://did:plc:user4/app.bsky.feed.post/4",
55 option.None,
56 "!warn",
57 option.None,
58 )
59 let assert Ok(_) =
60 labels.insert(
61 db,
62 src,
63 "at://did:plc:user5/app.bsky.feed.post/5",
64 option.None,
65 "spam",
66 option.None,
67 )
68
69 // Get first 2 labels
70 let assert Ok(paginated) =
71 labels.get_paginated(db, option.None, option.None, 2, option.None)
72
73 // Should return 2 labels
74 paginated.labels |> list.length() |> should.equal(2)
75 // Should have next page (3 more labels)
76 paginated.has_next_page |> should.equal(True)
77 // Total count should be 5
78 paginated.total_count |> should.equal(5)
79}
80
81pub fn labels_get_paginated_with_filter_test() {
82 let assert Ok(db) = test_helpers.create_test_db()
83 let assert Ok(_) = test_helpers.create_moderation_tables(db)
84
85 let src = "did:plc:admin123"
86
87 // Insert labels with different vals
88 let assert Ok(_) =
89 labels.insert(
90 db,
91 src,
92 "at://did:plc:user1/app.bsky.feed.post/1",
93 option.None,
94 "spam",
95 option.None,
96 )
97 let assert Ok(_) =
98 labels.insert(
99 db,
100 src,
101 "at://did:plc:user2/app.bsky.feed.post/2",
102 option.None,
103 "!warn",
104 option.None,
105 )
106 let assert Ok(_) =
107 labels.insert(
108 db,
109 src,
110 "at://did:plc:user3/app.bsky.feed.post/3",
111 option.None,
112 "spam",
113 option.None,
114 )
115
116 // Filter by val = "spam"
117 let assert Ok(paginated) =
118 labels.get_paginated(db, option.None, option.Some("spam"), 10, option.None)
119
120 // Should return 2 spam labels
121 paginated.labels |> list.length() |> should.equal(2)
122 // No next page
123 paginated.has_next_page |> should.equal(False)
124 // Total count of spam labels is 2
125 paginated.total_count |> should.equal(2)
126}
127
128pub fn labels_get_paginated_with_cursor_test() {
129 let assert Ok(db) = test_helpers.create_test_db()
130 let assert Ok(_) = test_helpers.create_moderation_tables(db)
131
132 let src = "did:plc:admin123"
133
134 // Insert 4 labels
135 let assert Ok(_) =
136 labels.insert(
137 db,
138 src,
139 "at://did:plc:user1/app.bsky.feed.post/1",
140 option.None,
141 "spam",
142 option.None,
143 )
144 let assert Ok(_) =
145 labels.insert(
146 db,
147 src,
148 "at://did:plc:user2/app.bsky.feed.post/2",
149 option.None,
150 "spam",
151 option.None,
152 )
153 let assert Ok(_) =
154 labels.insert(
155 db,
156 src,
157 "at://did:plc:user3/app.bsky.feed.post/3",
158 option.None,
159 "spam",
160 option.None,
161 )
162 let assert Ok(_) =
163 labels.insert(
164 db,
165 src,
166 "at://did:plc:user4/app.bsky.feed.post/4",
167 option.None,
168 "spam",
169 option.None,
170 )
171
172 // Get first page (2 items)
173 let assert Ok(page1) =
174 labels.get_paginated(db, option.None, option.None, 2, option.None)
175
176 page1.labels |> list.length() |> should.equal(2)
177 page1.has_next_page |> should.equal(True)
178 page1.total_count |> should.equal(4)
179
180 // Get last item from first page to use as cursor
181 let assert Ok(last_label) = list.last(page1.labels)
182
183 // Get second page using cursor
184 let assert Ok(page2) =
185 labels.get_paginated(
186 db,
187 option.None,
188 option.None,
189 2,
190 option.Some(last_label.id),
191 )
192
193 page2.labels |> list.length() |> should.equal(2)
194 page2.has_next_page |> should.equal(False)
195 // Total count is still 4 (cursor doesn't affect total)
196 page2.total_count |> should.equal(4)
197
198 // Verify second page has different labels (lower IDs)
199 let assert Ok(first_label_page2) = list.first(page2.labels)
200 { first_label_page2.id < last_label.id } |> should.equal(True)
201}
202
203pub fn labels_get_paginated_empty_result_test() {
204 let assert Ok(db) = test_helpers.create_test_db()
205 let assert Ok(_) = test_helpers.create_moderation_tables(db)
206
207 // Get paginated with no labels
208 let assert Ok(paginated) =
209 labels.get_paginated(db, option.None, option.None, 10, option.None)
210
211 paginated.labels |> list.length() |> should.equal(0)
212 paginated.has_next_page |> should.equal(False)
213 paginated.total_count |> should.equal(0)
214}
215
216// =============================================================================
217// Reports Connection Pagination Tests
218// =============================================================================
219
220pub fn reports_get_paginated_returns_correct_structure_test() {
221 let assert Ok(db) = test_helpers.create_test_db()
222 let assert Ok(_) = test_helpers.create_moderation_tables(db)
223
224 let reporter = "did:plc:reporter123"
225
226 // Insert 4 reports
227 let assert Ok(_) =
228 reports.insert(db, reporter, "at://did/post/1", "spam", option.None)
229 let assert Ok(_) =
230 reports.insert(db, reporter, "at://did/post/2", "violation", option.None)
231 let assert Ok(_) =
232 reports.insert(db, reporter, "at://did/post/3", "rude", option.None)
233 let assert Ok(_) =
234 reports.insert(db, reporter, "at://did/post/4", "spam", option.None)
235
236 // Get first 2 reports
237 let assert Ok(paginated) =
238 reports.get_paginated(db, option.None, 2, option.None)
239
240 paginated.reports |> list.length() |> should.equal(2)
241 paginated.has_next_page |> should.equal(True)
242 paginated.total_count |> should.equal(4)
243}
244
245pub fn reports_get_paginated_with_status_filter_test() {
246 let assert Ok(db) = test_helpers.create_test_db()
247 let assert Ok(_) = test_helpers.create_moderation_tables(db)
248
249 let reporter = "did:plc:reporter123"
250 let admin = "did:plc:admin123"
251
252 // Insert reports
253 let assert Ok(report1) =
254 reports.insert(db, reporter, "at://did/post/1", "spam", option.None)
255 let assert Ok(_) =
256 reports.insert(db, reporter, "at://did/post/2", "violation", option.None)
257 let assert Ok(_) =
258 reports.insert(db, reporter, "at://did/post/3", "rude", option.None)
259
260 // Resolve first report
261 let assert Ok(_) = reports.resolve(db, report1.id, "resolved", admin)
262
263 // Filter by status = "pending"
264 let assert Ok(paginated) =
265 reports.get_paginated(db, option.Some("pending"), 10, option.None)
266
267 paginated.reports |> list.length() |> should.equal(2)
268 paginated.has_next_page |> should.equal(False)
269 paginated.total_count |> should.equal(2)
270}
271
272pub fn reports_get_paginated_with_cursor_test() {
273 let assert Ok(db) = test_helpers.create_test_db()
274 let assert Ok(_) = test_helpers.create_moderation_tables(db)
275
276 let reporter = "did:plc:reporter123"
277
278 // Insert 4 reports
279 let assert Ok(_) =
280 reports.insert(db, reporter, "at://did/post/1", "spam", option.None)
281 let assert Ok(_) =
282 reports.insert(db, reporter, "at://did/post/2", "spam", option.None)
283 let assert Ok(_) =
284 reports.insert(db, reporter, "at://did/post/3", "spam", option.None)
285 let assert Ok(_) =
286 reports.insert(db, reporter, "at://did/post/4", "spam", option.None)
287
288 // Get first page
289 let assert Ok(page1) = reports.get_paginated(db, option.None, 2, option.None)
290
291 page1.reports |> list.length() |> should.equal(2)
292 page1.has_next_page |> should.equal(True)
293
294 // Get last item from first page
295 let assert Ok(last_report) = list.last(page1.reports)
296
297 // Get second page using cursor
298 let assert Ok(page2) =
299 reports.get_paginated(db, option.None, 2, option.Some(last_report.id))
300
301 page2.reports |> list.length() |> should.equal(2)
302 page2.has_next_page |> should.equal(False)
303 page2.total_count |> should.equal(4)
304}