Skip to content

Commit

Permalink
Merge pull request #112 from satanTime/issues/ApplicationComponent
Browse files Browse the repository at this point in the history
feat(mock-builder): ApplicationModule providers
  • Loading branch information
ike18t authored May 9, 2020
2 parents f8d6b64 + 554fa34 commit 975894e
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 6 deletions.
10 changes: 10 additions & 0 deletions e2e/mock-builder-keeps-application-module/fixtures.components.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// tslint:disable:max-classes-per-file

import { Component } from '@angular/core';

@Component({
selector: 'target-component',
template: 'target',
})
export class TargetComponent {
}
26 changes: 26 additions & 0 deletions e2e/mock-builder-keeps-application-module/fixtures.modules.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// tslint:disable:max-classes-per-file

import { APP_ID, InjectionToken, NgModule } from '@angular/core';
import { TargetComponent } from './fixtures.components';

export const TARGET_TOKEN = new InjectionToken('TARGET_TOKEN');

@NgModule({
declarations: [
TargetComponent,
],
exports: [
TargetComponent,
],
providers: [
{
provide: TARGET_TOKEN,
useValue: 'TARGET_TOKEN',
},
{
provide: APP_ID,
useValue: 'random',
}
],
})
export class TargetModule {}
35 changes: 35 additions & 0 deletions e2e/mock-builder-keeps-application-module/test.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { APP_ID, APP_INITIALIZER } from '@angular/core';
import { TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { MockBuilder, MockRender } from 'ng-mocks';

import { TargetComponent } from './fixtures.components';
import { TARGET_TOKEN, TargetModule } from './fixtures.modules';

describe('MockBuilderKeepsApplicationModule:real', () => {
beforeEach(() => TestBed.configureTestingModule({
imports: [TargetModule],
}).compileComponents());

it('should render', () => {
const fixture = MockRender(TargetComponent);
const element = fixture.debugElement.query(By.directive(TargetComponent));
expect(element).toBeDefined();
expect(TestBed.get(TARGET_TOKEN)).toBeDefined();
expect(TestBed.get(APP_INITIALIZER)).toBeDefined();
expect(TestBed.get(APP_ID)).toBeDefined();
});
});

describe('MockBuilderKeepsApplicationModule:mock', () => {
beforeEach(() => MockBuilder(TargetComponent, TargetModule));

it('should render', () => {
const fixture = MockRender(TargetComponent);
const element = fixture.debugElement.query(By.directive(TargetComponent));
expect(element).toBeDefined();
expect(TestBed.get(TARGET_TOKEN)).toBeUndefined();
expect(TestBed.get(APP_INITIALIZER)).toBeDefined();
expect(TestBed.get(APP_ID)).toBeDefined();
});
});
45 changes: 39 additions & 6 deletions lib/mock-builder/mock-builder.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
// tslint:disable:unified-signatures

import { InjectionToken, ModuleWithProviders, NgModule, PipeTransform, Provider, Type } from '@angular/core';
import {
ApplicationModule,
InjectionToken,
ModuleWithProviders,
NgModule,
PipeTransform,
Provider,
Type,
} from '@angular/core';
import { TestBed } from '@angular/core/testing';

import { flatten, isNgDef, isNgInjectionToken, NG_MOCKS } from '../common';
import { ngMocksUniverse } from '../common/ng-mocks-universe';
import { ngModuleResolver } from '../common/reflect';
import { MockComponent } from '../mock-component';
import { MockDirective } from '../mock-directive';
import { MockModule, MockProvider } from '../mock-module';
Expand Down Expand Up @@ -41,7 +50,7 @@ const defaultMock = Symbol();

export class MockBuilderPromise implements PromiseLike<IMockBuilderResult> {
protected beforeCC: Set<(testBed: typeof TestBed) => void> = new Set();
protected configDef: Map<Type<any>, any> = new Map();
protected configDef: Map<Type<any> | InjectionToken<any>, any> = new Map();

protected keepDef: {
component: Set<Type<any>>;
Expand Down Expand Up @@ -221,17 +230,25 @@ export class MockBuilderPromise implements PromiseLike<IMockBuilderResult> {
if (ngMocksUniverse.touches.has(def)) {
continue;
}
providers.push(isNgInjectionToken(def) ? {
provide: def,
useValue: undefined,
} : def);
const config = this.configDef.get(def);
if (config && config.dependency) {
continue;
}
if (isNgInjectionToken(def)) {
continue;
}
providers.push(def);
}

// Adding missed providers to test bed.
for (const def of this.mockDef.provider.values()) {
if (ngMocksUniverse.touches.has(def)) {
continue;
}
const config = this.configDef.get(def);
if (config && config.dependency) {
continue;
}
providers.push(ngMocksUniverse.builder.get(def));
}

Expand Down Expand Up @@ -404,6 +421,22 @@ export class MockBuilderPromise implements PromiseLike<IMockBuilderResult> {

export function MockBuilder(componentToTest?: Type<any>, itsModuleToMock?: Type<any>): MockBuilderPromise {
const instance = new MockBuilderPromise();

// all providers of ApplicationModule shouldn't be mocked by default.
const providers = flatten(ngModuleResolver.resolve(ApplicationModule).providers);
for (const provider of providers) {
if (typeof provider === 'object' && provider.deps) {
for (const dep of provider.deps) {
instance.keep(dep, {dependency: true});
}
}
if (typeof provider === 'object' && provider.provide) {
instance.keep(provider.provide, {dependency: true});
} else {
instance.keep(provider, {dependency: true});
}
}

if (componentToTest) {
instance.keep(componentToTest, {
export: true,
Expand Down

0 comments on commit 975894e

Please sign in to comment.