test: enforce per-directory coverage thresholds

entities + use-cases + controllers must hit 100% (95% branches).
Project-wide baseline remains 80/75/80/80. Tightening these directories
reflects the architectural intent: these are the pure-logic layers and
should be exhaustively tested.

Added @vitest/coverage-v8@^3 to core-typescript, auth, blog,
marketing-pages, and navigation devDependencies.

Excluded from coverage (legitimately untestable):
- src/di/bind-production.ts — InversifyJS startup bootstrap
- src/application/repositories/** — pure TypeScript interfaces
- src/application/services/** — pure TypeScript interfaces (auth)
- src/integrations/cms/** — declarative Payload CMS config
- src/entities/cookie.ts — pure type aliases (auth)
- src/ui/** — React Query helpers, integration-tested in apps

Tests added (6 new files / 1 extended):
- auth/src/entities/errors.test.ts — UnauthenticatedError, UnauthorizedError,
  AuthenticationError, InputParseError constructors
- blog/src/entities/errors.test.ts — ArticleNotFoundError (default + custom
  message), InputParseError
- marketing-pages/src/entities/errors.test.ts — PageNotFoundError, InputParseError
- marketing-pages/src/entities/site-settings.test.ts — siteSettingsSchema
  (valid, no description, empty name rejection)
- navigation/src/entities/header.test.ts — headerItemSchema and headerSchema
  validation paths
- navigation/src/.../payload-header.repository.test.ts — logo relation-object,
  scalar-id, null, and null-item-field branches for full branch coverage

Spec: §6.9
This commit is contained in:
2026-05-05 19:51:34 +02:00
parent 98c25f3207
commit 9415eb1c5a
16 changed files with 510 additions and 3 deletions

View File

@@ -0,0 +1,39 @@
import { describe, expect, it } from "vitest";
import {
AuthenticationError,
UnauthenticatedError,
UnauthorizedError,
InputParseError,
} from "./errors";
describe("AuthenticationError", () => {
it("is an instance of Error with the given message", () => {
const err = new AuthenticationError("bad credentials");
expect(err).toBeInstanceOf(Error);
expect(err.message).toBe("bad credentials");
});
});
describe("UnauthenticatedError", () => {
it("is an instance of Error with the given message", () => {
const err = new UnauthenticatedError("not logged in");
expect(err).toBeInstanceOf(Error);
expect(err.message).toBe("not logged in");
});
});
describe("UnauthorizedError", () => {
it("is an instance of Error with the given message", () => {
const err = new UnauthorizedError("forbidden");
expect(err).toBeInstanceOf(Error);
expect(err.message).toBe("forbidden");
});
});
describe("InputParseError", () => {
it("is an instance of Error with the given message", () => {
const err = new InputParseError("invalid input");
expect(err).toBeInstanceOf(Error);
expect(err.message).toBe("invalid input");
});
});