import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import fs from 'fs/promises'; import path from 'path'; import os from 'os'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const PROJECT_ROOT = path.join(__dirname, '..'); const sampleGold = [ JSON.stringify({ question: 'What is the meaning of life?', sample: { answer: '42', raw: '42' }, context: [{ id: 'c1', content: 'ctx content' }], verifier: { ok: true, score: 0.9 }, reward: { score: 0.8 }, }), JSON.stringify({ question: 'Q1?', sample: { answer: 'a'.repeat(50) }, context: [{ id: 'c2', content: 'ctx content 2' }], }), ].join('\n'); describe('scripts/gold_preview.mjs', () => { let tmpFile; const origArgv = process.argv.slice(); beforeEach(async () => { const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'gold-prev-')); tmpFile = path.join(tmpDir, 'gold.jsonl'); await fs.writeFile(tmpFile, sampleGold, 'utf8'); }); afterEach(async () => { process.argv = origArgv.slice(); if (tmpFile) { await fs.rm(path.dirname(tmpFile), { recursive: true, force: true }).catch(() => {}); } }); it('respects --limit', async () => { process.argv = ['node', 'gold_preview.mjs', '--file', tmpFile, '--limit', '1']; const { capturePreview } = await import('../scripts/gold_preview.mjs'); const output = await capturePreview(); const lines = output.split('\n').filter(Boolean); expect(lines.some((l) => l.startsWith('#2'))).toBe(false); }); it('respects --max-answer truncation', async () => { process.argv = ['node', 'gold_preview.mjs', '--file', tmpFile, '--max-answer', '10']; const { capturePreview } = await import('../scripts/gold_preview.mjs'); const output = await capturePreview(); expect(output).toMatch(/A: a{10}… \[\+40 chars\]/); }); it('shows full when --full is set', async () => { process.argv = ['node', 'gold_preview.mjs', '--file', tmpFile, '--full', '--limit', '1']; const { capturePreview } = await import('../scripts/gold_preview.mjs'); const output = await capturePreview(); expect(output).toMatch(/A: 42/); expect(output).not.toMatch(/\[\+\d+ chars\]/); }); });