Auto-indexing service and GraphQL API for AT Protocol Records quickslice.slices.network/
atproto gleam graphql
at main 304 lines 8.6 kB view raw
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}