Massive deployment session deploying entire BlackRoad/Lucidia infrastructure to Raspberry Pi 4B: - Cleaned /tmp space: 595MB → 5.2GB free - Total containers: 136+ running simultaneously - Ports: 3067-3200+ - Disk: 25G/29G (92% usage) - Memory: 3.6Gi/7.9Gi Deployment scripts created: - /tmp/continue-deploy.sh (v2-* deployments) - /tmp/absolute-final-deploy.sh (final-* deployments) - /tmp/deployment-status.sh (monitoring) Infrastructure maximized on single Pi 4B (8GB RAM, 32GB SD). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
76 lines
2.3 KiB
JavaScript
76 lines
2.3 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
|
|
import { ModuleLoader } from '../module-loader.js';
|
|
|
|
test('buildDependencyGraph maps dependencies and dependents', () => {
|
|
const loader = new ModuleLoader();
|
|
const configs = [
|
|
{ name: 'a', deps: [] },
|
|
{ name: 'b', deps: ['a'] },
|
|
{ name: 'c', deps: ['b'] },
|
|
{ name: 'wild', deps: ['*'] }
|
|
];
|
|
|
|
const graph = loader.buildDependencyGraph(configs);
|
|
|
|
assert.deepEqual(graph.get('b').deps, ['a']);
|
|
assert.deepEqual(graph.get('a').dependents, ['b']);
|
|
assert.deepEqual(graph.get('wild').deps, []);
|
|
});
|
|
|
|
test('topologicalSort orders dependencies before dependents', () => {
|
|
const loader = new ModuleLoader();
|
|
const configs = [
|
|
{ name: 'a', deps: [] },
|
|
{ name: 'b', deps: ['a'] },
|
|
{ name: 'c', deps: ['b'] }
|
|
];
|
|
const graph = loader.buildDependencyGraph(configs);
|
|
const order = loader.topologicalSort(graph);
|
|
|
|
assert.ok(order.includes('a'));
|
|
assert.ok(order.includes('b'));
|
|
assert.ok(order.includes('c'));
|
|
assert.ok(order.indexOf('a') < order.indexOf('b'));
|
|
assert.ok(order.indexOf('b') < order.indexOf('c'));
|
|
});
|
|
|
|
test('topologicalSort throws on cycles', () => {
|
|
const loader = new ModuleLoader();
|
|
const graph = new Map([
|
|
['a', { deps: ['b'], dependents: [] }],
|
|
['b', { deps: ['a'], dependents: [] }]
|
|
]);
|
|
|
|
assert.throws(() => loader.topologicalSort(graph), /Circular dependency/);
|
|
});
|
|
|
|
test('loadModule returns module and runs init', async () => {
|
|
const loader = new ModuleLoader();
|
|
const fixtureUrl = new URL('./fixtures/test-module.js', import.meta.url);
|
|
|
|
const loadedModule = await loader.loadModule({
|
|
name: 'fixture',
|
|
path: fixtureUrl.href,
|
|
deps: []
|
|
});
|
|
|
|
assert.equal(loadedModule.name, 'fixture');
|
|
assert.equal(loadedModule.initialized, true);
|
|
});
|
|
|
|
test('loadModule returns placeholder for missing module', async () => {
|
|
const loader = new ModuleLoader();
|
|
const missingUrl = new URL('./fixtures/does-not-exist.js', import.meta.url);
|
|
|
|
const loadedModule = await loader.loadModule({
|
|
name: 'missing',
|
|
path: missingUrl.href,
|
|
deps: []
|
|
});
|
|
|
|
assert.equal(loadedModule.placeholder, true);
|
|
assert.equal(loadedModule.name, 'missing');
|
|
});
|