refactor(navigation): factory-style use case + controller
- Use case (get-header) → factory function with IGetHeaderUseCase alias - Controller renamed header.controller.ts → get-header.controller.ts (verb-noun); converted to factory function with IGetHeaderController alias - DI module wires factories with .toDynamicValue() - tRPC router resolves controller via container - Use case + controller tests refactored to direct factory injection (no container rebinding) - container.test.ts verifies IGetHeaderUseCase + IGetHeaderController symbols Refactor log: §1, §4.1, §4.2, §5.1 Spec: §6.4 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,22 +1,12 @@
|
||||
import { beforeEach, describe, expect, it } from "vitest";
|
||||
import { navigationContainer } from "@/di/container";
|
||||
import { NAVIGATION_SYMBOLS } from "@/di/symbols";
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { getHeaderUseCase } from "@/application/use-cases/get-header.use-case";
|
||||
import { MockHeaderRepository } from "@/infrastructure/repositories/header.repository.mock";
|
||||
import type { IHeaderRepository } from "@/application/repositories/header.repository.interface";
|
||||
import { getHeaderUseCase } from "./get-header.use-case";
|
||||
|
||||
describe("getHeaderUseCase", () => {
|
||||
beforeEach(() => {
|
||||
if (navigationContainer.isBound(NAVIGATION_SYMBOLS.IHeaderRepository)) {
|
||||
navigationContainer.unbind(NAVIGATION_SYMBOLS.IHeaderRepository);
|
||||
}
|
||||
navigationContainer
|
||||
.bind<IHeaderRepository>(NAVIGATION_SYMBOLS.IHeaderRepository)
|
||||
.toConstantValue(new MockHeaderRepository());
|
||||
});
|
||||
|
||||
it("returns the seeded header items", async () => {
|
||||
const result = await getHeaderUseCase();
|
||||
const repo = new MockHeaderRepository();
|
||||
const useCase = getHeaderUseCase(repo);
|
||||
const result = await useCase();
|
||||
expect(result.items.length).toBeGreaterThan(0);
|
||||
expect(result.items[0]?.label).toBe("Home");
|
||||
});
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
import type { Header } from "../../entities/models/header";
|
||||
import { navigationContainer } from "../../di/container";
|
||||
import { NAVIGATION_SYMBOLS } from "../../di/symbols";
|
||||
import type { IHeaderRepository } from "../repositories/header.repository.interface";
|
||||
|
||||
export async function getHeaderUseCase(): Promise<Header> {
|
||||
const repo = navigationContainer.get<IHeaderRepository>(
|
||||
NAVIGATION_SYMBOLS.IHeaderRepository,
|
||||
);
|
||||
return repo.getHeader();
|
||||
}
|
||||
export type IGetHeaderUseCase = ReturnType<typeof getHeaderUseCase>;
|
||||
|
||||
export const getHeaderUseCase =
|
||||
(headerRepository: IHeaderRepository) =>
|
||||
async (): Promise<Header> => {
|
||||
return headerRepository.getHeader();
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user