| import { describe, it, expect } from 'vitest'; |
| import { mkdtempSync, writeFileSync, mkdirSync } from 'fs'; |
| import { tmpdir } from 'os'; |
| import path from 'path'; |
| import { execFileSync } from 'child_process'; |
| import { chunkIdFromContent } from '../src/pipeline/ids.mjs'; |
|
|
| describe('scripts/try_generator_prompt.sh', () => { |
| it('prints the generator response using cached chunk/question', () => { |
| const workdir = mkdtempSync(path.join(tmpdir(), 'try-gen-')); |
| const cacheDir = path.join(workdir, 'cache'); |
| mkdirSync(cacheDir, { recursive: true }); |
|
|
| const content = 'Chunk content for testing.'; |
| const sourceId = 'source-1'; |
| const chunkId = chunkIdFromContent(content, sourceId); |
|
|
| const questionsFile = path.join(cacheDir, 'questions.jsonl'); |
| writeFileSync( |
| questionsFile, |
| JSON.stringify({ |
| chunk_id: chunkId, |
| questions: ['What is being asked?'], |
| question_ids: ['q1'], |
| provider: 'mock', |
| model: 'mock', |
| ts: Date.now(), |
| }) + '\n', |
| 'utf8', |
| ); |
|
|
| const ragFile = path.join(workdir, 'rag.jsonl'); |
| writeFileSync( |
| ragFile, |
| JSON.stringify({ id: sourceId, content }) + '\n', |
| 'utf8', |
| ); |
|
|
| const promptFile = path.join(workdir, 'prompt.txt'); |
| writeFileSync( |
| promptFile, |
| 'Q: {{QUESTION}}\nCTX: {{CONTEXT}}', |
| 'utf8', |
| ); |
|
|
| |
| const mockApiDir = path.join(workdir, 'mock-ollama', 'api'); |
| mkdirSync(mockApiDir, { recursive: true }); |
| const mockResponsePath = path.join(mockApiDir, 'generate'); |
| writeFileSync( |
| mockResponsePath, |
| JSON.stringify({ response: 'mock generator answer' }), |
| 'utf8', |
| ); |
|
|
| const scriptPath = path.join( |
| path.dirname(new URL(import.meta.url).pathname), |
| '..', |
| 'scripts', |
| 'try_generator_prompt.sh', |
| ); |
|
|
| const env = { |
| ...process.env, |
| PIPELINE_CACHE_DIR: cacheDir, |
| RAG_CHUNKS_PATH: ragFile, |
| PROMPT_FILE: promptFile, |
| OLLAMA_URL: `file://${path.join(workdir, 'mock-ollama')}`, |
| GENERATOR_MODEL: 'mock-model', |
| }; |
|
|
| let output; |
| try { |
| output = execFileSync('bash', [scriptPath], { |
| env, |
| encoding: 'utf8', |
| }); |
| } catch (err) { |
| output = err?.stdout?.toString?.() || ''; |
| } |
|
|
| expect(output).toContain('mock generator answer'); |
| expect(output).toContain(chunkId); |
| }); |
| }); |
|
|