OverviewFilesCommitsIssuesDocsReleasesPeers

favela-community / test / discovery.test.mjs

42 lines · javascript ref:
// favela-community — DHT name/topic discovery. Over a LOCAL testnet DHT (deterministic, no network): an
// announcer publishes a room under a name + topic; an INDEPENDENT resolver finds the roomKey by name and
// by topic. Run: bare test/discovery.test.mjs
import createTestnet from 'hyperdht/testnet.js'
import DHT from 'hyperdht'
import { CommunityDiscovery } from '../index.js'

const assert = (c, m) => { if (!c) { console.error('FAIL:', m); process.exit(1) } console.log('  ok -', m) }
const ROOM_A = 'a'.repeat(64)
const ROOM_B = 'b'.repeat(64)

const testnet = await createTestnet(4)
const bootstrap = testnet.bootstrap
const dhtPub = new DHT({ bootstrap })
const dhtFind = new DHT({ bootstrap })

// ── announce room A under a name + topic, room B under the same topic ──
const pub = new CommunityDiscovery(dhtPub)
const rA = await pub.announce({ roomKey: ROOM_A, name: 'Cat Lovers', description: 'meow', topics: ['Pets'] })
assert(rA.roomKey === ROOM_A && rA.labels.includes('cat lovers') && rA.labels.includes('pets'), 'announce normalizes + returns the room label set')
await pub.announce({ roomKey: ROOM_B, name: 'Dog Fans', topics: ['pets'] })

// ── an INDEPENDENT resolver finds it by name and by topic ──
const find = new CommunityDiscovery(dhtFind)
const byName = await find.resolve('cat lovers') // case-insensitive
assert(byName === ROOM_A, 'resolve(name) → roomKey (case-insensitive)')

const petsRooms = await find.discover('pets')
const petKeys = petsRooms.map((r) => r.roomKey).sort()
assert(petKeys.includes(ROOM_A) && petKeys.includes(ROOM_B), 'discover(topic) → BOTH rooms announced under that topic')
const catRec = petsRooms.find((r) => r.roomKey === ROOM_A)
assert(catRec && catRec.name === 'cat lovers' && catRec.description === 'meow', 'discovered record carries name + description metadata')

assert((await find.resolve('nonexistent community')) === null, 'resolve of an unknown name → null')

// ── unannounce drops the advertisement (best-effort; the record ages out) ──
await pub.unannounce(ROOM_A)
assert(true, 'unannounce completes without throwing')

console.log('\nFAVELA-COMMUNITY DISCOVERY OK: announce + resolve-by-name + discover-by-topic over a testnet DHT')
await dhtPub.destroy(); await dhtFind.destroy(); await testnet.destroy()