From c8d9680b74b82b6c3916b9f980d718fc3fd16b09 Mon Sep 17 00:00:00 2001 From: Romain Lenzotti Date: Tue, 9 Apr 2024 09:53:43 +0200 Subject: [PATCH] test(di): update unit test to reproduce issue Closes: #2660 --- packages/di/src/node/services/DITest.spec.ts | 97 +++++++++++++++----- 1 file changed, 75 insertions(+), 22 deletions(-) diff --git a/packages/di/src/node/services/DITest.spec.ts b/packages/di/src/node/services/DITest.spec.ts index 2901078c5d7..437cf65c1a2 100644 --- a/packages/di/src/node/services/DITest.spec.ts +++ b/packages/di/src/node/services/DITest.spec.ts @@ -1,26 +1,57 @@ -import {Inject, Injectable, InjectorService, registerProvider} from "../../index"; +import {Logger} from "@tsed/logger"; +import {Inject, Injectable, InjectorService, registerProvider, Service} from "../../index"; import {DITest} from "../services/DITest"; -@Injectable() -export class MyService { - @Inject("TOKEN") - token: any; -} +class Model {} + +const SQLITE_DATA_SOURCE = Symbol.for("SQLITE_DATA_SOURCE"); registerProvider({ - provide: "TOKEN", - useFactory() { - return {token: "token"}; + provide: SQLITE_DATA_SOURCE, + type: "typeorm:datasource", + deps: [Logger], + useAsyncFactory(logger: Logger) { + return Promise.resolve({ + id: "sqlite" + }); } }); + +export abstract class AbstractDao { + private readonly dao: any; + + protected constructor( + protected readonly ds: any, + model: any + ) { + this.dao = ds.getRepository(model); + } + + getRepository(transaction?: any): any { + return transaction ? transaction.getRepository(this.dao.target) : this.dao; + } +} + +@Injectable() +export class FileDao extends AbstractDao { + public constructor(@Inject(SQLITE_DATA_SOURCE) protected ds: any) { + super(ds, Model); + } +} + describe("DITest", () => { describe("create()", () => { beforeEach(() => DITest.create({ imports: [ { - token: "TOKEN", - use: {token: "test"} + token: SQLITE_DATA_SOURCE, + use: { + initialize: jest.fn(), + getRepository: jest.fn().mockReturnValue({ + repository: true + }) + } }, { token: InjectorService, // not possible to override the injector @@ -32,31 +63,53 @@ describe("DITest", () => { afterEach(() => DITest.reset()); it("should return a service with pre mocked dependencies", () => { - const service = DITest.get(MyService); + const service = DITest.get(FileDao); + const repository = DITest.get(SQLITE_DATA_SOURCE); - expect(service.token).toEqual({ - token: "test" + expect(repository.getRepository).toHaveBeenCalledWith(Model); + + const result = service.getRepository(); + + expect(result).toEqual({ + repository: true }); }); it("should return a service with pre mocked dependencies (invoke)", async () => { - const service = await DITest.invoke(MyService); + const service = await DITest.invoke(FileDao); + + const repository = DITest.get(SQLITE_DATA_SOURCE); - expect(service.token).toEqual({ - token: "test" + expect(repository.getRepository).toHaveBeenCalledWith(Model); + + const result = service.getRepository(); + + expect(result).toEqual({ + repository: true }); }); it("should return a service with pre mocked dependencies (invoke + mock)", async () => { - const service = await DITest.invoke(MyService, [ + const service = await DITest.invoke(FileDao, [ { - token: "TOKEN", - use: {token: "test2"} + token: SQLITE_DATA_SOURCE, + use: { + initialize: jest.fn(), + getRepository: jest.fn().mockReturnValue({ + repository: false + }) + } } ]); - expect(service.token).toEqual({ - token: "test2" + const repository = DITest.get(SQLITE_DATA_SOURCE); + + expect(repository.getRepository).toHaveBeenCalledWith(Model); + + const result = service.getRepository(); + + expect(result).toEqual({ + repository: false }); }); });