Skip to content

Commit

Permalink
test(di): update unit test to reproduce issue
Browse files Browse the repository at this point in the history
Closes: #2660
  • Loading branch information
Romakita committed May 8, 2024
1 parent 785c186 commit c8d9680
Showing 1 changed file with 75 additions and 22 deletions.
97 changes: 75 additions & 22 deletions packages/di/src/node/services/DITest.spec.ts
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -32,31 +63,53 @@ describe("DITest", () => {
afterEach(() => DITest.reset());

it("should return a service with pre mocked dependencies", () => {
const service = DITest.get<MyService>(MyService);
const service = DITest.get<FileDao>(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>(MyService);
const service = await DITest.invoke<FileDao>(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>(MyService, [
const service = await DITest.invoke<FileDao>(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
});
});
});
Expand Down

0 comments on commit c8d9680

Please sign in to comment.