From fa4f05e430888c1872018cde27eb3f364db49e01 Mon Sep 17 00:00:00 2001 From: Daniel van der Ploeg Date: Tue, 22 Jul 2025 15:47:47 +0930 Subject: [PATCH 1/2] fix: improve test isolation in graphql-mesh-server maintenance tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Changed beforeAll to beforeEach in whitelist.test.ts to ensure proper test isolation - Changed beforeAll to beforeEach in maintenance.test.ts to ensure proper test isolation - Prevents test interference when tests share file system state - Fixes flaky test failures in CI pipeline The issue was that tests were sharing file system state without proper reset between tests, causing race conditions and inconsistent results in different execution environments. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../assets/handlers/maintenance/maintenance.test.ts | 3 ++- .../assets/handlers/maintenance/whitelist.test.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/graphql-mesh-server/assets/handlers/maintenance/maintenance.test.ts b/packages/graphql-mesh-server/assets/handlers/maintenance/maintenance.test.ts index 74659916..a385f45d 100644 --- a/packages/graphql-mesh-server/assets/handlers/maintenance/maintenance.test.ts +++ b/packages/graphql-mesh-server/assets/handlers/maintenance/maintenance.test.ts @@ -26,7 +26,8 @@ const createMockEvent = ( const mockSites = { "example.com": false, "example.com.au": false }; describe("Lambda handler", () => { - beforeAll(() => { + beforeEach(() => { + // Reset the maintenance status before each test to ensure test isolation updateMaintenanceStatus(mockSites); }); diff --git a/packages/graphql-mesh-server/assets/handlers/maintenance/whitelist.test.ts b/packages/graphql-mesh-server/assets/handlers/maintenance/whitelist.test.ts index d8933a75..0f99c1a8 100644 --- a/packages/graphql-mesh-server/assets/handlers/maintenance/whitelist.test.ts +++ b/packages/graphql-mesh-server/assets/handlers/maintenance/whitelist.test.ts @@ -41,7 +41,8 @@ const mockAllowlist = [ "2001:4860:4860::8888", // Google DNS IPv6 ]; describe("Lambda handler", () => { - beforeAll(() => { + beforeEach(() => { + // Reset the whitelist before each test to ensure test isolation setWhitelist(mockAllowlist); }); From ecc4971923dc0cf44b6881f772cfaed208ffa0ba Mon Sep 17 00:00:00 2001 From: Daniel van der Ploeg Date: Tue, 22 Jul 2025 15:52:57 +0930 Subject: [PATCH 2/2] fix: improve file cleanup and test isolation in maintenance tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added proper file cleanup in beforeEach hooks to prevent race conditions - Fixed test dependency by setting up required state within individual tests - Ensures tests can run independently without relying on execution order - Fixes JSON parsing errors caused by corrupted files from concurrent access This addresses the remaining CI failures where tests were interfering with each other's file system state, causing "Unexpected end of JSON input" errors. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../handlers/maintenance/maintenance.test.ts | 17 +++++++++++++++++ .../handlers/maintenance/whitelist.test.ts | 7 +++++++ 2 files changed, 24 insertions(+) diff --git a/packages/graphql-mesh-server/assets/handlers/maintenance/maintenance.test.ts b/packages/graphql-mesh-server/assets/handlers/maintenance/maintenance.test.ts index a385f45d..198816bc 100644 --- a/packages/graphql-mesh-server/assets/handlers/maintenance/maintenance.test.ts +++ b/packages/graphql-mesh-server/assets/handlers/maintenance/maintenance.test.ts @@ -27,6 +27,13 @@ const mockSites = { "example.com": false, "example.com.au": false }; describe("Lambda handler", () => { beforeEach(() => { + // Clean up any existing maintenance files before each test + if (existsSync(`${cwd()}/maintenance.enabled`)) { + rmSync(`${cwd()}/maintenance.enabled`); + } + if (existsSync(`${cwd()}/maintenance.disabled`)) { + rmSync(`${cwd()}/maintenance.disabled`); + } // Reset the maintenance status before each test to ensure test isolation updateMaintenanceStatus(mockSites); }); @@ -52,7 +59,17 @@ describe("Lambda handler", () => { }); it("should handle POST'ing a disable all sites", async () => { + // First enable a site to set up the required state + const enableUpdate = { + sites: { "example.com": false, "example.com.au": true }, + }; + const enableEvent = createMockEvent("POST", JSON.stringify(enableUpdate)); + await handler(enableEvent); + + // Verify the file is in enabled state as expected expect(existsSync(`${cwd()}/maintenance.enabled`)).toBe(true); + + // Now test disabling all sites const mockUpdate = { sites: { "example.com": false, "example.com.au": false }, }; diff --git a/packages/graphql-mesh-server/assets/handlers/maintenance/whitelist.test.ts b/packages/graphql-mesh-server/assets/handlers/maintenance/whitelist.test.ts index 0f99c1a8..08f47fdf 100644 --- a/packages/graphql-mesh-server/assets/handlers/maintenance/whitelist.test.ts +++ b/packages/graphql-mesh-server/assets/handlers/maintenance/whitelist.test.ts @@ -42,6 +42,13 @@ const mockAllowlist = [ ]; describe("Lambda handler", () => { beforeEach(() => { + // Clean up any existing maintenance files before each test + if (existsSync(`${cwd()}/maintenance.enabled`)) { + rmSync(`${cwd()}/maintenance.enabled`); + } + if (existsSync(`${cwd()}/maintenance.disabled`)) { + rmSync(`${cwd()}/maintenance.disabled`); + } // Reset the whitelist before each test to ensure test isolation setWhitelist(mockAllowlist); });