refactor: extract isStatusUp utility to decouple from got's response.ok and modified utils test accordingly
This commit is contained in:
1 parent
372fc9869b
commit
5628c202f7
5 files changed
+50
-8
No files matched your search
@@ -3,6 +3,7 @@ import { supportsGeoCheck, type HttpStatusCode } from "@/types/monitor.js";
|
||||
import { MonitorType } from "@/types/index.js";
|
||||
import type { ILogger } from "@/utils/logger.js";
|
||||
import got from "got";
|
||||
import { isStatusUp } from "@/service/infrastructure/network/utils.js";
|
||||
|
||||
const SERVICE_NAME = "GlobalPingService";
|
||||
const GLOBAL_PING_API_BASE = "https://api.globalping.io/v1";
|
||||
@@ -209,8 +210,7 @@ export class GlobalPingService implements IGlobalPingService {
|
||||
|
||||
successfulResults.push({
|
||||
location,
|
||||
status:
|
||||
customUpCodes.includes(probeResult.result.statusCode) || (probeResult.result.statusCode >= 200 && probeResult.result.statusCode < 300),
|
||||
status: isStatusUp(probeResult.result.statusCode, customUpCodes),
|
||||
statusCode: probeResult.result.statusCode,
|
||||
timings,
|
||||
});
|
||||
|
||||
@@ -5,7 +5,7 @@ import { HttpStatusPayload } from "@/types/network.js";
|
||||
import { MonitorStatusResponse } from "@/types/network.js";
|
||||
import { Agent as HttpsAgent } from "https";
|
||||
import { Monitor, MonitorType } from "@/types/monitor.js";
|
||||
import { NETWORK_ERROR } from "@/service/infrastructure/network/utils.js";
|
||||
import { NETWORK_ERROR, isStatusUp } from "@/service/infrastructure/network/utils.js";
|
||||
import CacheableLookup from "cacheable-lookup";
|
||||
|
||||
export class HttpProvider implements IStatusProvider<HttpStatusPayload> {
|
||||
@@ -32,7 +32,7 @@ export class HttpProvider implements IStatusProvider<HttpStatusPayload> {
|
||||
private handleHttpError<T>(error: unknown, monitor: Monitor): MonitorStatusResponse<T> {
|
||||
if (error instanceof HTTPError || error instanceof RequestError) {
|
||||
const statusCode = error.response?.statusCode;
|
||||
const statusUp = statusCode !== undefined && monitor.customUpCodes.includes(statusCode);
|
||||
const statusUp = isStatusUp(statusCode, monitor.customUpCodes);
|
||||
|
||||
return {
|
||||
monitorId: monitor.id,
|
||||
@@ -105,7 +105,7 @@ export class HttpProvider implements IStatusProvider<HttpStatusPayload> {
|
||||
}
|
||||
|
||||
const matchResult = this.advancedMatcher.validate<T>(payload, monitor);
|
||||
const statusUp = monitor.customUpCodes.includes(response.statusCode) || response.ok;
|
||||
const statusUp = isStatusUp(response.statusCode, monitor.customUpCodes);
|
||||
return {
|
||||
monitorId: monitor.id,
|
||||
teamId: monitor.teamId,
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import type { HttpStatusCode } from "@/types/monitor.js";
|
||||
|
||||
export const timeRequest = async <T>(operation: () => Promise<T>): Promise<{ response: T | null; responseTime: number; error: unknown }> => {
|
||||
const start = process.hrtime.bigint();
|
||||
try {
|
||||
@@ -12,3 +14,8 @@ export const timeRequest = async <T>(operation: () => Promise<T>): Promise<{ res
|
||||
|
||||
export const NETWORK_ERROR = 5000;
|
||||
export const PING_ERROR = 5001;
|
||||
|
||||
export const isStatusUp = (statusCode: number | undefined, customUpCodes: HttpStatusCode[] = []): boolean => {
|
||||
if (statusCode === undefined) return false;
|
||||
return (statusCode >= 200 && statusCode < 300) || customUpCodes.includes(statusCode);
|
||||
};
|
||||
@@ -254,14 +254,13 @@ describe("HttpProvider", () => {
|
||||
expect(result.extracted).toBe("value");
|
||||
});
|
||||
|
||||
it("sets status to false when response.ok is false even if matcher passes", async () => {
|
||||
it("sets status to false when status code is non-2xx even if matcher passes", async () => {
|
||||
mockGot.mockResolvedValue(makeGotResponse({ ok: false, statusCode: 301 }));
|
||||
const matcher = createMockMatcher({ ok: true, message: "Success" });
|
||||
const { provider } = createProvider(matcher);
|
||||
|
||||
const result = await provider.handle(makeMonitor());
|
||||
|
||||
// status = response.ok && matchResult.ok
|
||||
expect(result.status).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { describe, expect, it } from "@jest/globals";
|
||||
import { timeRequest, NETWORK_ERROR, PING_ERROR } from "../../../../src/service/infrastructure/network/utils.ts";
|
||||
import { timeRequest, NETWORK_ERROR, PING_ERROR, isStatusUp } from "../../../../src/service/infrastructure/network/utils.ts";
|
||||
|
||||
describe("network utils", () => {
|
||||
describe("timeRequest", () => {
|
||||
@@ -41,4 +41,40 @@ describe("network utils", () => {
|
||||
expect(PING_ERROR).toBe(5001);
|
||||
});
|
||||
});
|
||||
|
||||
describe("isStatusUp", () => {
|
||||
it("returns true for 2xx status codes", () => {
|
||||
expect(isStatusUp(200)).toBe(true);
|
||||
expect(isStatusUp(201)).toBe(true);
|
||||
expect(isStatusUp(204)).toBe(true);
|
||||
expect(isStatusUp(299)).toBe(true);
|
||||
});
|
||||
|
||||
it("returns false for non-2xx status codes without customUpCodes", () => {
|
||||
expect(isStatusUp(100)).toBe(false);
|
||||
expect(isStatusUp(301)).toBe(false);
|
||||
expect(isStatusUp(404)).toBe(false);
|
||||
expect(isStatusUp(500)).toBe(false);
|
||||
});
|
||||
|
||||
it("returns true when status code is in customUpCodes", () => {
|
||||
expect(isStatusUp(301, [301])).toBe(true);
|
||||
expect(isStatusUp(404, [200, 404])).toBe(true);
|
||||
expect(isStatusUp(401, [401, 403])).toBe(true);
|
||||
});
|
||||
|
||||
it("returns false when status code is not in customUpCodes", () => {
|
||||
expect(isStatusUp(500, [401, 403])).toBe(false);
|
||||
});
|
||||
|
||||
it("returns false when statusCode is undefined", () => {
|
||||
expect(isStatusUp(undefined)).toBe(false);
|
||||
expect(isStatusUp(undefined, [200])).toBe(false);
|
||||
});
|
||||
|
||||
it("defaults customUpCodes to empty array", () => {
|
||||
expect(isStatusUp(200)).toBe(true);
|
||||
expect(isStatusUp(404)).toBe(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user