update tests

This commit is contained in:
Alex Holliday committed 2026-09-16 11:40:42 -07:00
1 parent 20ce11497e
commit 011b93ecc1
4 files changed
+34 -34

No files matched your search

@@ -33,7 +33,7 @@ const createMockHttpProvider = () =>
const createMockSettingsService = (apiKey?: string) =>
({
getDBSettings: jest.fn().mockResolvedValue({ pagespeedApiKey: apiKey }),
getCachedDBSettings: jest.fn().mockResolvedValue({ pagespeedApiKey: apiKey }),
}) as unknown as jest.Mocked<ISettingsService>;
const createProvider = (opts?: { apiKey?: string }) => {
@@ -154,7 +154,7 @@ describe("PageSpeedProvider", () => {
const logger = createMockLogger();
const httpProvider = createMockHttpProvider();
const settingsService = {
getDBSettings: jest.fn().mockResolvedValue(null),
getCachedDBSettings: jest.fn().mockResolvedValue(null),
} as unknown as jest.Mocked<ISettingsService>;
const provider = new PageSpeedProvider(httpProvider, settingsService, logger as any);
+12 -12
View File
@@ -66,7 +66,7 @@ const degradedRepository = (overrides?: Record<string, any>) => ({
const createService = (overrides?: Record<string, any>) => {
const defaults = {
settingsService: { getDBSettings: jest.fn().mockResolvedValue(makeSettings()) },
settingsService: { getCachedDBSettings: jest.fn().mockResolvedValue(makeSettings()) },
egressStateRepository: {
findSingleton: jest.fn().mockResolvedValue(makeState()),
recordProbe: jest.fn().mockResolvedValue(makeState()),
@@ -201,7 +201,7 @@ describe("EgressService", () => {
describe("assessAfterFailure", () => {
it("returns null and does not probe or record when the feature is disabled", async () => {
const { service, defaults } = createService({
settingsService: { getDBSettings: jest.fn().mockResolvedValue(makeSettings({ egressCheckEnabled: false })) },
settingsService: { getCachedDBSettings: jest.fn().mockResolvedValue(makeSettings({ egressCheckEnabled: false })) },
});
const result = await service.assessAfterFailure();
@@ -299,7 +299,7 @@ describe("EgressService", () => {
it("uses the default poll interval for the recovery job when the setting is missing or invalid", async () => {
const { service, defaults } = createService({
settingsService: { getDBSettings: jest.fn().mockResolvedValue(makeSettings({ egressPollIntervalSeconds: undefined })) },
settingsService: { getCachedDBSettings: jest.fn().mockResolvedValue(makeSettings({ egressPollIntervalSeconds: undefined })) },
networkService: { requestStatus: statusFor([]) },
});
@@ -310,7 +310,7 @@ describe("EgressService", () => {
it("falls back to the default targets when the configured list is empty", async () => {
const { service, defaults } = createService({
settingsService: { getDBSettings: jest.fn().mockResolvedValue(makeSettings({ egressCheckTargets: [] })) },
settingsService: { getCachedDBSettings: jest.fn().mockResolvedValue(makeSettings({ egressCheckTargets: [] })) },
});
await service.assessAfterFailure();
@@ -320,7 +320,7 @@ describe("EgressService", () => {
it("returns null and logs when the assessment itself fails", async () => {
const { service, defaults } = createService({
settingsService: { getDBSettings: jest.fn().mockRejectedValue(new Error("db down")) },
settingsService: { getCachedDBSettings: jest.fn().mockRejectedValue(new Error("db down")) },
});
const result = await service.assessAfterFailure();
@@ -339,7 +339,7 @@ describe("EgressService", () => {
const results = await Promise.all([service.assessAfterFailure(), service.assessAfterFailure(), service.assessAfterFailure()]);
expect(results).toEqual(["ok", "ok", "ok"]);
expect(defaults.settingsService.getDBSettings).toHaveBeenCalledTimes(1);
expect(defaults.settingsService.getCachedDBSettings).toHaveBeenCalledTimes(1);
expect(defaults.networkService.requestStatus).toHaveBeenCalledTimes(2); // one call per target, once
expect(defaults.egressStateRepository.recordProbe).toHaveBeenCalledTimes(1);
});
@@ -372,18 +372,18 @@ describe("EgressService", () => {
});
it("reuses a disabled result instead of re-reading settings for every failure", async () => {
const getDBSettings = jest.fn().mockResolvedValue(makeSettings({ egressCheckEnabled: false }));
const { service } = createService({ settingsService: { getDBSettings } });
const getCachedDBSettings = jest.fn().mockResolvedValue(makeSettings({ egressCheckEnabled: false }));
const { service } = createService({ settingsService: { getCachedDBSettings } });
expect(await service.assessAfterFailure()).toBeNull();
expect(await service.assessAfterFailure()).toBeNull();
expect(getDBSettings).toHaveBeenCalledTimes(1);
expect(getCachedDBSettings).toHaveBeenCalledTimes(1);
});
it("does not cache an internal failure", async () => {
const getDBSettings = jest.fn().mockRejectedValueOnce(new Error("db down")).mockResolvedValue(makeSettings());
const { service, defaults } = createService({ settingsService: { getDBSettings } });
const getCachedDBSettings = jest.fn().mockRejectedValueOnce(new Error("db down")).mockResolvedValue(makeSettings());
const { service, defaults } = createService({ settingsService: { getCachedDBSettings } });
expect(await service.assessAfterFailure()).toBeNull();
expect(await service.assessAfterFailure()).toBe("ok");
@@ -451,7 +451,7 @@ describe("EgressService", () => {
it("releases the job without probing when the feature has been disabled mid-episode", async () => {
const { service, defaults } = createService({
settingsService: { getDBSettings: jest.fn().mockResolvedValue(makeSettings({ egressCheckEnabled: false })) },
settingsService: { getCachedDBSettings: jest.fn().mockResolvedValue(makeSettings({ egressCheckEnabled: false })) },
egressStateRepository: degradedRepository(),
});
@@ -27,7 +27,7 @@ const makeProxy = (overrides?: Partial<Proxy>): Proxy =>
const createResolver = (overrides?: Record<string, any>) => {
const defaults = {
proxiesRepository: { findByIdOrNull: jest.fn<() => Promise<Proxy | null>>().mockResolvedValue(makeProxy()) },
settingsService: { getCachedDbSettings: jest.fn<() => Promise<any>>().mockResolvedValue({ globalProxyEnabled: true, globalProxyId: "p1" }) },
settingsService: { getCachedDBSettings: jest.fn<() => Promise<any>>().mockResolvedValue({ globalProxyEnabled: true, globalProxyId: "p1" }) },
logger: createMockLogger(),
ttlMs: 60_000,
...overrides,
@@ -46,7 +46,7 @@ describe("ProxyResolver", () => {
expect(result).toBeUndefined();
expect(defaults.proxiesRepository.findByIdOrNull).not.toHaveBeenCalled();
expect(defaults.settingsService.getCachedDbSettings).not.toHaveBeenCalled();
expect(defaults.settingsService.getCachedDBSettings).not.toHaveBeenCalled();
});
it("returns undefined for proxyMode 'none' without calling settings", async () => {
@@ -55,7 +55,7 @@ describe("ProxyResolver", () => {
const result = await resolver.resolve(makeMonitor({ proxyMode: "none" }));
expect(result).toBeUndefined();
expect(defaults.settingsService.getCachedDbSettings).not.toHaveBeenCalled();
expect(defaults.settingsService.getCachedDBSettings).not.toHaveBeenCalled();
});
// ── custom mode ───────────────────────────────────────────────────────────
@@ -94,7 +94,7 @@ describe("ProxyResolver", () => {
it("returns undefined when the global proxy is disabled, without a repo call", async () => {
const { resolver, defaults } = createResolver({
settingsService: { getCachedDbSettings: jest.fn<() => Promise<any>>().mockResolvedValue({ globalProxyEnabled: false, globalProxyId: "p1" }) },
settingsService: { getCachedDBSettings: jest.fn<() => Promise<any>>().mockResolvedValue({ globalProxyEnabled: false, globalProxyId: "p1" }) },
});
const result = await resolver.resolve(makeMonitor({ proxyMode: "inherit" }));
@@ -114,7 +114,7 @@ describe("ProxyResolver", () => {
it("returns undefined when the global proxy is enabled but globalProxyId is null, without a repo call", async () => {
const { resolver, defaults } = createResolver({
settingsService: { getCachedDbSettings: jest.fn<() => Promise<any>>().mockResolvedValue({ globalProxyEnabled: true, globalProxyId: null }) },
settingsService: { getCachedDBSettings: jest.fn<() => Promise<any>>().mockResolvedValue({ globalProxyEnabled: true, globalProxyId: null }) },
});
const result = await resolver.resolve(makeMonitor({ proxyMode: "inherit" }));
@@ -140,7 +140,7 @@ describe("ProxyResolver", () => {
const result = await resolver.resolve(makeMonitor({ proxyMode: "garbage" as Monitor["proxyMode"] }));
expect(result).toBe("http://proxy.example.com:8080");
expect(defaults.settingsService.getCachedDbSettings).toHaveBeenCalled();
expect(defaults.settingsService.getCachedDBSettings).toHaveBeenCalled();
});
// ── never throws ──────────────────────────────────────────────────────────
@@ -158,7 +158,7 @@ describe("ProxyResolver", () => {
it("returns undefined and warns when the settings service throws", async () => {
const { resolver, defaults } = createResolver({
settingsService: { getCachedDbSettings: jest.fn<() => Promise<any>>().mockRejectedValue(new Error("db down")) },
settingsService: { getCachedDBSettings: jest.fn<() => Promise<any>>().mockRejectedValue(new Error("db down")) },
});
const result = await resolver.resolve(makeMonitor({ proxyMode: "inherit" }));
@@ -172,14 +172,14 @@ describe("SettingsService", () => {
});
});
// ── getCachedDbSettings ─────────────────────────────────────────────────
// ── getCachedDBSettings ─────────────────────────────────────────────────
describe("getCachedDbSettings", () => {
describe("getCachedDBSettings", () => {
it("serves a second call within the TTL from cache", async () => {
const { service, settingsRepository } = createService();
const first = await service.getCachedDbSettings();
const second = await service.getCachedDbSettings();
const first = await service.getCachedDBSettings();
const second = await service.getCachedDBSettings();
expect(second).toBe(first);
expect(settingsRepository.findSingleton).toHaveBeenCalledTimes(1);
@@ -188,8 +188,8 @@ describe("SettingsService", () => {
it("refetches after the TTL expires", async () => {
const { service, settingsRepository } = createService(undefined, 0);
await service.getCachedDbSettings();
await service.getCachedDbSettings();
await service.getCachedDBSettings();
await service.getCachedDBSettings();
expect(settingsRepository.findSingleton).toHaveBeenCalledTimes(2);
});
@@ -197,7 +197,7 @@ describe("SettingsService", () => {
it("shares one in-flight fetch between concurrent calls", async () => {
const { service, settingsRepository } = createService();
await Promise.all([service.getCachedDbSettings(), service.getCachedDbSettings(), service.getCachedDbSettings()]);
await Promise.all([service.getCachedDBSettings(), service.getCachedDBSettings(), service.getCachedDBSettings()]);
expect(settingsRepository.findSingleton).toHaveBeenCalledTimes(1);
});
@@ -206,17 +206,17 @@ describe("SettingsService", () => {
const { service, settingsRepository } = createService();
(settingsRepository.findSingleton as jest.Mock).mockRejectedValueOnce(new Error("db down")).mockResolvedValueOnce(makeSettings());
await expect(service.getCachedDbSettings()).rejects.toThrow("db down");
await expect(service.getCachedDbSettings()).resolves.toEqual(makeSettings());
await expect(service.getCachedDBSettings()).rejects.toThrow("db down");
await expect(service.getCachedDBSettings()).resolves.toEqual(makeSettings());
expect(settingsRepository.findSingleton).toHaveBeenCalledTimes(2);
});
it("refetches after updateDbSettings so the write is visible immediately", async () => {
const { service, settingsRepository } = createService();
await service.getCachedDbSettings();
await service.getCachedDBSettings();
await service.updateDbSettings({ checkTTL: 60 });
await service.getCachedDbSettings();
await service.getCachedDBSettings();
expect(settingsRepository.findSingleton).toHaveBeenCalledTimes(2);
});
@@ -224,9 +224,9 @@ describe("SettingsService", () => {
it("refetches after removeEgressNotification", async () => {
const { service, settingsRepository } = createService();
await service.getCachedDbSettings();
await service.getCachedDBSettings();
await service.removeEgressNotification("notif-1");
await service.getCachedDbSettings();
await service.getCachedDBSettings();
expect(settingsRepository.findSingleton).toHaveBeenCalledTimes(2);
});