// tests/pipeline.mock.test.mjs import { describe, it, expect, beforeEach, vi } from 'vitest'; import { runPipelineStep } from '../src/pipeline/pipeline.mjs'; // Mock provider module so loadProviderFor("...") returns stage-specific stubs vi.mock('../src/providers/provider.mjs', () => { return { loadProviderFor(stage) { return { stage, async generate(prompt) { // simple debug guard if needed: // console.log(`[mock ${stage}] prompt:\n`, prompt); if (stage === 'generator') { // pretend generator returns a plain-text answer return 'mocked'; } if (stage === 'verifier') { return JSON.stringify({ REASONING: ['ok'], SCORE: 0.9 }); } if (stage === 'reward') { // reward returns a score in [0,1] return '0.9 great sample'; } // fallback return 'ok'; }, }; }, }; }); // Mock retrieval so we do not hit real Elasticsearch vi.mock('../src/retrieval/retrieval.mjs', () => { return { hybridSearch: async () => [ { content: 'mock context 1' }, { content: 'mock context 2' }, ], }; }); describe('runPipelineStep (mocked providers)', () => { beforeEach(() => { process.env.GENERATOR_PROVIDER = 'mock'; process.env.VERIFIER_PROVIDER = 'mock'; process.env.REWARD_PROVIDER = 'mock'; }); it('runs a full pipeline step successfully', async () => { const result = await runPipelineStep({ question: 'What is mock testing?' }); expect(result.status).toBe('accepted'); // generator output made it through expect(result.gen.answer).toBe('mocked'); // verifier + reward both say OK expect(result.ver.ok).toBe(true); expect(result.rew.ok).toBe(true); // NEW CONTRACT: // even though retrieval returns 2 chunks, step.mjs enforces a single-chunk context expect(result.context.length).toBe(1); expect(result.context[0].content).toBe('mock context 1'); }); });