@supernal/interface 1.0.9 → 1.0.12
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/cjs/src/background/navigation/NavigationGraph.js +48 -0
- package/dist/cjs/src/background/navigation/NavigationGraph.js.map +1 -1
- package/dist/cjs/src/browser.js +42 -1
- package/dist/cjs/src/browser.js.map +1 -1
- package/dist/cjs/src/decorators/ContainerHelpers.js +16 -1
- package/dist/cjs/src/decorators/ContainerHelpers.js.map +1 -1
- package/dist/cjs/src/decorators/Tool.js +2 -3
- package/dist/cjs/src/decorators/Tool.js.map +1 -1
- package/dist/cjs/src/testing/graph-tester/core/GraphTester.js +339 -0
- package/dist/cjs/src/testing/graph-tester/core/GraphTester.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/core/TestFunction.js +189 -0
- package/dist/cjs/src/testing/graph-tester/core/TestFunction.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/core/types.js +24 -0
- package/dist/cjs/src/testing/graph-tester/core/types.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/fixtures/index.js +13 -0
- package/dist/cjs/src/testing/graph-tester/fixtures/index.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/fixtures/portPool.js +184 -0
- package/dist/cjs/src/testing/graph-tester/fixtures/portPool.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/index.js +98 -0
- package/dist/cjs/src/testing/graph-tester/index.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/modes/AccessibilityMode.js +230 -0
- package/dist/cjs/src/testing/graph-tester/modes/AccessibilityMode.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/modes/PerformanceMode.js +168 -0
- package/dist/cjs/src/testing/graph-tester/modes/PerformanceMode.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/modes/SEOMode.js +264 -0
- package/dist/cjs/src/testing/graph-tester/modes/SEOMode.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/modes/VisualRegressionMode.js +199 -0
- package/dist/cjs/src/testing/graph-tester/modes/VisualRegressionMode.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/modes/index.js +17 -0
- package/dist/cjs/src/testing/graph-tester/modes/index.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/reporters/HTMLReporter.js +411 -0
- package/dist/cjs/src/testing/graph-tester/reporters/HTMLReporter.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/reporters/JSONReporter.js +127 -0
- package/dist/cjs/src/testing/graph-tester/reporters/JSONReporter.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/reporters/MarkdownReporter.js +169 -0
- package/dist/cjs/src/testing/graph-tester/reporters/MarkdownReporter.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/reporters/UnifiedReporter.js +118 -0
- package/dist/cjs/src/testing/graph-tester/reporters/UnifiedReporter.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/reporters/index.js +17 -0
- package/dist/cjs/src/testing/graph-tester/reporters/index.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js +47 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js +584 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js +376 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/index.js +15 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/index.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/types.js +11 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/types.js.map +1 -0
- package/dist/cjs/src/testing/selectors.js +1 -1
- package/dist/esm/src/background/navigation/INavigationGraph.d.ts +15 -0
- package/dist/esm/src/background/navigation/INavigationGraph.d.ts.map +1 -1
- package/dist/esm/src/background/navigation/NavigationGraph.d.ts +32 -0
- package/dist/esm/src/background/navigation/NavigationGraph.d.ts.map +1 -1
- package/dist/esm/src/background/navigation/NavigationGraph.js +48 -0
- package/dist/esm/src/background/navigation/NavigationGraph.js.map +1 -1
- package/dist/esm/src/browser.d.ts +9 -0
- package/dist/esm/src/browser.d.ts.map +1 -1
- package/dist/esm/src/browser.js +14 -0
- package/dist/esm/src/browser.js.map +1 -1
- package/dist/esm/src/decorators/ContainerHelpers.d.ts +2 -1
- package/dist/esm/src/decorators/ContainerHelpers.d.ts.map +1 -1
- package/dist/esm/src/decorators/ContainerHelpers.js +16 -1
- package/dist/esm/src/decorators/ContainerHelpers.js.map +1 -1
- package/dist/esm/src/decorators/Tool.d.ts.map +1 -1
- package/dist/esm/src/decorators/Tool.js +2 -3
- package/dist/esm/src/decorators/Tool.js.map +1 -1
- package/dist/esm/src/testing/graph-tester/core/GraphTester.d.ts +110 -0
- package/dist/esm/src/testing/graph-tester/core/GraphTester.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/core/GraphTester.js +335 -0
- package/dist/esm/src/testing/graph-tester/core/GraphTester.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/core/TestFunction.d.ts +120 -0
- package/dist/esm/src/testing/graph-tester/core/TestFunction.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/core/TestFunction.js +184 -0
- package/dist/esm/src/testing/graph-tester/core/TestFunction.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/core/types.d.ts +331 -0
- package/dist/esm/src/testing/graph-tester/core/types.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/core/types.js +21 -0
- package/dist/esm/src/testing/graph-tester/core/types.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/fixtures/index.d.ts +8 -0
- package/dist/esm/src/testing/graph-tester/fixtures/index.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/fixtures/index.js +7 -0
- package/dist/esm/src/testing/graph-tester/fixtures/index.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/fixtures/portPool.d.ts +40 -0
- package/dist/esm/src/testing/graph-tester/fixtures/portPool.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/fixtures/portPool.js +147 -0
- package/dist/esm/src/testing/graph-tester/fixtures/portPool.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/index.d.ts +84 -0
- package/dist/esm/src/testing/graph-tester/index.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/index.js +77 -0
- package/dist/esm/src/testing/graph-tester/index.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.d.ts +40 -0
- package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.js +193 -0
- package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.d.ts +42 -0
- package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.js +131 -0
- package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/SEOMode.d.ts +39 -0
- package/dist/esm/src/testing/graph-tester/modes/SEOMode.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/SEOMode.js +227 -0
- package/dist/esm/src/testing/graph-tester/modes/SEOMode.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.d.ts +83 -0
- package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.js +162 -0
- package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/index.d.ts +14 -0
- package/dist/esm/src/testing/graph-tester/modes/index.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/index.js +10 -0
- package/dist/esm/src/testing/graph-tester/modes/index.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.d.ts +38 -0
- package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.js +374 -0
- package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.d.ts +50 -0
- package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.js +90 -0
- package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.d.ts +33 -0
- package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.js +132 -0
- package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.d.ts +30 -0
- package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.js +81 -0
- package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/index.d.ts +14 -0
- package/dist/esm/src/testing/graph-tester/reporters/index.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/index.js +10 -0
- package/dist/esm/src/testing/graph-tester/reporters/index.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.d.ts +33 -0
- package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js +43 -0
- package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.d.ts +70 -0
- package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js +547 -0
- package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.d.ts +83 -0
- package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js +339 -0
- package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/index.d.ts +11 -0
- package/dist/esm/src/testing/graph-tester/screenshot/index.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/index.js +9 -0
- package/dist/esm/src/testing/graph-tester/screenshot/index.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/types.d.ts +331 -0
- package/dist/esm/src/testing/graph-tester/screenshot/types.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/types.js +10 -0
- package/dist/esm/src/testing/graph-tester/screenshot/types.js.map +1 -0
- package/dist/esm/src/testing/selectors.d.ts +1 -1
- package/dist/esm/src/testing/selectors.js +1 -1
- package/package.json +19 -6
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Main orchestrator for graph-based testing.
|
|
4
|
+
*
|
|
5
|
+
* GraphTester coordinates:
|
|
6
|
+
* 1. Route discovery (manual or via NavigationGraph)
|
|
7
|
+
* 2. Test function execution across all routes
|
|
8
|
+
* 3. Result aggregation and reporting
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.GraphTester = void 0;
|
|
14
|
+
const test_1 = require("@playwright/test");
|
|
15
|
+
const TestFunction_1 = require("./TestFunction");
|
|
16
|
+
const types_1 = require("./types");
|
|
17
|
+
/**
|
|
18
|
+
* Main orchestrator for graph-based testing.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const tester = new GraphTester({
|
|
23
|
+
* baseUrl: 'http://localhost:3000',
|
|
24
|
+
* routes: [
|
|
25
|
+
* { route: '/', metadata: { name: 'Home' } },
|
|
26
|
+
* { route: '/dashboard', metadata: { name: 'Dashboard' } }
|
|
27
|
+
* ],
|
|
28
|
+
* modes: ['visual', 'performance'],
|
|
29
|
+
* output: {
|
|
30
|
+
* dir: './test-results',
|
|
31
|
+
* formats: ['html', 'json']
|
|
32
|
+
* }
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* const results = await tester.runTests();
|
|
36
|
+
* console.log(`Pass rate: ${results.passRate}%`);
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
class GraphTester {
|
|
40
|
+
/**
|
|
41
|
+
* Create a new GraphTester instance.
|
|
42
|
+
*
|
|
43
|
+
* @param config - Configuration for the tester
|
|
44
|
+
*/
|
|
45
|
+
constructor(config) {
|
|
46
|
+
this.testFunctions = new Map();
|
|
47
|
+
this.browser = null;
|
|
48
|
+
this.context = null;
|
|
49
|
+
this.config = this.validateConfig(config);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Validate and normalize configuration.
|
|
53
|
+
*/
|
|
54
|
+
validateConfig(config) {
|
|
55
|
+
if (!config.baseUrl) {
|
|
56
|
+
throw new Error('baseUrl is required');
|
|
57
|
+
}
|
|
58
|
+
if (!config.modes || config.modes.length === 0) {
|
|
59
|
+
throw new Error('At least one test mode is required');
|
|
60
|
+
}
|
|
61
|
+
// Normalize routes configuration
|
|
62
|
+
if (!config.routes) {
|
|
63
|
+
config.routes = {
|
|
64
|
+
strategy: 'manual',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// Normalize output configuration
|
|
68
|
+
if (!config.output) {
|
|
69
|
+
config.output = {
|
|
70
|
+
dir: './test-results',
|
|
71
|
+
formats: ['json', 'html'],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// Normalize execution configuration
|
|
75
|
+
if (!config.execution) {
|
|
76
|
+
config.execution = {
|
|
77
|
+
parallel: 1,
|
|
78
|
+
timeout: 30000,
|
|
79
|
+
retries: 0,
|
|
80
|
+
failFast: false,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return config;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Register a test function.
|
|
87
|
+
*
|
|
88
|
+
* @param testFunction - Test function to register
|
|
89
|
+
*/
|
|
90
|
+
registerTestFunction(testFunction) {
|
|
91
|
+
if (!(0, TestFunction_1.isTestFunction)(testFunction)) {
|
|
92
|
+
throw new Error('Invalid test function');
|
|
93
|
+
}
|
|
94
|
+
const validationErrors = testFunction.validate();
|
|
95
|
+
if (validationErrors.length > 0) {
|
|
96
|
+
throw new Error(`Test function validation failed: ${validationErrors.join(', ')}`);
|
|
97
|
+
}
|
|
98
|
+
this.testFunctions.set(testFunction.mode, testFunction);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Discover routes to test.
|
|
102
|
+
*
|
|
103
|
+
* @returns Array of route descriptors
|
|
104
|
+
*/
|
|
105
|
+
async discoverRoutes() {
|
|
106
|
+
const routesConfig = this.config.routes;
|
|
107
|
+
// Manual routes provided as array
|
|
108
|
+
if (Array.isArray(routesConfig)) {
|
|
109
|
+
return routesConfig;
|
|
110
|
+
}
|
|
111
|
+
// Route discovery configuration
|
|
112
|
+
const discoveryConfig = routesConfig;
|
|
113
|
+
if (discoveryConfig.strategy === 'manual') {
|
|
114
|
+
throw new Error('Manual strategy requires routes array');
|
|
115
|
+
}
|
|
116
|
+
if (discoveryConfig.strategy === 'navigation-graph') {
|
|
117
|
+
throw new Error('NavigationGraph discovery is only available in @supernalintelligence/interface-enterprise');
|
|
118
|
+
}
|
|
119
|
+
if (discoveryConfig.strategy === 'custom' && discoveryConfig.discoveryFn) {
|
|
120
|
+
return discoveryConfig.discoveryFn();
|
|
121
|
+
}
|
|
122
|
+
throw new Error(`Unknown discovery strategy: ${discoveryConfig.strategy}`);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Filter routes based on include/exclude patterns.
|
|
126
|
+
*
|
|
127
|
+
* @param routes - Routes to filter
|
|
128
|
+
* @returns Filtered routes
|
|
129
|
+
*/
|
|
130
|
+
filterRoutes(routes) {
|
|
131
|
+
const routesConfig = this.config.routes;
|
|
132
|
+
if (Array.isArray(routesConfig)) {
|
|
133
|
+
return routes;
|
|
134
|
+
}
|
|
135
|
+
const discoveryConfig = routesConfig;
|
|
136
|
+
const { include, exclude } = discoveryConfig;
|
|
137
|
+
let filtered = routes;
|
|
138
|
+
// Apply include patterns
|
|
139
|
+
if (include && include.length > 0) {
|
|
140
|
+
filtered = filtered.filter((r) => include.some((pattern) => this.matchPattern(r.route, pattern)));
|
|
141
|
+
}
|
|
142
|
+
// Apply exclude patterns
|
|
143
|
+
if (exclude && exclude.length > 0) {
|
|
144
|
+
filtered = filtered.filter((r) => !exclude.some((pattern) => this.matchPattern(r.route, pattern)));
|
|
145
|
+
}
|
|
146
|
+
return filtered;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Simple pattern matching for route filtering.
|
|
150
|
+
* Supports basic glob patterns with *.
|
|
151
|
+
*
|
|
152
|
+
* @param route - Route to match
|
|
153
|
+
* @param pattern - Pattern to match against
|
|
154
|
+
* @returns Whether route matches pattern
|
|
155
|
+
*/
|
|
156
|
+
matchPattern(route, pattern) {
|
|
157
|
+
// Convert glob pattern to regex
|
|
158
|
+
const regexPattern = pattern
|
|
159
|
+
.replace(/\*/g, '.*')
|
|
160
|
+
.replace(/\?/g, '.')
|
|
161
|
+
.replace(/\//g, '\\/');
|
|
162
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
163
|
+
return regex.test(route);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Initialize browser and context.
|
|
167
|
+
*/
|
|
168
|
+
async initBrowser() {
|
|
169
|
+
const browserConfig = this.config.browser || {};
|
|
170
|
+
this.browser = await test_1.chromium.launch({
|
|
171
|
+
headless: browserConfig.headless !== false,
|
|
172
|
+
...browserConfig.launchOptions,
|
|
173
|
+
});
|
|
174
|
+
this.context = await this.browser.newContext({
|
|
175
|
+
viewport: browserConfig.viewport || { width: 1280, height: 720 },
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Close browser and context.
|
|
180
|
+
*/
|
|
181
|
+
async closeBrowser() {
|
|
182
|
+
if (this.context) {
|
|
183
|
+
await this.context.close();
|
|
184
|
+
this.context = null;
|
|
185
|
+
}
|
|
186
|
+
if (this.browser) {
|
|
187
|
+
await this.browser.close();
|
|
188
|
+
this.browser = null;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Apply a test function to a route with optional viewport.
|
|
193
|
+
*
|
|
194
|
+
* @param route - Route descriptor
|
|
195
|
+
* @param testFunction - Test function to apply
|
|
196
|
+
* @param viewport - Viewport configuration (optional)
|
|
197
|
+
* @returns Test result
|
|
198
|
+
*/
|
|
199
|
+
async applyTestFunction(route, testFunction, viewport) {
|
|
200
|
+
if (!this.context) {
|
|
201
|
+
throw new Error('Browser context not initialized');
|
|
202
|
+
}
|
|
203
|
+
const page = await this.context.newPage();
|
|
204
|
+
try {
|
|
205
|
+
// Set viewport if provided
|
|
206
|
+
if (viewport) {
|
|
207
|
+
await page.setViewportSize({ width: viewport.width, height: viewport.height });
|
|
208
|
+
// Note: Device scale factor and mobile emulation would require creating
|
|
209
|
+
// a new context per viewport for full mobile emulation.
|
|
210
|
+
// For now, we just set viewport size which covers most responsive testing needs.
|
|
211
|
+
}
|
|
212
|
+
// Navigate to route
|
|
213
|
+
const url = `${this.config.baseUrl}${route.route}`;
|
|
214
|
+
await page.goto(url, { waitUntil: 'networkidle', timeout: this.config.execution?.timeout });
|
|
215
|
+
// Create test context
|
|
216
|
+
const testContext = {
|
|
217
|
+
route: route.route,
|
|
218
|
+
contextId: route.contextId,
|
|
219
|
+
metadata: route.metadata,
|
|
220
|
+
baseUrl: this.config.baseUrl,
|
|
221
|
+
viewport,
|
|
222
|
+
};
|
|
223
|
+
// Run test function
|
|
224
|
+
const result = await testFunction.run(page, testContext);
|
|
225
|
+
return result;
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
return {
|
|
229
|
+
passed: false,
|
|
230
|
+
duration: 0,
|
|
231
|
+
errors: [
|
|
232
|
+
{
|
|
233
|
+
severity: 'critical',
|
|
234
|
+
message: `Failed to test route: ${error instanceof Error ? error.message : String(error)}`,
|
|
235
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
236
|
+
},
|
|
237
|
+
],
|
|
238
|
+
metadata: {},
|
|
239
|
+
mode: testFunction.mode,
|
|
240
|
+
route: route.route,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
finally {
|
|
244
|
+
await page.close();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Run all tests across all routes.
|
|
249
|
+
*
|
|
250
|
+
* @returns Aggregated test results
|
|
251
|
+
*/
|
|
252
|
+
async runTests() {
|
|
253
|
+
const startTime = Date.now();
|
|
254
|
+
try {
|
|
255
|
+
// Discover and filter routes
|
|
256
|
+
const allRoutes = await this.discoverRoutes();
|
|
257
|
+
const routes = this.filterRoutes(allRoutes);
|
|
258
|
+
if (routes.length === 0) {
|
|
259
|
+
throw new Error('No routes to test');
|
|
260
|
+
}
|
|
261
|
+
console.log(`Discovered ${routes.length} routes to test`);
|
|
262
|
+
// Get viewports to test
|
|
263
|
+
const browserConfig = this.config.browser || {};
|
|
264
|
+
const viewports = browserConfig.viewports || [
|
|
265
|
+
browserConfig.viewport
|
|
266
|
+
? { name: 'default', ...browserConfig.viewport }
|
|
267
|
+
: types_1.ViewportPresets.Desktop
|
|
268
|
+
];
|
|
269
|
+
console.log(`Testing with ${viewports.length} viewport(s): ${viewports.map(v => v.name).join(', ')}`);
|
|
270
|
+
// Initialize browser
|
|
271
|
+
await this.initBrowser();
|
|
272
|
+
// Execute tests
|
|
273
|
+
const resultsByRoute = new Map();
|
|
274
|
+
const resultsByMode = new Map();
|
|
275
|
+
const allErrors = [];
|
|
276
|
+
// Test each viewport
|
|
277
|
+
for (const viewport of viewports) {
|
|
278
|
+
console.log(`\n📱 Testing viewport: ${viewport.name} (${viewport.width}x${viewport.height})`);
|
|
279
|
+
for (const route of routes) {
|
|
280
|
+
const routeKey = viewports.length > 1
|
|
281
|
+
? `${route.route} [${viewport.name}]`
|
|
282
|
+
: route.route;
|
|
283
|
+
console.log(` Testing route: ${routeKey}`);
|
|
284
|
+
const routeResults = [];
|
|
285
|
+
for (const [mode, testFunction] of this.testFunctions) {
|
|
286
|
+
console.log(` Running ${mode} test...`);
|
|
287
|
+
const result = await this.applyTestFunction(route, testFunction, viewport);
|
|
288
|
+
routeResults.push(result);
|
|
289
|
+
// Aggregate by mode
|
|
290
|
+
if (!resultsByMode.has(mode)) {
|
|
291
|
+
resultsByMode.set(mode, []);
|
|
292
|
+
}
|
|
293
|
+
resultsByMode.get(mode).push(result);
|
|
294
|
+
// Collect errors
|
|
295
|
+
allErrors.push(...result.errors);
|
|
296
|
+
}
|
|
297
|
+
resultsByRoute.set(routeKey, routeResults);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
// Calculate statistics
|
|
301
|
+
const testCount = routes.length * this.testFunctions.size * viewports.length;
|
|
302
|
+
const passedCount = Array.from(resultsByRoute.values())
|
|
303
|
+
.flat()
|
|
304
|
+
.filter((r) => r.passed).length;
|
|
305
|
+
const failedCount = testCount - passedCount;
|
|
306
|
+
const passRate = testCount > 0 ? Math.round((passedCount / testCount) * 100) : 0;
|
|
307
|
+
return {
|
|
308
|
+
routeCount: routes.length,
|
|
309
|
+
testCount,
|
|
310
|
+
passedCount,
|
|
311
|
+
failedCount,
|
|
312
|
+
passRate,
|
|
313
|
+
totalDuration: Date.now() - startTime,
|
|
314
|
+
resultsByRoute,
|
|
315
|
+
resultsByMode,
|
|
316
|
+
errors: allErrors,
|
|
317
|
+
timestamp: new Date(),
|
|
318
|
+
config: this.config,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
finally {
|
|
322
|
+
await this.closeBrowser();
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Get registered test functions.
|
|
327
|
+
*/
|
|
328
|
+
getTestFunctions() {
|
|
329
|
+
return Array.from(this.testFunctions.values());
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Get configuration.
|
|
333
|
+
*/
|
|
334
|
+
getConfig() {
|
|
335
|
+
return this.config;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
exports.GraphTester = GraphTester;
|
|
339
|
+
//# sourceMappingURL=GraphTester.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphTester.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/core/GraphTester.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Abstract base class for all test functions.
|
|
4
|
+
*
|
|
5
|
+
* Test functions implement specific testing modes (visual regression, performance, accessibility, etc.).
|
|
6
|
+
* Each test function:
|
|
7
|
+
* 1. Receives a Playwright page and test context
|
|
8
|
+
* 2. Performs its testing logic
|
|
9
|
+
* 3. Returns a TestResult with pass/fail status and metadata
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.TestFunction = void 0;
|
|
15
|
+
exports.isTestFunction = isTestFunction;
|
|
16
|
+
/**
|
|
17
|
+
* Abstract base class for test functions.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* class VisualRegressionMode extends TestFunction {
|
|
22
|
+
* mode = 'visual';
|
|
23
|
+
*
|
|
24
|
+
* async execute(page: Page, context: TestContext): Promise<TestResult> {
|
|
25
|
+
* const startTime = Date.now();
|
|
26
|
+
* const screenshot = await page.screenshot({ fullPage: true });
|
|
27
|
+
*
|
|
28
|
+
* return {
|
|
29
|
+
* passed: true,
|
|
30
|
+
* duration: Date.now() - startTime,
|
|
31
|
+
* errors: [],
|
|
32
|
+
* metadata: {
|
|
33
|
+
* screenshot,
|
|
34
|
+
* screenshotPath: './screenshots/example.png'
|
|
35
|
+
* }
|
|
36
|
+
* };
|
|
37
|
+
* }
|
|
38
|
+
* }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
class TestFunction {
|
|
42
|
+
/**
|
|
43
|
+
* Execute the full test lifecycle: setup, execute, teardown.
|
|
44
|
+
* This method handles the orchestration and error handling.
|
|
45
|
+
*
|
|
46
|
+
* @param page - Playwright page instance
|
|
47
|
+
* @param context - Test context
|
|
48
|
+
* @returns Test result
|
|
49
|
+
*/
|
|
50
|
+
async run(page, context) {
|
|
51
|
+
const startTime = Date.now();
|
|
52
|
+
const errors = [];
|
|
53
|
+
try {
|
|
54
|
+
// Check if we should test this route
|
|
55
|
+
if (this.shouldTest && !this.shouldTest(context)) {
|
|
56
|
+
return {
|
|
57
|
+
passed: true,
|
|
58
|
+
duration: Date.now() - startTime,
|
|
59
|
+
errors: [],
|
|
60
|
+
metadata: {
|
|
61
|
+
skipped: true,
|
|
62
|
+
reason: 'Skipped by shouldTest() predicate',
|
|
63
|
+
},
|
|
64
|
+
mode: this.mode,
|
|
65
|
+
route: context.route,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
// Setup
|
|
69
|
+
if (this.setup) {
|
|
70
|
+
try {
|
|
71
|
+
await this.setup(page);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
errors.push({
|
|
75
|
+
severity: 'critical',
|
|
76
|
+
message: `Setup failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
77
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
passed: false,
|
|
81
|
+
duration: Date.now() - startTime,
|
|
82
|
+
errors,
|
|
83
|
+
metadata: {},
|
|
84
|
+
mode: this.mode,
|
|
85
|
+
route: context.route,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Execute
|
|
90
|
+
let result;
|
|
91
|
+
try {
|
|
92
|
+
result = await this.execute(page, context);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
errors.push({
|
|
96
|
+
severity: 'critical',
|
|
97
|
+
message: `Execution failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
98
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
99
|
+
});
|
|
100
|
+
result = {
|
|
101
|
+
passed: false,
|
|
102
|
+
duration: Date.now() - startTime,
|
|
103
|
+
errors,
|
|
104
|
+
metadata: {},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// Teardown
|
|
108
|
+
if (this.teardown) {
|
|
109
|
+
try {
|
|
110
|
+
await this.teardown(page);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
errors.push({
|
|
114
|
+
severity: 'warning',
|
|
115
|
+
message: `Teardown failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
116
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Merge errors and add metadata
|
|
121
|
+
return {
|
|
122
|
+
...result,
|
|
123
|
+
errors: [...errors, ...result.errors],
|
|
124
|
+
mode: this.mode,
|
|
125
|
+
route: context.route,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
// Catch-all for unexpected errors
|
|
130
|
+
return {
|
|
131
|
+
passed: false,
|
|
132
|
+
duration: Date.now() - startTime,
|
|
133
|
+
errors: [
|
|
134
|
+
...errors,
|
|
135
|
+
{
|
|
136
|
+
severity: 'critical',
|
|
137
|
+
message: `Unexpected error: ${error instanceof Error ? error.message : String(error)}`,
|
|
138
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
metadata: {},
|
|
142
|
+
mode: this.mode,
|
|
143
|
+
route: context.route,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Validate test function configuration.
|
|
149
|
+
* Override to add custom validation logic.
|
|
150
|
+
*
|
|
151
|
+
* @returns Array of validation errors (empty if valid)
|
|
152
|
+
*/
|
|
153
|
+
validate() {
|
|
154
|
+
const errors = [];
|
|
155
|
+
if (!this.mode) {
|
|
156
|
+
errors.push('mode is required');
|
|
157
|
+
}
|
|
158
|
+
if (!this.name) {
|
|
159
|
+
errors.push('name is required');
|
|
160
|
+
}
|
|
161
|
+
if (!this.description) {
|
|
162
|
+
errors.push('description is required');
|
|
163
|
+
}
|
|
164
|
+
return errors;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get test function info for reporting.
|
|
168
|
+
*/
|
|
169
|
+
getInfo() {
|
|
170
|
+
return {
|
|
171
|
+
mode: this.mode,
|
|
172
|
+
name: this.name,
|
|
173
|
+
description: this.description,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
exports.TestFunction = TestFunction;
|
|
178
|
+
/**
|
|
179
|
+
* Type guard to check if an object is a TestFunction.
|
|
180
|
+
*/
|
|
181
|
+
function isTestFunction(obj) {
|
|
182
|
+
return (obj &&
|
|
183
|
+
typeof obj === 'object' &&
|
|
184
|
+
typeof obj.mode === 'string' &&
|
|
185
|
+
typeof obj.name === 'string' &&
|
|
186
|
+
typeof obj.description === 'string' &&
|
|
187
|
+
typeof obj.execute === 'function');
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=TestFunction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TestFunction.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/core/TestFunction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Core types for the graph-based testing framework.
|
|
4
|
+
*
|
|
5
|
+
* This file is the contract between all packages - changes require consensus.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.ViewportPresets = void 0;
|
|
11
|
+
/**
|
|
12
|
+
* Predefined viewport presets.
|
|
13
|
+
*/
|
|
14
|
+
exports.ViewportPresets = {
|
|
15
|
+
Desktop: { name: 'desktop', width: 1920, height: 1080 },
|
|
16
|
+
DesktopSmall: { name: 'desktop-small', width: 1366, height: 768 },
|
|
17
|
+
Laptop: { name: 'laptop', width: 1280, height: 720 },
|
|
18
|
+
TabletLandscape: { name: 'tablet-landscape', width: 1024, height: 768, isMobile: true, hasTouch: true },
|
|
19
|
+
TabletPortrait: { name: 'tablet-portrait', width: 768, height: 1024, isMobile: true, hasTouch: true },
|
|
20
|
+
MobileLarge: { name: 'mobile-large', width: 414, height: 896, isMobile: true, hasTouch: true },
|
|
21
|
+
Mobile: { name: 'mobile', width: 375, height: 812, isMobile: true, hasTouch: true },
|
|
22
|
+
MobileSmall: { name: 'mobile-small', width: 320, height: 568, isMobile: true, hasTouch: true },
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/core/types.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAyPH;;GAEG;AACU,QAAA,eAAe,GAAG;IAC7B,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACvD,YAAY,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IACjE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IACpD,eAAe,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;IACvG,cAAc,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;IACrG,WAAW,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC9F,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;IACnF,WAAW,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;CACtF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Fixtures exports.
|
|
4
|
+
*
|
|
5
|
+
* @packageDocumentation
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.cleanupPortPool = exports.expect = exports.test = void 0;
|
|
9
|
+
var portPool_1 = require("./portPool");
|
|
10
|
+
Object.defineProperty(exports, "test", { enumerable: true, get: function () { return portPool_1.test; } });
|
|
11
|
+
Object.defineProperty(exports, "expect", { enumerable: true, get: function () { return portPool_1.expect; } });
|
|
12
|
+
Object.defineProperty(exports, "cleanupPortPool", { enumerable: true, get: function () { return portPool_1.cleanupPortPool; } });
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/fixtures/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,uCAA2D;AAAlD,gGAAA,IAAI,OAAA;AAAE,kGAAA,MAAM,OAAA;AAAE,2GAAA,eAAe,OAAA"}
|