Files
chimera-Public/test/server/ch-0202-protection-policy.test.js

57 lines
2.5 KiB
JavaScript

'use strict';
const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const test = require('node:test');
const model = require('../../renderer/modules/protection-model');
const available = (id, deviceId, extra = {}) => model.normalizeCopy(
{ game_id: 'PPSA00001', name: 'Policy Test' },
{ id, deviceId, volumeId: `volume-${id}`, relativePath: `copy-${id}`, availabilityState: 'available', integrityState: 'verified', ...extra },
id
);
test('protection policy matrix requires healthy copies on distinct devices', () => {
const matrix = [
{ copies: [], status: 'unprotected', healthy: false },
{ copies: [available(1, 'A')], status: 'needs-diversity', healthy: false },
{ copies: [available(1, 'A'), available(2, 'B')], status: 'healthy', healthy: true },
{ copies: [available(1, 'A'), available(2, 'B', { integrityState: 'failed' })], status: 'needs-diversity', healthy: false }
];
matrix.forEach(entry => {
const result = model.evaluate(entry.copies, 2);
assert.equal(result.status, entry.status);
assert.equal(result.healthy, entry.healthy);
});
});
test('two copies on the same device do not satisfy diversity and are not called healthy duplicates', () => {
const result = model.evaluate([available(1, 'A'), available(2, 'A')], 2);
assert.equal(result.copyCount, 2);
assert.equal(result.distinctDeviceCount, 1);
assert.equal(result.sameDeviceExcess, 1);
assert.equal(result.status, 'needs-diversity');
assert.equal(result.healthy, false);
});
test('missing copy remains visible and exact restore action targets its concrete copy id', () => {
const rows = model.flatten([{
game_id: 'PPSA00001',
name: 'Policy Test',
localCopies: [
{ id: 41, deviceId: 'A', volumeId: 'primary', relativePath: 'PPSA00001', availabilityState: 'available', integrityState: 'verified' },
{ id: 42, deviceId: 'B', volumeId: 'usb', relativePath: 'PPSA00001', availabilityState: 'unavailable', integrityState: 'unknown' }
]
}]);
const renderer = fs.readFileSync(path.join(__dirname, '..', '..', 'renderer', 'modules', 'backups.js'), 'utf8');
assert.equal(rows.length, 2);
assert.equal(rows[1].missing, true);
assert.equal(rows[1].policy.missingCopyCount, 1);
assert.equal(rows[1].restoreTarget.copyId, '42');
assert.match(renderer, /data-restore-copy-id=/);
assert.match(renderer, /state\.protectionRestoreTarget = copy\.restoreTarget/);
assert.match(renderer, /No restore has started/);
});