From fce950d4062cf908cd0d187a8996322fa2a70ec8 Mon Sep 17 00:00:00 2001 From: ajnart Date: Tue, 4 Aug 2026 18:31:23 +0200 Subject: [PATCH] test: wait for Home Assistant API readiness --- .../integrations/test/home-assistant.spec.ts | 66 +++++++++++++------ 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/packages/integrations/test/home-assistant.spec.ts b/packages/integrations/test/home-assistant.spec.ts index 608af1ce0..91952b37e 100644 --- a/packages/integrations/test/home-assistant.spec.ts +++ b/packages/integrations/test/home-assistant.spec.ts @@ -41,35 +41,37 @@ describe("Home Assistant integration", () => { test("Test connection should work", async () => { // Arrange const startedContainer = await prepareHomeAssistantContainerAsync(); - const homeAssistantIntegration = createHomeAssistantIntegration(startedContainer); + try { + const homeAssistantIntegration = createHomeAssistantIntegration(startedContainer); - // Act - const result = await homeAssistantIntegration.testConnectionAsync(); + // Act + const result = await homeAssistantIntegration.testConnectionAsync(); - // Assert - expect(result.success).toBe(true); - - // Cleanup - await startedContainer.stop(); - }, 30_000); // Timeout of 30 seconds + // Assert + expect(result.success).toBe(true); + } finally { + await startedContainer.stop(); + } + }, 60_000); test("Test connection should fail with wrong credentials", async () => { // Arrange const startedContainer = await prepareHomeAssistantContainerAsync(); - const homeAssistantIntegration = createHomeAssistantIntegration(startedContainer, "wrong-api-key"); + try { + const homeAssistantIntegration = createHomeAssistantIntegration(startedContainer, "wrong-api-key"); - // Act - const result = await homeAssistantIntegration.testConnectionAsync(); + // Act + const result = await homeAssistantIntegration.testConnectionAsync(); - // Assert - expect(result.success).toBe(false); - if (result.success) return; + // Assert + expect(result.success).toBe(false); + if (result.success) return; - expect(result.error).toBeInstanceOf(TestConnectionError); - expect(result.error.type).toBe("authorization"); - - // Cleanup - await startedContainer.stop(); - }, 30_000); // Timeout of 30 seconds + expect(result.error).toBeInstanceOf(TestConnectionError); + expect(result.error.type).toBe("authorization"); + } finally { + await startedContainer.stop(); + } + }, 60_000); }); const prepareHomeAssistantContainerAsync = async () => { @@ -77,9 +79,31 @@ const prepareHomeAssistantContainerAsync = async () => { const startedContainer = await homeAssistantContainer.start(); await startedContainer.exec(["unzip", "-o", "/tmp/config.zip", "-d", "/config"]); await startedContainer.restart(); + await waitForHomeAssistantApiAsync(startedContainer); return startedContainer; }; +const waitForHomeAssistantApiAsync = async (container: StartedTestContainer) => { + const url = `http://${container.getHost()}:${container.getMappedPort(8123)}/api/config`; + const deadline = Date.now() + 45_000; + + while (Date.now() < deadline) { + try { + const response = await fetch(url, { + headers: { Authorization: `Bearer ${DEFAULT_API_KEY}` }, + signal: AbortSignal.timeout(1_000), + }); + if (response.ok) return; + } catch { + // Home Assistant closes connections while restarting. Retry until the deadline. + } + await new Promise((resolve) => setTimeout(resolve, 250)); + } + + await container.stop(); + throw new Error("Home Assistant API did not become ready after restart"); +}; + const createHomeAssistantContainer = () => { return ( new GenericContainer(IMAGE_NAME)