@qawolf/testkit 1.0.0 → 1.2.0

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.
package/CHANGELOG.md ADDED
@@ -0,0 +1,14 @@
1
+ # Changelog
2
+
3
+ ## [1.2.0] - 2026-07-08
4
+
5
+ ### Added
6
+
7
+ - Added `startWireGuard(options)` to start a WireGuard connection via the runner client, matching the existing `startOpenVpn` helper.
8
+
9
+ ## [1.1.0] - 2026-05-01
10
+
11
+ ### Added
12
+
13
+ - Added `saveEnvironmentVariable(name, value)` to save string values to the current QA Wolf environment and update `process.env` for the running flow.
14
+ - Added `reloadEnvironmentVariables()` to fetch the latest environment variables for the current QA Wolf environment and copy string values into `process.env`.
package/README.md CHANGED
@@ -36,8 +36,23 @@ const qrValue = await readQRCode(page, "[data-testid='qr-code']");
36
36
  if (!qrValue) throw new Error("QR code was not visible");
37
37
  ```
38
38
 
39
+ Save dynamic data to the QA Wolf environment and reload environment variables
40
+ when another flow has updated them.
41
+
42
+ ```ts
43
+ import {
44
+ reloadEnvironmentVariables,
45
+ saveEnvironmentVariable,
46
+ } from "@qawolf/testkit";
47
+
48
+ await saveEnvironmentVariable("LOGIN_TOKEN", token);
49
+
50
+ await reloadEnvironmentVariables();
51
+ const reloadedToken = process.env["LOGIN_TOKEN"];
52
+ ```
53
+
39
54
  Use runner-backed helpers for environment setup, such as connecting through
40
- OpenVPN before the rest of the flow runs.
55
+ OpenVPN or WireGuard before the rest of the flow runs.
41
56
 
42
57
  ```ts
43
58
  import { startOpenVpn } from "@qawolf/testkit";
@@ -46,3 +61,11 @@ await startOpenVpn({
46
61
  configPath: "/tmp/client.ovpn",
47
62
  });
