feat(marketing-pages): add per-feature InversifyJS container

This commit is contained in:
2026-05-05 08:28:50 +02:00
parent e383c9ef3f
commit 875bae3fde
4 changed files with 63 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { marketingPagesContainer } from "./container";
import { MARKETING_PAGES_SYMBOLS } from "./symbols";
import { MarketingPagesModule } from "./module";
import { MockPagesRepository } from "@/infrastructure/repositories/mock-pages.repository";
import { MockSiteSettingsRepository } from "@/infrastructure/repositories/mock-site-settings.repository";
import type { IPagesRepository } from "@/application/repositories/pages-repository.interface";
import type { ISiteSettingsRepository } from "@/application/repositories/site-settings-repository.interface";
describe("marketingPagesContainer", () => {
beforeEach(() => {
marketingPagesContainer.unbindAll();
marketingPagesContainer.load(MarketingPagesModule);
});
afterEach(() => {
marketingPagesContainer.unbindAll();
});
it("resolves IPagesRepository to MockPagesRepository", () => {
const repo = marketingPagesContainer.get<IPagesRepository>(
MARKETING_PAGES_SYMBOLS.IPagesRepository,
);
expect(repo).toBeInstanceOf(MockPagesRepository);
});
it("resolves ISiteSettingsRepository to MockSiteSettingsRepository", () => {
const repo = marketingPagesContainer.get<ISiteSettingsRepository>(
MARKETING_PAGES_SYMBOLS.ISiteSettingsRepository,
);
expect(repo).toBeInstanceOf(MockSiteSettingsRepository);
});
});

View File

@@ -0,0 +1,8 @@
import "reflect-metadata";
import { Container } from "inversify";
import { MarketingPagesModule } from "./module";
export const marketingPagesContainer = new Container({
defaultScope: "Singleton",
});
marketingPagesContainer.load(MarketingPagesModule);

View File

@@ -0,0 +1,18 @@
import { ContainerModule, type interfaces } from "inversify";
import type { IPagesRepository } from "../application/repositories/pages-repository.interface";
import type { ISiteSettingsRepository } from "../application/repositories/site-settings-repository.interface";
import { MockPagesRepository } from "../infrastructure/repositories/mock-pages.repository";
import { MockSiteSettingsRepository } from "../infrastructure/repositories/mock-site-settings.repository";
import { MARKETING_PAGES_SYMBOLS } from "./symbols";
export const MarketingPagesModule = new ContainerModule(
(bind: interfaces.Bind) => {
bind<IPagesRepository>(MARKETING_PAGES_SYMBOLS.IPagesRepository).to(
MockPagesRepository,
);
bind<ISiteSettingsRepository>(
MARKETING_PAGES_SYMBOLS.ISiteSettingsRepository,
).to(MockSiteSettingsRepository);
},
);

View File

@@ -0,0 +1,4 @@
export const MARKETING_PAGES_SYMBOLS = {
IPagesRepository: Symbol.for("marketing-pages:IPagesRepository"),
ISiteSettingsRepository: Symbol.for("marketing-pages:ISiteSettingsRepository"),
} as const;