Files
msd-core/tests/helpers/graphify.cjs
Jakub Zych a9a7a328e6 refactor: hard-fork GSD -> MSD (Make Software Done)
Mechanical rename produced by scripts/msd-rename.cjs: gsd/Gsd/GSD -> msd/Msd/MSD
across contents and paths, upstream package/repo coordinates -> @golem15/msd-core
and golem15com/msd-core. Deep links into upstream history, sibling upstream
packages, the GSD-2 import feature, CHANGELOG.md and .changeset/ are kept as-is.

Hand edits on top: MSD block-letter banner and logos, LICENSE copyright line,
package/plugin identity, regenerated lockfile, install-tree fixtures, derived
registries and benchmark baseline; migration checksum baseline re-locked
(MSD keeps its own install state, so no install had applied the old sums);
sort-order and regex-escaped expectations in tests adjusted.
2026-10-06 01:47:40 +02:00

113 lines
3.9 KiB
JavaScript

'use strict';
// Shared test helpers for graphify test suite.
// Extracted from graphify.test.cjs to serve graphify*.test.cjs split files.
// Refs #3761.
const fs = require('fs');
const path = require('path');
const os = require('node:os');
const { gitOrThrow } = require('./git-fixture.cjs');
function enableGraphify(planningDir) {
const configPath = path.join(planningDir, 'config.json');
const config = fs.existsSync(configPath)
? JSON.parse(fs.readFileSync(configPath, 'utf8'))
: {};
config.graphify = { enabled: true };
fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf8');
}
function writeGraphJson(planningDir, data) {
const graphsDir = path.join(planningDir, 'graphs');
fs.mkdirSync(graphsDir, { recursive: true });
fs.writeFileSync(
path.join(graphsDir, 'graph.json'),
JSON.stringify(data, null, 2),
'utf8'
);
}
function writeSnapshotJson(planningDir, data) {
const graphsDir = path.join(planningDir, 'graphs');
fs.mkdirSync(graphsDir, { recursive: true });
fs.writeFileSync(
path.join(graphsDir, '.last-build-snapshot.json'),
JSON.stringify(data, null, 2),
'utf8'
);
}
function gitHead(cwd) {
return gitOrThrow(['rev-parse', 'HEAD'], { cwd }).trim();
}
function commitEmpty(cwd, message) {
gitOrThrow(['commit', '--allow-empty', '-m', message], { cwd });
}
// Helper for auto-update status tests: builds a temp git project with
// optional .last-build-status.json written as autoUpdateValue.
// autoUpdateValue === null means no status file is written.
function makeStatusProject(autoUpdateValue) {
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'msd-3347-status-'));
gitOrThrow(['init', '-q', '-b', 'main'], { cwd: tmpDir });
gitOrThrow(['config', 'user.email', 'test@example.com'], { cwd: tmpDir });
gitOrThrow(['config', 'user.name', 'Test'], { cwd: tmpDir });
fs.writeFileSync(path.join(tmpDir, 'README.md'), '# t\n');
gitOrThrow(['add', '.'], { cwd: tmpDir });
gitOrThrow(['commit', '-qm', 'init'], { cwd: tmpDir });
fs.mkdirSync(path.join(tmpDir, '.planning/graphs'), { recursive: true });
fs.writeFileSync(
path.join(tmpDir, '.planning/config.json'),
JSON.stringify({ graphify: { enabled: true } }),
);
// Write a fresh (current-mtime) graph so age-based stale is false; only the
// auto-update status field can set stale: true.
fs.writeFileSync(
path.join(tmpDir, '.planning/graphs/graph.json'),
JSON.stringify({ nodes: [], edges: [] }),
);
if (autoUpdateValue !== null) {
fs.writeFileSync(
path.join(tmpDir, '.planning/graphs/.last-build-status.json'),
JSON.stringify(autoUpdateValue),
);
}
return tmpDir;
}
const SAMPLE_GRAPH = {
nodes: [
{ id: 'n1', label: 'AuthService', description: 'Handles user authentication and token validation', type: 'service' },
{ id: 'n2', label: 'UserModel', description: 'User database model for storing credentials', type: 'model' },
{ id: 'n3', label: 'SessionManager', description: 'Manages active user sessions', type: 'service' },
{ id: 'n4', label: 'EmailService', description: 'Sends notification emails', type: 'service' },
{ id: 'n5', label: 'Logger', description: 'Centralized logging utility', type: 'utility' },
],
edges: [
{ source: 'n1', target: 'n2', label: 'reads_from', confidence: 'EXTRACTED' },
{ source: 'n1', target: 'n3', label: 'creates', confidence: 'INFERRED' },
{ source: 'n2', target: 'n3', label: 'triggers', confidence: 'AMBIGUOUS' },
{ source: 'n3', target: 'n4', label: 'notifies', confidence: 'INFERRED' },
{ source: 'n4', target: 'n5', label: 'logs_via', confidence: 'EXTRACTED' },
],
hyperedges: [],
};
const SAMPLE_NODES_MINIMAL = [
{ id: 'n1', label: 'A', description: '', type: 'service' },
{ id: 'n2', label: 'B', description: '', type: 'model' },
];
module.exports = {
enableGraphify,
writeGraphJson,
writeSnapshotJson,
gitHead,
commitEmpty,
makeStatusProject,
SAMPLE_GRAPH,
SAMPLE_NODES_MINIMAL,
};