@memberjunction/react-test-harness 2.71.0 → 2.73.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/README.md +8 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/component-linter.d.ts +26 -0
- package/dist/lib/component-linter.d.ts.map +1 -0
- package/dist/lib/component-linter.js +429 -0
- package/dist/lib/component-linter.js.map +1 -0
- package/dist/lib/component-runner.d.ts +64 -0
- package/dist/lib/component-runner.d.ts.map +1 -1
- package/dist/lib/component-runner.js +283 -40
- 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 +64 -22
- package/dist/lib/test-harness.js.map +1 -1
- package/package.json +7 -4
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ComponentRunner = void 0;
|
|
4
4
|
const react_runtime_1 = require("@memberjunction/react-runtime");
|
|
5
|
+
const core_1 = require("@memberjunction/core");
|
|
6
|
+
const component_linter_1 = require("./component-linter");
|
|
5
7
|
class ComponentRunner {
|
|
6
8
|
constructor(browserManager) {
|
|
7
9
|
this.browserManager = browserManager;
|
|
@@ -10,48 +12,59 @@ class ComponentRunner {
|
|
|
10
12
|
// Set up runtime context (will be populated in browser)
|
|
11
13
|
this.runtimeContext = {};
|
|
12
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Lint component code before execution
|
|
17
|
+
*/
|
|
18
|
+
async lintComponent(componentCode, componentName, componentType) {
|
|
19
|
+
const lintResult = await component_linter_1.ComponentLinter.lintComponent(componentCode, componentType, componentName);
|
|
20
|
+
const violations = lintResult.violations.map(v => v.message);
|
|
21
|
+
const hasErrors = lintResult.violations.some(v => v.severity === 'error');
|
|
22
|
+
return {
|
|
23
|
+
violations,
|
|
24
|
+
suggestions: lintResult.suggestions,
|
|
25
|
+
hasErrors
|
|
26
|
+
};
|
|
27
|
+
}
|
|
13
28
|
async executeComponent(options) {
|
|
14
29
|
const startTime = Date.now();
|
|
15
30
|
const errors = [];
|
|
31
|
+
const warnings = [];
|
|
32
|
+
const criticalWarnings = [];
|
|
16
33
|
const consoleLogs = [];
|
|
34
|
+
let renderCount = 0;
|
|
17
35
|
try {
|
|
18
36
|
const page = await this.browserManager.getPage();
|
|
19
|
-
// Set up
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
});
|
|
27
|
-
// Create HTML template that uses the runtime's ComponentHierarchyRegistrar
|
|
37
|
+
// Set up monitoring
|
|
38
|
+
this.setupConsoleLogging(page, consoleLogs, warnings, criticalWarnings);
|
|
39
|
+
this.setupErrorHandling(page, errors);
|
|
40
|
+
await this.injectRenderTracking(page);
|
|
41
|
+
// Expose MJ utilities to the page
|
|
42
|
+
await this.exposeMJUtilities(page);
|
|
43
|
+
// Create and load the component
|
|
28
44
|
const htmlContent = this.createHTMLTemplate(options);
|
|
29
|
-
// Navigate to a data URL with the HTML content
|
|
30
45
|
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
|
-
}
|
|
46
|
+
// Wait for render with timeout detection
|
|
47
|
+
const renderSuccess = await this.waitForRender(page, options, errors);
|
|
48
|
+
// Get render count
|
|
49
|
+
renderCount = await this.getRenderCount(page);
|
|
44
50
|
// Get the rendered HTML
|
|
45
51
|
const html = await this.browserManager.getContent();
|
|
46
52
|
// Take screenshot if needed
|
|
47
53
|
const screenshot = await this.browserManager.screenshot();
|
|
54
|
+
// Determine success and collect any additional errors
|
|
55
|
+
const { success, additionalErrors } = this.determineSuccess(errors, criticalWarnings, renderCount, !renderSuccess);
|
|
56
|
+
// Add any additional errors
|
|
57
|
+
errors.push(...additionalErrors);
|
|
48
58
|
return {
|
|
49
|
-
success
|
|
59
|
+
success,
|
|
50
60
|
html,
|
|
51
61
|
errors,
|
|
62
|
+
warnings,
|
|
63
|
+
criticalWarnings,
|
|
52
64
|
console: consoleLogs,
|
|
53
65
|
screenshot,
|
|
54
|
-
executionTime: Date.now() - startTime
|
|
66
|
+
executionTime: Date.now() - startTime,
|
|
67
|
+
renderCount
|
|
55
68
|
};
|
|
56
69
|
}
|
|
57
70
|
catch (error) {
|
|
@@ -60,8 +73,11 @@ class ComponentRunner {
|
|
|
60
73
|
success: false,
|
|
61
74
|
html: '',
|
|
62
75
|
errors,
|
|
76
|
+
warnings,
|
|
77
|
+
criticalWarnings,
|
|
63
78
|
console: consoleLogs,
|
|
64
|
-
executionTime: Date.now() - startTime
|
|
79
|
+
executionTime: Date.now() - startTime,
|
|
80
|
+
renderCount
|
|
65
81
|
};
|
|
66
82
|
}
|
|
67
83
|
}
|
|
@@ -72,6 +88,14 @@ class ComponentRunner {
|
|
|
72
88
|
const coreLibraryScripts = (0, react_runtime_1.getCoreLibraryUrls)()
|
|
73
89
|
.map(url => ` <script src="${url}"></script>`)
|
|
74
90
|
.join('\n');
|
|
91
|
+
// Generate script tags for UI libraries
|
|
92
|
+
const uiLibraryScripts = (0, react_runtime_1.getUILibraryUrls)()
|
|
93
|
+
.map(url => ` <script src="${url}"></script>`)
|
|
94
|
+
.join('\n');
|
|
95
|
+
// Generate CSS links
|
|
96
|
+
const cssLinks = (0, react_runtime_1.getCSSUrls)()
|
|
97
|
+
.map(url => ` <link rel="stylesheet" href="${url}">`)
|
|
98
|
+
.join('\n');
|
|
75
99
|
return `
|
|
76
100
|
<!DOCTYPE html>
|
|
77
101
|
<html>
|
|
@@ -82,10 +106,43 @@ class ComponentRunner {
|
|
|
82
106
|
<script crossorigin src="${react_runtime_1.STANDARD_LIBRARY_URLS.REACT_DOM}"></script>
|
|
83
107
|
<script src="${react_runtime_1.STANDARD_LIBRARY_URLS.BABEL}"></script>
|
|
84
108
|
${coreLibraryScripts}
|
|
109
|
+
${uiLibraryScripts}
|
|
110
|
+
${cssLinks}
|
|
85
111
|
<style>
|
|
86
112
|
body { margin: 0; padding: 20px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
|
|
87
113
|
#root { min-height: 100vh; }
|
|
88
114
|
</style>
|
|
115
|
+
<script>
|
|
116
|
+
// Render tracking injection
|
|
117
|
+
(function() {
|
|
118
|
+
let renderCounter = 0;
|
|
119
|
+
window.__testHarnessRenderCount = 0;
|
|
120
|
+
|
|
121
|
+
// Wait for React to be available
|
|
122
|
+
const setupRenderTracking = () => {
|
|
123
|
+
if (window.React && window.React.createElement) {
|
|
124
|
+
const originalCreateElement = window.React.createElement.bind(window.React);
|
|
125
|
+
|
|
126
|
+
window.React.createElement = function(type, props, ...children) {
|
|
127
|
+
renderCounter++;
|
|
128
|
+
window.__testHarnessRenderCount = renderCounter;
|
|
129
|
+
|
|
130
|
+
if (renderCounter > 1000) {
|
|
131
|
+
console.error('Excessive renders detected: ' + renderCounter + ' renders. Possible infinite loop.');
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return originalCreateElement(type, props, ...children);
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
// Try to set up immediately
|
|
140
|
+
setupRenderTracking();
|
|
141
|
+
|
|
142
|
+
// Also try after a delay in case React loads later
|
|
143
|
+
setTimeout(setupRenderTracking, 100);
|
|
144
|
+
})();
|
|
145
|
+
</script>
|
|
89
146
|
</head>
|
|
90
147
|
<body>
|
|
91
148
|
<div id="root"></div>
|
|
@@ -100,7 +157,9 @@ ${coreLibraryScripts}
|
|
|
100
157
|
_: window._,
|
|
101
158
|
d3: window.d3,
|
|
102
159
|
Chart: window.Chart,
|
|
103
|
-
dayjs: window.dayjs
|
|
160
|
+
dayjs: window.dayjs,
|
|
161
|
+
antd: window.antd,
|
|
162
|
+
ReactBootstrap: window.ReactBootstrap
|
|
104
163
|
}
|
|
105
164
|
};
|
|
106
165
|
|
|
@@ -131,6 +190,8 @@ ${coreLibraryScripts}
|
|
|
131
190
|
const d3 = libraries.d3;
|
|
132
191
|
const Chart = libraries.Chart;
|
|
133
192
|
const dayjs = libraries.dayjs;
|
|
193
|
+
const antd = libraries.antd;
|
|
194
|
+
const ReactBootstrap = libraries.ReactBootstrap;
|
|
134
195
|
|
|
135
196
|
\${transformed.code}
|
|
136
197
|
return {
|
|
@@ -285,28 +346,28 @@ ${coreLibraryScripts}
|
|
|
285
346
|
|
|
286
347
|
const hierarchyRegistrar = new SimpleHierarchyRegistrar(compiler, registry, runtimeContext);
|
|
287
348
|
|
|
288
|
-
// BuildUtilities function -
|
|
349
|
+
// BuildUtilities function - uses real MJ utilities exposed via Playwright
|
|
289
350
|
const BuildUtilities = () => {
|
|
290
|
-
// Create mock utilities for testing
|
|
291
|
-
// In production, this would use the actual Metadata, RunView, and RunQuery
|
|
292
351
|
const utilities = {
|
|
293
352
|
md: {
|
|
294
|
-
entities:
|
|
353
|
+
entities: () => {
|
|
354
|
+
return window.__mjGetEntities();
|
|
355
|
+
},
|
|
356
|
+
GetEntityObject: async (entityName) => {
|
|
357
|
+
return await window.__mjGetEntityObject(entityName);
|
|
358
|
+
}
|
|
295
359
|
},
|
|
296
360
|
rv: {
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
return { Results: [], Success: true };
|
|
361
|
+
RunView: async (params) => {
|
|
362
|
+
return await window.__mjRunView(params);
|
|
300
363
|
},
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
return params.map(() => ({ Results: [], Success: true }));
|
|
364
|
+
RunViews: async (params) => {
|
|
365
|
+
return await window.__mjRunViews(params);
|
|
304
366
|
}
|
|
305
367
|
},
|
|
306
368
|
rq: {
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
return { Results: [], Success: true };
|
|
369
|
+
RunQuery: async (params) => {
|
|
370
|
+
return await window.__mjRunQuery(params);
|
|
310
371
|
}
|
|
311
372
|
}
|
|
312
373
|
};
|
|
@@ -445,6 +506,188 @@ ${coreLibraryScripts}
|
|
|
445
506
|
</body>
|
|
446
507
|
</html>`;
|
|
447
508
|
}
|
|
509
|
+
/**
|
|
510
|
+
* Checks if a console message is a warning
|
|
511
|
+
*/
|
|
512
|
+
isWarning(type, text) {
|
|
513
|
+
return type === 'warning' || text.startsWith('Warning:');
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Checks if a warning is critical and should fail the test
|
|
517
|
+
*/
|
|
518
|
+
isCriticalWarning(text) {
|
|
519
|
+
return ComponentRunner.CRITICAL_WARNING_PATTERNS.some(pattern => pattern.test(text));
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Sets up console logging with warning detection
|
|
523
|
+
*/
|
|
524
|
+
setupConsoleLogging(page, consoleLogs, warnings, criticalWarnings) {
|
|
525
|
+
page.on('console', (msg) => {
|
|
526
|
+
const type = msg.type();
|
|
527
|
+
const text = msg.text();
|
|
528
|
+
consoleLogs.push({ type, text });
|
|
529
|
+
if (this.isWarning(type, text)) {
|
|
530
|
+
warnings.push(text);
|
|
531
|
+
if (this.isCriticalWarning(text)) {
|
|
532
|
+
criticalWarnings.push(text);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Sets up error handling for the page
|
|
539
|
+
*/
|
|
540
|
+
setupErrorHandling(page, errors) {
|
|
541
|
+
page.on('pageerror', (error) => {
|
|
542
|
+
errors.push(error.message);
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
/**
|
|
546
|
+
* Injects render tracking code into the page
|
|
547
|
+
*/
|
|
548
|
+
async injectRenderTracking(page) {
|
|
549
|
+
// Instead of using evaluateOnNewDocument, we'll inject the script directly into the HTML
|
|
550
|
+
// This avoids the Playwright-specific API issue
|
|
551
|
+
// The actual injection will happen in createHTMLTemplate
|
|
552
|
+
}
|
|
553
|
+
/**
|
|
554
|
+
* Waits for component to render and checks for timeouts
|
|
555
|
+
*/
|
|
556
|
+
async waitForRender(page, options, errors) {
|
|
557
|
+
const timeout = options.timeout || 10000; // 10 seconds default
|
|
558
|
+
try {
|
|
559
|
+
if (options.waitForSelector) {
|
|
560
|
+
await this.browserManager.waitForSelector(options.waitForSelector, { timeout });
|
|
561
|
+
}
|
|
562
|
+
if (options.waitForLoadState) {
|
|
563
|
+
await this.browserManager.waitForLoadState(options.waitForLoadState);
|
|
564
|
+
}
|
|
565
|
+
else {
|
|
566
|
+
// Default wait for React to finish rendering
|
|
567
|
+
await page.waitForTimeout(100);
|
|
568
|
+
}
|
|
569
|
+
return true;
|
|
570
|
+
}
|
|
571
|
+
catch (timeoutError) {
|
|
572
|
+
errors.push(`Component rendering timeout after ${timeout}ms - possible infinite render loop`);
|
|
573
|
+
return false;
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
/**
|
|
577
|
+
* Gets the render count from the page
|
|
578
|
+
*/
|
|
579
|
+
async getRenderCount(page) {
|
|
580
|
+
return await page.evaluate(() => window.__testHarnessRenderCount || 0);
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* Determines if the component execution was successful
|
|
584
|
+
*/
|
|
585
|
+
determineSuccess(errors, criticalWarnings, renderCount, hasTimeout) {
|
|
586
|
+
const additionalErrors = [];
|
|
587
|
+
if (renderCount > ComponentRunner.MAX_RENDER_COUNT) {
|
|
588
|
+
additionalErrors.push(`Excessive render count: ${renderCount} renders detected`);
|
|
589
|
+
}
|
|
590
|
+
const success = errors.length === 0 &&
|
|
591
|
+
criticalWarnings.length === 0 &&
|
|
592
|
+
!hasTimeout &&
|
|
593
|
+
renderCount <= ComponentRunner.MAX_RENDER_COUNT;
|
|
594
|
+
return { success, additionalErrors };
|
|
595
|
+
}
|
|
596
|
+
/**
|
|
597
|
+
* Expose MemberJunction utilities to the browser context
|
|
598
|
+
*/
|
|
599
|
+
async exposeMJUtilities(page) {
|
|
600
|
+
// Check if utilities are already exposed
|
|
601
|
+
const alreadyExposed = await page.evaluate(() => {
|
|
602
|
+
return typeof window.__mjGetEntityObject === 'function';
|
|
603
|
+
});
|
|
604
|
+
if (alreadyExposed) {
|
|
605
|
+
return; // Already exposed, skip
|
|
606
|
+
}
|
|
607
|
+
// Create instances in Node.js context
|
|
608
|
+
const metadata = new core_1.Metadata();
|
|
609
|
+
const runView = new core_1.RunView();
|
|
610
|
+
const runQuery = new core_1.RunQuery();
|
|
611
|
+
// Expose individual functions since we can't pass complex objects
|
|
612
|
+
await page.exposeFunction('__mjGetEntityObject', async (entityName) => {
|
|
613
|
+
try {
|
|
614
|
+
const entity = await metadata.GetEntityObject(entityName);
|
|
615
|
+
return entity;
|
|
616
|
+
}
|
|
617
|
+
catch (error) {
|
|
618
|
+
console.error('Error in __mjGetEntityObject:', error);
|
|
619
|
+
return null;
|
|
620
|
+
}
|
|
621
|
+
});
|
|
622
|
+
await page.exposeFunction('__mjGetEntities', () => {
|
|
623
|
+
try {
|
|
624
|
+
return metadata.Entities;
|
|
625
|
+
}
|
|
626
|
+
catch (error) {
|
|
627
|
+
console.error('Error in __mjGetEntities:', error);
|
|
628
|
+
return null;
|
|
629
|
+
}
|
|
630
|
+
});
|
|
631
|
+
await page.exposeFunction('__mjRunView', async (params) => {
|
|
632
|
+
try {
|
|
633
|
+
return await runView.RunView(params);
|
|
634
|
+
}
|
|
635
|
+
catch (error) {
|
|
636
|
+
console.error('Error in __mjRunView:', error);
|
|
637
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
638
|
+
return { Success: false, ErrorMessage: errorMessage, Results: [] };
|
|
639
|
+
}
|
|
640
|
+
});
|
|
641
|
+
await page.exposeFunction('__mjRunViews', async (params) => {
|
|
642
|
+
try {
|
|
643
|
+
return await runView.RunViews(params);
|
|
644
|
+
}
|
|
645
|
+
catch (error) {
|
|
646
|
+
console.error('Error in __mjRunViews:', error);
|
|
647
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
648
|
+
return params.map(() => ({ Success: false, ErrorMessage: errorMessage, Results: [] }));
|
|
649
|
+
}
|
|
650
|
+
});
|
|
651
|
+
await page.exposeFunction('__mjRunQuery', async (params) => {
|
|
652
|
+
try {
|
|
653
|
+
return await runQuery.RunQuery(params);
|
|
654
|
+
}
|
|
655
|
+
catch (error) {
|
|
656
|
+
console.error('Error in __mjRunQuery:', error);
|
|
657
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
658
|
+
return { Success: false, ErrorMessage: errorMessage, Results: [] };
|
|
659
|
+
}
|
|
660
|
+
});
|
|
661
|
+
}
|
|
662
|
+
/**
|
|
663
|
+
* Analyze component errors to identify failed components
|
|
664
|
+
* @param errors Array of error messages
|
|
665
|
+
* @returns Array of component names that failed
|
|
666
|
+
*/
|
|
667
|
+
static analyzeComponentErrors(errors) {
|
|
668
|
+
return react_runtime_1.ComponentErrorAnalyzer.identifyFailedComponents(errors);
|
|
669
|
+
}
|
|
670
|
+
/**
|
|
671
|
+
* Get detailed error analysis
|
|
672
|
+
* @param errors Array of error messages
|
|
673
|
+
* @returns Detailed failure information
|
|
674
|
+
*/
|
|
675
|
+
static getDetailedErrorAnalysis(errors) {
|
|
676
|
+
return react_runtime_1.ComponentErrorAnalyzer.analyzeComponentErrors(errors);
|
|
677
|
+
}
|
|
448
678
|
}
|
|
449
679
|
exports.ComponentRunner = ComponentRunner;
|
|
680
|
+
// Critical warning patterns that should fail tests
|
|
681
|
+
ComponentRunner.CRITICAL_WARNING_PATTERNS = [
|
|
682
|
+
/Maximum update depth exceeded/i,
|
|
683
|
+
/Cannot update a component .* while rendering a different component/i,
|
|
684
|
+
/Cannot update during an existing state transition/i,
|
|
685
|
+
/Warning: setState.*unmounted component/i,
|
|
686
|
+
/Warning: Can't perform a React state update on an unmounted component/i,
|
|
687
|
+
/Encountered two children with the same key/i,
|
|
688
|
+
/Error: Minified React error/i,
|
|
689
|
+
/too many re-renders/i,
|
|
690
|
+
];
|
|
691
|
+
// Maximum allowed renders before considering it excessive
|
|
692
|
+
ComponentRunner.MAX_RENDER_COUNT = 1000;
|
|
450
693
|
//# 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,33 @@ 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
|
+
// First, lint the root component code
|
|
49
|
+
if (rootSpec.componentCode) {
|
|
50
|
+
const lintResult = await this.componentRunner.lintComponent(rootSpec.componentCode, rootSpec.componentName, 'root');
|
|
51
|
+
if (lintResult.hasErrors) {
|
|
52
|
+
// Return early with lint errors
|
|
53
|
+
return {
|
|
54
|
+
success: false,
|
|
55
|
+
html: '',
|
|
56
|
+
errors: lintResult.violations,
|
|
57
|
+
warnings: [],
|
|
58
|
+
criticalWarnings: [],
|
|
59
|
+
console: [],
|
|
60
|
+
executionTime: 0,
|
|
61
|
+
lintViolations: lintResult.violations,
|
|
62
|
+
fixSuggestions: lintResult.suggestions
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Convert ComponentRootSpec to ComponentSpec format
|
|
67
|
+
const spec = {
|
|
68
|
+
componentName: rootSpec.componentName,
|
|
69
|
+
componentCode: rootSpec.componentCode,
|
|
70
|
+
childComponents: this.convertSkipChildSpecs(rootSpec.childComponents)
|
|
71
|
+
};
|
|
49
72
|
const result = await this.componentRunner.executeComponent({
|
|
50
73
|
componentSpec: spec,
|
|
51
74
|
props,
|
|
@@ -64,32 +87,43 @@ class ReactTestHarness {
|
|
|
64
87
|
const screenshotPath = this.options.screenshotPath || './error-screenshot.png';
|
|
65
88
|
const fs = await Promise.resolve().then(() => __importStar(require('fs')));
|
|
66
89
|
// Ensure the screenshot Buffer is properly typed for writeFileSync
|
|
67
|
-
fs.writeFileSync(screenshotPath,
|
|
90
|
+
fs.writeFileSync(screenshotPath, result.screenshot);
|
|
68
91
|
console.log(`Screenshot saved to: ${screenshotPath}`);
|
|
69
92
|
}
|
|
70
93
|
return result;
|
|
71
94
|
}
|
|
72
95
|
/**
|
|
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
|
|
96
|
+
* Test a single child component
|
|
84
97
|
*/
|
|
85
|
-
async
|
|
86
|
-
//
|
|
98
|
+
async testChildComponent(childSpec, props, options) {
|
|
99
|
+
// First, lint the component code
|
|
100
|
+
if (childSpec.componentCode) {
|
|
101
|
+
const lintResult = await this.componentRunner.lintComponent(childSpec.componentCode, childSpec.componentName, 'child');
|
|
102
|
+
if (lintResult.hasErrors) {
|
|
103
|
+
// Return early with lint errors
|
|
104
|
+
return {
|
|
105
|
+
success: false,
|
|
106
|
+
html: '',
|
|
107
|
+
errors: lintResult.violations,
|
|
108
|
+
warnings: [],
|
|
109
|
+
criticalWarnings: [],
|
|
110
|
+
console: [],
|
|
111
|
+
executionTime: 0,
|
|
112
|
+
lintViolations: lintResult.violations,
|
|
113
|
+
fixSuggestions: lintResult.suggestions
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
87
117
|
const spec = {
|
|
88
|
-
componentName:
|
|
89
|
-
componentCode:
|
|
90
|
-
childComponents: this.convertSkipChildSpecs(
|
|
118
|
+
componentName: childSpec.componentName,
|
|
119
|
+
componentCode: childSpec.componentCode || '',
|
|
120
|
+
childComponents: childSpec.components ? this.convertSkipChildSpecs(childSpec.components) : []
|
|
91
121
|
};
|
|
92
|
-
return this.
|
|
122
|
+
return this.componentRunner.executeComponent({
|
|
123
|
+
componentSpec: spec,
|
|
124
|
+
props,
|
|
125
|
+
...options
|
|
126
|
+
});
|
|
93
127
|
}
|
|
94
128
|
/**
|
|
95
129
|
* Convert Skip child specs to test harness ComponentSpec format
|
|
@@ -114,7 +148,15 @@ class ReactTestHarness {
|
|
|
114
148
|
}
|
|
115
149
|
const componentCode = fs.readFileSync(absolutePath, 'utf-8');
|
|
116
150
|
const componentName = path.basename(absolutePath, path.extname(absolutePath));
|
|
117
|
-
|
|
151
|
+
// Create a minimal ComponentChildSpec for the file
|
|
152
|
+
const childSpec = {
|
|
153
|
+
componentName,
|
|
154
|
+
componentCode,
|
|
155
|
+
description: `Component loaded from ${filePath}`,
|
|
156
|
+
exampleUsage: `<${componentName} />`,
|
|
157
|
+
components: []
|
|
158
|
+
};
|
|
159
|
+
return this.testChildComponent(childSpec, props, options);
|
|
118
160
|
}
|
|
119
161
|
async runTest(name, testFn) {
|
|
120
162
|
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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"}
|