9dfa06ffee
Docker image / Build (linux/amd64) (push) Has been cancelled
Docker image / Build (linux/arm64) (push) Has been cancelled
Docker image / Merge release multi-arch manifest (push) Has been cancelled
Docker image / Merge debug multi-arch manifest (push) Has been cancelled
Docker image / Build public push gateway (linux/amd64) (push) Has been cancelled
Docker image / Build public push gateway (linux/arm64) (push) Has been cancelled
Docker image / Publish public push gateway image (push) Has been cancelled
Sprig image / Build (linux/amd64) (push) Has been cancelled
Sprig image / Build (linux/arm64) (push) Has been cancelled
Sprig image / Merge multi-arch manifest (push) Has been cancelled
Harbor Buzz Orchestra / Python tests and lint (push) Has been cancelled
CI / Detect Changed Paths (push) Has been cancelled
CI / Rust Lint (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Desktop Core (push) Has been cancelled
CI / Desktop Smoke E2E (1) (push) Has been cancelled
CI / Desktop Smoke E2E (2) (push) Has been cancelled
CI / Desktop Smoke E2E (3) (push) Has been cancelled
CI / Desktop Smoke E2E (4) (push) Has been cancelled
CI / Desktop (push) Has been cancelled
CI / Desktop E2E Relay (push) Has been cancelled
CI / Desktop E2E Integration (1/2) (push) Has been cancelled
CI / Desktop E2E Integration (2/2) (push) Has been cancelled
CI / Desktop E2E Integration (push) Has been cancelled
CI / Backend Integration (relay e2e) (push) Has been cancelled
CI / Relay E2E (push) Has been cancelled
CI / Web (push) Has been cancelled
CI / Mobile (push) Has been cancelled
CI / Security (push) Has been cancelled
CI / Dead Token Reference Guard (push) Has been cancelled
CI / Server Cross-Compile (aarch64-unknown-linux-musl) (push) Has been cancelled
CI / Server Cross-Compile (x86_64-unknown-linux-musl) (push) Has been cancelled
CI / Windows Rust (x86_64-pc-windows-msvc) (push) Has been cancelled
CI / Desktop Build (macOS) (push) Has been cancelled
helm chart / lint + unittest + render matrix (push) Has been cancelled
helm chart / install on kind (gated) (push) Has been cancelled
helm chart / publish chart to GHCR (push) Has been cancelled
Mesh Lifecycle / Relay-Driven Mesh Lifecycle Smoke (push) Has been cancelled
Sprig / Build (aarch64-unknown-linux-musl) (push) Has been cancelled
Sprig / Build (x86_64-unknown-linux-musl) (push) Has been cancelled
Sprig / Publish rolling release (push) Has been cancelled
Sprig / Publish tagged release (push) Has been cancelled
Signed-off-by: cls_宁波本机 <908705107@qq.com>
69 lines
2.5 KiB
TypeScript
69 lines
2.5 KiB
TypeScript
import { expect, test } from "@playwright/test";
|
|
|
|
import { waitForAnimations } from "../helpers/animations";
|
|
import { installMockBridge } from "../helpers/bridge";
|
|
|
|
const SAMPLE_NSEC =
|
|
"nsec1u70xptkumvfc4k4hu0rc4fnzcexvw63zvq2ng9vmqujsaayhparqu8eju9";
|
|
|
|
// --buzz-onboarding-backup-ink (#717106), the olive key ink shared with the
|
|
// backup step.
|
|
const BACKUP_INK = "rgb(113, 113, 6)";
|
|
|
|
test("key import masks the key with a reveal toggle", async ({ page }) => {
|
|
await page.setViewportSize({ width: 1280, height: 800 });
|
|
await installMockBridge(page, undefined, {
|
|
skipCommunitySeed: true,
|
|
skipOnboardingSeed: true,
|
|
});
|
|
await page.goto("/");
|
|
|
|
await page.getByRole("button", { name: "Use an existing key" }).click();
|
|
const input = page.getByTestId("nostr-import-nsec-input");
|
|
await expect(input).toBeVisible();
|
|
await waitForAnimations(page);
|
|
|
|
// Masked by default; no toggle until there is input; key text uses the
|
|
// shared backup ink.
|
|
const toggle = page.getByTestId("nostr-import-reveal-toggle");
|
|
await expect(input).toHaveAttribute("type", "password");
|
|
await expect(toggle).toHaveCSS("opacity", "0");
|
|
await expect(input).toHaveCSS("color", BACKUP_INK);
|
|
|
|
// The toggle is absolutely positioned: its appearance must not resize the
|
|
// input or shift the centered text.
|
|
const widthBefore = await input.evaluate(
|
|
(el) => el.getBoundingClientRect().width,
|
|
);
|
|
await input.fill(SAMPLE_NSEC);
|
|
await expect(toggle).toHaveCSS("opacity", "1");
|
|
const widthAfter = await input.evaluate(
|
|
(el) => el.getBoundingClientRect().width,
|
|
);
|
|
expect(widthAfter).toBe(widthBefore);
|
|
|
|
// Reveal, then clear: a sticky reveal must never carry over to newly
|
|
// pasted content, so the next key starts masked again.
|
|
await toggle.click();
|
|
await expect(input).toHaveAttribute("type", "text");
|
|
await input.fill("");
|
|
await expect(toggle).toHaveCSS("opacity", "0");
|
|
await input.fill(SAMPLE_NSEC);
|
|
await expect(input).toHaveAttribute("type", "password");
|
|
|
|
// Re-masking via the toggle still works.
|
|
await toggle.click();
|
|
await expect(input).toHaveAttribute("type", "text");
|
|
await toggle.click();
|
|
await expect(input).toHaveAttribute("type", "password");
|
|
|
|
// Narrow viewport: the absolutely positioned toggle must not cause
|
|
// horizontal overflow.
|
|
await page.setViewportSize({ width: 720, height: 620 });
|
|
await waitForAnimations(page);
|
|
const overflow = await page.evaluate(
|
|
() => document.documentElement.scrollWidth > window.innerWidth,
|
|
);
|
|
expect(overflow).toBe(false);
|
|
});
|