/** * @module live-proxy-ibgib.respec.mts * Unit tests for LiveProxyIbGib lifecycle, disposal, rel8nNamesForChildren, and error streams. */ import { ifWe, ifWeMight, iReckon, respecfully, } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs'; const maam = `[${import.meta.url}]`, sir = maam; import { Factory_V1 } from '@ibgib/ts-gib/dist/V1/factory.mjs'; import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs'; import { createInMemoryTempMetaspaceAndSpace } from '@ibgib/core-gib/dist/witness/space/metaspace/metaspace-innerspace/metaspace-innerspace.mjs'; import { putInSpace } from '@ibgib/core-gib/dist/witness/space/space-helper.mjs'; import { fnObs } from '@ibgib/core-gib/dist/common/pubsub/observer/observer-helper.mjs'; import { LiveProxyIbGib } from './live-proxy-ibgib-one-file.mjs'; await respecfully(sir, `LiveProxyIbGib Lifecycle & Teardown`, async () => { await ifWe(sir, `initializes with isDisposed = false and sets isDisposed = true on dispose()`, async () => { const proxy = new LiveProxyIbGib(); await proxy.initialized; iReckon(sir, proxy.isDisposed).asTo('isDisposed false initially').isGonnaBe(false); iReckon(sir, proxy.error$ !== undefined).asTo('error$ stream initialized').isGonnaBe(true); await proxy.dispose(); iReckon(sir, proxy.isDisposed).asTo('isDisposed true after dispose').isGonnaBe(true); }); await ifWe(sir, `dispose cleans up subscriptions and ignores subsequent timeline events`, async () => { const { metaspace, space } = await createInMemoryTempMetaspaceAndSpace(); const proxy = new LiveProxyIbGib(); await proxy.initialized; proxy.metaspace = metaspace; const rootItem = Factory_V1.primitive({ ib: 'proxy_test_root' }); await putInSpace({ space, ibGib: rootItem }); await proxy.setWrappedIbGib({ ibGib: rootItem, rel8nNamesForChildren: ['chat'], }); iReckon(sir, proxy.getRel8nNamesForChildren().includes('chat')).asTo('chat rel8n registered').isGonnaBe(true); let contextUpdatesCount = 0; proxy.contextUpdated$?.subscribe(fnObs({ next: async () => { contextUpdatesCount++; } })); // Dispose the proxy await proxy.dispose(); iReckon(sir, proxy.isDisposed).asTo('isDisposed is true').isGonnaBe(true); // Attempt to deliver update after dispose await proxy.setWrappedIbGib({ ibGib: rootItem }); iReckon(sir, contextUpdatesCount).asTo('no update processed after dispose').isGonnaBe(0); }); await ifWe(sir, `emits to error$ when setWrappedIbGib fails`, async () => { const { metaspace, space } = await createInMemoryTempMetaspaceAndSpace(); const proxy = new LiveProxyIbGib(); await proxy.initialized; proxy.metaspace = metaspace; const errors: any[] = []; proxy.error$?.subscribe(fnObs({ next: async (err) => { errors.push(err); } })); // Attempting to wrap nonexistent addr in metaspace should fail and emit to error$ try { await proxy.setWrappedIbGib({ ibGibAddr: 'nonexistent^addr', space, }); } catch { // expected } iReckon(sir, errors.length).asTo('error emitted to error$ stream').isGonnaBe(1); iReckon(sir, errors[0].ib.startsWith('error:')).asTo('error contains error message').isGonnaBe(true); }); });