Implement comprehensive frontend integration testing with Playwright
- Add Playwright E2E testing framework with cross-browser support (Chrome, Firefox) - Create authentication helpers for CalDAV server integration - Implement calendar interaction helpers with event creation, drag-and-drop, and view switching - Add comprehensive drag-and-drop test suite with event cleanup - Configure CI/CD integration with Gitea Actions for headless testing - Support both local development and CI environments with proper dependency management - Include video recording, screenshots, and HTML reporting for test debugging - Handle Firefox-specific timing and interaction challenges with force clicks and timeouts 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
		
							
								
								
									
										104
									
								
								frontend/e2e/node_modules/playwright/lib/common/process.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								frontend/e2e/node_modules/playwright/lib/common/process.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,104 @@ | ||||
| "use strict"; | ||||
| var __defProp = Object.defineProperty; | ||||
| var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | ||||
| var __getOwnPropNames = Object.getOwnPropertyNames; | ||||
| var __hasOwnProp = Object.prototype.hasOwnProperty; | ||||
| var __export = (target, all) => { | ||||
|   for (var name in all) | ||||
|     __defProp(target, name, { get: all[name], enumerable: true }); | ||||
| }; | ||||
| var __copyProps = (to, from, except, desc) => { | ||||
|   if (from && typeof from === "object" || typeof from === "function") { | ||||
|     for (let key of __getOwnPropNames(from)) | ||||
|       if (!__hasOwnProp.call(to, key) && key !== except) | ||||
|         __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); | ||||
|   } | ||||
|   return to; | ||||
| }; | ||||
| var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); | ||||
| var process_exports = {}; | ||||
| __export(process_exports, { | ||||
|   ProcessRunner: () => ProcessRunner | ||||
| }); | ||||
| module.exports = __toCommonJS(process_exports); | ||||
| var import_utils = require("playwright-core/lib/utils"); | ||||
| var import_util = require("../util"); | ||||
| class ProcessRunner { | ||||
|   async gracefullyClose() { | ||||
|   } | ||||
|   dispatchEvent(method, params) { | ||||
|     const response = { method, params }; | ||||
|     sendMessageToParent({ method: "__dispatch__", params: response }); | ||||
|   } | ||||
| } | ||||
| let gracefullyCloseCalled = false; | ||||
| let forceExitInitiated = false; | ||||
| sendMessageToParent({ method: "ready" }); | ||||
| process.on("disconnect", () => gracefullyCloseAndExit(true)); | ||||
| process.on("SIGINT", () => { | ||||
| }); | ||||
| process.on("SIGTERM", () => { | ||||
| }); | ||||
| let processRunner; | ||||
| let processName; | ||||
| const startingEnv = { ...process.env }; | ||||
| process.on("message", async (message) => { | ||||
|   if (message.method === "__init__") { | ||||
|     const { processParams, runnerParams, runnerScript } = message.params; | ||||
|     void (0, import_utils.startProfiling)(); | ||||
|     (0, import_utils.setTimeOrigin)(processParams.timeOrigin); | ||||
|     const { create } = require(runnerScript); | ||||
|     processRunner = create(runnerParams); | ||||
|     processName = processParams.processName; | ||||
|     return; | ||||
|   } | ||||
|   if (message.method === "__stop__") { | ||||
|     const keys = /* @__PURE__ */ new Set([...Object.keys(process.env), ...Object.keys(startingEnv)]); | ||||
|     const producedEnv = [...keys].filter((key) => startingEnv[key] !== process.env[key]).map((key) => [key, process.env[key] ?? null]); | ||||
|     sendMessageToParent({ method: "__env_produced__", params: producedEnv }); | ||||
|     await gracefullyCloseAndExit(false); | ||||
|     return; | ||||
|   } | ||||
|   if (message.method === "__dispatch__") { | ||||
|     const { id, method, params } = message.params; | ||||
|     try { | ||||
|       const result = await processRunner[method](params); | ||||
|       const response = { id, result }; | ||||
|       sendMessageToParent({ method: "__dispatch__", params: response }); | ||||
|     } catch (e) { | ||||
|       const response = { id, error: (0, import_util.serializeError)(e) }; | ||||
|       sendMessageToParent({ method: "__dispatch__", params: response }); | ||||
|     } | ||||
|   } | ||||
| }); | ||||
| const kForceExitTimeout = +(process.env.PWTEST_FORCE_EXIT_TIMEOUT || 3e4); | ||||
| async function gracefullyCloseAndExit(forceExit) { | ||||
|   if (forceExit && !forceExitInitiated) { | ||||
|     forceExitInitiated = true; | ||||
|     setTimeout(() => process.exit(0), kForceExitTimeout); | ||||
|   } | ||||
|   if (!gracefullyCloseCalled) { | ||||
|     gracefullyCloseCalled = true; | ||||
|     await processRunner?.gracefullyClose().catch(() => { | ||||
|     }); | ||||
|     if (processName) | ||||
|       await (0, import_utils.stopProfiling)(processName).catch(() => { | ||||
|       }); | ||||
|     process.exit(0); | ||||
|   } | ||||
| } | ||||
| function sendMessageToParent(message) { | ||||
|   try { | ||||
|     process.send(message); | ||||
|   } catch (e) { | ||||
|     try { | ||||
|       JSON.stringify(message); | ||||
|     } catch { | ||||
|       throw e; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| // Annotate the CommonJS export names for ESM import in node: | ||||
| 0 && (module.exports = { | ||||
|   ProcessRunner | ||||
| }); | ||||
		Reference in New Issue
	
	Block a user
	 Connor Johnstone
					Connor Johnstone