at protocol indexer with flexible filtering, xrpc queries, and a cursor-backed event stream, built on fjall
at-protocol atproto indexer rust fjall
at 68df12bfc6f171a9e519e641f93d839b88bcfc24 88 lines 3.3 kB view raw
1#!/usr/bin/env nu 2use common.nu * 3 4def main [] { 5 let did = "did:web:guestbook.gaze.systems" 6 let port = 3003 7 let debug_port = $port + 1 8 let url = $"http://localhost:($port)" 9 let debug_url = $"http://localhost:($debug_port)" 10 let db_path = (mktemp -d -t hydrant_debug_test.XXXXXX) 11 12 print $"testing debug endpoints..." 13 print $"database path: ($db_path)" 14 15 let binary = build-hydrant 16 let instance = start-hydrant $binary $db_path $port 17 18 if (wait-for-api $url) { 19 # Trigger backfill to populate some data 20 print $"adding repo ($did) to tracking..." 21 http patch -t application/json $"($url)/filter" { dids: { ($did): true } } 22 23 if (wait-for-backfill $url) { 24 print "backfill complete, testing debug endpoints" 25 26 # 1. Test /debug/iter to find a key 27 print "testing /debug/iter on records partition" 28 let records = http get $"($debug_url)/debug/iter?partition=records&limit=1" 29 30 if ($records.items | is-empty) { 31 print "FAILED: /debug/iter returned empty items" 32 exit 1 33 } 34 35 let first_item = ($records.items | first) 36 let key_str = $first_item.0 37 let value_cid = $first_item.1 38 39 print $"found key: ($key_str)" 40 print $"found value [cid]: ($value_cid)" 41 42 if not ($key_str | str contains "|") { 43 print "FAILED: key does not contain pipe separator" 44 exit 1 45 } 46 47 # 2. Test /debug/get with that key (sent as string) 48 print "testing /debug/get" 49 let get_res = http get $"($debug_url)/debug/get?partition=records&key=($key_str)" 50 51 if $get_res.value != $value_cid { 52 print $"FAILED: /debug/get returned different value. expected: ($value_cid), got: ($get_res.value)" 53 exit 1 54 } 55 56 print "PASSED: /debug/iter and /debug/get works with string keys and JSON values" 57 58 # 3. Test /debug/iter on events partition (should be JSON objects) 59 print "testing /debug/iter on events partition" 60 let events = http get $"($debug_url)/debug/iter?partition=events&limit=1" 61 62 if ($events.items | is-empty) { 63 # might be empty if no events yet (backfill only fills records?) 64 # Backfill should generate events? ops.rs makes events. 65 print "WARNING: /debug/iter returned empty items for events (expected if async?)" 66 } else { 67 let first_evt = ($events.items | first) 68 let val = $first_evt.1 69 let type = ($val | describe) 70 print $"found event value type: ($type)" 71 if not ($type | str starts-with "record") { 72 print $"FAILED: events value is not a record/object. got: ($type)" 73 exit 1 74 } 75 print "PASSED: /debug/iter on events returns JSON objects" 76 } 77 78 } else { 79 print "backfill failed" 80 exit 1 81 } 82 } else { 83 print "api failed to start" 84 exit 1 85 } 86 87 try { kill $instance.pid } 88}