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

> 43 lines of code and 15 definitions.

Tree: Codebase Testing
Language: typescript
Canonical: https://banes-lab.com/anatomy/testing#file-testing-test-deploy-core-reporters-webhook-fixture-ts
Source text: https://banes-lab.com/source/testing/test.deploy/core/reporters/webhook.fixture.ts.txt

Listed in [test.deploy/core/reporters](https://banes-lab.com/api/source/testing/test.deploy/core/reporters.md), after [test.deploy/core/reporters/notification.reporter.test.ts](https://banes-lab.com/source/testing/test.deploy/core/reporters/notification.reporter.test.ts.md).

## Definitions

- `isRecord` (lexical_declaration, line 30)
- `titleIn` (lexical_declaration, line 34)
- `titleOf` (lexical_declaration, line 47, exported)
- `FetchMock` (type_alias_declaration, line 5, exported)
- `stubFetch` (lexical_declaration, line 7, exported)
- `fetchMock` (lexical_declaration, line 8, exported)
- `requestOf` (lexical_declaration, line 13, exported)
- `[, request]` (lexical_declaration, line 14, exported)
- `rawPayloadOf` (lexical_declaration, line 18)
- `{ body }` (lexical_declaration, line 19)
- `entry` (lexical_declaration, line 24)
- `{ embeds }` (lexical_declaration, line 38)
- `entries` (lexical_declaration, line 42)
- `[first]` (lexical_declaration, line 43)
- `parsed` (lexical_declaration, line 48, exported)

## Contained in

- [test.deploy/core/reporters](https://banes-lab.com/anatomy/testing/folder-testing-test-deploy-core-reporters.md)

## Linked from

- [test.deploy/core/reporters](https://banes-lab.com/anatomy/testing/folder-testing-test-deploy-core-reporters.md)

## Source

```typescript
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);
};
```
