Skip to content

Commit 9fcbc87

Browse files
committed
fix: support jest 27
1 parent 489e135 commit 9fcbc87

File tree

6 files changed

+70
-57
lines changed

6 files changed

+70
-57
lines changed

apps/example-app/src/app/examples/14-async-component.spec.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { fakeAsync, tick } from '@angular/core/testing';
1+
import { fakeAsync, flush, tick } from '@angular/core/testing';
22
import { render, screen, fireEvent } from '@testing-library/angular';
33

44
import { AsyncComponent } from './14-async-component';
@@ -14,3 +14,16 @@ test('can use fakeAsync utilities', fakeAsync(async () => {
1414
const hello = await screen.findByText('Hello world');
1515
expect(hello).toBeInTheDocument();
1616
}));
17+
18+
test('can use fakeTimer utilities', async () => {
19+
jest.useFakeTimers();
20+
await render(AsyncComponent);
21+
22+
const load = await screen.findByRole('button', { name: /load/i });
23+
fireEvent.click(load);
24+
25+
jest.advanceTimersByTime(10_000);
26+
27+
const hello = await screen.findByText('Hello world');
28+
expect(hello).toBeInTheDocument();
29+
});

apps/example-app/src/app/examples/15-dialog.component.spec.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { MatDialogModule, MatDialogRef } from '@angular/material/dialog';
2-
import { render, screen, fireEvent, waitForElementToBeRemoved } from '@testing-library/angular';
2+
import { render, screen, waitForElementToBeRemoved, fireEvent } from '@testing-library/angular';
3+
import userEvent from '@testing-library/user-event';
34

45
import { DialogComponent, DialogContentComponent, DialogContentComponentModule } from './15-dialog.component';
56

@@ -18,44 +19,45 @@ test('dialog closes', async () => {
1819
});
1920

2021
const cancelButton = await screen.findByRole('button', { name: /cancel/i });
21-
fireEvent.click(cancelButton);
22+
userEvent.click(cancelButton);
2223

2324
expect(closeFn).toHaveBeenCalledTimes(1);
2425
});
2526

