# test.govlab/docs/core/validators/manifest.validator.test.ts

> 44 lines of code and 0 definitions.

Tree: Codebase Testing
Language: typescript
Canonical: https://banes-lab.com/anatomy/testing#file-testing-test-govlab-docs-core-validators-manifest-validator-test-ts
Source text: https://banes-lab.com/source/testing/test.govlab/docs/core/validators/manifest.validator.test.ts.txt

Listed in [test.govlab/docs/core/validators](https://banes-lab.com/api/source/testing/test.govlab/docs/core/validators.md), after [test.govlab/docs/core/validators/manifest.prose.validator.test.ts](https://banes-lab.com/source/testing/test.govlab/docs/core/validators/manifest.prose.validator.test.ts.md) and before [test.govlab/docs/core/validators/metadata.validator.test.ts](https://banes-lab.com/source/testing/test.govlab/docs/core/validators/metadata.validator.test.ts.md).

## Contained in

- [test.govlab/docs/core/validators](https://banes-lab.com/anatomy/testing/folder-testing-test-govlab-docs-core-validators.md)

## Source

```typescript
import { describe, expect, it } from "vitest";
import { validateManifest } from "@govlab/docs/core/validators/manifest.validator.ts";

const VALID = {
    ecosystem: "typescript",
    incompatibleWith: [],
    label: "X",
    maturity: "stable",
    overlaps: [],
    summary: "y",
    supersedes: [],
    visibility: { hidden: false, private: false },
};

describe("validateManifest", () => {
    it("accepts a well-formed manifest and refuses one that is not an object", () => {
        expect(validateManifest(VALID)).toStrictEqual([]);
        expect(validateManifest("x")).toHaveLength(1);
    });

    it("reports missing required fields and a missing visibility block", () => {
        const errors = validateManifest({ visibility: {} });
        expect(errors.some((error) => error.includes("label"))).toBe(true);
        expect(errors.some((error) => error.includes("maturity"))).toBe(true);
        expect(
            validateManifest({ label: "a", maturity: "stable", summary: "b" }).some((error) =>
                error.includes("visibility"),
            ),
        ).toBe(true);
    });

    it("reports a declared computed field and an unknown key", () => {
        const errors = validateManifest({ ...VALID, bogus: 1, requires: [] });
        expect(errors.some((error) => error.includes("computed field 'requires'"))).toBe(true);
        expect(errors.some((error) => error.includes("unknown key 'bogus'"))).toBe(true);
    });

    it("reports a malformed relationship, capability list and visibility flag", () => {
        const errors = validateManifest({
            ...VALID,
            capabilities: [""],
            overlaps: [{ package: "a" }],
            visibility: { private: "yes" },
        });
        expect(errors.some((error) => error.includes("overlaps"))).toBe(true);
        expect(errors.some((error) => error.includes("capabilities"))).toBe(true);
        expect(errors.some((error) => error.includes("visibility.private"))).toBe(true);
    });
});
```
