form-tester 0.11.0 → 0.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,9 +5,10 @@ Install (user runs once):
5
5
  npm install -g form-tester
6
6
  ```
7
7
 
8
- Install skill files:
8
+ Install skill files and configure:
9
9
  ```
10
10
  form-tester install
11
+ form-tester init # set baseUrl, pnr, person, etc.
11
12
  ```
12
13
 
13
14
  Test modes:
@@ -152,7 +153,7 @@ Step 9 — Dokumenter verification (only when modal confirms storage):
152
153
  ```
153
154
  form-tester documents
154
155
  ```
155
- This handles the full flow: navigate to Dokumenter, find latest doc, detect format, download PDF or screenshot HTML.
156
+ This handles the full flow: navigate to Dokumenter, select person if needed, find latest doc, detect format, download PDF or screenshot HTML.
156
157
 
157
158
  If `form-tester documents` fails (logged as issues), fall back to manual steps:
158
159
  1. Navigate to `/dokumenter?pnr={PNR}` and select the same person.
@@ -8,6 +8,7 @@ User must install globally first:
8
8
  ```bash
9
9
  npm install -g form-tester
10
10
  form-tester install
11
+ form-tester init # set baseUrl, pnr, person, etc.
11
12
  ```
12
13
 
13
14
  ## Running a test
@@ -2,5 +2,6 @@
2
2
  "pnr": "YOUR_PNR_HERE",
3
3
  "person": "",
4
4
  "baseUrl": "",
5
- "skjemaUrl": "/skjemautfyller"
5
+ "skjemaUrl": "/skjemautfyller",
6
+ "dokumenterUrlTemplate": "/dokumenter?pnr={PNR}"
6
7
  }
package/form-tester.js CHANGED
@@ -7,7 +7,7 @@ const { spawn, execSync } = require("child_process");
7
7
  const CONFIG_PATH = path.join(process.cwd(), "form-tester.config.json");
8
8
  const OUTPUT_BASE = path.resolve(process.cwd(), "output");
9
9
  const ISSUES_PATH = path.join(OUTPUT_BASE, "issues.jsonl");
10
- const LOCAL_VERSION = "0.11.0";
10
+ const LOCAL_VERSION = "0.11.2";
11
11
  const RECOMMENDED_PERSON = "Uromantisk Direktør";
12
12
 
13
13
  // Recording — persisted to disk so `form-tester exec` can append across processes
@@ -167,13 +167,26 @@ async function handleDocuments(config, flags = {}) {
167
167
  }
168
168
  await sleep(2000);
169
169
 
170
- // Step 2: Take snapshot of document list
170
+ // Step 2: Check if person selection is needed (same page as form)
171
+ const checkSnapshot = path.join(outputDir, "dokumenter_check.yml");
172
+ await runPlaywrightCli(["snapshot", "--filename", checkSnapshot]);
173
+ if (fs.existsSync(checkSnapshot)) {
174
+ const checkText = fs.readFileSync(checkSnapshot, "utf8");
175
+ if (checkText.includes("Hvem vil du bruke Helsenorge") || checkText.includes("personliste")) {
176
+ log("Person selection detected on Dokumenter page. Selecting person...");
177
+ await handleSelectPerson(config, config.lastPerson || config.person || null);
178
+ await sleep(2000);
179
+ }
180
+ try { fs.unlinkSync(checkSnapshot); } catch (e) {}
181
+ }
182
+
183
+ // Step 3: Take snapshot of document list
171
184
  const docListSnapshot = path.join(outputDir, "dokumenter.yml");
172
185
  await runPlaywrightCli(["snapshot", "--filename", docListSnapshot]);
173
186
  await runPlaywrightCli(["screenshot", "--filename", path.join(outputDir, "dokumenter.png"), "--full-page"]);
174
187
  log("Saved: dokumenter.yml + dokumenter.png");
175
188
 
176
- // Step 3: Click first document's "Se detaljer"
189
+ // Step 4: Click first document's "Se detaljer"
177
190
  log("Looking for first document...");
178
191
  const clickResult = await runPlaywrightCliCapture(["eval", '() => { const link = document.querySelector("a[href*=\\"detaljer\\"], button:has-text(\\"Se detaljer\\"), a:has-text(\\"Se detaljer\\")"); if (link) { link.click(); return "clicked"; } return "not-found"; }']);
179
192
  if (clickResult.stdout.includes("not-found")) {
@@ -936,6 +949,7 @@ function printHelp() {
936
949
  [
937
950
  "",
938
951
  "Subcommands (run directly):",
952
+ " form-tester init Set up config (baseUrl, pnr, person, etc.)",
939
953
  " form-tester install [--global] Install skill files into project or ~/.claude/skills/",
940
954
  " form-tester test <name-or-url> --auto Non-interactive test (for AI agents)",
941
955
  " form-tester test <name-or-url> --human Interactive test with prompts",
@@ -1736,6 +1750,51 @@ function install(targetDir, isGlobal) {
1736
1750
  async function main() {
1737
1751
  const args = process.argv.slice(2);
1738
1752
 
1753
+ if (args[0] === "init") {
1754
+ const config = loadConfig();
1755
+ console.log("Form Tester Setup\n");
1756
+ console.log("Current config:");
1757
+ console.log(` baseUrl: ${config.baseUrl || "(not set)"}`);
1758
+ console.log(` pnr: ${config.pnr || "(not set)"}`);
1759
+ console.log(` person: ${config.person || "(not set)"}`);
1760
+ console.log(` skjemaUrl: ${config.skjemaUrl || "/skjemautfyller"}`);
1761
+ console.log(` dokumenterUrl: ${config.dokumenterUrlTemplate || "/dokumenter?pnr={PNR}"}`);
1762
+ console.log("");
1763
+
1764
+ const currentRl = ensureReadline();
1765
+
1766
+ const prompt = (question, current) => new Promise((resolve) => {
1767
+ const suffix = current ? ` [${current}]` : "";
1768
+ currentRl.question(`${question}${suffix}: `, (answer) => {
1769
+ resolve(answer.trim() || current || "");
1770
+ });
1771
+ });
1772
+
1773
+ config.baseUrl = await prompt("Base URL (e.g. https://tjenester-a-vak-sprak.int-hn.nhn.no)", config.baseUrl);
1774
+ config.pnr = await prompt("PNR (fødselsnummer for test)", config.pnr);
1775
+ config.person = await prompt("Default person name (e.g. Uromantisk Direktør)", config.person);
1776
+ config.skjemaUrl = await prompt("Skjema path prefix", config.skjemaUrl || "/skjemautfyller");
1777
+ config.dokumenterUrlTemplate = await prompt("Dokumenter URL template", config.dokumenterUrlTemplate || "/dokumenter?pnr={PNR}");
1778
+
1779
+ saveConfig(config);
1780
+ currentRl.close();
1781
+
1782
+ console.log("\nConfig saved to form-tester.config.json:");
1783
+ console.log(` baseUrl: ${config.baseUrl}`);
1784
+ console.log(` pnr: ${config.pnr}`);
1785
+ console.log(` person: ${config.person}`);
1786
+ console.log(` skjemaUrl: ${config.skjemaUrl}`);
1787
+ console.log(` dokumenterUrl: ${config.dokumenterUrlTemplate}`);
1788
+
1789
+ // Test URL resolution
1790
+ console.log(`\nTest: form-tester test SLV-PasRapp-2020 --auto`);
1791
+ const testUrl = resolveFormUrl("SLV-PasRapp-2020", config);
1792
+ const withPnr = config.pnr && !extractPnrFromUrl(testUrl) ? setPnrOnUrl(testUrl, config.pnr) : testUrl;
1793
+ console.log(` → ${withPnr}`);
1794
+
1795
+ process.exit(0);
1796
+ }
1797
+
1739
1798
  if (args[0] === "install") {
1740
1799
  const isGlobal = args.includes("--global") || args.includes("-g");
1741
1800
  const remaining = args.slice(1).filter((a) => a !== "--global" && a !== "-g");
@@ -1850,13 +1909,21 @@ async function main() {
1850
1909
  console.error(" form-tester url skjemautfyller/SLV-PasRapp-2020");
1851
1910
  console.error(" form-tester url https://example.com/skjemautfyller/FORM");
1852
1911
  console.error(`\nConfig: baseUrl=${config.baseUrl || "(not set)"}, skjemaUrl=${config.skjemaUrl || "/skjemautfyller"}, pnr=${config.pnr || "(not set)"}`);
1912
+ console.error("\nRun 'form-tester init' to configure.");
1853
1913
  process.exit(1);
1854
1914
  }
1855
- let resolved = resolveFormUrl(input, config);
1856
- if (config.pnr && !extractPnrFromUrl(resolved)) {
1857
- resolved = setPnrOnUrl(resolved, config.pnr);
1915
+ let formUrl = resolveFormUrl(input, config);
1916
+ if (config.pnr && !extractPnrFromUrl(formUrl)) {
1917
+ formUrl = setPnrOnUrl(formUrl, config.pnr);
1858
1918
  }
1859
- console.log(resolved);
1919
+ // Also resolve dokumenter URL
1920
+ const tmpConfig = { ...config, lastTestUrl: formUrl };
1921
+ const dokUrl = resolveDokumenterUrl(tmpConfig);
1922
+
1923
+ console.log(`Form URL: ${formUrl}`);
1924
+ console.log(`Dokumenter URL: ${dokUrl || "(not available — set pnr)"}`);
1925
+ console.log(`Person: ${config.person || "(not set)"}`);
1926
+ console.log(`\nRun: form-tester test ${input} --auto`);
1860
1927
  process.exit(0);
1861
1928
  }
1862
1929
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "form-tester",
3
- "version": "0.11.0",
3
+ "version": "0.11.2",
4
4
  "description": "AI-powered form testing skill for /skjemautfyller forms using Playwright CLI. Works with Claude Code and GitHub Copilot.",
5
5
  "main": "form-tester.js",
6
6
  "bin": {