48
63
  ```
64
+
65
+ ```ts
66
+ import { startWireGuard } from "@qawolf/testkit";
67
+
68
+ await startWireGuard({
69
+ configPath: "/tmp/wg0.conf",
70
+ });
71
+ ```
package/dist/index.d.ts CHANGED
@@ -1,10 +1,13 @@
1
- import type { MountCifsShareOptions, Screenshotable, StartOpenVpnOptions } from "./types.js";
1
+ import type { MountCifsShareOptions, Screenshotable, StartOpenVpnOptions, StartWireGuardOptions } from "./types.js";
2
2
  export { configureTestkitClient, getCurrentTestkitClient, resetTestkitClient, } from "./clientScope.js";
3
- export type { MountCifsShareOptions, SaveBaselineScreenshot, Screenshotable, StartOpenVpnOptions, } from "./types.js";
3
+ export type { MountCifsShareOptions, SaveBaselineScreenshot, Screenshotable, StartOpenVpnOptions, StartWireGuardOptions, } from "./types.js";
4
4
  export declare const otp: {
5
5
  fromUri(uri: string): string;
6
6
  };
7
+ export declare function saveEnvironmentVariable(name: string, value: string): Promise<void>;
8
+ export declare function reloadEnvironmentVariables(): Promise<void>;
7
9
  export declare function mountCifsShare(options: MountCifsShareOptions): Promise<string>;
8
10
  export declare function startOpenVpn(options: StartOpenVpnOptions): Promise<string>;
11
+ export declare function startWireGuard(options: StartWireGuardOptions): Promise<string>;
9
12
  export declare function saveBaselineScreenshot(pageOrLocator: Screenshotable, name: string, screenshotOptions?: unknown): Promise<void>;
10
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,GAAG;iBACD,MAAM,GAAG,MAAM;CAG7B,CAAC;AAcF,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,wBAAsB,sBAAsB,CAC1C,aAAa,EAAE,cAAc,EAC7B,IAAI,EAAE,MAAM,EACZ,iBAAiB,CAAC,EAAE,OAAO,GAC1B,OAAO,CAAC,IAAI,CAAC,CAUf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,GAAG;iBACD,MAAM,GAAG,MAAM;CAG7B,CAAC;AA0BF,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,IAAI,CAAC,CA2BhE;AAaD,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,wBAAsB,sBAAsB,CAC1C,aAAa,EAAE,cAAc,EAC7B,IAAI,EAAE,MAAM,EACZ,iBAAiB,CAAC,EAAE,OAAO,GAC1B,OAAO,CAAC,IAAI,CAAC,CAUf"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import * as OTPAuth from "otpauth";
2
+ import { z } from "zod";
2
3
  import { getCurrentTestkitClient } from "./clientScope.js";
3
4
  export { configureTestkitClient, getCurrentTestkitClient, resetTestkitClient, } from "./clientScope.js";
4
5
  export const otp = {
@@ -6,6 +7,69 @@ export const otp = {
6
7
  return OTPAuth.URI.parse(uri).generate();
7
8
  },
8
9
  };
10
+ const environmentVariablesResponseSchema = z.object({
11
+ result: z.object({
12
+ data: z.object({
13
+ json: z.object({
14
+ environmentVariables: z.record(z.string(), z.unknown()).optional(),
15
+ }),
16
+ }),
17
+ }),
18
+ });
19
+ function requireEnvironmentVariable(name) {
20
+ const value = process.env[name];
21
+ if (!value)
22
+ throw Error(`${name} is not defined`);
23
+ return value;
24
+ }
25
+ function getApexApiConfig() {
26
+ return {
27
+ environmentId: requireEnvironmentVariable("QAWOLF_ENVIRONMENT_ID"),
28
+ jwtKey: requireEnvironmentVariable("QAWOLF_TEAM_API_KEY"),
29
+ url: requireEnvironmentVariable("QAWOLF_API_URL"),
30
+ };
31
+ }
32
+ export async function saveEnvironmentVariable(name, value) {
33
+ if (typeof value !== "string")
34
+ throw Error("value must be a string");
35
+ const { environmentId, jwtKey, url } = getApexApiConfig();
36
+ const response = await fetch(`${url}/trpc/environment.upsertEnvironmentVariable`, {
37
+ body: JSON.stringify({
38
+ environmentId,
39
+ environmentVariableName: name,
40
+ environmentVariableValue: value,
41
+ }),
42
+ headers: {
43
+ Authorization: `Bearer ${jwtKey}`,
44
+ "Content-Type": "application/json",
45
+ },
46
+ method: "POST",
47
+ });
48
+ if (response.status !== 200)
49
+ throw Error(`Failed to save environment variable: ${response.status}`);
50
+ process.env[name] = value;
51
+ }
52
+ export async function reloadEnvironmentVariables() {
53
+ const { environmentId, jwtKey, url } = getApexApiConfig();
54
+ const input = encodeURIComponent(JSON.stringify({ id: environmentId }));
55
+ const response = await fetch(`${url}/trpc/environment.getEnvironmentWithVariables?input=${input}`, {
56
+ headers: {
57
+ Authorization: `Bearer ${jwtKey}`,
58
+ "Content-Type": "application/json",
59
+ },
60
+ method: "GET",
61
+ });
62
+ if (!response.ok)
63
+ throw Error(`Failed to reload environment variables: ${response.status}`);
64
+ const body = environmentVariablesResponseSchema.parse(await response.json());
65
+ const environmentVariables = body.result.data.json.environmentVariables;
66
+ if (environmentVariables && typeof environmentVariables === "object") {
67
+ for (const [environmentVariableName, environmentVariableValue,] of Object.entries(environmentVariables)) {
68
+ if (typeof environmentVariableValue === "string")
69
+ process.env[environmentVariableName] = environmentVariableValue;
70
+ }
71
+ }
72
+ }
9
73
  function requireClient(helperName) {
10
74
  const client = getCurrentTestkitClient();
11
75
  if (!client) {
@@ -21,6 +85,9 @@ export async function mountCifsShare(options) {
21
85
  export async function startOpenVpn(options) {
22
86
  return requireClient("startOpenVpn").startOpenVpn(options);
23
87
  }
88
+ export async function startWireGuard(options) {
89
+ return requireClient("startWireGuard").startWireGuard(options);
90
+ }
24
91
  export async function saveBaselineScreenshot(pageOrLocator, name, screenshotOptions) {
25
92
  const client = requireClient("saveBaselineScreenshot");
26
93
  if (!client.saveBaselineScreenshot) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAGnC,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAO3D,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAS1B,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,OAAO,CAAC,GAAW;QACjB,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3C,CAAC;CACF,CAAC;AAEF,SAAS,aAAa,CAAC,UAAkB;IACvC,MAAM,MAAM,GAAG,uBAAuB,EAAE,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,KAAK,CACT,mBAAmB,UAAU,6BAA6B;YACxD,6DAA6D;YAC7D,GAAG,UAAU,KAAK,CACrB,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA8B;IAE9B,OAAO,aAAa,CAAC,gBAAgB,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAA4B;IAE5B,OAAO,aAAa,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,aAA6B,EAC7B,IAAY,EACZ,iBAA2B;IAE3B,MAAM,MAAM,GAAG,aAAa,CAAC,wBAAwB,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC;QACnC,MAAM,KAAK,CACT,qEAAqE;YACnE,uDAAuD;YACvD,mDAAmD,CACtD,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,sBAAsB,CAAC,aAAa,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC;AAC/E,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qawolf/testkit",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "sideEffects": false,
@@ -23,7 +23,8 @@
23
23
  "files": [
24
24
  "/dist",
25
25
  "/LICENSE",
26
- "/README.md"
26
+ "/README.md",
27
+ "/CHANGELOG.md"
27
28
  ],
28
29
  "scripts": {
29
30
  "build": "rm -rf ./dist && tsc -p tsconfig.build.json",
@@ -39,13 +40,17 @@
39
40
  "dependencies": {
40
41
  "jsqr": "^1.4.0",
41
42
  "otpauth": "9.3.6",
42
- "playwright": "1.58.2",
43
43
  "pngjs": "^6.0.0",
44
- "tslib": "^2.5.3"
44
+ "tslib": "^2.5.3",
45
+ "zod": "^4.1.11"
45
46
  },
46
47
  "devDependencies": {
47
48
  "@types/pngjs": "^6.0.5",
48
- "typescript": "^5.9.2"
49
+ "playwright": "1.58.2",
50
+ "typescript": "^5.9.3"
51
+ },
52
+ "peerDependencies": {
53
+ "playwright": "1.58.2"
49
54
  },
50
55
  "engines": {
51
56
  "node": ">=22.22.0 <25"