111 lines
3.7 KiB
TypeScript
111 lines
3.7 KiB
TypeScript
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");
|
||
});
|
||
});
|