form-icon.spec.ts

1.6 KB · raw

1import { test, expect, type BrowserContext } from "@playwright/test";2import { createServer, type Server } from "node:http";3import { makeContext } from "./helpers/vault";45test.describe("Real form icon injection", () => {6  let ctx: BrowserContext;7  let server: Server;8  let origin: string;910  test.beforeEach(async () => {11    server = createServer((_request, response) => {12      response.writeHead(200, { "content-type": "text/html; charset=utf-8" });13      response.end(`<!doctype html>14        <form aria-label="Sign in">15          <label>Username <input name="username" autocomplete="username"></label>16          <label>Password <input type="password" name="password" autocomplete="current-password"></label>17          <button type="submit">Sign in</button>18        </form>`);19    });20    await new Promise<void>((resolve, reject) => {21      server.once("error", reject);22      server.listen(0, "127.0.0.1", resolve);23    });24    const address = server.address();25    if (!address || typeof address === "string") throw new Error("form fixture did not bind");26    origin = `http://127.0.0.1:${address.port}`;27    ctx = await makeContext("peach-form-icon");28  });2930  test.afterEach(async () => {31    await ctx?.close();32    await new Promise<void>((resolve, reject) => server.close(error => error ? reject(error) : resolve()));33  });3435  test("injects Peach icons into a real login form", async () => {36    const page = await ctx.newPage();37    await page.goto(origin);38    await expect(page.locator('button[aria-label="Peach autofill"]')).toHaveCount(2, { timeout: 10_000 });39  });40});