diff --git a/app/comments.test.js b/app/comments.test.js index 27927bd..539ac2b 100644 --- a/app/comments.test.js +++ b/app/comments.test.js @@ -1,15 +1,22 @@ -import { describe, it } from 'node:test'; +import { describe, it, afterEach } from 'node:test'; import assert from 'node:assert/strict'; -import fs from 'fs'; -import os from 'os'; -import path from 'path'; +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; import { saveFindings } from './comments.js'; import { FINDINGS_PATH } from './config.js'; describe('saveFindings', () => { + const tempDirs = []; + const makeTempDir = prefix => { + const dir = fs.mkdtempSync(path.join(os.tmpdir(), prefix)); + tempDirs.push(dir); + return dir; + }; + it('writes findings to workspace and mirror dirs when provided', () => { - const workspace = fs.mkdtempSync(path.join(os.tmpdir(), 'findings-ws-')); - const mirrorDir = fs.mkdtempSync(path.join(os.tmpdir(), 'findings-mirror-')); + const workspace = makeTempDir('findings-ws-'); + const mirrorDir = makeTempDir('findings-mirror-'); const findings = [{ level: 'warning', role: 'Leo', location: 'file.js:1', suggestion: 'test' }]; saveFindings(workspace, findings, mirrorDir); @@ -19,4 +26,50 @@ describe('saveFindings', () => { assert.equal(workspaceText, JSON.stringify(findings, null, 2) + '\n'); assert.equal(mirrorText, JSON.stringify(findings, null, 2) + '\n'); }); + + it('writes only to workspace when mirrorDir is omitted', () => { + const workspace = makeTempDir('findings-ws-'); + const findings = [{ level: 'info', role: 'Maya', location: 'file.js:2', suggestion: 'note' }]; + + saveFindings(workspace, findings); + + const workspaceText = fs.readFileSync(path.join(workspace, FINDINGS_PATH), 'utf8'); + assert.equal(workspaceText, JSON.stringify(findings, null, 2) + '\n'); + }); + + it('does not duplicate writes when mirrorDir matches workspace', () => { + const workspace = makeTempDir('findings-same-'); + const findings = []; + const writeCalls = []; + const originalWriteFileSync = fs.writeFileSync; + + fs.writeFileSync = (...args) => { + writeCalls.push(args[0]); + return originalWriteFileSync(...args); + }; + + try { + saveFindings(workspace, findings, workspace); + } finally { + fs.writeFileSync = originalWriteFileSync; + } + + assert.equal(writeCalls.length, 1); + assert.equal(writeCalls[0], path.join(workspace, FINDINGS_PATH)); + }); + + it('writes an empty JSON array when findings is empty', () => { + const workspace = makeTempDir('findings-empty-'); + + saveFindings(workspace, []); + + const workspaceText = fs.readFileSync(path.join(workspace, FINDINGS_PATH), 'utf8'); + assert.equal(workspaceText, '[]\n'); + }); + + afterEach(() => { + while (tempDirs.length > 0) { + fs.rmSync(tempDirs.pop(), { recursive: true, force: true }); + } + }); });