Skip to content

Commit 51b93e5

Browse files
feature(core) property based injection (composition)
1 parent 098afe6 commit 51b93e5

18 files changed

Lines changed: 289 additions & 48 deletions

integration/injector/e2e/circular-modules.spec.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1+
import { Test } from '@nestjs/testing';
12
import { expect } from 'chai';
2-
import { Test, TestingModuleBuilder } from '@nestjs/testing';
3-
import { INestApplication } from '@nestjs/common';
43
import { CircularModule } from '../src/circular-modules/circular.module';
5-
import { InputService } from '../src/circular-modules/input.service';
64
import { CircularService } from '../src/circular-modules/circular.service';
75
import { InputModule } from '../src/circular-modules/input.module';
6+
import { InputService } from '../src/circular-modules/input.service';
87

98
describe('Circular dependency (modules)', () => {
109
it('should resolve circular dependency between providers', async () => {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { Test } from '@nestjs/testing';
2+
import { expect } from 'chai';
3+
import { CircularPropertiesModule } from '../src/circular-properties/circular-properties.module';
4+
import { CircularService } from '../src/circular-properties/circular.service';
5+
import { InputPropertiesModule } from '../src/circular-properties/input-properties.module';
6+
import { InputService } from '../src/circular-properties/input.service';
7+
8+
describe('Circular properties dependency (modules)', () => {
9+
it('should resolve circular dependency between providers', async () => {
10+
const builder = Test.createTestingModule({
11+
imports: [CircularPropertiesModule, InputPropertiesModule],
12+
});
13+
const testingModule = await builder.compile();
14+
const inputService = testingModule.get<InputService>(InputService);
15+
const circularService = testingModule.get<CircularService>(CircularService);
16+
17+
expect(inputService.service).to.be.eql(circularService);
18+
expect(circularService.service).to.be.eql(inputService);
19+
});
20+
});

integration/injector/e2e/circular.spec.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1+
import { Test } from '@nestjs/testing';
12
import { expect } from 'chai';
2-
import { Test, TestingModuleBuilder } from '@nestjs/testing';
3-
import { INestApplication } from '@nestjs/common';
43
import { CircularModule } from '../src/circular/circular.module';
5-
import { InputService } from '../src/circular/input.service';
64
import { CircularService } from '../src/circular/circular.service';
5+
import { InputService } from '../src/circular/input.service';
76

87
describe('Circular dependency', () => {
98
it('should resolve circular dependency between providers', async () => {

integration/injector/e2e/injector.spec.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1+
import { RuntimeException } from '@nestjs/core/errors/exceptions/runtime.exception';
2+
import { UnknownExportException } from '@nestjs/core/errors/exceptions/unknown-export.exception';
3+
import { Test } from '@nestjs/testing';
14
import { expect } from 'chai';
2-
import { Test, TestingModuleBuilder } from '@nestjs/testing';
3-
import { INestApplication } from '@nestjs/common';
5+
import {
6+
DYNAMIC_TOKEN,
7+
DYNAMIC_VALUE,
8+
NestDynamicModule,
9+
} from '../src/dynamic/dynamic.module';
410
import { ExportsModule } from '../src/exports/exports.module';
5-
import { TestingModule } from '@nestjs/testing/testing-module';
6-
import { UnknownExportException } from '@nestjs/core/errors/exceptions/unknown-export.exception';
7-
import { UndefinedDependencyException } from '@nestjs/core/errors/exceptions/undefined-dependency.exception';
811
import { InjectModule } from '../src/inject/inject.module';
9-
import { RuntimeException } from '@nestjs/core/errors/exceptions/runtime.exception';
10-
import { NestDynamicModule, DYNAMIC_TOKEN, DYNAMIC_VALUE } from '../src/dynamic/dynamic.module';
1112

1213
describe('Injector', () => {
1314
describe('when "providers" and "exports" properties are inconsistent', () => {
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { Test } from '@nestjs/testing';
2+
import { expect } from 'chai';
3+
import { DependencyService } from '../src/properties/dependency.service';
4+
import { PropertiesModule } from '../src/properties/properties.module';
5+
import { PropertiesService } from '../src/properties/properties.service';
6+
7+
describe('Injector', () => {
8+
it('should resolve property-based dependencies', async () => {
9+
const builder = Test.createTestingModule({
10+
imports: [PropertiesModule],
11+
});
12+
const app = await builder.compile();
13+
const dependency = app.get(DependencyService);
14+
15+
expect(app.get(PropertiesService).service).to.be.eql(dependency);
16+
});
17+
});
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { forwardRef, Module } from '@nestjs/common';
2+
import { CircularService } from './circular.service';
3+
import { InputPropertiesModule } from './input-properties.module';
4+
5+
@Module({
6+
imports: [forwardRef(() => InputPropertiesModule)],
7+
providers: [CircularService],
8+
exports: [CircularService],
9+
})
10+
export class CircularPropertiesModule {}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { forwardRef, Inject, Injectable } from '@nestjs/common';
2+
import { InputService } from './input.service';
3+
4+
@Injectable()
5+
export class CircularService {
6+
@Inject(forwardRef(() => InputService))
7+
public readonly service: InputService;
8+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { forwardRef, Module } from '@nestjs/common';
2+
import { CircularPropertiesModule } from './circular-properties.module';
3+
import { InputService } from './input.service';
4+
5+
@Module({
6+
imports: [forwardRef(() => CircularPropertiesModule)],
7+
providers: [InputService],
8+
exports: [InputService],
9+
})
10+
export class InputPropertiesModule {}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { forwardRef, Inject, Injectable } from '@nestjs/common';
2+
import { CircularService } from './circular.service';
3+
4+
@Injectable()
5+
export class InputService {
6+
@Inject(forwardRef(() => CircularService))
7+
public readonly service: CircularService;
8+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { Injectable } from '@nestjs/common';
2+
3+
@Injectable()
4+
export class DependencyService {}

0 commit comments

Comments
 (0)