Unverified 提交 80729b2e authored 作者: wwwillchen-bot's avatar wwwillchen-bot 提交者: GitHub

fix(e2e): skip external operations in E2E test mode (#2716)

## Summary - Skip actual Node.js downloads in E2E tests by returning a tiny test URL instead of the real Node.js installer - Skip opening external URLs in shell handler to avoid spawning browser windows during E2E tests - Both changes are conditional on `E2E_TEST_BUILD=true` environment variable ## Test plan - Run E2E tests with `E2E_TEST_BUILD=true` to verify external operations are skipped - Verify normal operation is unaffected when the environment variable is not set 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2716" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> --------- Co-authored-by: 's avatarWill Chen <willchen90@gmail.com> Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
上级 d01ef2e9
...@@ -9,6 +9,7 @@ import { join } from "path"; ...@@ -9,6 +9,7 @@ import { join } from "path";
import { readSettings } from "../../main/settings"; import { readSettings } from "../../main/settings";
import { createTypedHandler } from "./base"; import { createTypedHandler } from "./base";
import { systemContracts } from "../types/system"; import { systemContracts } from "../types/system";
import { IS_TEST_BUILD } from "../utils/test_utils";
const logger = log.scope("node_handlers"); const logger = log.scope("node_handlers");
...@@ -17,6 +18,12 @@ const logger = log.scope("node_handlers"); ...@@ -17,6 +18,12 @@ const logger = log.scope("node_handlers");
let mockNodeInstalled: boolean | null = null; let mockNodeInstalled: boolean | null = null;
function getNodeDownloadUrl(): string { function getNodeDownloadUrl(): string {
// In E2E test mode, return a placeholder URL to avoid actual Node.js downloads.
// This URL is never actually fetched since open-external-url is also skipped in test mode.
if (IS_TEST_BUILD) {
return "https://example.com/fake-node-installer.pkg";
}
// Default to mac download url. // Default to mac download url.
let nodeDownloadUrl = "https://nodejs.org/dist/v22.14.0/node-v22.14.0.pkg"; let nodeDownloadUrl = "https://nodejs.org/dist/v22.14.0/node-v22.14.0.pkg";
if (platform() == "win32") { if (platform() == "win32") {
...@@ -35,8 +42,8 @@ function getNodeDownloadUrl(): string { ...@@ -35,8 +42,8 @@ function getNodeDownloadUrl(): string {
export function registerNodeHandlers() { export function registerNodeHandlers() {
// Test-only handler to control Node.js mock state // Test-only handler to control Node.js mock state
// Guarded by E2E_TEST_BUILD environment variable // Guarded by IS_TEST_BUILD constant
if (process.env.E2E_TEST_BUILD === "true") { if (IS_TEST_BUILD) {
ipcMain.handle( ipcMain.handle(
"test:set-node-mock", "test:set-node-mock",
async (_, { installed }: { installed: boolean | null }) => { async (_, { installed }: { installed: boolean | null }) => {
...@@ -57,7 +64,7 @@ export function registerNodeHandlers() { ...@@ -57,7 +64,7 @@ export function registerNodeHandlers() {
const nodeDownloadUrl = getNodeDownloadUrl(); const nodeDownloadUrl = getNodeDownloadUrl();
// Test-only: Return mock state if set // Test-only: Return mock state if set
if (process.env.E2E_TEST_BUILD === "true" && mockNodeInstalled !== null) { if (IS_TEST_BUILD && mockNodeInstalled !== null) {
logger.log("Using mock Node.js status:", mockNodeInstalled); logger.log("Using mock Node.js status:", mockNodeInstalled);
if (mockNodeInstalled) { if (mockNodeInstalled) {
return { return {
......
import { shell } from "electron"; import { shell } from "electron";
import log from "electron-log"; import log from "electron-log";
import { createLoggedHandler } from "./safe_handle"; import { createLoggedHandler } from "./safe_handle";
import { IS_TEST_BUILD } from "../utils/test_utils";
const logger = log.scope("shell_handlers"); const logger = log.scope("shell_handlers");
const handle = createLoggedHandler(logger); const handle = createLoggedHandler(logger);
...@@ -13,6 +14,11 @@ export function registerShellHandlers() { ...@@ -13,6 +14,11 @@ export function registerShellHandlers() {
if (!url.startsWith("http://") && !url.startsWith("https://")) { if (!url.startsWith("http://") && !url.startsWith("https://")) {
throw new Error("Attempted to open invalid or non-http URL: " + url); throw new Error("Attempted to open invalid or non-http URL: " + url);
} }
// In E2E test mode, skip actually opening external URLs to avoid browser windows
if (IS_TEST_BUILD) {
logger.debug("E2E test mode: skipped opening external URL:", url);
return;
}
await shell.openExternal(url); await shell.openExternal(url);
logger.debug("Opened external URL:", url); logger.debug("Opened external URL:", url);
}); });
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论