From 6d3f7e3e362a063cd0a09da9206f9d7c3726e1bc 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 | 60 ++++++++++--------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/packages/integrations/test/home-assistant.spec.ts b/packages/integrations/test/home-assistant.spec.ts index 5dc2be90e..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,27 +79,29 @@ const prepareHomeAssistantContainerAsync = async () => { const startedContainer = await homeAssistantContainer.start(); await startedContainer.exec(["unzip", "-o", "/tmp/config.zip", "-d", "/config"]); await startedContainer.restart(); - await waitForHomeAssistantAsync(startedContainer); + await waitForHomeAssistantApiAsync(startedContainer); return startedContainer; }; -const waitForHomeAssistantAsync = async (container: StartedTestContainer) => { +const waitForHomeAssistantApiAsync = async (container: StartedTestContainer) => { const url = `http://${container.getHost()}:${container.getMappedPort(8123)}/api/config`; + const deadline = Date.now() + 45_000; - for (let attempt = 0; attempt < 40; attempt++) { + 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 is still restarting. + // Home Assistant closes connections while restarting. Retry until the deadline. } - - await new Promise((resolve) => setTimeout(resolve, 500)); + await new Promise((resolve) => setTimeout(resolve, 250)); } - throw new Error("Home Assistant did not become ready after restart"); + await container.stop(); + throw new Error("Home Assistant API did not become ready after restart"); }; const createHomeAssistantContainer = () => {