@memberjunction/react-test-harness 2.89.0 → 2.91.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 +98 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/browser-context.d.ts.map +1 -1
- package/dist/lib/browser-context.js +6 -2
- package/dist/lib/browser-context.js.map +1 -1
- package/dist/lib/component-linter.d.ts +1 -0
- package/dist/lib/component-linter.d.ts.map +1 -1
- package/dist/lib/component-linter.js +2620 -663
- package/dist/lib/component-linter.js.map +1 -1
- package/dist/lib/component-runner.d.ts +19 -49
- package/dist/lib/component-runner.d.ts.map +1 -1
- package/dist/lib/component-runner.js +925 -745
- package/dist/lib/component-runner.js.map +1 -1
- package/dist/lib/test-harness.d.ts +32 -0
- package/dist/lib/test-harness.d.ts.map +1 -1
- package/dist/lib/test-harness.js +52 -0
- package/dist/lib/test-harness.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -526,6 +526,104 @@ interface FluentMatcher {
|
|
|
526
526
|
}
|
|
527
527
|
```
|
|
528
528
|
|
|
529
|
+
## Parallel Testing
|
|
530
|
+
|
|
531
|
+
### Important: Test Harness Instance Limitations
|
|
532
|
+
|
|
533
|
+
The ReactTestHarness uses a single browser page instance and is **NOT safe for parallel test execution** on the same instance. This is due to Playwright's internal limitations with `exposeFunction` and potential race conditions when multiple tests try to modify the same page context simultaneously.
|
|
534
|
+
|
|
535
|
+
### Sequential Testing (Single Instance)
|
|
536
|
+
|
|
537
|
+
For sequential test execution, you can safely reuse a single harness instance:
|
|
538
|
+
|
|
539
|
+
```typescript
|
|
540
|
+
const harness = new ReactTestHarness({ headless: true });
|
|
541
|
+
await harness.initialize();
|
|
542
|
+
|
|
543
|
+
// ✅ CORRECT - Sequential testing on same instance
|
|
544
|
+
for (const test of tests) {
|
|
545
|
+
const result = await harness.testComponent(test.code, test.props);
|
|
546
|
+
// Each test runs one after another, no conflicts
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
await harness.close();
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
### Parallel Testing (Multiple Instances)
|
|
553
|
+
|
|
554
|
+
For parallel test execution, you **MUST** create separate ReactTestHarness instances:
|
|
555
|
+
|
|
556
|
+
```typescript
|
|
557
|
+
// ✅ CORRECT - Parallel testing with separate instances
|
|
558
|
+
const results = await Promise.all(tests.map(async (test) => {
|
|
559
|
+
const harness = new ReactTestHarness({ headless: true });
|
|
560
|
+
await harness.initialize();
|
|
561
|
+
|
|
562
|
+
try {
|
|
563
|
+
return await harness.testComponent(test.code, test.props);
|
|
564
|
+
} finally {
|
|
565
|
+
await harness.close(); // Clean up each instance
|
|
566
|
+
}
|
|
567
|
+
}));
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
### Common Mistake to Avoid
|
|
571
|
+
|
|
572
|
+
```typescript
|
|
573
|
+
// ❌ WRONG - DO NOT DO THIS
|
|
574
|
+
const harness = new ReactTestHarness({ headless: true });
|
|
575
|
+
await harness.initialize();
|
|
576
|
+
|
|
577
|
+
// This will cause conflicts and errors!
|
|
578
|
+
const results = await Promise.all(
|
|
579
|
+
tests.map(test => harness.testComponent(test.code, test.props))
|
|
580
|
+
);
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
This approach will fail with errors like:
|
|
584
|
+
- "Function '__mjGetEntityObject' has been already registered"
|
|
585
|
+
- "Cannot read properties of undefined (reading 'addBinding')"
|
|
586
|
+
|
|
587
|
+
### Performance Considerations
|
|
588
|
+
|
|
589
|
+
While creating multiple harness instances has some overhead (each launches its own browser context), the benefits of parallel execution typically outweigh this cost:
|
|
590
|
+
|
|
591
|
+
- **Sequential (1 instance)**: Lower memory usage, but tests run one by one
|
|
592
|
+
- **Parallel (N instances)**: Higher memory usage, but tests complete much faster
|
|
593
|
+
|
|
594
|
+
### Example: Test Runner with Configurable Parallelism
|
|
595
|
+
|
|
596
|
+
```typescript
|
|
597
|
+
class TestRunner {
|
|
598
|
+
async runTests(tests: TestCase[], parallel = false) {
|
|
599
|
+
if (parallel) {
|
|
600
|
+
// Create new instance for each test
|
|
601
|
+
return Promise.all(tests.map(async (test) => {
|
|
602
|
+
const harness = new ReactTestHarness({ headless: true });
|
|
603
|
+
await harness.initialize();
|
|
604
|
+
try {
|
|
605
|
+
return await harness.testComponent(test.code, test.props);
|
|
606
|
+
} finally {
|
|
607
|
+
await harness.close();
|
|
608
|
+
}
|
|
609
|
+
}));
|
|
610
|
+
} else {
|
|
611
|
+
// Reuse single instance for all tests
|
|
612
|
+
const harness = new ReactTestHarness({ headless: true });
|
|
613
|
+
await harness.initialize();
|
|
614
|
+
|
|
615
|
+
const results = [];
|
|
616
|
+
for (const test of tests) {
|
|
617
|
+
results.push(await harness.testComponent(test.code, test.props));
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
await harness.close();
|
|
621
|
+
return results;
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
```
|
|
626
|
+
|
|
529
627
|
## Usage Examples for TypeScript Projects
|
|
530
628
|
|
|
531
629
|
### Creating a Reusable Test Utility
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9E,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAC9G,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,7 @@ var test_harness_1 = require("./lib/test-harness");
|
|
|
5
5
|
Object.defineProperty(exports, "ReactTestHarness", { enumerable: true, get: function () { return test_harness_1.ReactTestHarness; } });
|
|
6
6
|
var browser_context_1 = require("./lib/browser-context");
|
|
7
7
|
Object.defineProperty(exports, "BrowserManager", { enumerable: true, get: function () { return browser_context_1.BrowserManager; } });
|
|
8
|
+
// Export the component runner that uses the real React runtime UMD bundle
|
|
8
9
|
var component_runner_1 = require("./lib/component-runner");
|
|
9
10
|
Object.defineProperty(exports, "ComponentRunner", { enumerable: true, get: function () { return component_runner_1.ComponentRunner; } });
|
|
10
11
|
var assertion_helpers_1 = require("./lib/assertion-helpers");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mDAA0E;AAAjE,gHAAA,gBAAgB,OAAA;AACzB,yDAA8E;AAArE,iHAAA,cAAc,OAAA;AACvB,2DAA8G;AAArG,mHAAA,eAAe,OAAA;AACxB,6DAA2D;AAAlD,qHAAA,gBAAgB,OAAA;AACzB,2DAA+F;AAAtF,mHAAA,eAAe,OAAA;AACxB,2FAA4E;AAAnE,4HAAA,aAAa,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mDAA0E;AAAjE,gHAAA,gBAAgB,OAAA;AACzB,yDAA8E;AAArE,iHAAA,cAAc,OAAA;AACvB,0EAA0E;AAC1E,2DAA8G;AAArG,mHAAA,eAAe,OAAA;AACxB,6DAA2D;AAAlD,qHAAA,gBAAgB,OAAA;AACzB,2DAA+F;AAAtF,mHAAA,eAAe,OAAA;AACxB,2FAA4E;AAAnE,4HAAA,aAAa,OAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-context.d.ts","sourceRoot":"","sources":["../../src/lib/browser-context.ts"],"names":[],"mappings":";AAAA,OAAO,EAAqC,IAAI,EAAE,MAAM,YAAY,CAAC;AAErE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,cAAc;IAKb,OAAO,CAAC,OAAO;IAJ3B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,IAAI,CAAqB;gBAEb,OAAO,GAAE,qBAA0B;IAQjD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-context.d.ts","sourceRoot":"","sources":["../../src/lib/browser-context.ts"],"names":[],"mappings":";AAAA,OAAO,EAAqC,IAAI,EAAE,MAAM,YAAY,CAAC;AAErE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,cAAc;IAKb,OAAO,CAAC,OAAO;IAJ3B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,IAAI,CAAqB;gBAEb,OAAO,GAAE,qBAA0B;IAQjD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAWxB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtC,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAKxE,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhF,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1C,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAK7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAetB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAKvB,gBAAgB,CAAC,KAAK,GAAE,MAAM,GAAG,kBAAkB,GAAG,aAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;CAInG"}
|
|
@@ -31,10 +31,14 @@ class BrowserManager {
|
|
|
31
31
|
this.page = await this.context.newPage();
|
|
32
32
|
}
|
|
33
33
|
async getPage() {
|
|
34
|
-
if (!this.
|
|
34
|
+
if (!this.context) {
|
|
35
35
|
await this.initialize();
|
|
36
36
|
}
|
|
37
|
-
|
|
37
|
+
// Always create a fresh page for each test to ensure isolation
|
|
38
|
+
// This prevents issues with page.exposeFunction being called multiple times
|
|
39
|
+
// and ensures each test harness instance has its own clean page
|
|
40
|
+
const newPage = await this.context.newPage();
|
|
41
|
+
return newPage;
|
|
38
42
|
}
|
|
39
43
|
async navigateTo(url) {
|
|
40
44
|
const page = await this.getPage();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-context.js","sourceRoot":"","sources":["../../src/lib/browser-context.ts"],"names":[],"mappings":";;;AAAA,2CAAqE;AAWrE,MAAa,cAAc;IAKzB,YAAoB,UAAiC,EAAE;QAAnC,YAAO,GAAP,OAAO,CAA4B;QAJ/C,YAAO,GAAmB,IAAI,CAAC;QAC/B,YAAO,GAA0B,IAAI,CAAC;QACtC,SAAI,GAAgB,IAAI,CAAC;QAG/B,IAAI,CAAC,OAAO,GAAG;YACb,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;YACtC,GAAG,OAAO;SACX,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,MAAM,qBAAQ,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;SAChC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;YAC3C,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;YAC/B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;YACjC,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB;YACjD,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;YAC3B,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"browser-context.js","sourceRoot":"","sources":["../../src/lib/browser-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,7 @@ export interface FixSuggestion {
|
|
|
22
22
|
example?: string;
|
|
23
23
|
}
|
|
24
24
|
export declare class ComponentLinter {
|
|
25
|
+
private static isVariableFromRunQueryOrView;
|
|
25
26
|
private static universalComponentRules;
|
|
26
27
|
static lintComponent(code: string, componentName: string, componentSpec?: ComponentSpec, isRootComponent?: boolean): Promise<LintResult>;
|
|
27
28
|
private static validateDataRequirements;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-linter.d.ts","sourceRoot":"","sources":["../../src/lib/component-linter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"component-linter.d.ts","sourceRoot":"","sources":["../../src/lib/component-linter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAiC,MAAM,6CAA6C,CAAC;AAG3G,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA+ED,qBAAa,eAAe;IAE1B,OAAO,CAAC,MAAM,CAAC,4BAA4B;IA2C3C,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAmrFpC;WAEkB,aAAa,CAC/B,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,aAAa,CAAC,EAAE,aAAa,EAC7B,eAAe,CAAC,EAAE,OAAO,GACxB,OAAO,CAAC,UAAU,CAAC;IAuEtB,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAoXvC,OAAO,CAAC,MAAM,CAAC,eAAe;IA2B9B,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAyBpC,OAAO,CAAC,MAAM,CAAC,sBAAsB;CAu/BtC"}
|