import { describe, it, expect } from "vitest"; import { getArticleBySlugController } from "@/interface-adapters/controllers/get-article-by-slug.controller"; import { MockArticlesRepository } from "@/infrastructure/repositories/articles.repository.mock"; import { getArticleBySlugUseCase } from "@/application/use-cases/get-article-by-slug.use-case"; import { InputParseError } from "@/entities/errors/common"; import { ArticleNotFoundError } from "@/entities/errors/article"; import { articleFactory } from "@/__factories__/article.factory"; describe("getArticleBySlugController", () => { it("returns article when slug exists", async () => { const repo = new MockArticlesRepository(); const seed = articleFactory.build({ slug: "test-slug" }); await repo.createArticle(seed); const useCase = getArticleBySlugUseCase(repo); const controller = getArticleBySlugController(useCase); const result = await controller({ slug: "test-slug" }); expect(result.slug).toBe("test-slug"); }); it("throws ArticleNotFoundError for missing slug", async () => { const repo = new MockArticlesRepository(); const useCase = getArticleBySlugUseCase(repo); const controller = getArticleBySlugController(useCase); await expect(controller({ slug: "nope" })).rejects.toBeInstanceOf(ArticleNotFoundError); }); it("throws InputParseError on empty slug", async () => { const repo = new MockArticlesRepository(); const useCase = getArticleBySlugUseCase(repo); const controller = getArticleBySlugController(useCase); await expect( controller({} as { slug: string }), ).rejects.toBeInstanceOf(InputParseError); }); });