@arcadialdev/arcality 2.4.28 → 2.4.30

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.
Files changed (83) hide show
  1. package/README.md +2 -2
  2. package/package.json +3 -7
  3. package/scripts/gen-and-run.mjs +5 -18
  4. package/src/KnowledgeService.ts +256 -0
  5. package/src/arcalityClient.mjs +2 -1
  6. package/src/consoleBanner.ts +32 -0
  7. package/src/envSetup.ts +205 -0
  8. package/src/index.ts +25 -0
  9. package/src/projectInspector.ts +42 -0
  10. package/src/services/collectiveMemoryService.ts +178 -0
  11. package/src/services/securityScanner.ts +128 -0
  12. package/src/testRunner.ts +201 -0
  13. package/tests/_helpers/agentic-runner.bundle.spec.js +2912 -83
  14. package/.agents/skills/e2e-testing-expert/SKILL.md +0 -28
  15. package/.agents/skills/frontend-design/LICENSE.txt +0 -177
  16. package/.agents/skills/frontend-design/SKILL.md +0 -42
  17. package/.agents/skills/nodejs-backend-patterns/SKILL.md +0 -639
  18. package/.agents/skills/nodejs-backend-patterns/references/advanced-patterns.md +0 -430
  19. package/.agents/skills/playwright-best-practices/LICENSE.md +0 -7
  20. package/.agents/skills/playwright-best-practices/README.md +0 -147
  21. package/.agents/skills/playwright-best-practices/SKILL.md +0 -303
  22. package/.agents/skills/playwright-best-practices/advanced/authentication-flows.md +0 -360
  23. package/.agents/skills/playwright-best-practices/advanced/authentication.md +0 -871
  24. package/.agents/skills/playwright-best-practices/advanced/clock-mocking.md +0 -364
  25. package/.agents/skills/playwright-best-practices/advanced/mobile-testing.md +0 -409
  26. package/.agents/skills/playwright-best-practices/advanced/multi-context.md +0 -288
  27. package/.agents/skills/playwright-best-practices/advanced/multi-user.md +0 -393
  28. package/.agents/skills/playwright-best-practices/advanced/network-advanced.md +0 -452
  29. package/.agents/skills/playwright-best-practices/advanced/third-party.md +0 -464
  30. package/.agents/skills/playwright-best-practices/architecture/pom-vs-fixtures.md +0 -363
  31. package/.agents/skills/playwright-best-practices/architecture/test-architecture.md +0 -369
  32. package/.agents/skills/playwright-best-practices/architecture/when-to-mock.md +0 -383
  33. package/.agents/skills/playwright-best-practices/browser-apis/browser-apis.md +0 -391
  34. package/.agents/skills/playwright-best-practices/browser-apis/iframes.md +0 -403
  35. package/.agents/skills/playwright-best-practices/browser-apis/service-workers.md +0 -504
  36. package/.agents/skills/playwright-best-practices/browser-apis/websockets.md +0 -403
  37. package/.agents/skills/playwright-best-practices/core/annotations.md +0 -424
  38. package/.agents/skills/playwright-best-practices/core/assertions-waiting.md +0 -361
  39. package/.agents/skills/playwright-best-practices/core/configuration.md +0 -452
  40. package/.agents/skills/playwright-best-practices/core/fixtures-hooks.md +0 -417
  41. package/.agents/skills/playwright-best-practices/core/global-setup.md +0 -434
  42. package/.agents/skills/playwright-best-practices/core/locators.md +0 -242
  43. package/.agents/skills/playwright-best-practices/core/page-object-model.md +0 -315
  44. package/.agents/skills/playwright-best-practices/core/projects-dependencies.md +0 -453
  45. package/.agents/skills/playwright-best-practices/core/test-data.md +0 -492
  46. package/.agents/skills/playwright-best-practices/core/test-suite-structure.md +0 -361
  47. package/.agents/skills/playwright-best-practices/core/test-tags.md +0 -298
  48. package/.agents/skills/playwright-best-practices/debugging/console-errors.md +0 -420
  49. package/.agents/skills/playwright-best-practices/debugging/debugging.md +0 -504
  50. package/.agents/skills/playwright-best-practices/debugging/error-testing.md +0 -360
  51. package/.agents/skills/playwright-best-practices/debugging/flaky-tests.md +0 -496
  52. package/.agents/skills/playwright-best-practices/frameworks/angular.md +0 -530
  53. package/.agents/skills/playwright-best-practices/frameworks/nextjs.md +0 -469
  54. package/.agents/skills/playwright-best-practices/frameworks/react.md +0 -531
  55. package/.agents/skills/playwright-best-practices/frameworks/vue.md +0 -574
  56. package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/ci-cd.md +0 -468
  57. package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/docker.md +0 -283
  58. package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/github-actions.md +0 -546
  59. package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/gitlab.md +0 -397
  60. package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/other-providers.md +0 -521
  61. package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/parallel-sharding.md +0 -371
  62. package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/performance.md +0 -453
  63. package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/reporting.md +0 -424
  64. package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/test-coverage.md +0 -497
  65. package/.agents/skills/playwright-best-practices/testing-patterns/accessibility.md +0 -359
  66. package/.agents/skills/playwright-best-practices/testing-patterns/api-testing.md +0 -719
  67. package/.agents/skills/playwright-best-practices/testing-patterns/browser-extensions.md +0 -506
  68. package/.agents/skills/playwright-best-practices/testing-patterns/canvas-webgl.md +0 -493
  69. package/.agents/skills/playwright-best-practices/testing-patterns/component-testing.md +0 -500
  70. package/.agents/skills/playwright-best-practices/testing-patterns/drag-drop.md +0 -576
  71. package/.agents/skills/playwright-best-practices/testing-patterns/electron.md +0 -509
  72. package/.agents/skills/playwright-best-practices/testing-patterns/file-operations.md +0 -377
  73. package/.agents/skills/playwright-best-practices/testing-patterns/file-upload-download.md +0 -562
  74. package/.agents/skills/playwright-best-practices/testing-patterns/forms-validation.md +0 -561
  75. package/.agents/skills/playwright-best-practices/testing-patterns/graphql-testing.md +0 -331
  76. package/.agents/skills/playwright-best-practices/testing-patterns/i18n.md +0 -508
  77. package/.agents/skills/playwright-best-practices/testing-patterns/performance-testing.md +0 -476
  78. package/.agents/skills/playwright-best-practices/testing-patterns/security-testing.md +0 -430
  79. package/.agents/skills/playwright-best-practices/testing-patterns/visual-regression.md +0 -634
  80. package/.agents/skills/security-qa/SKILL.md +0 -254
  81. package/public/ArcalityImagen.png +0 -0
  82. package/public/logo-arcadial-blanco.png +0 -0
  83. package/public/logo.png +0 -0
