@nouhouari/conductor-e2e 0.0.0-stage → 0.1.9
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 +237 -0
- package/LICENSE +21 -0
- package/README.md +196 -2
- package/config/environments/default.ts +41 -0
- package/config/environments/dev.ts +16 -0
- package/config/environments/staging.ts +15 -0
- package/config/index.ts +70 -0
- package/config/types.ts +94 -0
- package/dist/config/environments/default.d.ts +3 -0
- package/dist/config/environments/default.d.ts.map +1 -0
- package/dist/config/environments/default.js +40 -0
- package/dist/config/environments/default.js.map +1 -0
- package/dist/config/environments/dev.d.ts +3 -0
- package/dist/config/environments/dev.d.ts.map +1 -0
- package/dist/config/environments/dev.js +18 -0
- package/dist/config/environments/dev.js.map +1 -0
- package/dist/config/environments/staging.d.ts +3 -0
- package/dist/config/environments/staging.d.ts.map +1 -0
- package/dist/config/environments/staging.js +17 -0
- package/dist/config/environments/staging.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +81 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +93 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +3 -0
- package/dist/config/types.js.map +1 -0
- package/dist/src/drivers/ApiDriver.d.ts +16 -0
- package/dist/src/drivers/ApiDriver.d.ts.map +1 -0
- package/dist/src/drivers/ApiDriver.js +48 -0
- package/dist/src/drivers/ApiDriver.js.map +1 -0
- package/dist/src/drivers/DatabaseDriver.d.ts +12 -0
- package/dist/src/drivers/DatabaseDriver.d.ts.map +1 -0
- package/dist/src/drivers/DatabaseDriver.js +15 -0
- package/dist/src/drivers/DatabaseDriver.js.map +1 -0
- package/dist/src/drivers/FlutterDesktopDriver.d.ts +139 -0
- package/dist/src/drivers/FlutterDesktopDriver.d.ts.map +1 -0
- package/dist/src/drivers/FlutterDesktopDriver.js +445 -0
- package/dist/src/drivers/FlutterDesktopDriver.js.map +1 -0
- package/dist/src/drivers/MaestroDriver.d.ts +19 -0
- package/dist/src/drivers/MaestroDriver.d.ts.map +1 -0
- package/dist/src/drivers/MaestroDriver.js +144 -0
- package/dist/src/drivers/MaestroDriver.js.map +1 -0
- package/dist/src/drivers/WebDriver.d.ts +21 -0
- package/dist/src/drivers/WebDriver.d.ts.map +1 -0
- package/dist/src/drivers/WebDriver.js +57 -0
- package/dist/src/drivers/WebDriver.js.map +1 -0
- package/dist/src/hooks/browser.hooks.d.ts +2 -0
- package/dist/src/hooks/browser.hooks.d.ts.map +1 -0
- package/dist/src/hooks/browser.hooks.js +15 -0
- package/dist/src/hooks/browser.hooks.js.map +1 -0
- package/dist/src/hooks/database.hooks.d.ts +2 -0
- package/dist/src/hooks/database.hooks.d.ts.map +1 -0
- package/dist/src/hooks/database.hooks.js +11 -0
- package/dist/src/hooks/database.hooks.js.map +1 -0
- package/dist/src/hooks/desktop.hooks.d.ts +2 -0
- package/dist/src/hooks/desktop.hooks.d.ts.map +1 -0
- package/dist/src/hooks/desktop.hooks.js +15 -0
- package/dist/src/hooks/desktop.hooks.js.map +1 -0
- package/dist/src/hooks/flutterDesktop.hooks.d.ts +2 -0
- package/dist/src/hooks/flutterDesktop.hooks.d.ts.map +1 -0
- package/dist/src/hooks/flutterDesktop.hooks.js +26 -0
- package/dist/src/hooks/flutterDesktop.hooks.js.map +1 -0
- package/dist/src/hooks/index.d.ts +6 -0
- package/dist/src/hooks/index.d.ts.map +1 -0
- package/dist/src/hooks/index.js +25 -0
- package/dist/src/hooks/index.js.map +1 -0
- package/dist/src/hooks/maestro.hooks.d.ts +2 -0
- package/dist/src/hooks/maestro.hooks.d.ts.map +1 -0
- package/dist/src/hooks/maestro.hooks.js +8 -0
- package/dist/src/hooks/maestro.hooks.js.map +1 -0
- package/dist/src/index.d.ts +21 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +30 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/pages/BasePage.d.ts +11 -0
- package/dist/src/pages/BasePage.d.ts.map +1 -0
- package/dist/src/pages/BasePage.js +22 -0
- package/dist/src/pages/BasePage.js.map +1 -0
- package/dist/src/scenarios/RemoteScenarioFetcher.d.ts +51 -0
- package/dist/src/scenarios/RemoteScenarioFetcher.d.ts.map +1 -0
- package/dist/src/scenarios/RemoteScenarioFetcher.js +162 -0
- package/dist/src/scenarios/RemoteScenarioFetcher.js.map +1 -0
- package/dist/src/scenarios/cli.d.ts +3 -0
- package/dist/src/scenarios/cli.d.ts.map +1 -0
- package/dist/src/scenarios/cli.js +26 -0
- package/dist/src/scenarios/cli.js.map +1 -0
- package/dist/src/support/logger.d.ts +3 -0
- package/dist/src/support/logger.d.ts.map +1 -0
- package/dist/src/support/logger.js +16 -0
- package/dist/src/support/logger.js.map +1 -0
- package/dist/src/support/retry.d.ts +7 -0
- package/dist/src/support/retry.d.ts.map +1 -0
- package/dist/src/support/retry.js +21 -0
- package/dist/src/support/retry.js.map +1 -0
- package/dist/src/world/ConductorWorld.d.ts +39 -0
- package/dist/src/world/ConductorWorld.d.ts.map +1 -0
- package/dist/src/world/ConductorWorld.js +112 -0
- package/dist/src/world/ConductorWorld.js.map +1 -0
- package/package.json +81 -4
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.fetchScenarios = fetchScenarios;
|
|
7
|
+
exports.reconstructFeatureFiles = reconstructFeatureFiles;
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
/**
|
|
11
|
+
* Fetch scenarios from the requ scenario API, applying server-side filters.
|
|
12
|
+
* Always requests `content=true` so the gherkin body and background come inline.
|
|
13
|
+
*/
|
|
14
|
+
async function fetchScenarios(config) {
|
|
15
|
+
const base = config.baseUrl.replace(/\/+$/, '');
|
|
16
|
+
const params = new URLSearchParams();
|
|
17
|
+
params.set('content', 'true');
|
|
18
|
+
if (config.project)
|
|
19
|
+
params.set('project', config.project);
|
|
20
|
+
const f = config.filters ?? {};
|
|
21
|
+
if (f.story)
|
|
22
|
+
params.set('story', f.story);
|
|
23
|
+
if (f.requirement)
|
|
24
|
+
params.set('requirement', f.requirement);
|
|
25
|
+
if (f.phase)
|
|
26
|
+
params.set('phase', f.phase);
|
|
27
|
+
if (f.mode)
|
|
28
|
+
params.set('mode', f.mode);
|
|
29
|
+
if (f.tags)
|
|
30
|
+
params.set('tags', f.tags);
|
|
31
|
+
if (f.feature)
|
|
32
|
+
params.set('feature', f.feature);
|
|
33
|
+
if (f.q)
|
|
34
|
+
params.set('q', f.q);
|
|
35
|
+
if (typeof f.valid === 'boolean')
|
|
36
|
+
params.set('valid', String(f.valid));
|
|
37
|
+
const url = `${base}/scenarios?${params.toString()}`;
|
|
38
|
+
let res;
|
|
39
|
+
try {
|
|
40
|
+
res = await fetch(url);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
throw new Error(`Failed to reach requ scenario API at ${url}: ${err.message}`);
|
|
44
|
+
}
|
|
45
|
+
if (!res.ok) {
|
|
46
|
+
let detail = '';
|
|
47
|
+
try {
|
|
48
|
+
const body = (await res.json());
|
|
49
|
+
if (body.error)
|
|
50
|
+
detail = body.error;
|
|
51
|
+
if (body.available)
|
|
52
|
+
detail += ` (available projects: ${body.available.join(', ')})`;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// non-JSON error body; ignore
|
|
56
|
+
}
|
|
57
|
+
throw new Error(`requ scenario API returned ${res.status} for ${url}${detail ? `: ${detail}` : ''}`);
|
|
58
|
+
}
|
|
59
|
+
const data = (await res.json());
|
|
60
|
+
return data.scenarios ?? [];
|
|
61
|
+
}
|
|
62
|
+
/** Tag tokens on the leading tag lines of a scenario's content block. */
|
|
63
|
+
function leadingContentTags(content) {
|
|
64
|
+
const tags = new Set();
|
|
65
|
+
for (const raw of content.split(/\r?\n/)) {
|
|
66
|
+
const line = raw.trim();
|
|
67
|
+
if (line === '')
|
|
68
|
+
continue;
|
|
69
|
+
if (line.startsWith('@')) {
|
|
70
|
+
for (const t of line.split(/\s+/))
|
|
71
|
+
if (t.startsWith('@'))
|
|
72
|
+
tags.add(t);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
break; // first non-tag, non-blank line ends the leading tag block
|
|
76
|
+
}
|
|
77
|
+
return tags;
|
|
78
|
+
}
|
|
79
|
+
/** Slugify a feature name into a safe `.feature` filename. */
|
|
80
|
+
function featureFileName(feature) {
|
|
81
|
+
const slug = feature
|
|
82
|
+
.trim()
|
|
83
|
+
.toLowerCase()
|
|
84
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
85
|
+
.replace(/^-+|-+$/g, '');
|
|
86
|
+
return `${slug || 'feature'}.feature`;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Reconstruct `.feature` files from API scenario summaries, grouped by feature.
|
|
90
|
+
* Writes one file per feature into `outputDir` (which is cleaned first).
|
|
91
|
+
*
|
|
92
|
+
* Feature-level tags (e.g. `@web`) are recovered as the tags common to every
|
|
93
|
+
* scenario in a feature that do NOT appear on that scenario's own content tag
|
|
94
|
+
* lines, then emitted above `Feature:` so local `--tags`/profiles still match.
|
|
95
|
+
*/
|
|
96
|
+
async function reconstructFeatureFiles(scenarios, outputDir) {
|
|
97
|
+
const dir = node_path_1.default.resolve(outputDir);
|
|
98
|
+
await node_fs_1.promises.rm(dir, { recursive: true, force: true });
|
|
99
|
+
await node_fs_1.promises.mkdir(dir, { recursive: true });
|
|
100
|
+
// Group by feature name, preserving first-seen order.
|
|
101
|
+
const groups = new Map();
|
|
102
|
+
for (const sc of scenarios) {
|
|
103
|
+
const list = groups.get(sc.feature) ?? [];
|
|
104
|
+
list.push(sc);
|
|
105
|
+
groups.set(sc.feature, list);
|
|
106
|
+
}
|
|
107
|
+
const usedNames = new Set();
|
|
108
|
+
let featuresWritten = 0;
|
|
109
|
+
let scenariosWritten = 0;
|
|
110
|
+
for (const [feature, group] of groups) {
|
|
111
|
+
// Only content-bearing scenarios contribute to the file and to tag recovery.
|
|
112
|
+
// A feature with a Background but no scenarios is invalid Gherkin, so skip it.
|
|
113
|
+
const withContent = group.filter((sc) => (sc.content ?? '').trim() !== '');
|
|
114
|
+
if (withContent.length === 0)
|
|
115
|
+
continue;
|
|
116
|
+
// Feature-level tags = present on every scenario, absent from each one's own tag lines.
|
|
117
|
+
let featureTags = null;
|
|
118
|
+
for (const sc of withContent) {
|
|
119
|
+
const own = leadingContentTags(sc.content ?? '');
|
|
120
|
+
const inherited = new Set((sc.tags ?? []).filter((t) => !own.has(t)));
|
|
121
|
+
if (featureTags === null) {
|
|
122
|
+
featureTags = inherited;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
for (const t of [...featureTags])
|
|
126
|
+
if (!inherited.has(t))
|
|
127
|
+
featureTags.delete(t);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Sorted for deterministic, diff-stable output (tag order is insignificant to cucumber).
|
|
131
|
+
const tags = featureTags ? [...featureTags].sort() : [];
|
|
132
|
+
const background = withContent.find((sc) => (sc.background ?? '').trim() !== '')?.background?.trim();
|
|
133
|
+
const lines = [];
|
|
134
|
+
if (tags.length)
|
|
135
|
+
lines.push(tags.join(' '));
|
|
136
|
+
lines.push(`Feature: ${feature}`);
|
|
137
|
+
lines.push('');
|
|
138
|
+
if (background) {
|
|
139
|
+
lines.push(background);
|
|
140
|
+
lines.push('');
|
|
141
|
+
}
|
|
142
|
+
for (const sc of withContent) {
|
|
143
|
+
lines.push((sc.content ?? '').replace(/\s+$/, ''));
|
|
144
|
+
lines.push('');
|
|
145
|
+
scenariosWritten++;
|
|
146
|
+
}
|
|
147
|
+
let name = featureFileName(feature);
|
|
148
|
+
if (usedNames.has(name)) {
|
|
149
|
+
const stem = name.replace(/\.feature$/, '');
|
|
150
|
+
let i = 2;
|
|
151
|
+
while (usedNames.has(`${stem}-${i}.feature`))
|
|
152
|
+
i++;
|
|
153
|
+
name = `${stem}-${i}.feature`;
|
|
154
|
+
}
|
|
155
|
+
usedNames.add(name);
|
|
156
|
+
const body = `${lines.join('\n').replace(/\n+$/, '')}\n`;
|
|
157
|
+
await node_fs_1.promises.writeFile(node_path_1.default.join(dir, name), body, 'utf8');
|
|
158
|
+
featuresWritten++;
|
|
159
|
+
}
|
|
160
|
+
return { features: featuresWritten, scenarios: scenariosWritten, dir };
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=RemoteScenarioFetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemoteScenarioFetcher.js","sourceRoot":"","sources":["../../../src/scenarios/RemoteScenarioFetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/scenarios/cli.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const config_1 = require("../../config");
|
|
5
|
+
const RemoteScenarioFetcher_1 = require("./RemoteScenarioFetcher");
|
|
6
|
+
/**
|
|
7
|
+
* Prefetch step for the `remote` cucumber profile: fetch scenarios from the requ
|
|
8
|
+
* scenario API and reconstruct them into `.feature` files, then exit. Run before
|
|
9
|
+
* `cucumber-js --profile remote`.
|
|
10
|
+
*/
|
|
11
|
+
async function main() {
|
|
12
|
+
const remote = config_1.config.remoteScenarios;
|
|
13
|
+
if (!remote) {
|
|
14
|
+
throw new Error('No `remoteScenarios` config found. Configure it in config/environments or via REMOTE_SCENARIOS_* env vars.');
|
|
15
|
+
}
|
|
16
|
+
const where = remote.project ? ` (project: ${remote.project})` : '';
|
|
17
|
+
console.log(`Fetching scenarios from ${remote.baseUrl}${where} ...`);
|
|
18
|
+
const scenarios = await (0, RemoteScenarioFetcher_1.fetchScenarios)(remote);
|
|
19
|
+
const result = await (0, RemoteScenarioFetcher_1.reconstructFeatureFiles)(scenarios, remote.outputDir);
|
|
20
|
+
console.log(`Wrote ${result.scenarios} scenario(s) across ${result.features} feature file(s) to ${result.dir}`);
|
|
21
|
+
}
|
|
22
|
+
main().catch((err) => {
|
|
23
|
+
console.error(`fetch-features failed: ${err.message}`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/scenarios/cli.ts"],"names":[],"mappings":";;;AACA,yCAAsC;AACtC,mEAAkF;AAElF;;;;GAIG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,eAAM,CAAC,eAAe,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,4GAA4G,CAC7G,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,CAAC,OAAO,GAAG,KAAK,MAAM,CAAC,CAAC;IAErE,MAAM,SAAS,GAAG,MAAM,IAAA,sCAAc,EAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,IAAA,+CAAuB,EAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAE1E,OAAO,CAAC,GAAG,CACT,SAAS,MAAM,CAAC,SAAS,uBAAuB,MAAM,CAAC,QAAQ,uBAAuB,MAAM,CAAC,GAAG,EAAE,CACnG,CAAC;AACJ,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,0BAA2B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/support/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,+BAOxC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createLogger = createLogger;
|
|
7
|
+
const pino_1 = __importDefault(require("pino"));
|
|
8
|
+
function createLogger(name) {
|
|
9
|
+
const isDev = process.env.NODE_ENV !== 'production';
|
|
10
|
+
return (0, pino_1.default)({
|
|
11
|
+
name,
|
|
12
|
+
level: process.env.LOG_LEVEL ?? 'info',
|
|
13
|
+
transport: isDev ? { target: 'pino-pretty', options: { colorize: true } } : undefined
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/support/logger.ts"],"names":[],"mappings":";;;;;AAEA,oCAOC;AATD,gDAAwB;AAExB,SAAgB,YAAY,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;IACpD,OAAO,IAAA,cAAI,EAAC;QACV,IAAI;QACJ,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;QACtC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;KACtF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../src/support/retry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;CACnC;AAED,wBAAsB,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,CAAC,CAAC,CAiBxF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.retry = retry;
|
|
4
|
+
async function retry(fn, opts = {}) {
|
|
5
|
+
const { attempts = 3, delayMs = 1000, backoff = 'fixed' } = opts;
|
|
6
|
+
let lastError;
|
|
7
|
+
for (let i = 0; i < attempts; i++) {
|
|
8
|
+
try {
|
|
9
|
+
return await fn();
|
|
10
|
+
}
|
|
11
|
+
catch (err) {
|
|
12
|
+
lastError = err;
|
|
13
|
+
if (i < attempts - 1) {
|
|
14
|
+
const wait = backoff === 'exponential' ? delayMs * 2 ** i : delayMs;
|
|
15
|
+
await new Promise((r) => setTimeout(r, wait));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
throw lastError;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/support/retry.ts"],"names":[],"mappings":";;AAMA,sBAiBC;AAjBM,KAAK,UAAU,KAAK,CAAI,EAAoB,EAAE,OAAqB,EAAE;IAC1E,MAAM,EAAE,QAAQ,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;IACjE,IAAI,SAAkB,CAAC;IAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAG,GAAG,CAAC;YAChB,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,GAAG,OAAO,KAAK,aAAa,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;gBACpE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { IWorldOptions, World } from '@cucumber/cucumber';
|
|
2
|
+
import { Page, APIRequestContext } from 'playwright';
|
|
3
|
+
import type { EnvironmentConfig } from '../../config/types';
|
|
4
|
+
import { WebDriver } from '../drivers/WebDriver';
|
|
5
|
+
import { ApiDriver } from '../drivers/ApiDriver';
|
|
6
|
+
import { MaestroDriver } from '../drivers/MaestroDriver';
|
|
7
|
+
import { DatabaseDriver } from '../drivers/DatabaseDriver';
|
|
8
|
+
import { JavaFxDriver } from 'javafx-driver';
|
|
9
|
+
import { FlutterDesktopDriver } from '../drivers/FlutterDesktopDriver';
|
|
10
|
+
export declare class ConductorWorld extends World {
|
|
11
|
+
readonly config: EnvironmentConfig;
|
|
12
|
+
readonly logger: import("pino").Logger<never, boolean>;
|
|
13
|
+
readonly data: Record<string, unknown>;
|
|
14
|
+
private _webDriver;
|
|
15
|
+
private _apiDriver;
|
|
16
|
+
private _maestroDriver;
|
|
17
|
+
private _dbDriver;
|
|
18
|
+
private _fxDriver;
|
|
19
|
+
private _flutterDesktopDriver;
|
|
20
|
+
constructor(options: IWorldOptions);
|
|
21
|
+
get web(): WebDriver;
|
|
22
|
+
get page(): Page;
|
|
23
|
+
get api(): ApiDriver;
|
|
24
|
+
get request(): APIRequestContext;
|
|
25
|
+
get maestro(): MaestroDriver;
|
|
26
|
+
get fx(): JavaFxDriver;
|
|
27
|
+
get isFxLaunched(): boolean;
|
|
28
|
+
closeFx(): Promise<void>;
|
|
29
|
+
get flutterDesktop(): FlutterDesktopDriver;
|
|
30
|
+
get isFlutterDesktopLaunched(): boolean;
|
|
31
|
+
closeFlutterDesktop(): Promise<void>;
|
|
32
|
+
setDb(driver: DatabaseDriver): void;
|
|
33
|
+
get db(): DatabaseDriver;
|
|
34
|
+
get hasDb(): boolean;
|
|
35
|
+
closeWeb(): Promise<void>;
|
|
36
|
+
disposeApi(): Promise<void>;
|
|
37
|
+
disconnectDb(): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=ConductorWorld.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConductorWorld.d.ts","sourceRoot":"","sources":["../../../src/world/ConductorWorld.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAGvE,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAU;IAC5C,QAAQ,CAAC,MAAM,wCAA6B;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IAE5C,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,qBAAqB,CAAqC;gBAEtD,OAAO,EAAE,aAAa;IAMlC,IAAI,GAAG,IAAI,SAAS,CAGnB;IAED,IAAI,IAAI,IAAI,IAAI,CAEf;IAID,IAAI,GAAG,IAAI,SAAS,CAGnB;IAED,IAAI,OAAO,IAAI,iBAAiB,CAE/B;IAID,IAAI,OAAO,IAAI,aAAa,CAG3B;IAID,IAAI,EAAE,IAAI,YAAY,CAQrB;IAED,IAAI,YAAY,IAAI,OAAO,CAE1B;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,IAAI,cAAc,IAAI,oBAAoB,CAQzC;IAED,IAAI,wBAAwB,IAAI,OAAO,CAEtC;IAEK,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAO1C,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAInC,IAAI,EAAE,IAAI,cAAc,CAGvB;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAIK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAKzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAMpC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConductorWorld = void 0;
|
|
4
|
+
const cucumber_1 = require("@cucumber/cucumber");
|
|
5
|
+
const config_1 = require("../../config");
|
|
6
|
+
const WebDriver_1 = require("../drivers/WebDriver");
|
|
7
|
+
const ApiDriver_1 = require("../drivers/ApiDriver");
|
|
8
|
+
const MaestroDriver_1 = require("../drivers/MaestroDriver");
|
|
9
|
+
const javafx_driver_1 = require("javafx-driver");
|
|
10
|
+
const FlutterDesktopDriver_1 = require("../drivers/FlutterDesktopDriver");
|
|
11
|
+
const logger_1 = require("../support/logger");
|
|
12
|
+
class ConductorWorld extends cucumber_1.World {
|
|
13
|
+
config = config_1.config;
|
|
14
|
+
logger = (0, logger_1.createLogger)('conductor');
|
|
15
|
+
data = {};
|
|
16
|
+
_webDriver = null;
|
|
17
|
+
_apiDriver = null;
|
|
18
|
+
_maestroDriver = null;
|
|
19
|
+
_dbDriver = null;
|
|
20
|
+
_fxDriver = null;
|
|
21
|
+
_flutterDesktopDriver = null;
|
|
22
|
+
constructor(options) {
|
|
23
|
+
super(options);
|
|
24
|
+
}
|
|
25
|
+
// Web
|
|
26
|
+
get web() {
|
|
27
|
+
if (!this._webDriver)
|
|
28
|
+
this._webDriver = new WebDriver_1.WebDriver(this.config);
|
|
29
|
+
return this._webDriver;
|
|
30
|
+
}
|
|
31
|
+
get page() {
|
|
32
|
+
return this.web.page;
|
|
33
|
+
}
|
|
34
|
+
// API
|
|
35
|
+
get api() {
|
|
36
|
+
if (!this._apiDriver)
|
|
37
|
+
this._apiDriver = new ApiDriver_1.ApiDriver(this.config);
|
|
38
|
+
return this._apiDriver;
|
|
39
|
+
}
|
|
40
|
+
get request() {
|
|
41
|
+
return this.api.client;
|
|
42
|
+
}
|
|
43
|
+
// Mobile
|
|
44
|
+
get maestro() {
|
|
45
|
+
if (!this._maestroDriver)
|
|
46
|
+
this._maestroDriver = new MaestroDriver_1.MaestroDriver(this.config);
|
|
47
|
+
return this._maestroDriver;
|
|
48
|
+
}
|
|
49
|
+
// Desktop (JavaFX)
|
|
50
|
+
get fx() {
|
|
51
|
+
if (!this._fxDriver) {
|
|
52
|
+
if (!this.config.desktop) {
|
|
53
|
+
throw new Error('No desktop config. Set config.desktop with DesktopConfig.');
|
|
54
|
+
}
|
|
55
|
+
this._fxDriver = new javafx_driver_1.JavaFxDriver(this.config.desktop);
|
|
56
|
+
}
|
|
57
|
+
return this._fxDriver;
|
|
58
|
+
}
|
|
59
|
+
get isFxLaunched() {
|
|
60
|
+
return this._fxDriver?.isLaunched ?? false;
|
|
61
|
+
}
|
|
62
|
+
async closeFx() {
|
|
63
|
+
await this._fxDriver?.close();
|
|
64
|
+
this._fxDriver = null;
|
|
65
|
+
}
|
|
66
|
+
// Desktop (Flutter)
|
|
67
|
+
get flutterDesktop() {
|
|
68
|
+
if (!this._flutterDesktopDriver) {
|
|
69
|
+
if (!this.config.flutterDesktop) {
|
|
70
|
+
throw new Error('No flutterDesktop config. Set config.flutterDesktop with FlutterDesktopConfig.');
|
|
71
|
+
}
|
|
72
|
+
this._flutterDesktopDriver = new FlutterDesktopDriver_1.FlutterDesktopDriver(this.config);
|
|
73
|
+
}
|
|
74
|
+
return this._flutterDesktopDriver;
|
|
75
|
+
}
|
|
76
|
+
get isFlutterDesktopLaunched() {
|
|
77
|
+
return this._flutterDesktopDriver?.isLaunched ?? false;
|
|
78
|
+
}
|
|
79
|
+
async closeFlutterDesktop() {
|
|
80
|
+
await this._flutterDesktopDriver?.close();
|
|
81
|
+
this._flutterDesktopDriver = null;
|
|
82
|
+
}
|
|
83
|
+
// Database (plugin — user registers their adapter)
|
|
84
|
+
setDb(driver) {
|
|
85
|
+
this._dbDriver = driver;
|
|
86
|
+
}
|
|
87
|
+
get db() {
|
|
88
|
+
if (!this._dbDriver)
|
|
89
|
+
throw new Error('No DatabaseDriver registered. Call world.setDb(adapter) in a Before hook.');
|
|
90
|
+
return this._dbDriver;
|
|
91
|
+
}
|
|
92
|
+
get hasDb() {
|
|
93
|
+
return this._dbDriver !== null;
|
|
94
|
+
}
|
|
95
|
+
// Tear-down helpers (called by hooks)
|
|
96
|
+
async closeWeb() {
|
|
97
|
+
await this._webDriver?.close();
|
|
98
|
+
this._webDriver = null;
|
|
99
|
+
}
|
|
100
|
+
async disposeApi() {
|
|
101
|
+
await this._apiDriver?.dispose();
|
|
102
|
+
this._apiDriver = null;
|
|
103
|
+
}
|
|
104
|
+
async disconnectDb() {
|
|
105
|
+
if (this._dbDriver) {
|
|
106
|
+
await this._dbDriver.disconnect();
|
|
107
|
+
this._dbDriver = null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.ConductorWorld = ConductorWorld;
|
|
112
|
+
//# sourceMappingURL=ConductorWorld.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConductorWorld.js","sourceRoot":"","sources":["../../../src/world/ConductorWorld.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,83 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nouhouari/conductor-e2e",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.9",
|
|
4
|
+
"description": "Multi-platform E2E test framework — web (Playwright), API, mobile (Maestro), desktop (JavaFX), and database in one Cucumber scenario",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"e2e",
|
|
7
|
+
"testing",
|
|
8
|
+
"cucumber",
|
|
9
|
+
"bdd",
|
|
10
|
+
"playwright",
|
|
11
|
+
"maestro",
|
|
12
|
+
"flutter",
|
|
13
|
+
"javafx",
|
|
14
|
+
"multi-platform",
|
|
15
|
+
"test-framework"
|
|
16
|
+
],
|
|
17
|
+
"author": "Nourreddine Houari",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/nouhouari/conductor.git"
|
|
22
|
+
},
|
|
23
|
+
"homepage": "https://github.com/nouhouari/conductor#readme",
|
|
24
|
+
"bugs": {
|
|
25
|
+
"url": "https://github.com/nouhouari/conductor/issues"
|
|
26
|
+
},
|
|
27
|
+
"workspaces": [
|
|
28
|
+
"example",
|
|
29
|
+
"mcp"
|
|
30
|
+
],
|
|
31
|
+
"main": "dist/src/index.js",
|
|
32
|
+
"types": "dist/src/index.d.ts",
|
|
33
|
+
"bin": {
|
|
34
|
+
"conductor-fetch-features": "dist/src/scenarios/cli.js"
|
|
35
|
+
},
|
|
36
|
+
"files": [
|
|
37
|
+
"dist",
|
|
38
|
+
"config",
|
|
39
|
+
"README.md",
|
|
40
|
+
"LICENSE",
|
|
41
|
+
"CHANGELOG.md"
|
|
42
|
+
],
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsc",
|
|
45
|
+
"clean": "rm -rf dist",
|
|
46
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
47
|
+
"test": "cucumber-js",
|
|
48
|
+
"test:dry-run": "cucumber-js --dry-run",
|
|
49
|
+
"flutter:build:macos": "cd apps/mobile && flutter build macos --profile -t lib/main_test.dart --dart-define=API_BASE_URL=http://localhost:3000/api --dart-define=DISABLE_SWIPE_GESTURES=true",
|
|
50
|
+
"report": "allure generate allure-results --clean -o allure-report",
|
|
51
|
+
"report:open": "allure open allure-report"
|
|
52
|
+
},
|
|
53
|
+
"exports": {
|
|
54
|
+
".": {
|
|
55
|
+
"import": "./dist/src/index.js",
|
|
56
|
+
"require": "./dist/src/index.js",
|
|
57
|
+
"types": "./dist/src/index.d.ts"
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"engines": {
|
|
61
|
+
"node": ">=18.0.0"
|
|
62
|
+
},
|
|
63
|
+
"dependencies": {
|
|
64
|
+
"@cucumber/cucumber": "^11.0.0",
|
|
65
|
+
"allure-commandline": "^2.27.0",
|
|
66
|
+
"allure-cucumberjs": "^3.0.0",
|
|
67
|
+
"dotenv": "^16.4.5",
|
|
68
|
+
"javafx-driver": "^0.2.2",
|
|
69
|
+
"pino": "^9.0.0",
|
|
70
|
+
"pino-pretty": "^11.0.0",
|
|
71
|
+
"playwright": "^1.44.0",
|
|
72
|
+
"ws": "^8.21.0"
|
|
73
|
+
},
|
|
74
|
+
"devDependencies": {
|
|
75
|
+
"@types/node": "^20.0.0",
|
|
76
|
+
"@types/ws": "^8.18.1",
|
|
77
|
+
"ts-node": "^10.9.0",
|
|
78
|
+
"typescript": "^5.4.0"
|
|
79
|
+
},
|
|
80
|
+
"publishConfig": {
|
|
81
|
+
"registry": "https://npm.pkg.github.com"
|
|
82
|
+
}
|
|
83
|
+
}
|