test.deploy/core/reporters/webhook.fixture.ts

test.deploy/core/reporters/webhook.fixture.ts is a file in Codebase Testing. 43 lines of code and 15 definitions.

import { type Mock, vi } from "vitest";
import { PAYLOAD_FIELD } from "@banes-lab/deploy/configuration/constants/discord.constants.ts";
import type { WebhookRequest } from "@banes-lab/deploy/types/discord.types.ts";

export type FetchMock = Mock<typeof fetch>;

export const stubFetch = function stubFetch(status = 204, statusText = ""): FetchMock {
    const fetchMock = vi.fn<typeof fetch>().mockResolvedValue(new Response(null, { status, statusText }));
    vi.stubGlobal("fetch", fetchMock);
    return fetchMock;
};

export const requestOf = function requestOf(fetchMock: FetchMock): WebhookRequest {
    const [, request] = fetchMock.mock.calls[0] ?? [];
    return request ?? {};
};

const rawPayloadOf = function rawPayloadOf(request: WebhookRequest): string {
    const { body } = request;
    if (typeof body === "string") {
        return body;
    }
    if (body instanceof FormData) {
        const entry = body.get(PAYLOAD_FIELD);
        return typeof entry === "string" ? entry : "";
    }
    return "";
};

const isRecord = function isRecord(value: unknown): value is Record<string, unknown> {
    return typeof value === "object" && value !== null;
};

const titleIn = function titleIn(payload: unknown): string {
    if (!isRecord(payload)) {
        return "";
    }
    const { embeds } = payload;
    if (!Array.isArray(embeds)) {
        return "";
    }
    const entries: unknown[] = embeds;
    const [first] = entries;
    return isRecord(first) && typeof first["title"] === "string" ? first["title"] : "";
};

export const titleOf = function titleOf(fetchMock: FetchMock): string {
    const parsed: unknown = JSON.parse(rawPayloadOf(requestOf(fetchMock)));
    return titleIn(parsed);
};