@qawolf/testkit 1.0.0 → 1.1.1
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 +8 -0
- package/README.md +15 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -1
- package/package.json +9 -4
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [1.1.0] - 2026-05-01
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- Added `saveEnvironmentVariable(name, value)` to save string values to the current QA Wolf environment and update `process.env` for the running flow.
|
|
8
|
+
- 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,6 +36,21 @@ 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
55
|
OpenVPN before the rest of the flow runs.
|
|
41
56
|
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export type { MountCifsShareOptions, SaveBaselineScreenshot, Screenshotable, Sta
|
|
|
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>;
|
|
9
11
|
export declare function saveBaselineScreenshot(pageOrLocator: Screenshotable, name: string, screenshotOptions?: unknown): Promise<void>;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,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;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,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) {
|
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;
|
|
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.
|
|
3
|
+
"version": "1.1.1",
|
|
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,14 +40,18 @@
|
|
|
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",
|
|
49
|
+
"playwright": "1.58.2",
|
|
48
50
|
"typescript": "^5.9.2"
|
|
49
51
|
},
|
|
52
|
+
"peerDependencies": {
|
|
53
|
+
"playwright": "1.58.2"
|
|
54
|
+
},
|
|
50
55
|
"engines": {
|
|
51
56
|
"node": ">=22.22.0 <25"
|
|
52
57
|
},
|