87 lines
3.5 KiB
TypeScript
87 lines
3.5 KiB
TypeScript
import { describe, it, expect } from 'vitest'
|
|
|
|
import { shouldSkipLine } from '../src/parser.js'
|
|
|
|
const threshold = '2026-04-01T00:00:00.000Z'
|
|
|
|
function makeLine(type: string, timestamp: string, payloadSize = 0): string {
|
|
const payload = payloadSize > 0 ? `,"content":"${'x'.repeat(payloadSize)}"` : ''
|
|
return `{"type":"${type}","sessionId":"s1","timestamp":"${timestamp}"${payload}}`
|
|
}
|
|
|
|
function makeLineWithLongCwd(type: string, timestamp: string, cwdLength: number): string {
|
|
const cwd = '/projects/' + 'a'.repeat(cwdLength)
|
|
return `{"type":"${type}","sessionId":"s1","cwd":"${cwd}","timestamp":"${timestamp}","message":{"role":"user","content":"hi"}}`
|
|
}
|
|
|
|
describe('shouldSkipLine', () => {
|
|
it('skips old user lines', () => {
|
|
expect(shouldSkipLine(makeLine('user', '2026-03-01T10:00:00Z'), threshold)).toBe(true)
|
|
})
|
|
|
|
it('skips old assistant lines', () => {
|
|
expect(shouldSkipLine(makeLine('assistant', '2026-03-15T10:00:00Z'), threshold)).toBe(true)
|
|
})
|
|
|
|
it('does not skip in-range user lines', () => {
|
|
expect(shouldSkipLine(makeLine('user', '2026-04-05T10:00:00Z'), threshold)).toBe(false)
|
|
})
|
|
|
|
it('does not skip in-range assistant lines', () => {
|
|
expect(shouldSkipLine(makeLine('assistant', '2026-04-10T10:00:00Z'), threshold)).toBe(false)
|
|
})
|
|
|
|
it('never skips attachment lines regardless of timestamp', () => {
|
|
expect(shouldSkipLine(makeLine('attachment', '2026-01-01T00:00:00Z'), threshold)).toBe(false)
|
|
})
|
|
|
|
it('never skips system lines regardless of timestamp', () => {
|
|
expect(shouldSkipLine(makeLine('system', '2026-01-01T00:00:00Z'), threshold)).toBe(false)
|
|
})
|
|
|
|
it('never skips summary lines regardless of timestamp', () => {
|
|
expect(shouldSkipLine(makeLine('summary', '2026-01-01T00:00:00Z'), threshold)).toBe(false)
|
|
})
|
|
|
|
it('does not skip lines with no timestamp field', () => {
|
|
expect(shouldSkipLine('{"type":"user","sessionId":"s1"}', threshold)).toBe(false)
|
|
})
|
|
|
|
it('does not skip lines with unparseable timestamp', () => {
|
|
expect(shouldSkipLine('{"type":"user","timestamp":"bad"}', threshold)).toBe(false)
|
|
})
|
|
|
|
it('does not skip malformed JSON', () => {
|
|
expect(shouldSkipLine('not json at all', threshold)).toBe(false)
|
|
})
|
|
|
|
it('only reads top-level type and timestamp fields', () => {
|
|
const line = '{"message":{"type":"assistant","timestamp":"2026-03-01T10:00:00Z"},"type":"user","timestamp":"2026-04-05T10:00:00Z"}'
|
|
expect(shouldSkipLine(line, threshold)).toBe(false)
|
|
})
|
|
|
|
it('handles timestamp pushed past 200 chars by long cwd', () => {
|
|
const line = makeLineWithLongCwd('user', '2026-03-01T10:00:00Z', 300)
|
|
expect(line.indexOf('"timestamp"')).toBeGreaterThan(200)
|
|
expect(shouldSkipLine(line, threshold)).toBe(true)
|
|
})
|
|
|
|
it('handles timestamp at the edge of the 2048 head window', () => {
|
|
const line = makeLineWithLongCwd('user', '2026-03-01T10:00:00Z', 1900)
|
|
expect(line.indexOf('"timestamp"')).toBeGreaterThan(1900)
|
|
expect(shouldSkipLine(line, threshold)).toBe(true)
|
|
})
|
|
|
|
it('returns false when timestamp is beyond the head window', () => {
|
|
const line = makeLineWithLongCwd('user', '2026-03-01T10:00:00Z', 2100)
|
|
expect(line.indexOf('"timestamp"')).toBeGreaterThan(2048)
|
|
expect(shouldSkipLine(line, threshold)).toBe(false)
|
|
})
|
|
|
|
it('skips old assistant line with large payload without parsing it', () => {
|
|
const line = makeLine('assistant', '2026-02-01T10:00:00Z', 50_000_000)
|
|
expect(line.length).toBeGreaterThan(50_000_000)
|
|
expect(shouldSkipLine(line, threshold)).toBe(true)
|
|
})
|
|
})
|