Files
cloudron-box/src/routes/test/backups-test.js
Girish Ramakrishnan d0a66f1701 Back to mocha!
sorry i ever left you dear mocha

node:test has two major issues:
* --bail does not work and requires strange modules and incantations.
I was able to work around this with a custom module.

* the test reporter reports _after_ the suite is run. this makes debugging
really hard. the debugs that we print all happen before the test suite summary.
poor design overall.
2026-02-19 13:24:14 +01:00

108 lines
4.4 KiB
JavaScript

import { describe, it, before, after } from 'mocha';
import common from './common.js';
import assert from 'node:assert/strict';
import superagent from '@cloudron/superagent';
import timers from 'timers/promises';
describe('Backups API', function () {
const { setup, cleanup, waitForTask, serverUrl, owner, admin, getDefaultBackupSite } = common;
before(setup);
after(cleanup);
let someBackup;
// create some backup first
before(async function () {
const site = await getDefaultBackupSite();
const response = await superagent.post(`${serverUrl}/api/v1/backup_sites/${site.id}/create_backup`)
.query({ access_token: admin.token });
assert.equal(response.status, 202);
assert.equal(typeof response.body.taskId, 'string');
await waitForTask(response.body.taskId);
});
it('can list', async function () {
const response = await superagent.get(`${serverUrl}/api/v1/backups`)
.query({ access_token: admin.token });
assert.equal(response.status, 200);
assert.equal(response.body.backups.length, 1);
someBackup = response.body.backups[0];
});
it('can list by site id', async function () {
const site = await getDefaultBackupSite();
const response = await superagent.get(`${serverUrl}/api/v1/backup_sites/${site.id}/backups`)
.query({ access_token: admin.token });
assert.equal(response.status, 200);
assert.equal(response.body.backups.length, 1); // only box backups are listed
});
it('cannot get random id', async function () {
const response = await superagent.get(`${serverUrl}/api/v1/backups/bad_id`)
.query({ access_token: owner.token })
.ok(() => true);
assert.equal(response.status, 404);
});
it('can get valid id', async function () {
const response = await superagent.get(`${serverUrl}/api/v1/backups/${someBackup.id}`)
.query({ access_token: owner.token })
.ok(() => true);
assert.equal(response.status, 200);
assert.equal(response.body.preserveSecs, 0);
assert.equal(response.body.label, '');
});
it('cannot update invalid preserve secs', async function () {
const response = await superagent.post(`${serverUrl}/api/v1/backups/${someBackup.id}`)
.query({ access_token: owner.token })
.send({ preserveSecs: 'not-a-number', label: 'some string' })
.ok(() => true);
assert.equal(response.status, 400);
});
it('can update', async function () {
const response = await superagent.post(`${serverUrl}/api/v1/backups/${someBackup.id}`)
.query({ access_token: owner.token })
.send({ preserveSecs: 30, label: 'NewOrleans' });
assert.equal(response.status, 200);
});
describe('integrity', function () {
it('start a check', async function () {
const response = await superagent.post(`${serverUrl}/api/v1/backups/${someBackup.id}/start_integrity_check`)
.query({ access_token: admin.token })
.send({});
assert.equal(response.status, 201);
const taskId = response.body.taskId;
assert.equal(typeof taskId, 'string');
});
it('wait for check', async function () {
let response;
for (let i = 0; i < 10; i++) {
response = await superagent.get(`${serverUrl}/api/v1/backups/${someBackup.id}`)
.query({ access_token: admin.token });
assert.equal(response.status, 200);
if (!response.body.integrityCheckTask?.active) break;
await timers.setTimeout(3000);
}
assert.equal(response.body.integrityCheckTask, null);
});
it('has integrity fields', async function () {
const response = await superagent.get(`${serverUrl}/api/v1/backups/${someBackup.id}`)
.query({ access_token: owner.token })
.ok(() => true);
assert.equal(response.status, 200);
assert.equal(typeof response.body.lastIntegrityCheckTime, 'string');
assert.equal(response.body.integrityCheckStatus, 'passed');
assert.deepEqual(response.body.integrityCheckResult.messages, []);
assert.equal(typeof response.body.integrityCheckResult.stats, 'object');
assert.equal(response.body.integrityCheckTask, null);
});
});
});