Files
TORCH/test/fleet/console-work-views.test.mjs

100 lines
4.6 KiB
JavaScript

import assert from 'node:assert/strict';
import test from 'node:test';
import '../../site/work-views.js';
const views = globalThis.TorchWorkViews;
function storage(initial = {}) {
const values = new Map(Object.entries(initial));
return {
getItem: (key) => values.get(key) ?? null,
setItem: (key, value) => values.set(key, value),
values,
};
}
const tasks = [
{
id: 'NAV-4', title: 'Clear blocked doorway', description: 'Doorway occupancy fails in compounds.',
owner: 'navigation', state: 'blocked', priority: 'urgent', affectedDomains: ['runtime', 'world'],
feature: 'World pipeline', milestone: 'Alpha',
},
{
id: 'WORLD-8', title: 'Review facade evidence', description: 'Screenshots are ready for review.',
owner: 'world', state: 'verification', priority: 'normal', affectedDomains: ['world'],
},
{
id: 'NAV-2', title: 'Document route cache', description: 'Explain cache invalidation.',
owner: 'navigation', state: 'completed', priority: 'low', affectedDomains: ['runtime'],
},
];
test('SCN-console-saved-views: dynamic project filters narrow the authoritative backlog without changing task records', () => {
const filtered = views.filterTasks(tasks, {
query: 'DOORWAY', owner: 'navigation', state: 'blocked', priority: 'urgent', domain: 'world',
feature: 'World pipeline', milestone: 'Alpha',
});
assert.deepEqual(filtered.map((task) => task.id), ['NAV-4']);
assert.deepEqual(views.filterTasks(tasks, { owner: 'navigation' }).map((task) => task.id), ['NAV-4']);
assert.equal(views.hasFilters({ query: ' x ' }), true);
assert.equal(views.hasFilters({}), false);
assert.equal(views.normalizeFilters({ query: 'x'.repeat(500) }).query.length, 120);
assert.equal(views.storageKey('project-a'), views.storageKey('project-a'));
assert.notEqual(views.storageKey('project-a'), views.storageKey('project-b'));
assert.deepEqual(tasks.map((task) => task.state), ['blocked', 'verification', 'completed']);
});
test('SCN-console-saved-views: save, update, reload, and delete are project-local browser preferences', () => {
const store = storage();
const key = views.storageKey('project-a');
const now = () => new Date('2026-09-28T12:00:00.000Z');
const created = views.saveView({
storage: store, key, name: 'World at risk',
filters: { domain: 'world', priority: 'urgent' }, now,
});
assert.equal(created.ok, true);
assert.deepEqual(created.view.filters, {
query: '', owner: '', state: '', priority: 'urgent', domain: 'world', feature: '', milestone: '',
});
assert.equal(created.view.updatedAt, '2026-09-28T12:00:00.000Z');
assert.equal(views.saveView({
storage: store, key, views: created.views, name: 'world at risk', filters: {}, now,
}).code, 'VIEW_NAME_EXISTS');
const updated = views.saveView({
storage: store, key, views: created.views, id: created.view.id,
name: 'World verification', filters: { state: 'verification' }, now,
});
assert.equal(updated.ok, true);
const reloaded = views.readSavedViews(store, key);
assert.equal(reloaded.warning, null);
assert.equal(reloaded.views[0].name, 'World verification');
assert.equal(reloaded.views[0].filters.state, 'verification');
const deleted = views.deleteView({ storage: store, key, views: reloaded.views, id: created.view.id });
assert.equal(deleted.ok, true);
assert.deepEqual(views.readSavedViews(store, key).views, []);
});
test('SCN-console-saved-views: malformed storage and quota failures fail closed without touching project state', () => {
const key = views.storageKey('project-safe');
const malformed = storage({ [key]: '{not-json' });
assert.equal(views.readSavedViews(malformed, key).views.length, 0);
assert.match(views.readSavedViews(malformed, key).warning, /unavailable/);
const partial = storage({ [key]: JSON.stringify({
schema: views.schema,
views: [
{ id: 'ok', name: 'Safe', filters: {} },
{ id: 'bad', name: 'Invalid', filters: { owner: ['not', 'text'] } },
],
}) });
const refused = views.readSavedViews(partial, key);
assert.deepEqual(refused.views, [], 'one malformed entry refuses the entire preference set');
assert.match(refused.warning, /invalid data/);
const unavailable = { getItem: () => null, setItem: () => { throw new Error('quota'); } };
const failed = views.saveView({ storage: unavailable, key, name: 'My view', filters: {} });
assert.equal(failed.ok, false);
assert.equal(failed.code, 'VIEW_STORAGE_UNAVAILABLE');
assert.match(failed.message, /backlog was not changed/);
assert.equal(views.saveView({ storage: unavailable, key, name: ' ', filters: {} }).code, 'VIEW_NAME_REQUIRED');
});