mirror of
https://github.com/getpaseo/paseo.git
synced 2026-07-29 12:01:31 +00:00
* Update files * Git panel: share checkout actions Hoist checkout-scoped async git actions into a shared store and keep primary Push CTA loading in-place. Also stabilize e2e git flows. * Stabilize git panel async actions and fix e2e flakes
110 lines
3.7 KiB
TypeScript
110 lines
3.7 KiB
TypeScript
import { test, expect } from './fixtures';
|
|
|
|
test('host removal removes the host from UI and persists after reload', async ({ page }) => {
|
|
const daemonPort = process.env.E2E_DAEMON_PORT;
|
|
const seededServerId = process.env.E2E_SERVER_ID;
|
|
if (!daemonPort) {
|
|
throw new Error('E2E_DAEMON_PORT is not set (expected from globalSetup).');
|
|
}
|
|
if (!seededServerId) {
|
|
throw new Error('E2E_SERVER_ID is not set (expected from globalSetup).');
|
|
}
|
|
|
|
const extraPort = Number(daemonPort) + 1;
|
|
const extraEndpoint = `127.0.0.1:${extraPort}`;
|
|
const nowIso = new Date().toISOString();
|
|
|
|
const extraDaemon = {
|
|
serverId: 'srv_e2e_extra_daemon',
|
|
label: 'extra',
|
|
connections: [
|
|
{ id: `direct:${extraEndpoint}`, type: 'direct', endpoint: extraEndpoint },
|
|
],
|
|
preferredConnectionId: `direct:${extraEndpoint}`,
|
|
createdAt: nowIso,
|
|
updatedAt: nowIso,
|
|
};
|
|
|
|
const seededTestDaemon = {
|
|
serverId: seededServerId,
|
|
label: 'localhost',
|
|
connections: [
|
|
{ id: `direct:127.0.0.1:${daemonPort}`, type: 'direct', endpoint: `127.0.0.1:${daemonPort}` },
|
|
],
|
|
preferredConnectionId: `direct:127.0.0.1:${daemonPort}`,
|
|
createdAt: nowIso,
|
|
updatedAt: nowIso,
|
|
};
|
|
|
|
const seedOnceKey = `@paseo:e2e-host-removal-seeded:${Math.random().toString(36).slice(2)}`;
|
|
|
|
// Add a second host once (fixtures seed the primary host on every navigation).
|
|
await page.addInitScript(
|
|
({ daemon, seededTestDaemon, seedOnceKey }) => {
|
|
if (localStorage.getItem(seedOnceKey)) {
|
|
return;
|
|
}
|
|
|
|
const raw = localStorage.getItem('@paseo:daemon-registry');
|
|
let parsed: any[] = [];
|
|
if (raw) {
|
|
try {
|
|
parsed = JSON.parse(raw);
|
|
} catch {
|
|
parsed = [];
|
|
}
|
|
}
|
|
const list = Array.isArray(parsed) ? parsed : [];
|
|
localStorage.setItem(seedOnceKey, '1');
|
|
|
|
const next = [...list];
|
|
const hasSeeded = next.some((entry: any) => entry && entry.serverId === seededTestDaemon.serverId);
|
|
if (!hasSeeded) {
|
|
next.push(seededTestDaemon);
|
|
}
|
|
|
|
const alreadyPresent = next.some((entry: any) => entry && entry.serverId === daemon.serverId);
|
|
if (!alreadyPresent) {
|
|
next.push(daemon);
|
|
}
|
|
|
|
localStorage.setItem('@paseo:daemon-registry', JSON.stringify(next));
|
|
},
|
|
{ daemon: extraDaemon, seededTestDaemon, seedOnceKey }
|
|
);
|
|
|
|
await page.goto('/settings');
|
|
|
|
await expect(page.getByText('extra', { exact: true }).first()).toBeVisible();
|
|
await expect(page.getByText(extraEndpoint, { exact: true }).first()).toBeVisible();
|
|
|
|
await page.getByTestId(`daemon-menu-trigger-${extraDaemon.serverId}`).click();
|
|
await page.getByTestId(`daemon-menu-remove-${extraDaemon.serverId}`).click();
|
|
await expect(page.getByTestId('remove-host-confirm-modal')).toBeVisible();
|
|
await page.getByTestId('remove-host-confirm').click();
|
|
|
|
await expect(page.getByText(extraEndpoint, { exact: true })).toHaveCount(0);
|
|
await page.waitForFunction(
|
|
(serverId) => {
|
|
const raw = localStorage.getItem('@paseo:daemon-registry');
|
|
if (!raw) return false;
|
|
try {
|
|
const parsed = JSON.parse(raw);
|
|
return Array.isArray(parsed) && !parsed.some((entry: any) => entry && entry.serverId === serverId);
|
|
} catch {
|
|
return false;
|
|
}
|
|
},
|
|
extraDaemon.serverId,
|
|
{ timeout: 10000 }
|
|
);
|
|
|
|
// Prevent the fixture from overwriting storage on reload; verify persistence.
|
|
await page.evaluate(() => {
|
|
const nonce = localStorage.getItem('@paseo:e2e-seed-nonce') ?? '1';
|
|
localStorage.setItem('@paseo:e2e-disable-default-seed-once', nonce);
|
|
});
|
|
await page.reload();
|
|
await expect(page.getByText(extraEndpoint, { exact: true })).toHaveCount(0);
|
|
});
|