Files
kandev/apps/web/e2e/tests/ssh/test-result.spec.ts
2026-06-29 19:06:33 +01:00

111 lines
3.7 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { test, expect } from "../../fixtures/ssh-test-base";
import { SSHSettingsPage } from "../../pages/SSHSettingsPage";
/**
* Clicking "Test Connection" against various host configurations. Validates
* the per-step badge UI, fingerprint surfacing, and the
* cached/will-upload agentctl-action copy.
*
* Covers e2e-plan.md group B (B1–B7).
*/
test.describe("ssh test-result UI", () => {
test("successful test reveals fingerprint and green-badge steps", async ({
testPage,
seedData,
}) => {
const page = new SSHSettingsPage(testPage);
await page.gotoNew();
await page.fillForm({
name: "B1",
host: seedData.sshTarget.host,
port: seedData.sshTarget.port,
user: seedData.sshTarget.user,
identitySource: "file",
identityFile: seedData.sshTarget.identityFile,
});
await page.clickTest();
const success = await page.waitForTestResult();
expect(success).toBe("true");
await page.expectStepSuccess("resolve-target");
await page.expectStepSuccess("ssh-handshake");
await page.expectStepSuccess("probe-remote");
await page.expectStepSuccess("verify-platform");
await page.expectStepSuccess("verify-agentctl-cache");
await expect(page.observedFingerprint()).toHaveText(seedData.sshTarget.hostFingerprint);
});
test("failed test shows red badges, no fingerprint", async ({ testPage }) => {
const page = new SSHSettingsPage(testPage);
await page.gotoNew();
await page.fillForm({
name: "B2",
host: "127.0.0.1",
port: 1, // refused
user: "kandev",
identitySource: "agent",
});
await page.clickTest();
const success = await page.waitForTestResult();
expect(success).toBe("false");
await page.expectStepFailure("ssh-handshake");
// No probe step emitted on handshake failure.
await expect(page.step("probe-remote")).toHaveCount(0);
await expect(page.observedFingerprint()).toHaveCount(0);
});
test("invalid form (no host, no alias) fails Resolve target", async ({ testPage }) => {
const page = new SSHSettingsPage(testPage);
await page.gotoNew();
await page.fillForm({ name: "B3" });
// testButton is disabled; force the request via API instead to exercise
// the backend's "Resolve target" failure path even when the UI gate
// prevents the click.
await expect(page.testButton).toBeDisabled();
});
test("agentctl cache step says 'will upload on first launch' before any launch", async ({
testPage,
seedData,
}) => {
const page = new SSHSettingsPage(testPage);
await page.gotoNew();
await page.fillForm({
name: "B5",
host: seedData.sshTarget.host,
port: seedData.sshTarget.port,
user: seedData.sshTarget.user,
identitySource: "file",
identityFile: seedData.sshTarget.identityFile,
});
await page.clickTest();
await page.waitForTestResult();
await page.expectStepSuccess("verify-agentctl-cache");
await expect(page.step("verify-agentctl-cache")).toContainText(/will upload|cached/);
});
test("uname output surfaces in the probe-remote step", async ({ testPage, seedData }) => {
const page = new SSHSettingsPage(testPage);
await page.gotoNew();
await page.fillForm({
name: "B7",
host: seedData.sshTarget.host,
port: seedData.sshTarget.port,
user: seedData.sshTarget.user,
identitySource: "file",
identityFile: seedData.sshTarget.identityFile,
});
await page.clickTest();
await page.waitForTestResult();
// alpine ships busybox; uname -a includes "Linux".
await expect(page.step("probe-remote")).toContainText(/Linux/);
// platform step output is the normalized goos/goarch tuple.
await expect(page.step("verify-platform")).toContainText("linux/amd64");
});
});