test(hygiene): close every brain the unit suite creates
Each file opened one or more Brainy instances (beforeEach, or a small per-test helper like migration-gate-family-scoped's module-level seed()) and never closed them. migration-gate-family-scoped.test.ts now tracks every brain seed() hands back in a describe-scoped array drained by afterEach, since the helper itself lives outside the describe block.
This commit is contained in:
parent
d6e7453f1f
commit
de79d6b5a4
16 changed files with 83 additions and 15 deletions
|
|
@ -5,7 +5,7 @@
|
||||||
* No mocks, no fakes, real implementation
|
* No mocks, no fakes, real implementation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { describe, it, expect, beforeEach } from 'vitest'
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
||||||
import { Brainy } from '../../src/brainy.js'
|
import { Brainy } from '../../src/brainy.js'
|
||||||
import { NounType } from '../../src/types/graphTypes.js'
|
import { NounType } from '../../src/types/graphTypes.js'
|
||||||
|
|
||||||
|
|
@ -21,6 +21,10 @@ describe('Brainy 3.0 Core (Unit Tests)', () => {
|
||||||
await brain.init()
|
await brain.init()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
await brain.close()
|
||||||
|
})
|
||||||
|
|
||||||
describe('CRUD Operations', () => {
|
describe('CRUD Operations', () => {
|
||||||
it('should create items with add', async () => {
|
it('should create items with add', async () => {
|
||||||
const id = await brain.add({
|
const id = await brain.add({
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
* exercised by cor's combined matrix); they inject probe/spy hooks onto the live JS
|
* exercised by cor's combined matrix); they inject probe/spy hooks onto the live JS
|
||||||
* metadata index, which has neither method by default.
|
* metadata index, which has neither method by default.
|
||||||
*/
|
*/
|
||||||
import { describe, it, expect, beforeEach } from 'vitest'
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
||||||
import { Brainy } from '../../../src/brainy'
|
import { Brainy } from '../../../src/brainy'
|
||||||
import { NounType } from '../../../src/types/graphTypes'
|
import { NounType } from '../../../src/types/graphTypes'
|
||||||
|
|
||||||
|
|
@ -34,6 +34,10 @@ describe('metadata-provider contract wiring (getIdsForFilter opts)', () => {
|
||||||
mi = (brain as any).metadataIndex
|
mi = (brain as any).metadataIndex
|
||||||
})
|
})
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
await brain.close()
|
||||||
|
})
|
||||||
|
|
||||||
it('RETIRED: a read never calls probeConsistency() / self-heals via detectAndRepairCorruption — that is the read-triggered dark rebuild the health-gate law forbids', async () => {
|
it('RETIRED: a read never calls probeConsistency() / self-heals via detectAndRepairCorruption — that is the read-triggered dark rebuild the health-gate law forbids', async () => {
|
||||||
let probes = 0
|
let probes = 0
|
||||||
let repairs = 0
|
let repairs = 0
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
* gate that hung getStats / readdir / readFile behind an unrelated family's
|
* gate that hung getStats / readdir / readFile behind an unrelated family's
|
||||||
* migration until the wait timed out.
|
* migration until the wait timed out.
|
||||||
*/
|
*/
|
||||||
import { describe, it, expect, beforeEach } from 'vitest'
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
||||||
import { Brainy } from '../../../src/brainy.js'
|
import { Brainy } from '../../../src/brainy.js'
|
||||||
import { MigrationInProgressError } from '../../../src/errors/brainyError.js'
|
import { MigrationInProgressError } from '../../../src/errors/brainyError.js'
|
||||||
|
|
||||||
|
|
@ -38,12 +38,19 @@ const jam = (provider: unknown) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
describe('migration LOCK is family-scoped', () => {
|
describe('migration LOCK is family-scoped', () => {
|
||||||
|
const opened: Brainy[] = []
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
process.env.BRAINY_DETERMINISTIC_EMBEDDINGS = 'true'
|
process.env.BRAINY_DETERMINISTIC_EMBEDDINGS = 'true'
|
||||||
})
|
})
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
for (const b of opened.splice(0)) await b.close().catch(() => {})
|
||||||
|
})
|
||||||
|
|
||||||
it('a stuck VECTOR migration does not block canonical or graph/metadata reads', async () => {
|
it('a stuck VECTOR migration does not block canonical or graph/metadata reads', async () => {
|
||||||
const brain = await seed()
|
const brain = await seed()
|
||||||
|
opened.push(brain)
|
||||||
const childId = (
|
const childId = (
|
||||||
(await brain.vfs.readdir('/notes', { withFileTypes: true })) as Array<{ entityId: string }>
|
(await brain.vfs.readdir('/notes', { withFileTypes: true })) as Array<{ entityId: string }>
|
||||||
)[0].entityId
|
)[0].entityId
|
||||||
|
|
@ -60,6 +67,7 @@ describe('migration LOCK is family-scoped', () => {
|
||||||
|
|
||||||
it('a stuck VECTOR migration STILL blocks a read that needs the vector family', async () => {
|
it('a stuck VECTOR migration STILL blocks a read that needs the vector family', async () => {
|
||||||
const brain = await seed()
|
const brain = await seed()
|
||||||
|
opened.push(brain)
|
||||||
jam((brain as any).index)
|
jam((brain as any).index)
|
||||||
|
|
||||||
// A semantic query consults the vector index — it must wait, and (bounded by
|
// A semantic query consults the vector index — it must wait, and (bounded by
|
||||||
|
|
@ -70,6 +78,7 @@ describe('migration LOCK is family-scoped', () => {
|
||||||
|
|
||||||
it('a stuck GRAPH migration blocks traversal but not vector/canonical reads', async () => {
|
it('a stuck GRAPH migration blocks traversal but not vector/canonical reads', async () => {
|
||||||
const brain = await seed()
|
const brain = await seed()
|
||||||
|
opened.push(brain)
|
||||||
const childId = (
|
const childId = (
|
||||||
(await brain.vfs.readdir('/notes', { withFileTypes: true })) as Array<{ entityId: string }>
|
(await brain.vfs.readdir('/notes', { withFileTypes: true })) as Array<{ entityId: string }>
|
||||||
)[0].entityId
|
)[0].entityId
|
||||||
|
|
@ -87,6 +96,7 @@ describe('migration LOCK is family-scoped', () => {
|
||||||
|
|
||||||
it('with no migration in flight, every read serves (the fast path is a no-op)', async () => {
|
it('with no migration in flight, every read serves (the fast path is a no-op)', async () => {
|
||||||
const brain = await seed()
|
const brain = await seed()
|
||||||
|
opened.push(brain)
|
||||||
await expect(brain.getStats()).resolves.toBeDefined()
|
await expect(brain.getStats()).resolves.toBeDefined()
|
||||||
await expect(brain.find({ query: 'doc' })).resolves.toBeDefined()
|
await expect(brain.find({ query: 'doc' })).resolves.toBeDefined()
|
||||||
await expect(brain.vfs.readdir('/notes')).resolves.toHaveLength(1)
|
await expect(brain.vfs.readdir('/notes')).resolves.toHaveLength(1)
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ describe('Duplicate Check Optimization', () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
// Cleanup is automatic with memory storage
|
await brain.close()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should detect duplicate relationships using GraphAdjacencyIndex', async () => {
|
it('should detect duplicate relationships using GraphAdjacencyIndex', async () => {
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
* _indexRebuildFailed / _indexDegradedIds degraded states (mirroring
|
* _indexRebuildFailed / _indexDegradedIds degraded states (mirroring
|
||||||
* validateIndexConsistency / checkHealth).
|
* validateIndexConsistency / checkHealth).
|
||||||
*/
|
*/
|
||||||
import { describe, it, expect, beforeEach } from 'vitest'
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
||||||
import { Brainy, NounType } from '../../src/index.js'
|
import { Brainy, NounType } from '../../src/index.js'
|
||||||
|
|
||||||
describe('getIndexStatus honest readiness (Finding 9)', () => {
|
describe('getIndexStatus honest readiness (Finding 9)', () => {
|
||||||
|
|
@ -20,6 +20,10 @@ describe('getIndexStatus honest readiness (Finding 9)', () => {
|
||||||
await brain.flush()
|
await brain.flush()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
await brain.close()
|
||||||
|
})
|
||||||
|
|
||||||
it('a not-ready provider makes populated honest (false) and exposes ready:false', async () => {
|
it('a not-ready provider makes populated honest (false) and exposes ready:false', async () => {
|
||||||
brain.index.isReady = () => false // count present, serving structure NOT loaded
|
brain.index.isReady = () => false // count present, serving structure NOT loaded
|
||||||
const status = await brain.getIndexStatus()
|
const status = await brain.getIndexStatus()
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
* scan; and a one-shot probe self-heals a no-isReady provider whose adjacency
|
* scan; and a one-shot probe self-heals a no-isReady provider whose adjacency
|
||||||
* did not cold-load.
|
* did not cold-load.
|
||||||
*/
|
*/
|
||||||
import { describe, it, expect, beforeEach } from 'vitest'
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
||||||
import { Brainy, NounType, VerbType } from '../../../src/index.js'
|
import { Brainy, NounType, VerbType } from '../../../src/index.js'
|
||||||
|
|
||||||
describe('graph fast-path honest readiness (Finding 2)', () => {
|
describe('graph fast-path honest readiness (Finding 2)', () => {
|
||||||
|
|
@ -33,6 +33,10 @@ describe('graph fast-path honest readiness (Finding 2)', () => {
|
||||||
await storage.getVerbsBySource(a)
|
await storage.getVerbsBySource(a)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
await brain.close()
|
||||||
|
})
|
||||||
|
|
||||||
it('not-ready provider → shard scan returns the REAL edges, not a silent []', async () => {
|
it('not-ready provider → shard scan returns the REAL edges, not a silent []', async () => {
|
||||||
const gi = storage.graphIndex
|
const gi = storage.graphIndex
|
||||||
// Simulate a cold native provider: count/manifest loaded (isInitialized) but
|
// Simulate a cold native provider: count/manifest loaded (isInitialized) but
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
* The 8.0 JS index cold-loads correctly, so we simulate the cold native failure
|
* The 8.0 JS index cold-loads correctly, so we simulate the cold native failure
|
||||||
* mode by intercepting the provider's getIdsForFilter/rebuild.
|
* mode by intercepting the provider's getIdsForFilter/rebuild.
|
||||||
*/
|
*/
|
||||||
import { describe, it, expect, beforeEach } from 'vitest'
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
||||||
import { Brainy, NounType, MetadataIndexNotReadyError } from '../../src/index.js'
|
import { Brainy, NounType, MetadataIndexNotReadyError } from '../../src/index.js'
|
||||||
|
|
||||||
const V = () => Array.from({ length: 384 }, (_, i) => Math.sin(i * 0.1) + 0.001)
|
const V = () => Array.from({ length: 384 }, (_, i) => Math.sin(i * 0.1) + 0.001)
|
||||||
|
|
@ -31,6 +31,10 @@ describe('Metadata cold-read guard (#venue silent-[])', () => {
|
||||||
await brain.flush()
|
await brain.flush()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
await brain.close()
|
||||||
|
})
|
||||||
|
|
||||||
it('warm brain: filtered find is correct and the guard does not rebuild', async () => {
|
it('warm brain: filtered find is correct and the guard does not rebuild', async () => {
|
||||||
const mi = brain.metadataIndex
|
const mi = brain.metadataIndex
|
||||||
let rebuilds = 0
|
let rebuilds = 0
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
* the production feature-detection reads it.
|
* the production feature-detection reads it.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { describe, it, expect, beforeEach } from 'vitest'
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
||||||
import { Brainy, NounType, MigrationInProgressError } from '../../src/index.js'
|
import { Brainy, NounType, MigrationInProgressError } from '../../src/index.js'
|
||||||
import { GraphAdjacencyIndex } from '../../src/graph/graphAdjacencyIndex.js'
|
import { GraphAdjacencyIndex } from '../../src/graph/graphAdjacencyIndex.js'
|
||||||
|
|
||||||
|
|
@ -39,6 +39,12 @@ describe('Migration LOCK (#18) — coordinated 7.x→8.0 auto-upgrade', () => {
|
||||||
await brain.init()
|
await brain.init()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
// The "close() is not gated" test already closes `brain` itself as its
|
||||||
|
// own assertion — closing an already-closed brain is a safe no-op here.
|
||||||
|
await brain.close().catch(() => {})
|
||||||
|
})
|
||||||
|
|
||||||
it('does not gate operations when no provider is migrating (fast path)', async () => {
|
it('does not gate operations when no provider is migrating (fast path)', async () => {
|
||||||
const id = await brain.add({ data: 'hello', type: NounType.Concept })
|
const id = await brain.add({ data: 'hello', type: NounType.Concept })
|
||||||
expect(id).toBeTruthy()
|
expect(id).toBeTruthy()
|
||||||
|
|
@ -130,6 +136,9 @@ describe('Migration LOCK (#18) — coordinated 7.x→8.0 auto-upgrade', () => {
|
||||||
expect(e).toBeInstanceOf(MigrationInProgressError)
|
expect(e).toBeInstanceOf(MigrationInProgressError)
|
||||||
expect(e.retryable).toBe(true)
|
expect(e.retryable).toBe(true)
|
||||||
expect(typeof e.elapsedMs).toBe('number')
|
expect(typeof e.elapsedMs).toBe('number')
|
||||||
|
} finally {
|
||||||
|
// close() is proven not-gated by the test below — safe even mid-migration.
|
||||||
|
await shortBrain.close()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,10 +13,11 @@ describe('EmbeddingSignal', () => {
|
||||||
signal = new EmbeddingSignal(brain)
|
signal = new EmbeddingSignal(brain)
|
||||||
})
|
})
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(async () => {
|
||||||
signal.clearCache()
|
signal.clearCache()
|
||||||
signal.clearHistory()
|
signal.clearHistory()
|
||||||
signal.resetStats()
|
signal.resetStats()
|
||||||
|
await brain.close()
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('initialization', () => {
|
describe('initialization', () => {
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
* hydration (zero per-entity reads when unfiltered). Both must preserve the exact
|
* hydration (zero per-entity reads when unfiltered). Both must preserve the exact
|
||||||
* pagination contract: same order, cursor continuation, filters, totalCount.
|
* pagination contract: same order, cursor continuation, filters, totalCount.
|
||||||
*/
|
*/
|
||||||
import { describe, it, expect, beforeEach, vi } from 'vitest'
|
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
|
||||||
import { Brainy, NounType } from '../../../src/index.js'
|
import { Brainy, NounType } from '../../../src/index.js'
|
||||||
|
|
||||||
describe('paginated enumeration — parallel hydration + id-only (cortex heal-cost)', () => {
|
describe('paginated enumeration — parallel hydration + id-only (cortex heal-cost)', () => {
|
||||||
|
|
@ -30,6 +30,10 @@ describe('paginated enumeration — parallel hydration + id-only (cortex heal-co
|
||||||
storage = brain.storage
|
storage = brain.storage
|
||||||
})
|
})
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
await brain.close()
|
||||||
|
})
|
||||||
|
|
||||||
/** Page the whole dataset through a small limit via cursor and collect ordered ids. */
|
/** Page the whole dataset through a small limit via cursor and collect ordered ids. */
|
||||||
const pageAll = async (fn: (opts: any) => Promise<any>, key: 'items' | 'ids') => {
|
const pageAll = async (fn: (opts: any) => Promise<any>, key: 'items' | 'ids') => {
|
||||||
const out: string[] = []
|
const out: string[] = []
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
* Tests to verify that brain.find({ type: NounType.X }) correctly filters entities
|
* Tests to verify that brain.find({ type: NounType.X }) correctly filters entities
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { describe, it, expect, beforeEach } from 'vitest'
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
||||||
import { Brainy, NounType } from '../../src/index.js'
|
import { Brainy, NounType } from '../../src/index.js'
|
||||||
|
|
||||||
describe('Type Filtering (A Consumer Team Issue)', () => {
|
describe('Type Filtering (A Consumer Team Issue)', () => {
|
||||||
|
|
@ -17,6 +17,10 @@ describe('Type Filtering (A Consumer Team Issue)', () => {
|
||||||
await brain.init()
|
await brain.init()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
await brain.close()
|
||||||
|
})
|
||||||
|
|
||||||
it('should filter entities by NounType.Person', async () => {
|
it('should filter entities by NounType.Person', async () => {
|
||||||
// Add 3 people
|
// Add 3 people
|
||||||
await brain.add({ data: 'John Smith', type: NounType.Person, metadata: { name: 'John' } })
|
await brain.add({ data: 'John Smith', type: NounType.Person, metadata: { name: 'John' } })
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,10 @@ describe('the indexable-array bound', () => {
|
||||||
await brain.init()
|
await brain.init()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
await brain.close()
|
||||||
|
})
|
||||||
|
|
||||||
describe('BELOW the bound: the array indexes, every element of it', () => {
|
describe('BELOW the bound: the array indexes, every element of it', () => {
|
||||||
it('the eleven-element array that used to vanish is searchable', async () => {
|
it('the eleven-element array that used to vanish is searchable', async () => {
|
||||||
// ELEVEN — one over the old silent limit, the whole shape of the defect.
|
// ELEVEN — one over the old silent limit, the whole shape of the defect.
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@
|
||||||
* column store adopts the field. It is named in `getIdsFromChunksForRange`'s
|
* column store adopts the field. It is named in `getIdsFromChunksForRange`'s
|
||||||
* doc comment rather than papered over.
|
* doc comment rather than papered over.
|
||||||
*/
|
*/
|
||||||
import { describe, it, expect, beforeEach } from 'vitest'
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
||||||
import { Brainy } from '../../../src/brainy'
|
import { Brainy } from '../../../src/brainy'
|
||||||
import { NounType } from '../../../src/types/graphTypes'
|
import { NounType } from '../../../src/types/graphTypes'
|
||||||
import { SparseIndex, ChunkManager } from '../../../src/utils/metadataIndexChunking'
|
import { SparseIndex, ChunkManager } from '../../../src/utils/metadataIndexChunking'
|
||||||
|
|
@ -122,6 +122,10 @@ describe('legacy sparse index: range queries order values, or refuse', () => {
|
||||||
expect(index.columnStore.hasField(FIELD)).toBe(false)
|
expect(index.columnStore.hasField(FIELD)).toBe(false)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
await brain.close()
|
||||||
|
})
|
||||||
|
|
||||||
describe('(a) a long BOUND against ordinary short values', () => {
|
describe('(a) a long BOUND against ordinary short values', () => {
|
||||||
// 'apple' < 'mango' < 'zebra', and every bound below is compared against
|
// 'apple' < 'mango' < 'zebra', and every bound below is compared against
|
||||||
// these three raw keys.
|
// these three raw keys.
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
* validateInvariants(), and repairIndex() maps a failing invariant with heal:'rebuild'
|
* validateInvariants(), and repairIndex() maps a failing invariant with heal:'rebuild'
|
||||||
* to that provider's rebuild(). "healthy-while-broken must be impossible."
|
* to that provider's rebuild(). "healthy-while-broken must be impossible."
|
||||||
*/
|
*/
|
||||||
import { describe, it, expect, beforeEach } from 'vitest'
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
||||||
import { Brainy, NounType } from '../../src/index.js'
|
import { Brainy, NounType } from '../../src/index.js'
|
||||||
import type { ProviderInvariantReport } from '../../src/index.js'
|
import type { ProviderInvariantReport } from '../../src/index.js'
|
||||||
|
|
||||||
|
|
@ -48,6 +48,10 @@ describe('validateIndexConsistency delegates to provider validateInvariants() (P
|
||||||
await brain.flush()
|
await brain.flush()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
await brain.close()
|
||||||
|
})
|
||||||
|
|
||||||
it('a broken provider report makes the store unhealthy and names the failing invariant', async () => {
|
it('a broken provider report makes the store unhealthy and names the failing invariant', async () => {
|
||||||
brain.index.validateInvariants = async () => brokenReport('vector')
|
brain.index.validateInvariants = async () => brokenReport('vector')
|
||||||
const v = await brain.validateIndexConsistency()
|
const v = await brain.validateIndexConsistency()
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
* signal (from either strategy) THROWS VectorIndexNotReadyError immediately,
|
* signal (from either strategy) THROWS VectorIndexNotReadyError immediately,
|
||||||
* with no rebuild attempt in between — never a silent empty result.
|
* with no rebuild attempt in between — never a silent empty result.
|
||||||
*/
|
*/
|
||||||
import { describe, it, expect, beforeEach } from 'vitest'
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
||||||
import { Brainy, NounType, VectorIndexNotReadyError } from '../../src/index.js'
|
import { Brainy, NounType, VectorIndexNotReadyError } from '../../src/index.js'
|
||||||
|
|
||||||
const V = (): number[] => Array.from({ length: 384 }, (_, i) => Math.sin(i * 0.1) + 0.001)
|
const V = (): number[] => Array.from({ length: 384 }, (_, i) => Math.sin(i * 0.1) + 0.001)
|
||||||
|
|
@ -28,6 +28,10 @@ describe('Vector cold-read guard (verifyVectorLive) — silent-[] on cold semant
|
||||||
await brain.flush()
|
await brain.flush()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
await brain.close()
|
||||||
|
})
|
||||||
|
|
||||||
it('warm brain: semantic find is correct and the guard does not rebuild', async () => {
|
it('warm brain: semantic find is correct and the guard does not rebuild', async () => {
|
||||||
const vi = brain.index
|
const vi = brain.index
|
||||||
let rebuilds = 0
|
let rebuilds = 0
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
* Tests to verify VFS import behavior and identify if VFS creates only wrappers or also graph entities
|
* Tests to verify VFS import behavior and identify if VFS creates only wrappers or also graph entities
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { describe, it, expect, beforeEach } from 'vitest'
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
||||||
import { Brainy, NounType } from '../../src/index.js'
|
import { Brainy, NounType } from '../../src/index.js'
|
||||||
|
|
||||||
describe('VFS Multi-instance Diagnostic', () => {
|
describe('VFS Multi-instance Diagnostic', () => {
|
||||||
|
|
@ -17,6 +17,10 @@ describe('VFS Multi-instance Diagnostic', () => {
|
||||||
await brain.init()
|
await brain.init()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
await brain.close()
|
||||||
|
})
|
||||||
|
|
||||||
it('should verify VFS creates document wrappers AND allows entity filtering', async () => {
|
it('should verify VFS creates document wrappers AND allows entity filtering', async () => {
|
||||||
console.log('\n🔬 VFS Multi-instance Diagnostic Test\n')
|
console.log('\n🔬 VFS Multi-instance Diagnostic Test\n')
|
||||||
console.log('='.repeat(70))
|
console.log('='.repeat(70))
|
||||||
|
|
|
||||||
Reference in a new issue