From 141e007d22537632d6cc6dace8aeb0ace939da11 Mon Sep 17 00:00:00 2001 From: Danijel Martinek Date: Tue, 5 May 2026 08:28:12 +0200 Subject: [PATCH] feat(marketing-pages): add getPageBySlugUseCase (test red until DI lands) --- .../get-page-by-slug.use-case.test.ts | 30 +++++++++++++++++++ .../use-cases/get-page-by-slug.use-case.ts | 13 ++++++++ 2 files changed, 43 insertions(+) create mode 100644 packages/marketing-pages/src/application/use-cases/get-page-by-slug.use-case.test.ts create mode 100644 packages/marketing-pages/src/application/use-cases/get-page-by-slug.use-case.ts diff --git a/packages/marketing-pages/src/application/use-cases/get-page-by-slug.use-case.test.ts b/packages/marketing-pages/src/application/use-cases/get-page-by-slug.use-case.test.ts new file mode 100644 index 0000000..24aab56 --- /dev/null +++ b/packages/marketing-pages/src/application/use-cases/get-page-by-slug.use-case.test.ts @@ -0,0 +1,30 @@ +import { beforeEach, describe, expect, it } from "vitest"; +import { marketingPagesContainer } from "@/di/container"; +import { MARKETING_PAGES_SYMBOLS } from "@/di/symbols"; +import { MockPagesRepository } from "@/infrastructure/repositories/mock-pages.repository"; +import type { IPagesRepository } from "@/application/repositories/pages-repository.interface"; +import { getPageBySlugUseCase } from "./get-page-by-slug.use-case"; + +describe("getPageBySlugUseCase", () => { + let repo: MockPagesRepository; + + beforeEach(() => { + if (marketingPagesContainer.isBound(MARKETING_PAGES_SYMBOLS.IPagesRepository)) { + marketingPagesContainer.unbind(MARKETING_PAGES_SYMBOLS.IPagesRepository); + } + repo = new MockPagesRepository(); + marketingPagesContainer + .bind(MARKETING_PAGES_SYMBOLS.IPagesRepository) + .toConstantValue(repo); + }); + + it("returns the page when found", async () => { + const result = await getPageBySlugUseCase("about"); + expect(result?.slug).toBe("about"); + }); + + it("returns undefined when not found", async () => { + const result = await getPageBySlugUseCase("missing-page"); + expect(result).toBeUndefined(); + }); +}); diff --git a/packages/marketing-pages/src/application/use-cases/get-page-by-slug.use-case.ts b/packages/marketing-pages/src/application/use-cases/get-page-by-slug.use-case.ts new file mode 100644 index 0000000..f4b7954 --- /dev/null +++ b/packages/marketing-pages/src/application/use-cases/get-page-by-slug.use-case.ts @@ -0,0 +1,13 @@ +import type { Page } from "../../entities/page"; +import { marketingPagesContainer } from "../../di/container"; +import { MARKETING_PAGES_SYMBOLS } from "../../di/symbols"; +import type { IPagesRepository } from "../repositories/pages-repository.interface"; + +export async function getPageBySlugUseCase( + slug: string, +): Promise { + const repo = marketingPagesContainer.get( + MARKETING_PAGES_SYMBOLS.IPagesRepository, + ); + return repo.getPageBySlug(slug); +}