import { expect } from "e2e";
import { execFileSync } from "node:child_process";
import { readFileSync } from "node:fs";
import { test, WEB } from "./t3.ts";

test("An inherited non-interactive askpass authenticates remote worktree preparation", WEB, async ({ t3, app, screen, browser }) => {
  const project = await t3.project("Private repository");
  const git = (...args: string[]) => execFileSync("git", args, { cwd: project, encoding: "utf8" });
  git("config", "credential.helper", "");
  git("config", "core.askPass", "");
  git("config", "http.proxy", "");
  git("remote", "add", "origin", readFileSync(process.env.ASKPASS_FIXTURE_URL_FILE!, "utf8").trim());
  git("fetch", "origin");
  git("branch", "--set-upstream-to", "origin/main", "main");
  git("symbolic-ref", "refs/remotes/origin/HEAD", "refs/remotes/origin/main");
  await t3.open();
  await screen.getByRole("button", "Private repository", { exact: false }).first().tap();
  await screen.getByRole("combobox", "Workspace").tap();
  await screen.getByRole("option", "New worktree").tap();
  // Redact only private filesystem prefixes from displayed text and recordings.
  await browser.evaluate((workspace: string) => {
    const scrub = () => {
      const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT);
      for (let node = walker.nextNode(); node; node = walker.nextNode()) {
        if (node.nodeValue?.includes(workspace)) node.nodeValue = node.nodeValue.replaceAll(workspace, "/workspace/private-repository");
      }
    };
    new MutationObserver(scrub).observe(document.body, { subtree: true, childList: true, characterData: true });
    scrub();
  }, project);
  await app.screenshot("workspace-selected");
  await screen.getByRole("textbox").fill("Give me a short tour");
  await screen.getByRole("textbox").press("Enter");
  try {
    await expect(screen.getByText("This turn is a replay.", { exact: false })).toBeVisible({ timeout: 60000 });
  } catch (error) {
    await screen.getByRole("button", "Show full error").tap();
    throw error;
  } finally {
    await app.screenshot("remote-worktree-result");
  }
});
