126 lines
3.4 KiB
TypeScript
126 lines
3.4 KiB
TypeScript
import * as assert from 'node:assert/strict'
|
|
import { test } from 'node:test'
|
|
|
|
import { decideWarnings } from '../../app/utils/kb_warning_decision.js'
|
|
|
|
const MB = 1024 * 1024
|
|
|
|
test('healthy file: chunks present and on-target → no warnings', () => {
|
|
assert.deepEqual(
|
|
decideWarnings({
|
|
fileSizeBytes: 100 * MB,
|
|
chunksInQdrant: 11_000,
|
|
expectedChunks: 11_000,
|
|
}),
|
|
[]
|
|
)
|
|
})
|
|
|
|
test('healthy file: chunks slightly above expectation → no warnings', () => {
|
|
assert.deepEqual(
|
|
decideWarnings({
|
|
fileSizeBytes: 100 * MB,
|
|
chunksInQdrant: 12_000,
|
|
expectedChunks: 11_000,
|
|
}),
|
|
[]
|
|
)
|
|
})
|
|
|
|
test('Warning A: large file with 0 chunks (video-only ZIM)', () => {
|
|
assert.deepEqual(
|
|
decideWarnings({
|
|
fileSizeBytes: 5 * 1024 * MB,
|
|
chunksInQdrant: 0,
|
|
expectedChunks: 0,
|
|
}),
|
|
[{ kind: 'zero_chunks', fileSizeBytes: 5 * 1024 * MB }]
|
|
)
|
|
})
|
|
|
|
test('Warning A: small empty file is silently ignored (under 100 MB threshold)', () => {
|
|
// A user uploads a 5 KB placeholder.txt that produces nothing → not worth a banner
|
|
assert.deepEqual(
|
|
decideWarnings({
|
|
fileSizeBytes: 5 * 1024, // 5 KB
|
|
chunksInQdrant: 0,
|
|
expectedChunks: null,
|
|
}),
|
|
[]
|
|
)
|
|
})
|
|
|
|
test('Warning B: partial stall — chunks well below expectation', () => {
|
|
assert.deepEqual(
|
|
decideWarnings({
|
|
fileSizeBytes: 1000 * MB,
|
|
chunksInQdrant: 266,
|
|
expectedChunks: 600_000,
|
|
}),
|
|
[{ kind: 'partial_stall', chunksEmbedded: 266, chunksExpected: 600_000 }]
|
|
)
|
|
})
|
|
|
|
test('Warning B: chunks just under 50% of expected → triggers', () => {
|
|
assert.deepEqual(
|
|
decideWarnings({
|
|
fileSizeBytes: 100 * MB,
|
|
chunksInQdrant: 4_999,
|
|
expectedChunks: 10_000,
|
|
}),
|
|
[{ kind: 'partial_stall', chunksEmbedded: 4_999, chunksExpected: 10_000 }]
|
|
)
|
|
})
|
|
|
|
test('Warning B: chunks at exactly 50% of expected → does NOT trigger', () => {
|
|
// Strict less-than threshold leaves room for the boundary
|
|
assert.deepEqual(
|
|
decideWarnings({
|
|
fileSizeBytes: 100 * MB,
|
|
chunksInQdrant: 5_000,
|
|
expectedChunks: 10_000,
|
|
}),
|
|
[]
|
|
)
|
|
})
|
|
|
|
test('Warning B suppressed when expectedChunks is null (registry miss)', () => {
|
|
// Better to be silent than show a meaningless "266 of unknown" comparison
|
|
assert.deepEqual(
|
|
decideWarnings({
|
|
fileSizeBytes: 100 * MB,
|
|
chunksInQdrant: 266,
|
|
expectedChunks: null,
|
|
}),
|
|
[]
|
|
)
|
|
})
|
|
|
|
test('Warning B suppressed when expectedChunks is 0 (video-only registry entry)', () => {
|
|
// A `lrnselfreliance_` row in the registry says "expect 0 chunks". A real
|
|
// file matching it correctly producing 0 chunks must not trigger Warning B.
|
|
assert.deepEqual(
|
|
decideWarnings({
|
|
fileSizeBytes: 500 * MB,
|
|
chunksInQdrant: 0,
|
|
expectedChunks: 0,
|
|
}),
|
|
// Note: Warning A triggers here because file > 100 MB and chunks = 0
|
|
[{ kind: 'zero_chunks', fileSizeBytes: 500 * MB }]
|
|
)
|
|
})
|
|
|
|
test('Both warnings can fire on the same file in principle', () => {
|
|
// Edge case: huge file, 0 chunks, but ratio registry expected 100k.
|
|
// Warning A fires (large + zero), Warning B suppressed (chunksInQdrant must be > 0).
|
|
// This documents the chunksInQdrant > 0 guard on Warning B.
|
|
assert.deepEqual(
|
|
decideWarnings({
|
|
fileSizeBytes: 1000 * MB,
|
|
chunksInQdrant: 0,
|
|
expectedChunks: 100_000,
|
|
}),
|
|
[{ kind: 'zero_chunks', fileSizeBytes: 1000 * MB }]
|
|
)
|
|
})
|