Files
Multi-Hoster-Upload/tests/online-backup-service.test.js
T

72 lines
2.7 KiB
JavaScript

const { once } = require('node:events');
const fs = require('node:fs');
const os = require('node:os');
const path = require('node:path');
const { pathToFileURL } = require('node:url');
const { after, before, describe, it } = require('node:test');
const assert = require('node:assert/strict');
const {
createOnlineBackup,
deleteOnlineBackup,
downloadOnlineBackup,
uploadOnlineBackup
} = require('../lib/online-backup');
let rootDir;
let server;
let baseUrl;
before(async () => {
rootDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mhu-backup-contract-'));
const moduleUrl = pathToFileURL(path.join(__dirname, '..', 'services', 'backup-api', 'src', 'server.mjs')).href;
const { createBackupServer } = await import(moduleUrl);
server = createBackupServer({ rootDir });
server.listen(0, '127.0.0.1');
await once(server, 'listening');
baseUrl = `http://127.0.0.1:${server.address().port}`;
});
after(async () => {
if (server) await new Promise((resolve) => server.close(resolve));
if (rootDir) fs.rmSync(rootDir, { recursive: true, force: true });
});
describe('online backup client and service contract', () => {
it('keeps older keys valid and stores ciphertext only', async () => {
const firstSettings = {
hosters: { 'byse.sx': [{ id: 'first', apiKey: 'first-secret' }] },
hosterSettings: { 'byse.sx': { retries: 3 } },
globalSettings: { alwaysOnTop: false },
history: []
};
const secondSettings = {
hosters: { 'byse.sx': [{ id: 'second', apiKey: 'second-secret' }] },
hosterSettings: { 'byse.sx': { retries: 7 } },
globalSettings: { alwaysOnTop: true },
history: []
};
const first = createOnlineBackup(firstSettings, '2.0.3');
const second = createOnlineBackup(secondSettings, '2.0.3');
await uploadOnlineBackup(first.record, baseUrl);
await uploadOnlineBackup(second.record, baseUrl);
assert.deepEqual((await downloadOnlineBackup(first.key, baseUrl)).settings, firstSettings);
assert.deepEqual((await downloadOnlineBackup(second.key, baseUrl)).settings, secondSettings);
const stored = fs.readdirSync(rootDir)
.filter((name) => name.endsWith('.json'))
.map((name) => fs.readFileSync(path.join(rootDir, name), 'utf8'))
.join('\n');
assert.equal(stored.includes('first-secret'), false);
assert.equal(stored.includes('second-secret'), false);
assert.equal(stored.includes(first.key), false);
assert.equal(stored.includes(second.key), false);
await deleteOnlineBackup(first.key, baseUrl);
await assert.rejects(downloadOnlineBackup(first.key, baseUrl), /nicht gefunden/i);
assert.deepEqual((await downloadOnlineBackup(second.key, baseUrl)).settings, secondSettings);
await deleteOnlineBackup(second.key, baseUrl);
});
});