diff --git a/packages/blog/src/di/container.test.ts b/packages/blog/src/di/container.test.ts new file mode 100644 index 0000000..8ccd394 --- /dev/null +++ b/packages/blog/src/di/container.test.ts @@ -0,0 +1,36 @@ +import { afterEach, beforeEach, describe, expect, it } from "vitest"; +import { blogContainer } from "./container"; +import { BLOG_SYMBOLS } from "./symbols"; +import { BlogModule } from "./module"; +import { MockArticlesRepository } from "@/infrastructure/repositories/mock-articles.repository"; +import type { IArticlesRepository } from "@/application/repositories/articles-repository.interface"; + +describe("blogContainer", () => { + beforeEach(() => { + blogContainer.unbindAll(); + blogContainer.load(BlogModule); + }); + + afterEach(() => { + blogContainer.unbindAll(); + }); + + it("resolves IArticlesRepository to MockArticlesRepository by default binding", () => { + const repo = blogContainer.get( + BLOG_SYMBOLS.IArticlesRepository, + ); + expect(repo).toBeInstanceOf(MockArticlesRepository); + }); + + it("supports rebinding to a custom repo", () => { + blogContainer.unbind(BLOG_SYMBOLS.IArticlesRepository); + const custom = new MockArticlesRepository(); + blogContainer + .bind(BLOG_SYMBOLS.IArticlesRepository) + .toConstantValue(custom); + const resolved = blogContainer.get( + BLOG_SYMBOLS.IArticlesRepository, + ); + expect(resolved).toBe(custom); + }); +}); diff --git a/packages/blog/src/di/container.ts b/packages/blog/src/di/container.ts new file mode 100644 index 0000000..1624894 --- /dev/null +++ b/packages/blog/src/di/container.ts @@ -0,0 +1,6 @@ +import "reflect-metadata"; +import { Container } from "inversify"; +import { BlogModule } from "./module"; + +export const blogContainer = new Container({ defaultScope: "Singleton" }); +blogContainer.load(BlogModule); diff --git a/packages/blog/src/di/module.ts b/packages/blog/src/di/module.ts new file mode 100644 index 0000000..5bd4bcc --- /dev/null +++ b/packages/blog/src/di/module.ts @@ -0,0 +1,11 @@ +import { ContainerModule, type interfaces } from "inversify"; + +import type { IArticlesRepository } from "@/application/repositories/articles-repository.interface"; +import { MockArticlesRepository } from "@/infrastructure/repositories/mock-articles.repository"; +import { BLOG_SYMBOLS } from "./symbols"; + +export const BlogModule = new ContainerModule((bind: interfaces.Bind) => { + bind(BLOG_SYMBOLS.IArticlesRepository).to( + MockArticlesRepository, + ); +}); diff --git a/packages/blog/src/di/symbols.ts b/packages/blog/src/di/symbols.ts new file mode 100644 index 0000000..2033cfe --- /dev/null +++ b/packages/blog/src/di/symbols.ts @@ -0,0 +1,3 @@ +export const BLOG_SYMBOLS = { + IArticlesRepository: Symbol.for("blog:IArticlesRepository"), +} as const; diff --git a/packages/blog/vitest.config.ts b/packages/blog/vitest.config.ts index f115cc9..705772c 100644 --- a/packages/blog/vitest.config.ts +++ b/packages/blog/vitest.config.ts @@ -1,3 +1,11 @@ +import path from "path"; import { baseVitestConfig } from "@repo/typescript-config/vitest.base"; -export default baseVitestConfig; +export default { + ...baseVitestConfig, + resolve: { + alias: { + "@": path.resolve(__dirname, "./src"), + }, + }, +};