From 344c362299953e898a6f431d921da6af58210e27 Mon Sep 17 00:00:00 2001 From: Tim Deschryver <28659384+timdeschryver@users.noreply.github.com> Date: Wed, 26 Jul 2023 15:21:44 +0200 Subject: [PATCH] feat: add configureTestBed callback method --- projects/testing-library/src/lib/models.ts | 50 ++++++++++------- .../src/lib/testing-library.ts | 5 ++ .../issue-396-standalone-stub-child.spec.ts | 54 +++++++++++++++++++ projects/testing-library/tests/render.spec.ts | 11 ++++ 4 files changed, 102 insertions(+), 18 deletions(-) create mode 100644 projects/testing-library/tests/issues/issue-396-standalone-stub-child.spec.ts diff --git a/projects/testing-library/src/lib/models.ts b/projects/testing-library/src/lib/models.ts index c1c68c2..2e198a6 100644 --- a/projects/testing-library/src/lib/models.ts +++ b/projects/testing-library/src/lib/models.ts @@ -1,5 +1,5 @@ import { Type, DebugElement } from '@angular/core'; -import { ComponentFixture } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { Routes } from '@angular/router'; import { BoundFunction, Queries, queries, Config as dtlConfig, PrettyDOMOptions } from '@testing-library/dom'; @@ -74,7 +74,7 @@ export interface RenderComponentOptions { ... } @@ -190,7 +190,7 @@ export interface RenderComponentOptions { ... } - * const component = await render(AppComponent, { + * await render(AppComponent, { * componentOutputs: { * send: { * emit: sendValue @@ -225,7 +225,7 @@ export interface RenderComponentOptions {} + * + * @example + * await render(AppComponent, { + * configureTestBed: (testBed) => { } + * }) + */ + configureTestBed?: (testbed: TestBed) => void; } export interface ComponentOverride { @@ -368,7 +382,7 @@ export interface RenderTemplateOptions`, { + * await render(`
`, { * declarations: [SpoilerDirective] * wrapper: CustomWrapperComponent * }) diff --git a/projects/testing-library/src/lib/testing-library.ts b/projects/testing-library/src/lib/testing-library.ts index 66cb819..974402f 100644 --- a/projects/testing-library/src/lib/testing-library.ts +++ b/projects/testing-library/src/lib/testing-library.ts @@ -65,6 +65,9 @@ export async function render( removeAngularAttributes = false, defaultImports = [], initialRoute = '', + configureTestBed = () => { + /* noop*/ + }, } = { ...globalConfig, ...renderOptions }; dtlConfigure({ @@ -94,6 +97,8 @@ export async function render( overrideComponentImports(sut, componentImports); overrideChildComponentProviders(childComponentOverrides); + configureTestBed(TestBed); + await TestBed.compileComponents(); componentProviders diff --git a/projects/testing-library/tests/issues/issue-396-standalone-stub-child.spec.ts b/projects/testing-library/tests/issues/issue-396-standalone-stub-child.spec.ts new file mode 100644 index 0000000..306297a --- /dev/null +++ b/projects/testing-library/tests/issues/issue-396-standalone-stub-child.spec.ts @@ -0,0 +1,54 @@ +import { Component } from '@angular/core'; +import { render, screen } from '../../src/public_api'; + +test('child', async () => { + await render(FixtureComponent); + expect(screen.getByText('Hello from child')).toBeInTheDocument(); +}); + +test('stub', async () => { + await render(FixtureComponent, { + componentImports: [StubComponent], + }); + + expect(screen.getByText('Hello from stub')).toBeInTheDocument(); +}); + +test('configure', async () => { + await render(FixtureComponent, { + configureTestBed: (testBed) => { + testBed.overrideComponent(FixtureComponent, { + add: { + imports: [StubComponent], + }, + remove: { + imports: [ChildComponent], + }, + }); + }, + }); + + expect(screen.getByText('Hello from stub')).toBeInTheDocument(); +}); + +@Component({ + selector: 'atl-child', + template: `Hello from child`, + standalone: true, +}) +class ChildComponent {} + +@Component({ + selector: 'atl-child', + template: `Hello from stub`, + standalone: true, +}) +class StubComponent {} + +@Component({ + selector: 'atl-fixture', + template: ``, + standalone: true, + imports: [ChildComponent], +}) +class FixtureComponent {} diff --git a/projects/testing-library/tests/render.spec.ts b/projects/testing-library/tests/render.spec.ts index 2290b90..4b546e0 100644 --- a/projects/testing-library/tests/render.spec.ts +++ b/projects/testing-library/tests/render.spec.ts @@ -366,3 +366,14 @@ describe('initialRoute', () => { expect(screen.getByText('button')).toBeInTheDocument(); }); }); + +describe('configureTestBed', () => { + it('invokes configureTestBed', async () => { + const configureTestBedFn = jest.fn(); + await render(FixtureComponent, { + configureTestBed: configureTestBedFn, + }); + + expect(configureTestBedFn).toHaveBeenCalledTimes(1); + }); +});