Compare commits
No commits in common. "dadfa61b5fd5baed5a6fcec100dcf54ef3f6dc3e" and "87d3a945a53ec7470b8b72f70942ed4849176b75" have entirely different histories.
dadfa61b5f
...
87d3a945a5
2 changed files with 6 additions and 50 deletions
|
|
@ -67,13 +67,6 @@ describe('find({ connected }) is graph-first: neighbours → filter → page', (
|
||||||
})
|
})
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
// CLOSE IT. Dropping the reference does not close a brain — it only makes
|
|
||||||
// it unreachable from here. The instance stays open and registered, its
|
|
||||||
// unref'd cadence timer keeps running, and because the gate config runs the
|
|
||||||
// whole suite in ONE process (pool: 'forks', singleFork: true) it goes on
|
|
||||||
// narrating its flushes into every test file that runs after this one.
|
|
||||||
// A test that leaks a brain is a defect of the test.
|
|
||||||
await brain?.close()
|
|
||||||
brain = null as any
|
brain = null as any
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -144,34 +137,13 @@ describe('find({ connected }) is graph-first: neighbours → filter → page', (
|
||||||
})
|
})
|
||||||
|
|
||||||
it('walks the vector leg over the neighbours only', async () => {
|
it('walks the vector leg over the neighbours only', async () => {
|
||||||
// The SAME query without the vector leg, first. Both legs draw from the
|
|
||||||
// one neighbour set, so this is the control: it says whether a short answer
|
|
||||||
// came from the adjacency/filter (both legs short) or from the vector walk
|
|
||||||
// alone (only the vector leg short). Cheap, and it turns a bare count
|
|
||||||
// mismatch into a named half — this case has gone red on the gate box
|
|
||||||
// while passing in isolation and beside its own predecessor, so the next
|
|
||||||
// red must arrive already carrying the half it belongs to.
|
|
||||||
const control = await brain.find({
|
|
||||||
connected: { from: anchor, direction: 'out' },
|
|
||||||
where: { kind: 'note' },
|
|
||||||
limit: 5
|
|
||||||
})
|
|
||||||
|
|
||||||
const results = await brain.find({
|
const results = await brain.find({
|
||||||
vector: sharedVector,
|
vector: sharedVector,
|
||||||
connected: { from: anchor, direction: 'out' },
|
connected: { from: anchor, direction: 'out' },
|
||||||
where: { kind: 'note' },
|
where: { kind: 'note' },
|
||||||
limit: 5
|
limit: 5
|
||||||
})
|
})
|
||||||
|
expect(results).toHaveLength(5)
|
||||||
expect(
|
|
||||||
results.length,
|
|
||||||
`the vector leg returned ${results.length} of a requested 5. The same query ` +
|
|
||||||
`WITHOUT the vector returned ${control.length}: if that is also short the ` +
|
|
||||||
`neighbour set or the filter is the cause, and if it is 5 the vector walk is — ` +
|
|
||||||
`note every row in this corpus carries an identical vector, so the walk is ` +
|
|
||||||
`ranking an exact tie.`
|
|
||||||
).toBe(5)
|
|
||||||
for (const r of results) expect(neighbourIds.has(r.entity.id)).toBe(true)
|
for (const r of results) expect(neighbourIds.has(r.entity.id)).toBe(true)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -70,22 +70,8 @@ describe('an idle brain costs nothing', () => {
|
||||||
await brain.flush()
|
await brain.flush()
|
||||||
|
|
||||||
const logged: string[] = []
|
const logged: string[] = []
|
||||||
// The STACK behind each narration, kept beside the line it belongs to.
|
|
||||||
// vitest tags a stdout block with the test that is RUNNING, not the brain
|
|
||||||
// that wrote it, so teeing these lines through would only ever name this
|
|
||||||
// test. The call stack does name the driver: `kickBackgroundFlush('idle')`
|
|
||||||
// under `armIdleFlushTimer` is a cadence flush on some brain, the deferred-
|
|
||||||
// embed worker's commit path is a brain still landing vectors, and a bare
|
|
||||||
// `flush()` is an explicit caller. That distinction is the whole question.
|
|
||||||
const stacks: string[] = []
|
|
||||||
const origLog = console.log
|
const origLog = console.log
|
||||||
console.log = ((...a: unknown[]) => {
|
console.log = ((...a: unknown[]) => { logged.push(a.map(String).join(' ')) }) as typeof console.log
|
||||||
const line = a.map(String).join(' ')
|
|
||||||
logged.push(line)
|
|
||||||
if (/All indexes flushed to disk|Flushing Brainy indexes/.test(line)) {
|
|
||||||
stacks.push(new Error('flush narration').stack ?? '(no stack)')
|
|
||||||
}
|
|
||||||
}) as typeof console.log
|
|
||||||
|
|
||||||
// Watch the providers directly: a flush that runs calls all of them.
|
// Watch the providers directly: a flush that runs calls all of them.
|
||||||
const storage = (brain as unknown as { storage: { flushCounts: () => Promise<void> } }).storage
|
const storage = (brain as unknown as { storage: { flushCounts: () => Promise<void> } }).storage
|
||||||
|
|
@ -127,12 +113,10 @@ describe('an idle brain costs nothing', () => {
|
||||||
)
|
)
|
||||||
expect(
|
expect(
|
||||||
flushChatter,
|
flushChatter,
|
||||||
`${flushChatter.length} flush line(s) narrated during the ${IDLE_WATCH_MS}ms idle ` +
|
`a flush narrated during the ${IDLE_WATCH_MS}ms idle window. This brain's own ` +
|
||||||
`window. This brain's own providers were NOT called (asserted above), so another ` +
|
`providers were NOT called (asserted above), so the lines below were printed by ` +
|
||||||
`brain alive in this process printed them — the suite runs every file in ONE ` +
|
`another brain alive in this process — find it by the 'stdout | <file> > <test>' ` +
|
||||||
`process and 67 test files create more brains than they close.\n` +
|
`prefix in the run log:\n${flushChatter.join('\n')}`
|
||||||
`${flushChatter.join('\n')}\n\n` +
|
|
||||||
`The stack behind the first one names the driver:\n${stacks[0] ?? '(none captured)'}`
|
|
||||||
).toEqual([])
|
).toEqual([])
|
||||||
}, 180_000)
|
}, 180_000)
|
||||||
|
|
||||||
|
|
|
||||||
Reference in a new issue