26-
test('opens and closes the dialog with buttons', async () => {
27+
test('closes the dialog via the backdrop', async () => {
2728
await render(DialogComponent, {
2829
imports: [MatDialogModule, DialogContentComponentModule],
2930
});
3031

3132
const openDialogButton = await screen.findByRole('button', { name: /open dialog/i });
32-
fireEvent.click(openDialogButton);
33+
userEvent.click(openDialogButton);
3334

3435
await screen.findByRole('dialog');
3536
await screen.findByRole('heading', { name: /dialog title/i });
3637

37-
const cancelButton = await screen.findByRole('button', { name: /cancel/i });
38-
fireEvent.click(cancelButton);
38+
// using fireEvent because of:
39+
// unable to click element as it has or inherits pointer-events set to "none"
40+
fireEvent.click(document.querySelector('.cdk-overlay-backdrop'));
3941

4042
await waitForElementToBeRemoved(() => screen.getByRole('dialog'));
4143

4244
const dialogTitle = screen.queryByRole('heading', { name: /dialog title/i });
4345
expect(dialogTitle).not.toBeInTheDocument();
4446
});
4547

46-
test('closes the dialog via the backdrop', async () => {
48+
test('opens and closes the dialog with buttons', async () => {
4749
await render(DialogComponent, {
4850
imports: [MatDialogModule, DialogContentComponentModule],
4951
});
5052

5153
const openDialogButton = await screen.findByRole('button', { name: /open dialog/i });
52-
fireEvent.click(openDialogButton);
54+
userEvent.click(openDialogButton);
5355

5456
await screen.findByRole('dialog');
5557
await screen.findByRole('heading', { name: /dialog title/i });
5658

57-
// eslint-disable-next-line testing-library/no-node-access
58-
fireEvent.click(document.querySelector('.cdk-overlay-backdrop'));
59+
const cancelButton = await screen.findByRole('button', { name: /cancel/i });
60+
userEvent.click(cancelButton);
5961

6062
await waitForElementToBeRemoved(() => screen.getByRole('dialog'));
6163

jest.preset.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,6 @@ module.exports = {
1717
'ts-jest': {
1818
tsconfig: '<rootDir>/tsconfig.spec.json',
1919
stringifyContentPathRegex: '\\.(html|svg)$',
20-
astTransformers: {
21-
before: [
22-
'jest-preset-angular/build/InlineFilesTransformer',
23-
'jest-preset-angular/build/StripStylesTransformer',
24-
],
25-
},
2620
},
2721
},
2822
};

package.json

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,18 @@
2828
"prepare": "husky install"
2929
},
3030
"dependencies": {
31-
"@angular/animations": "12.0.0",
32-
"@angular/cdk": "12.0.0",
33-
"@angular/common": "12.0.0",
34-
"@angular/compiler": "12.0.0",
35-
"@angular/core": "12.0.0",
36-
"@angular/forms": "12.0.0",
37-
"@angular/material": "12.0.0",
38-
"@angular/platform-browser": "12.0.0",
39-
"@angular/platform-browser-dynamic": "12.0.0",
40-
"@angular/router": "12.0.0",
41-
"@ngrx/store": "12.0.0",
42-
"@nrwl/angular": "12.0.3",
31+
"@angular/animations": "12.1.1",
32+
"@angular/cdk": "12.1.1",
33+
"@angular/common": "12.1.1",
34+
"@angular/compiler": "12.1.1",
35+
"@angular/core": "12.1.1",
36+
"@angular/forms": "12.1.1",
37+
"@angular/material": "12.1.1",
38+
"@angular/platform-browser": "12.1.1",
39+
"@angular/platform-browser-dynamic": "12.1.1",
40+
"@angular/router": "12.1.1",
41+
"@ngrx/store": "12.2.0",
42+
"@nrwl/angular": "12.5.1",
4343
"@nrwl/nx-cloud": "11.2.0",
4444
"@testing-library/dom": "^8.0.0",
4545
"@testing-library/user-event": "^13.1.9",
@@ -49,23 +49,23 @@
4949
"zone.js": "~0.11.4"
5050
},
5151
"devDependencies": {
52-
"@angular-devkit/build-angular": "12.0.0",
52+
"@angular-devkit/build-angular": "12.1.0",
5353
"@angular-eslint/eslint-plugin": "~12.0.0",
5454
"@angular-eslint/eslint-plugin-template": "~12.0.0",
5555
"@angular-eslint/template-parser": "~12.0.0",
56-
"@angular/cli": "12.0.0",
57-
"@angular/compiler-cli": "12.0.0",
58-
"@angular/language-service": "12.0.0",
59-
"@nrwl/cli": "12.0.3",
60-
"@nrwl/eslint-plugin-nx": "12.0.3",
61-
"@nrwl/jest": "12.0.3",
62-
"@nrwl/linter": "12.0.3",
63-
"@nrwl/node": "12.0.3",
64-
"@nrwl/nx-plugin": "12.0.3",
65-
"@nrwl/workspace": "12.3.1",
56+
"@angular/cli": "12.1.0",
57+
"@angular/compiler-cli": "12.1.1",
58+
"@angular/language-service": "12.1.1",
59+
"@nrwl/cli": "12.5.1",
60+
"@nrwl/eslint-plugin-nx": "12.5.1",
61+
"@nrwl/jest": "12.5.1",
62+
"@nrwl/linter": "12.5.1",
63+
"@nrwl/node": "12.5.1",
64+
"@nrwl/nx-plugin": "12.5.1",
65+
"@nrwl/workspace": "12.5.1",
6666
"@testing-library/jest-dom": "^5.11.10",
6767
"@types/jasmine": "~3.5.0",
68-
"@types/jest": "~26.0.3",
68+
"@types/jest": "^26.0.23",
6969
"@types/node": "14.14.37",
7070
"@typescript-eslint/eslint-plugin": "4.22.0",
7171
"@typescript-eslint/parser": "4.22.0",
@@ -79,9 +79,9 @@
7979
"husky": "^6.0.0",
8080
"jasmine-core": "~3.6.0",
8181
"jasmine-spec-reporter": "~5.0.0",
82-
"jest": "^26.1.0",
83-
"jest-preset-angular": "8.4.0",
84-
"karma": "~5.0.0",
82+
"jest": "^27.0.6",
83+
"jest-preset-angular": "9.0.4",
84+
"karma": "~6.3.4",
8585
"karma-chrome-launcher": "~3.1.0",
8686
"karma-jasmine": "~4.0.0",
8787
"karma-jasmine-html-reporter": "^1.5.0",
@@ -90,7 +90,7 @@
9090
"prettier": "^2.3.0",
9191
"rimraf": "^3.0.2",
9292
"semantic-release": "^17.1.1",
93-
"ts-jest": "26.5.4",
93+
"ts-jest": "^27.0.3",
9494
"ts-node": "9.1.1",
9595
"typescript": "4.2.4"
9696
}

projects/jest-utils/tests/create-mock.spec.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,13 @@ it('provides a mock service', async () => {
3939
expect(service.print).toHaveBeenCalledTimes(1);
4040
});
4141

42-
// eslint-disable-next-line jest/expect-expect
43-
it('is possible to write a mock implementation', async (done) => {
42+
it('is possible to write a mock implementation', async () => {
4443
const { getByText } = await render(FixtureComponent, {
4544
providers: [provideMock(FixtureService)],
4645
});
4746

4847
const service = TestBed.inject(FixtureService) as Mock<FixtureService>;
49-
service.print.mockImplementation(() => done());
5048

5149
fireEvent.click(getByText('Print'));
50+
expect(service.print).toHaveBeenCalled();
5251
});

projects/testing-library/src/lib/testing-library.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
SimpleChanges,
99
ApplicationInitStatus,
1010
} from '@angular/core';
11-
import { ComponentFixture, TestBed } from '@angular/core/testing';
11+
import { ComponentFixture, TestBed, tick } from '@angular/core/testing';
1212
import { By } from '@angular/platform-browser';
1313
import { BrowserAnimationsModule, NoopAnimationsModule } from '@angular/platform-browser/animations';
1414
import { NavigationExtras, Router } from '@angular/router';
@@ -310,14 +310,21 @@ async function waitForWrapper<T>(
310310
callback: () => T extends Promise<any> ? never : T,
311311
options?: dtlWaitForOptions,
312312
): Promise<T> {
313+
let inFakeAsync = true;
314+
try {
315+
tick(0);
316+
} catch (err) {
317+
inFakeAsync = false;
318+
}
319+
313320
detectChanges();
321+
314322
return await dtlWaitFor(() => {
315-
try {
316-
return callback();
317-
} catch (error) {
318-
setImmediate(() => detectChanges());
319-
throw error;
323+
setTimeout(() => detectChanges(), 0);
324+
if (inFakeAsync) {
325+
tick(0);
320326
}
327+
return callback();
321328
}, options);
322329
}
323330

@@ -345,10 +352,8 @@ async function waitForElementToBeRemovedWrapper<T>(
345352
}
346353

347354
return await dtlWaitForElementToBeRemoved(() => {
348-
const result = cb();
349355
detectChanges();
350-
setImmediate(() => detectChanges());
351-
return result;
356+
return cb();
352357
}, options);
353358
}
354359

0 commit comments

Comments
 (0)