|
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
|
|
} from './lib/server';
|
|
|
|
|
|
|
|
|
|
test.describe('smoke: enrol-via-announce → backup', () => {
|
|
|
|
|
test('happy path completes in under a minute', async ({ page, request }) => {
|
|
|
|
|
test('happy path: enrol → accept → backup → succeeded', async ({ page, request }) => {
|
|
|
|
|
const { username, password } = await bootstrapAdmin(request);
|
|
|
|
|
await loginViaUI(page, username, password);
|
|
|
|
|
|
|
|
|
@@ -38,16 +38,23 @@ test.describe('smoke: enrol-via-announce → backup', () => {
|
|
|
|
|
password: 'e2e-repo-password',
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Wait for the host to come online + auto-init to land.
|
|
|
|
|
const onlineHost = await waitForHostStatus(
|
|
|
|
|
// Wait for the host to come online AND for auto-init to
|
|
|
|
|
// finish. Coming online happens as soon as the agent's
|
|
|
|
|
// bearer-authed WS attaches (~1s after accept); repo_status
|
|
|
|
|
// flips to 'ready' once the auto-init job completes (a
|
|
|
|
|
// couple of seconds later). Loading the host page before
|
|
|
|
|
// that leaves the Run-backup button disabled because the
|
|
|
|
|
// server-rendered HTML reflects the still-in-progress init,
|
|
|
|
|
// and the page has no live-refresh on that field.
|
|
|
|
|
const readyHost = await waitForHostStatus(
|
|
|
|
|
request, cookie,
|
|
|
|
|
(h) => h.status === 'online',
|
|
|
|
|
60_000,
|
|
|
|
|
(h) => h.status === 'online' && h.repo_status === 'ready',
|
|
|
|
|
90_000,
|
|
|
|
|
);
|
|
|
|
|
expect(onlineHost.id).toBeTruthy();
|
|
|
|
|
expect(readyHost.id).toBeTruthy();
|
|
|
|
|
|
|
|
|
|
// Trigger a backup via the UI form-post (HX-Redirect to /jobs/{id}).
|
|
|
|
|
await page.goto(`${baseURL}/hosts/${onlineHost.id}`);
|
|
|
|
|
await page.goto(`${baseURL}/hosts/${readyHost.id}`);
|
|
|
|
|
await Promise.all([
|
|
|
|
|
page.waitForURL(/\/jobs\//),
|
|
|
|
|
page.locator('form[action$="/run-backup"] button[type="submit"]').first().click(),
|
|
|
|
@@ -60,7 +67,7 @@ test.describe('smoke: enrol-via-announce → backup', () => {
|
|
|
|
|
// surfaces.
|
|
|
|
|
const finishedHost = await waitForHostStatus(
|
|
|
|
|
request, cookie,
|
|
|
|
|
(h) => h.id === onlineHost.id && h.last_backup_status === 'succeeded',
|
|
|
|
|
(h) => h.id === readyHost.id && h.last_backup_status === 'succeeded',
|
|
|
|
|
120_000,
|
|
|
|
|
);
|
|
|
|
|
expect(finishedHost.last_backup_status).toBe('succeeded');
|
|
|
|
|