Files
Homarr/packages/integrations/test/base.spec.ts

58 lines
1.8 KiB
TypeScript

import { describe, expect, test, vi } from "vitest";
import { ResponseError } from "@homarr/common/server";
import { createDb } from "@homarr/db/test";
import type { IntegrationTestingInput } from "../src/base/integration";
import { Integration } from "../src/base/integration";
import type { TestingResult } from "../src/base/test-connection/test-connection-service";
vi.mock("@homarr/db", async (importActual) => {
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
const actual = await importActual<typeof import("@homarr/db")>();
return {
...actual,
db: createDb(),
};
});
describe("Base integration", () => {
test("testConnectionAsync should handle errors", async () => {
const responseError = new ResponseError({ status: 500, url: "https://example.com" });
const integration = new FakeIntegration(undefined, responseError);
const result = await integration.testConnectionAsync();
expect(result.success).toBe(false);
if (result.success) return;
expect(result.error.type === "statusCode").toBe(true);
if (result.error.type !== "statusCode") return;
expect(result.error.data.statusCode).toBe(500);
expect(result.error.data.url).toContain("https://example.com");
expect(result.error.data.reason).toBe("internalServerError");
});
});
class FakeIntegration extends Integration {
constructor(
private testingResult?: TestingResult,
private error?: Error,
) {
super({
id: "test",
name: "Test",
url: "https://example.com",
decryptedSecrets: [],
});
}
// eslint-disable-next-line no-restricted-syntax
protected testingAsync(_: IntegrationTestingInput): Promise<TestingResult> {
if (this.error) {
return Promise.reject(this.error);
}
return Promise.resolve(this.testingResult ?? { success: true });
}
}