* feat: add test integration for pi-hole * refactor: test integration for pi-hole * fix: multiple secrets of same type could be used for integration creation * fix: remove integration test connection test and add mock for test-connection function * fix: add missing onUpdateFn to mysql integration secrets * fix: format issues * feat: add home assistant test connection * fix: deepsource issues * test: add system integration tests for test connection * fix: add before all for pulling home assistant image * test: add unit tests for handleTestConnectionResponseAsync * test: add unit test for testConnectionAsync * test: add mroe tests to integration-test-connection * fix: deepsource issues * fix: deepsource issue * chore: address pull request feedback
82 lines
2.9 KiB
TypeScript
82 lines
2.9 KiB
TypeScript
import type { StartedTestContainer } from "testcontainers";
|
|
import { GenericContainer, getContainerRuntimeClient, ImageName, Wait } from "testcontainers";
|
|
import { beforeAll, describe, expect, test } from "vitest";
|
|
|
|
import { HomeAssistantIntegration, IntegrationTestConnectionError } from "../src";
|
|
|
|
const DEFAULT_API_KEY =
|
|
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkNjQwY2VjNDFjOGU0NGM5YmRlNWQ4ZmFjMjUzYWViZiIsImlhdCI6MTcxODQ3MTE1MSwiZXhwIjoyMDMzODMxMTUxfQ.uQCZ5FZTokipa6N27DtFhLHkwYEXU1LZr0fsVTryL2Q";
|
|
const IMAGE_NAME = "ghcr.io/home-assistant/home-assistant:stable";
|
|
|
|
describe("Home Assistant integration", () => {
|
|
beforeAll(async () => {
|
|
const containerRuntimeClient = await getContainerRuntimeClient();
|
|
await containerRuntimeClient.image.pull(ImageName.fromString(IMAGE_NAME));
|
|
}, 100_000);
|
|
|
|
test("Test connection should work", async () => {
|
|
// Arrange
|
|
const startedContainer = await prepareHomeAssistantContainerAsync();
|
|
const homeAssistantIntegration = createHomeAssistantIntegration(startedContainer);
|
|
|
|
// Act
|
|
const actAsync = async () => await homeAssistantIntegration.testConnectionAsync();
|
|
|
|
// Assert
|
|
await expect(actAsync()).resolves.not.toThrow();
|
|
|
|
// Cleanup
|
|
await startedContainer.stop();
|
|
}, 20_000); // Timeout of 20 seconds
|
|
test("Test connection should fail with wrong credentials", async () => {
|
|
// Arrange
|
|
const startedContainer = await prepareHomeAssistantContainerAsync();
|
|
const homeAssistantIntegration = createHomeAssistantIntegration(startedContainer, "wrong-api-key");
|
|
|
|
// Act
|
|
const actAsync = async () => await homeAssistantIntegration.testConnectionAsync();
|
|
|
|
// Assert
|
|
await expect(actAsync()).rejects.toThrow(IntegrationTestConnectionError);
|
|
|
|
// Cleanup
|
|
await startedContainer.stop();
|
|
}, 20_000); // Timeout of 20 seconds
|
|
});
|
|
|
|
const prepareHomeAssistantContainerAsync = async () => {
|
|
const homeAssistantContainer = createHomeAssistantContainer();
|
|
const startedContainer = await homeAssistantContainer.start();
|
|
|
|
await startedContainer.exec(["unzip", "-o", "/tmp/config.zip", "-d", "/config"]);
|
|
await startedContainer.restart();
|
|
return startedContainer;
|
|
};
|
|
|
|
const createHomeAssistantContainer = () => {
|
|
return new GenericContainer(IMAGE_NAME)
|
|
.withCopyFilesToContainer([
|
|
{
|
|
source: __dirname + "/volumes/home-assistant-config.zip",
|
|
target: "/tmp/config.zip",
|
|
},
|
|
])
|
|
.withPrivilegedMode()
|
|
.withExposedPorts(8123)
|
|
.withWaitStrategy(Wait.forHttp("/", 8123));
|
|
};
|
|
|
|
const createHomeAssistantIntegration = (container: StartedTestContainer, apiKeyOverride?: string) => {
|
|
return new HomeAssistantIntegration({
|
|
id: "1",
|
|
decryptedSecrets: [
|
|
{
|
|
kind: "apiKey",
|
|
value: apiKeyOverride ?? DEFAULT_API_KEY,
|
|
},
|
|
],
|
|
name: "Home assistant",
|
|
url: `http://${container.getHost()}:${container.getMappedPort(8123)}`,
|
|
});
|
|
};
|