Automerge backed Markdown editor for the Atmosphere
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869import { test } from 'node:test'import { deepStrictEqual, equal } from 'node:assert/strict'import http from 'node:http'import { createUserinputSpaceRefHandler } from '../../src/server/userinput-space-ref.mjs'
const did = 'did:plc:reams-test-board'const rkey = 'feedback-space'const cid = `b${'a'.repeat(30)}`const space = { uri: `at://${did}/app.userinput.space/${rkey}`, cid, value: { $type: 'app.userinput.space', name: 'ignored', tags: [{ value: 'bug', label: 'Bug' }, { value: 'feature' }] } }
async function run(handler) { const server = http.createServer(async (req, res) => { if (!await handler(req, res)) res.writeHead(404).end() }) await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)) try { return await fetch(`http://127.0.0.1:${server.address().port}/api/feedback/space`) } finally { await new Promise(resolve => server.close(resolve)) }}
test('queries only the configured DID record at its configured PDS and returns the minimal strong reference', async () => { let requests = 0 const pds = http.createServer((req, res) => { requests++ const url = new URL(req.url, 'http://127.0.0.1') equal(url.pathname, '/xrpc/com.atproto.repo.getRecord') equal(url.searchParams.get('repo'), did) equal(url.searchParams.get('collection'), 'app.userinput.space') equal(url.searchParams.get('rkey'), rkey) equal(req.headers.authorization, undefined) res.writeHead(200, { 'content-type': 'application/json' }).end(JSON.stringify(space)) }) await new Promise(resolve => pds.listen(0, '127.0.0.1', resolve)) try { const handler = createUserinputSpaceRefHandler({ spaceDid: did, spaceRkey: rkey, pdsUrl: `http://127.0.0.1:${pds.address().port}`, allowLoopbackTest: true }) const response = await run(handler) equal(response.status, 200) deepStrictEqual(await response.json(), { uri: space.uri, cid, types: [{ value: 'bug', label: 'Bug' }, { value: 'feature', label: 'feature' }] }) equal(requests, 1) } finally { await new Promise(resolve => pds.close(resolve)) }})
test('missing config fails closed without fetching and production rejects loopback HTTP', async () => { const response = await run(createUserinputSpaceRefHandler({ spaceDid: did, spaceRkey: rkey })) equal(response.status, 503) equal((await response.json()).error, 'feedback_unconfigured') let fetched = false const pds = http.createServer(() => { fetched = true }) await new Promise(resolve => pds.listen(0, '127.0.0.1', resolve)) try { const handler = createUserinputSpaceRefHandler({ spaceDid: did, spaceRkey: rkey, pdsUrl: `http://127.0.0.1:${pds.address().port}` }) equal((await run(handler)).status, 503) equal(fetched, false) } finally { await new Promise(resolve => pds.close(resolve)) }})
test('rejects mismatched strong references and invalid tag vocabularies', async () => { for (const invalid of [ { ...space, uri: `at://${did}/app.userinput.space/other` }, { ...space, cid: 'not-a-cid' }, { ...space, value: { ...space.value, $type: 'other' } }, { ...space, value: { ...space.value, tags: [{ value: 'Bad Tag' }] } }, ]) { const pds = http.createServer((_req, res) => res.writeHead(200, { 'content-type': 'application/json' }).end(JSON.stringify(invalid))) await new Promise(resolve => pds.listen(0, '127.0.0.1', resolve)) try { const handler = createUserinputSpaceRefHandler({ spaceDid: did, spaceRkey: rkey, pdsUrl: `http://127.0.0.1:${pds.address().port}`, allowLoopbackTest: true }) equal((await run(handler)).status, 502) } finally { await new Promise(resolve => pds.close(resolve)) } }})