@@ -1,452 +0,0 @@
1
- # Advanced Network Interception
2
-
3
- ## Table of Contents
4
-
5
- 1. [Request Modification](#request-modification)
6
- 2. [GraphQL Mocking](#graphql-mocking)
7
- 3. [HAR Recording & Playback](#har-recording--playback)
8
- 4. [Conditional Mocking](#conditional-mocking)
9
- 5. [Network Throttling](#network-throttling)
10
-
11
- ## Request Modification
12
-
13
- ### Modify Request Headers
14
-
15
- ```typescript
16
- test("add auth header to requests", async ({ page }) => {
17
- await page.route("**/api/**", (route) => {
18
- const headers = {
19
- ...route.request().headers(),
20
- Authorization: "Bearer test-token",
21
- "X-Test-Header": "test-value",
22
- };
23
- route.continue({ headers });
24
- });
25
-
26
- await page.goto("/dashboard");
27
- });
28
- ```
29
-
30
- ### Modify Request Body
31
-
32
- ```typescript
33
- test("modify POST body", async ({ page }) => {
34
- await page.route("**/api/orders", async (route) => {
35
- if (route.request().method() === "POST") {
36
- const postData = route.request().postDataJSON();
37
-
38
- // Add test metadata
39
- const modifiedData = {
40
- ...postData,
41
- testMode: true,
42
- testTimestamp: Date.now(),
43
- };
44
-
45
- await route.continue({
46
- postData: JSON.stringify(modifiedData),
47
- });
48
- } else {
49
- await route.continue();
50
- }
51
- });
52
-
53
- await page.goto("/checkout");
54
- await page.getByRole("button", { name: "Place Order" }).click();
55
- });
56
- ```
57
-
58
- ### Transform Response
59
-
60
- ```typescript
61
- test("modify API response", async ({ page }) => {
62
- await page.route("**/api/products", async (route) => {
63
- // Fetch real response
64
- const response = await route.fetch();
65
- const json = await response.json();
66
-
67
- // Modify response
68
- const modified = json.map((product: any) => ({
69
- ...product,
70
- price: product.price * 0.9, // 10% discount
71
- testMode: true,
72
- }));
73
-
74
- await route.fulfill({
75
- response,
76
- json: modified,
77
- });
78
- });
79
-
80
- await page.goto("/products");
81
- });
82
- ```
83
-
84
- ## GraphQL Mocking
85
-
86
- ### Mock by Operation Name
87
-
88
- ```typescript
89
- test("mock GraphQL query", async ({ page }) => {
90
- await page.route("**/graphql", async (route) => {
91
- const postData = route.request().postDataJSON();
92
-
93
- if (postData.operationName === "GetUser") {
94
- return route.fulfill({
95
- json: {
96
- data: {
97
- user: {
98
- id: "1",
99
- name: "Test User",
100
- email: "test@example.com",
101
- },
102
- },
103
- },
104
- });
105
- }
106
-
107
- if (postData.operationName === "GetProducts") {
108
- return route.fulfill({
109
- json: {
110
- data: {
111
- products: [
112
- { id: "1", name: "Product A", price: 29.99 },
113
- { id: "2", name: "Product B", price: 49.99 },
114
- ],
115
- },
116
- },
117
- });
118
- }
119
-
120
- // Pass through unmocked operations
121
- return route.continue();
122
- });
123
-
124
- await page.goto("/dashboard");
125
- });
126
- ```
127
-
128
- ### GraphQL Mock Fixture
129
-
130
- ```typescript
131
- // fixtures/graphql.fixture.ts
132
- type GraphQLMock = {
133
- operation: string;
134
- variables?: Record<string, any>;
135
- response: { data?: any; errors?: any[] };
136
- };
137
-
138
- type GraphQLFixtures = {
139
- mockGraphQL: (mocks: GraphQLMock[]) => Promise<void>;
140
- };
141
-
142
- export const test = base.extend<GraphQLFixtures>({
143
- mockGraphQL: async ({ page }, use) => {
144
- await use(async (mocks) => {
145
- await page.route("**/graphql", async (route) => {
146
- const postData = route.request().postDataJSON();
147
-
148
- const mock = mocks.find((m) => {
149
- if (m.operation !== postData.operationName) return false;
150
-
151
- // Optionally match variables
152
- if (m.variables) {
153
- return (
154
- JSON.stringify(m.variables) === JSON.stringify(postData.variables)
155
- );
156
- }
157
- return true;
158
- });
159
-
160
- if (mock) {
161
- return route.fulfill({ json: mock.response });
162
- }
163
-
164
- return route.continue();
165
- });
166
- });
167
- },
168
- });
169
-
170
- // Usage
171
- test("dashboard with mocked GraphQL", async ({ page, mockGraphQL }) => {
172
- await mockGraphQL([
173
- {
174
- operation: "GetDashboardStats",
175
- response: {
176
- data: { stats: { users: 100, revenue: 50000 } },
177
- },
178
- },
179
- {
180
- operation: "GetUser",
181
- variables: { id: "1" },
182
- response: {
183
- data: { user: { id: "1", name: "John" } },
184
- },
185
- },
186
- ]);
187
-
188
- await page.goto("/dashboard");
189
- await expect(page.getByText("100 users")).toBeVisible();
190
- });
191
- ```
192
-
193
- ### Mock GraphQL Mutations
194
-
195
- ```typescript
196
- test("mock GraphQL mutation", async ({ page }) => {
197
- await page.route("**/graphql", async (route) => {
198
- const postData = route.request().postDataJSON();
199
-
200
- if (postData.operationName === "CreateOrder") {
201
- const { input } = postData.variables;
202
-
203
- return route.fulfill({
204
- json: {
205
- data: {
206
- createOrder: {
207
- id: "order-123",
208
- status: "PENDING",
209
- items: input.items,
210
- total: input.items.reduce(
211
- (sum: number, item: any) => sum + item.price * item.quantity,
212
- 0,
213
- ),
214
- },
215
- },
216
- },
217
- });
218
- }
219
-
220
- return route.continue();
221
- });
222
-
223
- await page.goto("/checkout");
224
- await page.getByRole("button", { name: "Place Order" }).click();
225
-
226
- await expect(page.getByText("Order #order-123")).toBeVisible();
227
- });
228
- ```
229
-
230
- ## HAR Recording & Playback
231
-
232
- ### Record HAR File
233
-
234
- ```typescript
235
- // Record network traffic
236
- test("record HAR", async ({ page, context }) => {
237
- // Start recording
238
- await context.routeFromHAR("./recordings/checkout.har", {
239
- update: true, // Create/update HAR file
240
- url: "**/api/**",
241
- });
242
-
243
- await page.goto("/checkout");
244
- await page.getByRole("button", { name: "Place Order" }).click();
245
-
246
- // HAR file is saved automatically
247
- });
248
- ```
249
-
250
- ### Playback HAR File
251
-
252
- ```typescript
253
- // Use recorded HAR for offline testing
254
- test("playback HAR", async ({ page, context }) => {
255
- await context.routeFromHAR("./recordings/checkout.har", {
256
- url: "**/api/**",
257
- update: false, // Don't update, just playback
258
- });
259
-
260
- await page.goto("/checkout");
261
-
262
- // All API calls served from HAR file
263
- await expect(page.getByText("Order confirmed")).toBeVisible();
264
- });
265
- ```
266
-
267
- ### HAR with Fallback
268
-
269
- ```typescript
270
- test("HAR with live fallback", async ({ page, context }) => {
271
- await context.routeFromHAR("./recordings/api.har", {
272
- url: "**/api/**",
273
- update: false,
274
- notFound: "fallback", // Use real network if not in HAR
275
- });
276
-
277
- await page.goto("/dashboard");
278
- });
279
- ```
280
-
281
- ## Conditional Mocking
282
-
283
- ### Mock Based on Request Body
284
-
285
- ```typescript
286
- test("conditional mock by body", async ({ page }) => {
287
- await page.route("**/api/search", async (route) => {
288
- const body = route.request().postDataJSON();
289
-
290
- if (body.query === "error") {
291
- return route.fulfill({
292
- status: 500,
293
- json: { error: "Search failed" },
294
- });
295
- }
296
-
297
- if (body.query === "empty") {
298
- return route.fulfill({
299
- json: { results: [] },
300
- });
301
- }
302
-
303
- // Default response
304
- return route.fulfill({
305
- json: {
306
- results: [{ id: 1, title: `Result for: ${body.query}` }],
307
- },
308
- });
309
- });
310
-
311
- await page.goto("/search");
312
-
313
- // Test different scenarios
314
- await page.getByLabel("Search").fill("error");
315
- await page.getByLabel("Search").press("Enter");
316
- await expect(page.getByText("Search failed")).toBeVisible();
317
- });
318
- ```
319
-
320
- ### Mock Nth Request
321
-
322
- ```typescript
323
- test("different response on retry", async ({ page }) => {
324
- let callCount = 0;
325
-
326
- await page.route("**/api/status", (route) => {
327
- callCount++;
328
-
329
- if (callCount < 3) {
330
- return route.fulfill({
331
- status: 503,
332
- json: { error: "Service unavailable" },
333
- });
334
- }
335
-
336
- // Succeed on 3rd attempt
337
- return route.fulfill({
338
- json: { status: "ok" },
339
- });
340
- });
341
-
342
- await page.goto("/dashboard");
343
-
344
- // App should retry and eventually succeed
345
- await expect(page.getByText("Connected")).toBeVisible();
346
- });
347
- ```
348
-
349
- ### Mock with Delay
350
-
351
- ```typescript
352
- test("slow network simulation", async ({ page }) => {
353
- await page.route("**/api/data", async (route) => {
354
- // Simulate 2 second delay
355
- await new Promise((resolve) => setTimeout(resolve, 2000));
356
-
357
- return route.fulfill({
358
- json: { data: "loaded" },
359
- });
360
- });
361
-
362
- await page.goto("/dashboard");
363
-
364
- // Loading state should appear
365
- await expect(page.getByText("Loading...")).toBeVisible();
366
-
367
- // Then data appears
368
- await expect(page.getByText("loaded")).toBeVisible();
369
- });
370
- ```
371
-
372
- ## Network Throttling
373
-
374
- ### Slow 3G Simulation
375
-
376
- ```typescript
377
- test("slow network experience", async ({ page, context }) => {
378
- // Create CDP session for network throttling
379
- const client = await context.newCDPSession(page);
380
-
381
- await client.send("Network.emulateNetworkConditions", {
382
- offline: false,
383
- downloadThroughput: (500 * 1024) / 8, // 500 Kbps
384
- uploadThroughput: (500 * 1024) / 8,
385
- latency: 400, // 400ms
386
- });
387
-
388
- await page.goto("/");
389
-
390
- // Test loading states appear
391
- await expect(page.getByTestId("skeleton-loader")).toBeVisible();
392
- });
393
- ```
394
-
395
- ### Offline Mode
396
-
397
- Use `context.setOffline(true/false)` to simulate network connectivity changes.
398
-
399
- > **For comprehensive offline testing patterns:**
400
- >
401
- > - **Network failure simulation** (error recovery, graceful degradation): See [error-testing.md](error-testing.md#offline-testing)
402
- > - **Offline-first/PWA testing** (service workers, caching, background sync): See [service-workers.md](service-workers.md#offline-testing)
403
-
404
- ### Network Throttling Fixture
405
-
406
- ```typescript
407
- // fixtures/network.fixture.ts
408
- type NetworkCondition = "slow3g" | "fast3g" | "offline";
409
-
410
- const conditions = {
411
- slow3g: { downloadThroughput: 50000, uploadThroughput: 50000, latency: 2000 },
412
- fast3g: { downloadThroughput: 180000, uploadThroughput: 75000, latency: 150 },
413
- };
414
-
415
- type NetworkFixtures = {
416
- setNetworkCondition: (condition: NetworkCondition) => Promise<void>;
417
- };
418
-
419
- export const test = base.extend<NetworkFixtures>({
420
- setNetworkCondition: async ({ page, context }, use) => {
421
- const client = await context.newCDPSession(page);
422
-
423
- await use(async (condition) => {
424
- if (condition === "offline") {
425
- await context.setOffline(true);
426
- } else {
427
- await client.send("Network.emulateNetworkConditions", {
428
- offline: false,
429
- ...conditions[condition],
430
- });
431
- }
432
- });
433
-
434
- // Reset
435
- await context.setOffline(false);
436
- },
437
- });
438
- ```
439
-
440
- ## Anti-Patterns to Avoid
441
-
442
- | Anti-Pattern | Problem | Solution |
443
- | ------------------------ | ------------------------------ | -------------------------------- |
444
- | Mocking all requests | Tests don't reflect reality | Mock only what's necessary |
445
- | No cleanup of routes | Routes persist across tests | Use fixtures with cleanup |
446
- | Ignoring request method | Mock applies to wrong requests | Check `route.request().method()` |
447
- | Hardcoded mock responses | Brittle, hard to maintain | Use factories for mock data |
448
-
449
- ## Related References
450
-
451
- - **Basic Mocking**: See [test-suite-structure.md](../core/test-suite-structure.md) for simple mocking
452
- - **WebSockets**: See [websockets.md](../browser-apis/websockets.md) for real-time mocking