@memberjunction/react-test-harness 2.71.0 → 2.72.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/dist/lib/component-runner.d.ts +49 -0
- package/dist/lib/component-runner.d.ts.map +1 -1
- package/dist/lib/component-runner.js +193 -33
- package/dist/lib/component-runner.js.map +1 -1
- package/dist/lib/test-harness.d.ts +6 -11
- package/dist/lib/test-harness.d.ts.map +1 -1
- package/dist/lib/test-harness.js +29 -22
- package/dist/lib/test-harness.js.map +1 -1
- package/package.json +3 -3
|
@@ -18,20 +18,69 @@ export interface ComponentExecutionResult {
|
|
|
18
18
|
success: boolean;
|
|
19
19
|
html: string;
|
|
20
20
|
errors: string[];
|
|
21
|
+
warnings: string[];
|
|
22
|
+
criticalWarnings: string[];
|
|
21
23
|
console: {
|
|
22
24
|
type: string;
|
|
23
25
|
text: string;
|
|
24
26
|
}[];
|
|
25
27
|
screenshot?: Buffer;
|
|
26
28
|
executionTime: number;
|
|
29
|
+
renderCount?: number;
|
|
27
30
|
}
|
|
28
31
|
export declare class ComponentRunner {
|
|
29
32
|
private browserManager;
|
|
30
33
|
private compiler;
|
|
31
34
|
private registry;
|
|
32
35
|
private runtimeContext;
|
|
36
|
+
private static readonly CRITICAL_WARNING_PATTERNS;
|
|
37
|
+
private static readonly MAX_RENDER_COUNT;
|
|
33
38
|
constructor(browserManager: BrowserManager);
|
|
34
39
|
executeComponent(options: ComponentExecutionOptions): Promise<ComponentExecutionResult>;
|
|
35
40
|
private createHTMLTemplate;
|
|
41
|
+
/**
|
|
42
|
+
* Checks if a console message is a warning
|
|
43
|
+
*/
|
|
44
|
+
private isWarning;
|
|
45
|
+
/**
|
|
46
|
+
* Checks if a warning is critical and should fail the test
|
|
47
|
+
*/
|
|
48
|
+
private isCriticalWarning;
|
|
49
|
+
/**
|
|
50
|
+
* Sets up console logging with warning detection
|
|
51
|
+
*/
|
|
52
|
+
private setupConsoleLogging;
|
|
53
|
+
/**
|
|
54
|
+
* Sets up error handling for the page
|
|
55
|
+
*/
|
|
56
|
+
private setupErrorHandling;
|
|
57
|
+
/**
|
|
58
|
+
* Injects render tracking code into the page
|
|
59
|
+
*/
|
|
60
|
+
private injectRenderTracking;
|
|
61
|
+
/**
|
|
62
|
+
* Waits for component to render and checks for timeouts
|
|
63
|
+
*/
|
|
64
|
+
private waitForRender;
|
|
65
|
+
/**
|
|
66
|
+
* Gets the render count from the page
|
|
67
|
+
*/
|
|
68
|
+
private getRenderCount;
|
|
69
|
+
/**
|
|
70
|
+
* Determines if the component execution was successful
|
|
71
|
+
*/
|
|
72
|
+
private determineSuccess;
|
|
73
|
+
/**
|
|
74
|
+
* Analyze component errors to identify failed components
|
|
75
|
+
* @param errors Array of error messages
|
|
76
|
+
* @returns Array of component names that failed
|
|
77
|
+
*/
|
|
78
|
+
static analyzeComponentErrors(errors: string[]): string[];
|
|
79
|
+
/**
|
|
80
|
+
* Get detailed error analysis
|
|
81
|
+
* @param errors Array of error messages
|
|
82
|
+
* @returns Detailed failure information
|
|
83
|
+
*/
|
|
84
|
+
static getDetailedErrorAnalysis(errors: string[]): import("@memberjunction/react-runtime").FailedComponentInfo[];
|
|
36
85
|
}
|
|
37
86
|
//# sourceMappingURL=component-runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-runner.d.ts","sourceRoot":"","sources":["../../src/lib/component-runner.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"component-runner.d.ts","sourceRoot":"","sources":["../../src/lib/component-runner.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAYnD,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,aAAa,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,GAAG,kBAAkB,GAAG,aAAa,CAAC;CAChE;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;IAClC,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,eAAe;IAoBd,OAAO,CAAC,cAAc;IAnBlC,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,cAAc,CAAiB;IAGvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAS/C;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;gBAE5B,cAAc,EAAE,cAAc;IAQ5C,gBAAgB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAqE7F,OAAO,CAAC,kBAAkB;IA8a1B;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAM1B;;OAEG;YACW,oBAAoB;IAMlC;;OAEG;YACW,aAAa;IA0B3B;;OAEG;YACW,cAAc;IAI5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoBxB;;;;OAIG;IACH,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAIzD;;;;OAIG;IACH,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE;CAGjD"}
|
|
@@ -13,45 +13,41 @@ class ComponentRunner {
|
|
|
13
13
|
async executeComponent(options) {
|
|
14
14
|
const startTime = Date.now();
|
|
15
15
|
const errors = [];
|
|
16
|
+
const warnings = [];
|
|
17
|
+
const criticalWarnings = [];
|
|
16
18
|
const consoleLogs = [];
|
|
19
|
+
let renderCount = 0;
|
|
17
20
|
try {
|
|
18
21
|
const page = await this.browserManager.getPage();
|
|
19
|
-
// Set up
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
//
|
|
24
|
-
page.on('pageerror', (error) => {
|
|
25
|
-
errors.push(error.message);
|
|
26
|
-
});
|
|
27
|
-
// Create HTML template that uses the runtime's ComponentHierarchyRegistrar
|
|
22
|
+
// Set up monitoring
|
|
23
|
+
this.setupConsoleLogging(page, consoleLogs, warnings, criticalWarnings);
|
|
24
|
+
this.setupErrorHandling(page, errors);
|
|
25
|
+
await this.injectRenderTracking(page);
|
|
26
|
+
// Create and load the component
|
|
28
27
|
const htmlContent = this.createHTMLTemplate(options);
|
|
29
|
-
// Navigate to a data URL with the HTML content
|
|
30
28
|
await page.goto(`data:text/html;charset=utf-8,${encodeURIComponent(htmlContent)}`);
|
|
31
|
-
// Wait for
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
if (options.waitForLoadState) {
|
|
38
|
-
await this.browserManager.waitForLoadState(options.waitForLoadState);
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
// Default wait for React to finish rendering
|
|
42
|
-
await page.waitForTimeout(100);
|
|
43
|
-
}
|
|
29
|
+
// Wait for render with timeout detection
|
|
30
|
+
const renderSuccess = await this.waitForRender(page, options, errors);
|
|
31
|
+
// Get render count
|
|
32
|
+
renderCount = await this.getRenderCount(page);
|
|
44
33
|
// Get the rendered HTML
|
|
45
34
|
const html = await this.browserManager.getContent();
|
|
46
35
|
// Take screenshot if needed
|
|
47
36
|
const screenshot = await this.browserManager.screenshot();
|
|
37
|
+
// Determine success and collect any additional errors
|
|
38
|
+
const { success, additionalErrors } = this.determineSuccess(errors, criticalWarnings, renderCount, !renderSuccess);
|
|
39
|
+
// Add any additional errors
|
|
40
|
+
errors.push(...additionalErrors);
|
|
48
41
|
return {
|
|
49
|
-
success
|
|
42
|
+
success,
|
|
50
43
|
html,
|
|
51
44
|
errors,
|
|
45
|
+
warnings,
|
|
46
|
+
criticalWarnings,
|
|
52
47
|
console: consoleLogs,
|
|
53
48
|
screenshot,
|
|
54
|
-
executionTime: Date.now() - startTime
|
|
49
|
+
executionTime: Date.now() - startTime,
|
|
50
|
+
renderCount
|
|
55
51
|
};
|
|
56
52
|
}
|
|
57
53
|
catch (error) {
|
|
@@ -60,8 +56,11 @@ class ComponentRunner {
|
|
|
60
56
|
success: false,
|
|
61
57
|
html: '',
|
|
62
58
|
errors,
|
|
59
|
+
warnings,
|
|
60
|
+
criticalWarnings,
|
|
63
61
|
console: consoleLogs,
|
|
64
|
-
executionTime: Date.now() - startTime
|
|
62
|
+
executionTime: Date.now() - startTime,
|
|
63
|
+
renderCount
|
|
65
64
|
};
|
|
66
65
|
}
|
|
67
66
|
}
|
|
@@ -72,6 +71,14 @@ class ComponentRunner {
|
|
|
72
71
|
const coreLibraryScripts = (0, react_runtime_1.getCoreLibraryUrls)()
|
|
73
72
|
.map(url => ` <script src="${url}"></script>`)
|
|
74
73
|
.join('\n');
|
|
74
|
+
// Generate script tags for UI libraries
|
|
75
|
+
const uiLibraryScripts = (0, react_runtime_1.getUILibraryUrls)()
|
|
76
|
+
.map(url => ` <script src="${url}"></script>`)
|
|
77
|
+
.join('\n');
|
|
78
|
+
// Generate CSS links
|
|
79
|
+
const cssLinks = (0, react_runtime_1.getCSSUrls)()
|
|
80
|
+
.map(url => ` <link rel="stylesheet" href="${url}">`)
|
|
81
|
+
.join('\n');
|
|
75
82
|
return `
|
|
76
83
|
<!DOCTYPE html>
|
|
77
84
|
<html>
|
|
@@ -82,10 +89,43 @@ class ComponentRunner {
|
|
|
82
89
|
<script crossorigin src="${react_runtime_1.STANDARD_LIBRARY_URLS.REACT_DOM}"></script>
|
|
83
90
|
<script src="${react_runtime_1.STANDARD_LIBRARY_URLS.BABEL}"></script>
|
|
84
91
|
${coreLibraryScripts}
|
|
92
|
+
${uiLibraryScripts}
|
|
93
|
+
${cssLinks}
|
|
85
94
|
<style>
|
|
86
95
|
body { margin: 0; padding: 20px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
|
|
87
96
|
#root { min-height: 100vh; }
|
|
88
97
|
</style>
|
|
98
|
+
<script>
|
|
99
|
+
// Render tracking injection
|
|
100
|
+
(function() {
|
|
101
|
+
let renderCounter = 0;
|
|
102
|
+
window.__testHarnessRenderCount = 0;
|
|
103
|
+
|
|
104
|
+
// Wait for React to be available
|
|
105
|
+
const setupRenderTracking = () => {
|
|
106
|
+
if (window.React && window.React.createElement) {
|
|
107
|
+
const originalCreateElement = window.React.createElement.bind(window.React);
|
|
108
|
+
|
|
109
|
+
window.React.createElement = function(type, props, ...children) {
|
|
110
|
+
renderCounter++;
|
|
111
|
+
window.__testHarnessRenderCount = renderCounter;
|
|
112
|
+
|
|
113
|
+
if (renderCounter > 1000) {
|
|
114
|
+
console.error('Excessive renders detected: ' + renderCounter + ' renders. Possible infinite loop.');
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return originalCreateElement(type, props, ...children);
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
// Try to set up immediately
|
|
123
|
+
setupRenderTracking();
|
|
124
|
+
|
|
125
|
+
// Also try after a delay in case React loads later
|
|
126
|
+
setTimeout(setupRenderTracking, 100);
|
|
127
|
+
})();
|
|
128
|
+
</script>
|
|
89
129
|
</head>
|
|
90
130
|
<body>
|
|
91
131
|
<div id="root"></div>
|
|
@@ -100,7 +140,9 @@ ${coreLibraryScripts}
|
|
|
100
140
|
_: window._,
|
|
101
141
|
d3: window.d3,
|
|
102
142
|
Chart: window.Chart,
|
|
103
|
-
dayjs: window.dayjs
|
|
143
|
+
dayjs: window.dayjs,
|
|
144
|
+
antd: window.antd,
|
|
145
|
+
ReactBootstrap: window.ReactBootstrap
|
|
104
146
|
}
|
|
105
147
|
};
|
|
106
148
|
|
|
@@ -131,6 +173,8 @@ ${coreLibraryScripts}
|
|
|
131
173
|
const d3 = libraries.d3;
|
|
132
174
|
const Chart = libraries.Chart;
|
|
133
175
|
const dayjs = libraries.dayjs;
|
|
176
|
+
const antd = libraries.antd;
|
|
177
|
+
const ReactBootstrap = libraries.ReactBootstrap;
|
|
134
178
|
|
|
135
179
|
\${transformed.code}
|
|
136
180
|
return {
|
|
@@ -294,18 +338,18 @@ ${coreLibraryScripts}
|
|
|
294
338
|
entities: []
|
|
295
339
|
},
|
|
296
340
|
rv: {
|
|
297
|
-
|
|
298
|
-
console.log('Mock
|
|
341
|
+
RunView: async (params) => {
|
|
342
|
+
console.log('Mock RunView called with:', params);
|
|
299
343
|
return { Results: [], Success: true };
|
|
300
344
|
},
|
|
301
|
-
|
|
302
|
-
console.log('Mock
|
|
345
|
+
RunViews: async (params) => {
|
|
346
|
+
console.log('Mock RunViews called with:', params);
|
|
303
347
|
return params.map(() => ({ Results: [], Success: true }));
|
|
304
348
|
}
|
|
305
349
|
},
|
|
306
350
|
rq: {
|
|
307
|
-
|
|
308
|
-
console.log('Mock
|
|
351
|
+
RunQuery: async (params) => {
|
|
352
|
+
console.log('Mock RunQuery called with:', params);
|
|
309
353
|
return { Results: [], Success: true };
|
|
310
354
|
}
|
|
311
355
|
}
|
|
@@ -445,6 +489,122 @@ ${coreLibraryScripts}
|
|
|
445
489
|
</body>
|
|
446
490
|
</html>`;
|
|
447
491
|
}
|
|
492
|
+
/**
|
|
493
|
+
* Checks if a console message is a warning
|
|
494
|
+
*/
|
|
495
|
+
isWarning(type, text) {
|
|
496
|
+
return type === 'warning' || text.startsWith('Warning:');
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Checks if a warning is critical and should fail the test
|
|
500
|
+
*/
|
|
501
|
+
isCriticalWarning(text) {
|
|
502
|
+
return ComponentRunner.CRITICAL_WARNING_PATTERNS.some(pattern => pattern.test(text));
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Sets up console logging with warning detection
|
|
506
|
+
*/
|
|
507
|
+
setupConsoleLogging(page, consoleLogs, warnings, criticalWarnings) {
|
|
508
|
+
page.on('console', (msg) => {
|
|
509
|
+
const type = msg.type();
|
|
510
|
+
const text = msg.text();
|
|
511
|
+
consoleLogs.push({ type, text });
|
|
512
|
+
if (this.isWarning(type, text)) {
|
|
513
|
+
warnings.push(text);
|
|
514
|
+
if (this.isCriticalWarning(text)) {
|
|
515
|
+
criticalWarnings.push(text);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Sets up error handling for the page
|
|
522
|
+
*/
|
|
523
|
+
setupErrorHandling(page, errors) {
|
|
524
|
+
page.on('pageerror', (error) => {
|
|
525
|
+
errors.push(error.message);
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Injects render tracking code into the page
|
|
530
|
+
*/
|
|
531
|
+
async injectRenderTracking(page) {
|
|
532
|
+
// Instead of using evaluateOnNewDocument, we'll inject the script directly into the HTML
|
|
533
|
+
// This avoids the Playwright-specific API issue
|
|
534
|
+
// The actual injection will happen in createHTMLTemplate
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Waits for component to render and checks for timeouts
|
|
538
|
+
*/
|
|
539
|
+
async waitForRender(page, options, errors) {
|
|
540
|
+
const timeout = options.timeout || 10000; // 10 seconds default
|
|
541
|
+
try {
|
|
542
|
+
if (options.waitForSelector) {
|
|
543
|
+
await this.browserManager.waitForSelector(options.waitForSelector, { timeout });
|
|
544
|
+
}
|
|
545
|
+
if (options.waitForLoadState) {
|
|
546
|
+
await this.browserManager.waitForLoadState(options.waitForLoadState);
|
|
547
|
+
}
|
|
548
|
+
else {
|
|
549
|
+
// Default wait for React to finish rendering
|
|
550
|
+
await page.waitForTimeout(100);
|
|
551
|
+
}
|
|
552
|
+
return true;
|
|
553
|
+
}
|
|
554
|
+
catch (timeoutError) {
|
|
555
|
+
errors.push(`Component rendering timeout after ${timeout}ms - possible infinite render loop`);
|
|
556
|
+
return false;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* Gets the render count from the page
|
|
561
|
+
*/
|
|
562
|
+
async getRenderCount(page) {
|
|
563
|
+
return await page.evaluate(() => window.__testHarnessRenderCount || 0);
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Determines if the component execution was successful
|
|
567
|
+
*/
|
|
568
|
+
determineSuccess(errors, criticalWarnings, renderCount, hasTimeout) {
|
|
569
|
+
const additionalErrors = [];
|
|
570
|
+
if (renderCount > ComponentRunner.MAX_RENDER_COUNT) {
|
|
571
|
+
additionalErrors.push(`Excessive render count: ${renderCount} renders detected`);
|
|
572
|
+
}
|
|
573
|
+
const success = errors.length === 0 &&
|
|
574
|
+
criticalWarnings.length === 0 &&
|
|
575
|
+
!hasTimeout &&
|
|
576
|
+
renderCount <= ComponentRunner.MAX_RENDER_COUNT;
|
|
577
|
+
return { success, additionalErrors };
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Analyze component errors to identify failed components
|
|
581
|
+
* @param errors Array of error messages
|
|
582
|
+
* @returns Array of component names that failed
|
|
583
|
+
*/
|
|
584
|
+
static analyzeComponentErrors(errors) {
|
|
585
|
+
return react_runtime_1.ComponentErrorAnalyzer.identifyFailedComponents(errors);
|
|
586
|
+
}
|
|
587
|
+
/**
|
|
588
|
+
* Get detailed error analysis
|
|
589
|
+
* @param errors Array of error messages
|
|
590
|
+
* @returns Detailed failure information
|
|
591
|
+
*/
|
|
592
|
+
static getDetailedErrorAnalysis(errors) {
|
|
593
|
+
return react_runtime_1.ComponentErrorAnalyzer.analyzeComponentErrors(errors);
|
|
594
|
+
}
|
|
448
595
|
}
|
|
449
596
|
exports.ComponentRunner = ComponentRunner;
|
|
597
|
+
// Critical warning patterns that should fail tests
|
|
598
|
+
ComponentRunner.CRITICAL_WARNING_PATTERNS = [
|
|
599
|
+
/Maximum update depth exceeded/i,
|
|
600
|
+
/Cannot update a component .* while rendering a different component/i,
|
|
601
|
+
/Cannot update during an existing state transition/i,
|
|
602
|
+
/Warning: setState.*unmounted component/i,
|
|
603
|
+
/Warning: Can't perform a React state update on an unmounted component/i,
|
|
604
|
+
/Encountered two children with the same key/i,
|
|
605
|
+
/Error: Minified React error/i,
|
|
606
|
+
/too many re-renders/i,
|
|
607
|
+
];
|
|
608
|
+
// Maximum allowed renders before considering it excessive
|
|
609
|
+
ComponentRunner.MAX_RENDER_COUNT = 1000;
|
|
450
610
|
//# sourceMappingURL=component-runner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-runner.js","sourceRoot":"","sources":["../../src/lib/component-runner.ts"],"names":[],"mappings":";;;AACA,
|
|
1
|
+
{"version":3,"file":"component-runner.js","sourceRoot":"","sources":["../../src/lib/component-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { BrowserContextOptions } from './browser-context';
|
|
3
|
-
import { ComponentExecutionOptions, ComponentExecutionResult
|
|
3
|
+
import { ComponentExecutionOptions, ComponentExecutionResult } from './component-runner';
|
|
4
4
|
import { AssertionHelpers } from './assertion-helpers';
|
|
5
|
-
import { ComponentRootSpec } from '@memberjunction/interactive-component-types';
|
|
5
|
+
import { ComponentRootSpec, ComponentChildSpec } from '@memberjunction/interactive-component-types';
|
|
6
6
|
export interface TestHarnessOptions extends BrowserContextOptions {
|
|
7
7
|
debug?: boolean;
|
|
8
8
|
screenshotOnError?: boolean;
|
|
@@ -15,18 +15,13 @@ export declare class ReactTestHarness {
|
|
|
15
15
|
constructor(options?: TestHarnessOptions);
|
|
16
16
|
initialize(): Promise<void>;
|
|
17
17
|
/**
|
|
18
|
-
* Test a
|
|
19
|
-
* This is the main method that leverages the runtime's ComponentHierarchyRegistrar
|
|
18
|
+
* Test a root component with its full hierarchy of child components
|
|
20
19
|
*/
|
|
21
|
-
|
|
20
|
+
testRootComponent(rootSpec: ComponentRootSpec, props?: Record<string, any>, options?: Partial<ComponentExecutionOptions>): Promise<ComponentExecutionResult>;
|
|
22
21
|
/**
|
|
23
|
-
*
|
|
22
|
+
* Test a single child component
|
|
24
23
|
*/
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Test a component from the Skip spec format
|
|
28
|
-
*/
|
|
29
|
-
testSkipComponent(skipSpec: ComponentRootSpec, props?: Record<string, any>, options?: Partial<ComponentExecutionOptions>): Promise<ComponentExecutionResult>;
|
|
24
|
+
testChildComponent(childSpec: ComponentChildSpec, props?: Record<string, any>, options?: Partial<ComponentExecutionOptions>): Promise<ComponentExecutionResult>;
|
|
30
25
|
/**
|
|
31
26
|
* Convert Skip child specs to test harness ComponentSpec format
|
|
32
27
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-harness.d.ts","sourceRoot":"","sources":["../../src/lib/test-harness.ts"],"names":[],"mappings":";AAAA,OAAO,EAAkB,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAmB,yBAAyB,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"test-harness.d.ts","sourceRoot":"","sources":["../../src/lib/test-harness.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/test-harness.js
CHANGED
|
@@ -42,10 +42,15 @@ class ReactTestHarness {
|
|
|
42
42
|
await this.browserManager.initialize();
|
|
43
43
|
}
|
|
44
44
|
/**
|
|
45
|
-
* Test a
|
|
46
|
-
* This is the main method that leverages the runtime's ComponentHierarchyRegistrar
|
|
45
|
+
* Test a root component with its full hierarchy of child components
|
|
47
46
|
*/
|
|
48
|
-
async
|
|
47
|
+
async testRootComponent(rootSpec, props, options) {
|
|
48
|
+
// Convert ComponentRootSpec to ComponentSpec format
|
|
49
|
+
const spec = {
|
|
50
|
+
componentName: rootSpec.componentName,
|
|
51
|
+
componentCode: rootSpec.componentCode,
|
|
52
|
+
childComponents: this.convertSkipChildSpecs(rootSpec.childComponents)
|
|
53
|
+
};
|
|
49
54
|
const result = await this.componentRunner.executeComponent({
|
|
50
55
|
componentSpec: spec,
|
|
51
56
|
props,
|
|
@@ -64,32 +69,25 @@ class ReactTestHarness {
|
|
|
64
69
|
const screenshotPath = this.options.screenshotPath || './error-screenshot.png';
|
|
65
70
|
const fs = await Promise.resolve().then(() => __importStar(require('fs')));
|
|
66
71
|
// Ensure the screenshot Buffer is properly typed for writeFileSync
|
|
67
|
-
fs.writeFileSync(screenshotPath,
|
|
72
|
+
fs.writeFileSync(screenshotPath, result.screenshot);
|
|
68
73
|
console.log(`Screenshot saved to: ${screenshotPath}`);
|
|
69
74
|
}
|
|
70
75
|
return result;
|
|
71
76
|
}
|
|
72
77
|
/**
|
|
73
|
-
*
|
|
74
|
-
*/
|
|
75
|
-
async testSingleComponent(componentName, componentCode, props, options) {
|
|
76
|
-
const spec = {
|
|
77
|
-
componentName,
|
|
78
|
-
componentCode
|
|
79
|
-
};
|
|
80
|
-
return this.testComponentSpec(spec, props, options);
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Test a component from the Skip spec format
|
|
78
|
+
* Test a single child component
|
|
84
79
|
*/
|
|
85
|
-
async
|
|
86
|
-
// Convert SkipComponentRootSpec to ComponentSpec format
|
|
80
|
+
async testChildComponent(childSpec, props, options) {
|
|
87
81
|
const spec = {
|
|
88
|
-
componentName:
|
|
89
|
-
componentCode:
|
|
90
|
-
childComponents: this.convertSkipChildSpecs(
|
|
82
|
+
componentName: childSpec.componentName,
|
|
83
|
+
componentCode: childSpec.componentCode || '',
|
|
84
|
+
childComponents: childSpec.components ? this.convertSkipChildSpecs(childSpec.components) : []
|
|
91
85
|
};
|
|
92
|
-
return this.
|
|
86
|
+
return this.componentRunner.executeComponent({
|
|
87
|
+
componentSpec: spec,
|
|
88
|
+
props,
|
|
89
|
+
...options
|
|
90
|
+
});
|
|
93
91
|
}
|
|
94
92
|
/**
|
|
95
93
|
* Convert Skip child specs to test harness ComponentSpec format
|
|
@@ -114,7 +112,16 @@ class ReactTestHarness {
|
|
|
114
112
|
}
|
|
115
113
|
const componentCode = fs.readFileSync(absolutePath, 'utf-8');
|
|
116
114
|
const componentName = path.basename(absolutePath, path.extname(absolutePath));
|
|
117
|
-
|
|
115
|
+
// Create a minimal ComponentChildSpec for the file
|
|
116
|
+
const childSpec = {
|
|
117
|
+
componentName,
|
|
118
|
+
componentCode,
|
|
119
|
+
description: `Component loaded from ${filePath}`,
|
|
120
|
+
exampleUsage: `<${componentName} />`,
|
|
121
|
+
statePath: componentName.toLowerCase(),
|
|
122
|
+
components: []
|
|
123
|
+
};
|
|
124
|
+
return this.testChildComponent(childSpec, props, options);
|
|
118
125
|
}
|
|
119
126
|
async runTest(name, testFn) {
|
|
120
127
|
const startTime = Date.now();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-harness.js","sourceRoot":"","sources":["../../src/lib/test-harness.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uDAA0E;AAC1E,yDAAyH;AACzH,2DAAuD;AASvD,MAAa,gBAAgB;IAK3B,YAAY,UAA8B,EAAE;QAC1C,IAAI,CAAC,OAAO,GAAG;YACb,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,KAAK;YACZ,iBAAiB,EAAE,IAAI;YACvB,GAAG,OAAO;SACX,CAAC;QAEF,IAAI,CAAC,cAAc,GAAG,IAAI,gCAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,eAAe,GAAG,IAAI,kCAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;IACzC,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"test-harness.js","sourceRoot":"","sources":["../../src/lib/test-harness.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/react-test-harness",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.72.0",
|
|
4
4
|
"description": "React component test harness for MemberJunction using Playwright",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
"typescript": "^5.4.5"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@memberjunction/react-runtime": "^2.
|
|
26
|
-
"@memberjunction/interactive-component-types": "^2.
|
|
25
|
+
"@memberjunction/react-runtime": "^2.72.0",
|
|
26
|
+
"@memberjunction/interactive-component-types": "^2.72.0",
|
|
27
27
|
"@playwright/test": "^1.40.0",
|
|
28
28
|
"playwright": "^1.40.0",
|
|
29
29
|
"commander": "^11.1.0",
|