UNPKG

@competent-devs/test-forge

Version:

Package for UI unit test generation based on storybook context

81 lines (65 loc) 2.34 kB
import * as path from "node:path"; import * as fs from "node:fs/promises"; import { memory, tokenTracker } from "./agent.js"; import { runVitest } from "./run-test.js"; import { logToFile, resetLogFile } from "./logger.js"; import { readCsfFile, readTestFile, writeTestFile } from "./utils.js"; import { generateTests, regenerateTestsWithErrors } from "./generate-tests.js"; const MAX_ATTEMPTS = 3; export const processFile = async ( storyPath: string, filePath: string, resetLog: boolean = true, ) => { await memory.clear(); tokenTracker.clearUsage(); if (!!resetLog) { resetLogFile(); } console.group(`===== ${storyPath} =====`); logToFile(filePath); const parsedpath = path.parse(storyPath); const csffile = await readCsfFile(storyPath); const fileContent = await fs.readFile(filePath, "utf-8"); const testcode = await generateTests(storyPath, csffile, fileContent); const testfilename = path.resolve( path.dirname(storyPath), `${parsedpath.name}.test.tsx`, ); await writeTestFile(testfilename, testcode); logToFile("First generation"); logToFile(testcode); const fileName = testfilename.split("\\/").pop() || ""; let testResult = await runVitest(fileName); let attempt = 1; while (testResult.hasErrors && attempt <= MAX_ATTEMPTS) { console.log( `Test failed on attempt ${attempt}. Regenerating based on error information...`, ); const errorDetails = testResult.errors; logToFile(`Test Result. Attempt ${attempt}`); logToFile(JSON.stringify(testResult)); logToFile(`Error Details. Attempt ${attempt}`); logToFile(JSON.stringify(errorDetails)); const currentTestCode = await readTestFile(testfilename); const regeneratedTestCode = await regenerateTestsWithErrors( currentTestCode, errorDetails as string, ); logToFile(`${attempt} generation`); logToFile(regeneratedTestCode); await writeTestFile(testfilename, regeneratedTestCode); testResult = await runVitest(fileName); attempt++; if (!testResult.hasErrors) { console.log("Test passed after regeneration!"); break; } } if (testResult.hasErrors) { console.error( `Test failed after ${MAX_ATTEMPTS} regeneration attempts. Please check the error log for more information.`, ); } console.groupEnd(); };