Skip to content

Commit 260472d

Browse files
committed
test(*): add TestBed for simple di control in tests
1 parent a1b184f commit 260472d

8 files changed

Lines changed: 110 additions & 51 deletions

File tree

dist/index.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/services/repositories.repository.test.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { vol } from 'memfs';
22
import { temporaryDirectory } from 'tempy';
3-
import { beforeEach, describe, expect, it, vi } from 'vitest';
3+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
44
import { CONFIG, initConfig } from '../config.js';
5-
import { DefaultInjector, inject, Logger } from '../utils/index.js';
5+
import { Logger, TestBed } from '../utils/index.js';
66
import { TemplatesAccess } from './access/templates-access.js';
77
import { RepositoriesRepository } from './repositories.repository.js';
88

@@ -16,14 +16,21 @@ describe('RepositoriesRepository', () => {
1616
beforeEach(() => {
1717
const config = initConfig(path, 'acme', null).store;
1818

19-
DefaultInjector.getInstance([
20-
[CONFIG, { factory: () => config }],
21-
[Logger, { factory: () => new Logger() }],
22-
[TemplatesAccess, { factory: () => new TemplatesAccess() }],
23-
[RepositoriesRepository, { factory: () => new RepositoriesRepository() }],
24-
]);
19+
TestBed.configureTestingModule({
20+
providers: [
21+
[CONFIG, () => config],
22+
[Logger, () => new Logger()],
23+
[TemplatesAccess, () => new TemplatesAccess()],
24+
[RepositoriesRepository, () => new RepositoriesRepository()],
25+
],
26+
});
27+
28+
sut = TestBed.inject(RepositoriesRepository);
29+
});
2530

26-
sut = inject(RepositoriesRepository);
31+
afterEach(() => {
32+
vol.reset();
33+
TestBed.resetTestingModule();
2734
});
2835

2936
it('should load repositories; empty list', async () => {

src/services/script-executor.test.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
1-
import { beforeEach, describe, expect, test } from 'vitest';
2-
import { DefaultInjector, inject } from '../utils/index.js';
1+
import { afterEach, beforeEach, describe, expect, test } from 'vitest';
2+
import { TestBed } from '../utils/index.js';
33
import { ScriptExecutor } from './script-executor.js';
44

55
describe('ScriptExecutor', () => {
66
let sut: ScriptExecutor;
77

88
beforeEach(() => {
9-
DefaultInjector.getInstance([
10-
[ScriptExecutor, { factory: () => new ScriptExecutor() }],
11-
]);
12-
sut = inject(ScriptExecutor);
9+
TestBed.configureTestingModule({
10+
providers: [[ScriptExecutor, () => new ScriptExecutor()]],
11+
});
12+
13+
sut = TestBed.inject(ScriptExecutor);
14+
});
15+
16+
afterEach(() => {
17+
TestBed.resetTestingModule();
1318
});
1419

1520
describe('executeFormula', () => {

src/services/servers.repository.test.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { vol } from 'memfs';
22
import { temporaryDirectory } from 'tempy';
3-
import { beforeEach, describe, expect, it, vi } from 'vitest';
3+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
44
import { CONFIG, initConfig } from '../config.js';
5-
import { DefaultInjector, inject, Logger } from '../utils/index.js';
5+
import { Logger, TestBed } from '../utils/index.js';
66
import { TemplatesAccess } from './access/templates-access.js';
77
import { ServersRepository } from './servers.repository.js';
88

@@ -16,14 +16,21 @@ describe('ServersRepository', () => {
1616
beforeEach(() => {
1717
const config = initConfig(path, 'acme', null).store;
1818

19-
DefaultInjector.getInstance([
20-
[CONFIG, { factory: () => config }],
21-
[Logger, { factory: () => new Logger() }],
22-
[TemplatesAccess, { factory: () => new TemplatesAccess() }],
23-
[ServersRepository, { factory: () => new ServersRepository() }],
24-
]);
19+
TestBed.configureTestingModule({
20+
providers: [
21+
[CONFIG, () => config],
22+
[Logger, () => new Logger()],
23+
[TemplatesAccess, () => new TemplatesAccess()],
24+
[ServersRepository, () => new ServersRepository()],
25+
],
26+
});
27+
28+
sut = TestBed.inject(ServersRepository);
29+
});
2530

26-
sut = inject(ServersRepository);
31+
afterEach(() => {
32+
vol.reset();
33+
TestBed.resetTestingModule();
2734
});
2835

2936
it('should load servers; empty list', async () => {

src/services/use-cases.repository.test.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { vol } from 'memfs';
22
import { temporaryDirectory } from 'tempy';
3-
import { beforeEach, describe, expect, it, vi } from 'vitest';
3+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
44
import { CONFIG, initConfig } from '../config.js';
5-
import { DefaultInjector, inject, Logger } from '../utils/index.js';
5+
import { Logger, TestBed } from '../utils/index.js';
66
import { TemplatesAccess } from './access/templates-access.js';
77
import { UseCasesRepository } from './use-cases.repository.js';
88

@@ -16,14 +16,21 @@ describe('UseCasesRepository', () => {
1616
beforeEach(() => {
1717
const config = initConfig(path, 'acme', null).store;
1818

19-
DefaultInjector.getInstance([
20-
[CONFIG, { factory: () => config }],
21-
[Logger, { factory: () => new Logger() }],
22-
[TemplatesAccess, { factory: () => new TemplatesAccess() }],
23-
[UseCasesRepository, { factory: () => new UseCasesRepository() }],
24-
]);
19+
TestBed.configureTestingModule({
20+
providers: [
21+
[CONFIG, () => config],
22+
[Logger, () => new Logger()],
23+
[TemplatesAccess, () => new TemplatesAccess()],
24+
[UseCasesRepository, () => new UseCasesRepository()],
25+
],
26+
});
27+
28+
sut = TestBed.inject(UseCasesRepository);
29+
});
2530

26-
sut = inject(UseCasesRepository);
31+
afterEach(() => {
32+
vol.reset();
33+
TestBed.resetTestingModule();
2734
});
2835

2936
it('should load use cases; empty list', async () => {

src/services/use-cases/use-case-runner.test.ts

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { temporaryDirectory } from 'tempy';
33
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
44
import { CONFIG, initConfig } from '../../config.js';
55
import { UseCase } from '../../types/use-case.js';
6-
import { DefaultInjector, inject, Logger } from '../../utils/index.js';
6+
import { Logger, TestBed } from '../../utils/index.js';
77
import { TemplatesAccess } from '../access/templates-access.js';
88
import { RepositoriesRepository } from '../repositories.repository.js';
99
import { ScriptExecutor } from '../script-executor.js';
@@ -23,24 +23,27 @@ describe('UseCaseRunner', () => {
2323
beforeEach(() => {
2424
const config = initConfig(path, 'acme', null).store;
2525

26-
DefaultInjector.getInstance([
27-
[CONFIG, { factory: () => config }],
28-
[Logger, { factory: () => new Logger() }],
29-
[ScriptExecutor, { factory: () => new ScriptExecutor() }],
30-
[TemplatesAccess, { factory: () => new TemplatesAccess() }],
31-
[UseCasesRepository, { factory: () => new UseCasesRepository() }],
32-
[ServersRepository, { factory: () => new ServersRepository() }],
33-
[RepositoriesRepository, { factory: () => new RepositoriesRepository() }],
34-
[ContextCreator, { factory: () => new ContextCreator() }],
35-
[UseCaseRunner, { factory: () => new UseCaseRunner() }],
36-
]);
37-
38-
scriptExecutor = inject(ScriptExecutor);
39-
sut = inject(UseCaseRunner);
26+
TestBed.configureTestingModule({
27+
providers: [
28+
[CONFIG, () => config],
29+
[Logger, () => new Logger()],
30+
[ScriptExecutor, () => new ScriptExecutor()],
31+
[TemplatesAccess, () => new TemplatesAccess()],
32+
[UseCasesRepository, () => new UseCasesRepository()],
33+
[ServersRepository, () => new ServersRepository()],
34+
[RepositoriesRepository, () => new RepositoriesRepository()],
35+
[ContextCreator, () => new ContextCreator()],
36+
[UseCaseRunner, () => new UseCaseRunner()],
37+
],
38+
});
39+
40+
scriptExecutor = TestBed.inject(ScriptExecutor);
41+
sut = TestBed.inject(UseCaseRunner);
4042
});
4143

4244
afterEach(() => {
4345
vol.reset();
46+
TestBed.resetTestingModule();
4447
});
4548

4649
describe('run', () => {

src/utils/di/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export * from './default-injector.js';
22
export * from './inject.js';
33
export { InjectionToken, Injector } from './interfaces.js';
4+
export { TestBed } from './test-bed.js';

src/utils/di/test-bed.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { DefaultInjector } from './default-injector.js';
2+
import { inject } from './index.js';
3+
import { ProviderToken } from './interfaces.js';
4+
5+
export declare interface TestModuleMetadata {
6+
providers?: Array<[ProviderToken<unknown>, factory: () => unknown]>;
7+
}
8+
9+
export class TestBed {
10+
static configureTestingModule(moduleDef: TestModuleMetadata): void {
11+
DefaultInjector.getInstance([]);
12+
13+
if (moduleDef.providers?.length) {
14+
moduleDef.providers.forEach(provider => {
15+
DefaultInjector.getInstance().register(provider[0], provider[1]);
16+
});
17+
}
18+
}
19+
20+
static resetTestingModule(): void {
21+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
22+
// @ts-ignore
23+
DefaultInjector.instance = null as unknown as DefaultInjector;
24+
}
25+
26+
static inject<T>(token: ProviderToken<T>) {
27+
return inject(token);
28+
}
29+
}

0 commit comments

Comments
 (0)