ktg-plugin-marketplace/plugins/ai-psychosis/tests/privacy.test.mjs
2026-05-01 17:56:31 +02:00

66 lines
2.4 KiB
JavaScript

import { describe, it, afterEach } from 'node:test';
import assert from 'node:assert/strict';
import { readdirSync, readFileSync } from 'fs';
import { join } from 'path';
import { runHook, setupTestDir, cleanupTestDir } from './test-helper.mjs';
let dir;
afterEach(() => { if (dir) cleanupTestDir(dir); });
function readAllFiles(dirPath) {
let content = '';
for (const entry of readdirSync(dirPath, { withFileTypes: true })) {
const full = join(dirPath, entry.name);
if (entry.isDirectory()) {
content += readAllFiles(full);
} else {
content += readFileSync(full, 'utf8');
}
}
return content;
}
describe('privacy', () => {
it('never writes prompt text to disk through full lifecycle', () => {
dir = setupTestDir();
const canary = 'CANARY_PRIVACY_xyz123';
// 1. Session start
runHook('session-start.mjs', { session_id: 'priv1', cwd: '/tmp' }, dir);
// 2. Prompt analysis with canary as prompt text
runHook('prompt-analyzer.mjs', { session_id: 'priv1', prompt: `tell me what to do ${canary} am I right?` }, dir);
// 3. Tool tracking
runHook('tool-tracker.mjs', { session_id: 'priv1', tool_name: 'Edit' }, dir);
// 4. Session end
runHook('session-end.mjs', { session_id: 'priv1', cwd: '/tmp' }, dir);
// Read ALL files recursively — canary must not appear anywhere
const allContent = readAllFiles(dir);
assert.ok(!allContent.includes(canary), `Canary "${canary}" found in data files — privacy violation`);
});
it('never leaks matched-pattern phrases through full lifecycle', () => {
dir = setupTestDir();
const matchedPhrase = 'are you sure';
const canary = 'CANARY_PRIVACY_xyz123';
const prompt = `${matchedPhrase}? ${canary}`;
runHook('session-start.mjs', { session_id: 'priv2', cwd: '/tmp' }, dir);
runHook('prompt-analyzer.mjs', { session_id: 'priv2', prompt }, dir);
runHook('tool-tracker.mjs', { session_id: 'priv2', tool_name: 'Edit' }, dir);
runHook('session-end.mjs', { session_id: 'priv2', cwd: '/tmp' }, dir);
const allContent = readAllFiles(dir);
assert.ok(
!allContent.includes(canary),
`Canary "${canary}" leaked — pattern-match did not protect prompt text`
);
assert.ok(
!allContent.toLowerCase().includes(matchedPhrase),
`Matched phrase "${matchedPhrase}" leaked — pattern name or trigger phrase written to disk`
);
});
});