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});