* 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
53 lines
2.1 KiB
TypeScript
53 lines
2.1 KiB
TypeScript
import { Integration } from "../base/integration";
|
|
import { IntegrationTestConnectionError } from "../base/test-connection-error";
|
|
import type { DnsHoleSummaryIntegration } from "../interfaces/dns-hole-summary/dns-hole-summary-integration";
|
|
import type { DnsHoleSummary } from "../interfaces/dns-hole-summary/dns-hole-summary-types";
|
|
import { summaryResponseSchema } from "./pi-hole-types";
|
|
|
|
export class PiHoleIntegration extends Integration implements DnsHoleSummaryIntegration {
|
|
public async getSummaryAsync(): Promise<DnsHoleSummary> {
|
|
const apiKey = super.getSecretValue("apiKey");
|
|
const response = await fetch(`${this.integration.url}/admin/api.php?summaryRaw&auth=${apiKey}`);
|
|
if (!response.ok) {
|
|
throw new Error(
|
|
`Failed to fetch summary for ${this.integration.name} (${this.integration.id}): ${response.statusText}`,
|
|
);
|
|
}
|
|
|
|
const result = summaryResponseSchema.safeParse(await response.json());
|
|
|
|
if (!result.success) {
|
|
throw new Error(
|
|
`Failed to parse summary for ${this.integration.name} (${this.integration.id}), most likely your api key is wrong: ${result.error.message}`,
|
|
);
|
|
}
|
|
|
|
return {
|
|
adsBlockedToday: result.data.ads_blocked_today,
|
|
adsBlockedTodayPercentage: result.data.ads_percentage_today,
|
|
domainsBeingBlocked: result.data.domains_being_blocked,
|
|
dnsQueriesToday: result.data.dns_queries_today,
|
|
};
|
|
}
|
|
|
|
public async testConnectionAsync(): Promise<void> {
|
|
const apiKey = super.getSecretValue("apiKey");
|
|
|
|
await super.handleTestConnectionResponseAsync({
|
|
queryFunctionAsync: async () => {
|
|
return await fetch(`${this.integration.url}/admin/api.php?status&auth=${apiKey}`);
|
|
},
|
|
handleResponseAsync: async (response) => {
|
|
try {
|
|
const result = (await response.json()) as unknown;
|
|
if (typeof result === "object" && result !== null && "status" in result) return;
|
|
} catch (error) {
|
|
throw new IntegrationTestConnectionError("invalidJson");
|
|
}
|
|
|
|
throw new IntegrationTestConnectionError("invalidCredentials");
|
|
},
|
|
});
|
|
}
|
|
}
|