Skip to content

Commit 0559c2f

Browse files
authored
Merge pull request #20705 from mozilla/FXA-13708
test(auth): migrate log/statsd/fxaMailer mocks to typed Jest fixtures
2 parents d13ec42 + 6ade9f7 commit 0559c2f

73 files changed

Lines changed: 699 additions & 454 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

packages/fxa-auth-server/lib/account-delete.spec.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
44

55
import Container from 'typedi';
6+
import { createMock, DeepMocked } from '@golevelup/ts-jest';
7+
import { StatsD } from 'hot-shots';
68
import { v4 as uuidv4 } from 'uuid';
79
import { AppError, ERRNO } from '@fxa/accounts/errors';
810
import { AppleIAP } from './payments/iap/apple-app-store/apple-iap';
@@ -47,7 +49,7 @@ describe('AccountDeleteManager', () => {
4749
let mockOAuthDb: any;
4850
let mockPush: any;
4951
let mockPushbox: any;
50-
let mockStatsd: any;
52+
let mockStatsd: DeepMocked<StatsD>;
5153
let mockGlean: any;
5254
let mockMailer: any;
5355
let mockStripeHelper: any;
@@ -89,11 +91,11 @@ describe('AccountDeleteManager', () => {
8991
mockOAuthDb = {};
9092
mockPush = mocks.mockPush();
9193
mockPushbox = mocks.mockPushbox();
92-
mockStatsd = { increment: jest.fn() };
94+
mockStatsd = createMock<StatsD>();
9395
mockGlean = mocks.mockGlean();
9496
mockMailer = mocks.mockMailer();
9597
mockStripeHelper = {};
96-
mockLog = mocks.mockLog();
98+
mockLog = createMock<AuthLogger>();
9799
mockAppleIap = {
98100
purchaseManager: {
99101
deletePurchases: jest.fn().mockResolvedValue(undefined),

packages/fxa-auth-server/lib/cad-reminders.in.spec.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
* License, v. 2.0. If a copy of the MPL was not distributed with this
33
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
44

5+
import { createMock } from '@golevelup/ts-jest';
6+
import { AuthLogger } from './types';
7+
58
const REMINDERS = ['first', 'second', 'third'];
69
const EXPECTED_CREATE_DELETE_RESULT = REMINDERS.reduce(
710
(expected: any, reminder) => {
@@ -12,14 +15,13 @@ const EXPECTED_CREATE_DELETE_RESULT = REMINDERS.reduce(
1215
);
1316

1417
const config = require('../config').default.getProperties();
15-
const mocks = require('../test/mocks');
1618

1719
describe('#integration - lib/cad-reminders', () => {
1820
let log: any, mockConfig: any, redis: any, cadReminders: any;
1921

2022
beforeEach(() => {
2123
jest.resetModules();
22-
log = mocks.mockLog();
24+
log = createMock<AuthLogger>();
2325
mockConfig = {
2426
redis: config.redis,
2527
cadReminders: {
@@ -40,7 +42,7 @@ describe('#integration - lib/cad-reminders', () => {
4042
...mockConfig.cadReminders.redis,
4143
enabled: true,
4244
},
43-
mocks.mockLog()
45+
createMock<AuthLogger>()
4446
);
4547
cadReminders = require('./cad-reminders')(mockConfig, log);
4648
});

packages/fxa-auth-server/lib/db.spec.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
* License, v. 2.0. If a copy of the MPL was not distributed with this
33
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
44

5+
import { createMock } from '@golevelup/ts-jest';
6+
import { AuthLogger } from './types';
7+
58
// Mock fxa-shared/db to prevent real DB connections
69
jest.mock('fxa-shared/db', () => ({
710
setupAuthDatabase: jest.fn(),
@@ -59,7 +62,6 @@ jest.mock('fxa-shared/connected-services', () => {
5962
});
6063

6164
// Import after mocks
62-
const mocks = require('../test/mocks');
6365
const config = require('../config').default.getProperties();
6466
const models: any = require('fxa-shared/db/models/auth');
6567
const { createDB } = require('./db');
@@ -73,7 +75,7 @@ describe('db, session tokens expire:', () => {
7375

7476
beforeEach(async () => {
7577
redisMockFactory = () => undefined;
76-
log = mocks.mockLog();
78+
log = createMock<AuthLogger>();
7779
tokens = require('../lib/tokens')(log, { tokenLifetimes });
7880
const DB = createDB(
7981
{
@@ -131,7 +133,7 @@ describe('db, session tokens do not expire:', () => {
131133

132134
beforeEach(async () => {
133135
redisMockFactory = () => undefined;
134-
log = mocks.mockLog();
136+
log = createMock<AuthLogger>();
135137
tokens = require('../lib/tokens')(log, { tokenLifetimes });
136138
const DB = createDB(
137139
{
@@ -189,7 +191,7 @@ describe('db with redis disabled:', () => {
189191

190192
beforeEach(async () => {
191193
redisMockFactory = () => undefined;
192-
log = mocks.mockLog();
194+
log = createMock<AuthLogger>();
193195
tokens = require('../lib/tokens')(log, { tokenLifetimes });
194196
const DB = createDB(
195197
{ redis: {}, tokenLifetimes, tokenPruning: {} },
@@ -249,7 +251,7 @@ describe('redis enabled, token-pruning enabled:', () => {
249251
expect(args[0].blee).toBeUndefined();
250252
return redis;
251253
};
252-
log = mocks.mockLog();
254+
log = createMock<AuthLogger>();
253255
tokens = require('../lib/tokens')(log, { tokenLifetimes });
254256
const DB = createDB(
255257
{
@@ -489,7 +491,7 @@ describe('redis enabled, token-pruning disabled:', () => {
489491
expect(args[0].blee).toBeUndefined();
490492
return redis;
491493
};
492-
log = mocks.mockLog();
494+
log = createMock<AuthLogger>();
493495
tokens = require('../lib/tokens')(log, { tokenLifetimes });
494496
const DB = createDB(
495497
{
@@ -539,7 +541,7 @@ describe('db.deviceFromRefreshTokenId:', () => {
539541
mergeDevicesAndSessionTokens: jest.Mock;
540542

541543
beforeEach(async () => {
542-
log = mocks.mockLog();
544+
log = createMock<AuthLogger>();
543545
tokens = require('../lib/tokens')(log, { tokenLifetimes });
544546

545547
models.Device.findByUidAndRefreshTokenId = jest.fn();

packages/fxa-auth-server/lib/devices.spec.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
* License, v. 2.0. If a copy of the MPL was not distributed with this
33
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
44

5+
import { createMock } from '@golevelup/ts-jest';
6+
import { AuthLogger } from './types';
7+
58
const crypto = require('crypto');
69
const mocks = require('../test/mocks');
710
const { AppError: error } = require('@fxa/accounts/errors');
@@ -36,7 +39,7 @@ interface DevicesModule {
3639

3740
describe('lib/devices:', () => {
3841
describe('instantiate:', () => {
39-
let log: ReturnType<typeof mocks.mockLog>,
42+
let log: AuthLogger,
4043
deviceCreatedAt: number,
4144
deviceId: string,
4245
device: Record<string, unknown>,
@@ -46,7 +49,7 @@ describe('lib/devices:', () => {
4649
pushbox: ReturnType<typeof mocks.mockPushbox>;
4750

4851
beforeEach(() => {
49-
log = mocks.mockLog();
52+
log = createMock<AuthLogger>();
5053
deviceCreatedAt = Date.now();
5154
deviceId = crypto.randomBytes(16).toString('hex');
5255
device = {

packages/fxa-auth-server/lib/email/bounces.spec.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44

55
import { EventEmitter } from 'events';
66
import Container from 'typedi';
7+
import { createMock } from '@golevelup/ts-jest';
8+
import { StatsD } from 'hot-shots';
9+
import { AuthLogger } from '../types';
710

811
const bounces = require('./bounces');
912
const { AppError: error } = require('@fxa/accounts/errors');
10-
const { mockLog, mockStatsd } = require('../../test/mocks');
1113
const { StripeHelper } = require('../payments/stripe');
1214
const emailHelpers = require('./utils/helpers');
1315

@@ -34,8 +36,8 @@ describe('bounce messages', () => {
3436
}
3537

3638
beforeEach(() => {
37-
log = mockLog();
38-
statsd = mockStatsd();
39+
log = createMock<AuthLogger>();
40+
statsd = createMock<StatsD>();
3941
mockConfig = {
4042
smtp: {
4143
bounces: {

packages/fxa-auth-server/lib/email/delivery-delay.spec.ts

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
44

55
import { EventEmitter } from 'events';
6+
import { createMock } from '@golevelup/ts-jest';
7+
import { StatsD } from 'hot-shots';
8+
import { AuthLogger } from '../types';
69

7-
const { mockLog, mockStatsd } = require('../../test/mocks');
810
const emailHelpers = require('./utils/helpers');
911
const deliveryDelay = require('./delivery-delay');
1012

@@ -48,26 +50,26 @@ describe('delivery delay messages', () => {
4850
});
4951

5052
it('should not log an error for headers', async () => {
51-
const log = mockLog();
52-
const statsd = mockStatsd();
53+
const log = createMock<AuthLogger>();
54+
const statsd = createMock<StatsD>();
5355
await mockedDeliveryDelay(log, statsd).handleDeliveryDelay(
5456
mockMessage({ junk: 'message' })
5557
);
5658
expect(log.error).toHaveBeenCalledTimes(0);
5759
});
5860

5961
it('should log an error for missing headers', async () => {
60-
const log = mockLog();
61-
const statsd = mockStatsd();
62+
const log = createMock<AuthLogger>();
63+
const statsd = createMock<StatsD>();
6264
const message = mockMessage({ junk: 'message' });
6365
message.headers = undefined;
6466
await mockedDeliveryDelay(log, statsd).handleDeliveryDelay(message);
6567
expect(log.error).toHaveBeenCalledTimes(1);
6668
});
6769

6870
it('should log delivery delay with all fields', async () => {
69-
const log = mockLog();
70-
const statsd = mockStatsd();
71+
const log = createMock<AuthLogger>();
72+
const statsd = createMock<StatsD>();
7173
const mockMsg = createDeliveryDelayMessage({
7274
deliveryDelay: {
7375
delayType: 'TransientCommunicationFailure',
@@ -118,8 +120,8 @@ describe('delivery delay messages', () => {
118120
});
119121

120122
it('should handle delivery delay with notificationType', async () => {
121-
const log = mockLog();
122-
const statsd = mockStatsd();
123+
const log = createMock<AuthLogger>();
124+
const statsd = createMock<StatsD>();
123125
const mockMsg = createDeliveryDelayMessage({
124126
notificationType: 'DeliveryDelay',
125127
eventType: undefined,
@@ -150,8 +152,8 @@ describe('delivery delay messages', () => {
150152
jest
151153
.spyOn(emailHelpers, 'logAccountEventFromMessage')
152154
.mockReturnValue(Promise.resolve());
153-
const log = mockLog();
154-
const statsd = mockStatsd();
155+
const log = createMock<AuthLogger>();
156+
const statsd = createMock<StatsD>();
155157
const mockMsg = createDeliveryDelayMessage({
156158
deliveryDelay: {
157159
delayType: 'SpamDetected',
@@ -169,8 +171,8 @@ describe('delivery delay messages', () => {
169171
});
170172

171173
it('should handle popular email domain', async () => {
172-
const log = mockLog();
173-
const statsd = mockStatsd();
174+
const log = createMock<AuthLogger>();
175+
const statsd = createMock<StatsD>();
174176
const mockMsg = createDeliveryDelayMessage({
175177
deliveryDelay: {
176178
delayType: 'RecipientServerError',
@@ -187,8 +189,8 @@ describe('delivery delay messages', () => {
187189
});
188190

189191
it('should handle missing delayedRecipients gracefully', async () => {
190-
const log = mockLog();
191-
const statsd = mockStatsd();
192+
const log = createMock<AuthLogger>();
193+
const statsd = createMock<StatsD>();
192194
const mockMsg = createDeliveryDelayMessage({
193195
deliveryDelay: {
194196
delayType: 'Undetermined',
@@ -204,8 +206,8 @@ describe('delivery delay messages', () => {
204206
});
205207

206208
it('should handle errors and still delete message', async () => {
207-
const log = mockLog();
208-
const statsd = mockStatsd();
209+
const log = createMock<AuthLogger>();
210+
const statsd = createMock<StatsD>();
209211
const mockMsg = createDeliveryDelayMessage();
210212

211213
jest

packages/fxa-auth-server/lib/email/delivery.spec.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
44

55
import { EventEmitter } from 'events';
6+
import { createMock } from '@golevelup/ts-jest';
7+
import { AuthLogger } from '../types';
68

7-
const { mockLog, mockGlean } = require('../../test/mocks');
9+
const { mockGlean } = require('../../test/mocks');
810
const emailHelpers = require('./utils/helpers');
911
const delivery = require('./delivery');
1012
const { requestForGlean } = require('../inactive-accounts');
@@ -32,7 +34,7 @@ describe('delivery messages', () => {
3234
});
3335

3436
it('should not log an error for headers', async () => {
35-
const log = mockLog();
37+
const log = createMock<AuthLogger>();
3638
const glean = mockGlean();
3739
await mockedDelivery(log, glean).handleDelivery(
3840
mockMessage({ junk: 'message' })
@@ -41,7 +43,7 @@ describe('delivery messages', () => {
4143
});
4244

4345
it('should log an error for missing headers', async () => {
44-
const log = mockLog();
46+
const log = createMock<AuthLogger>();
4547
const glean = mockGlean();
4648
const message = mockMessage({
4749
junk: 'message',
@@ -52,7 +54,7 @@ describe('delivery messages', () => {
5254
});
5355

5456
it('should ignore unknown message types', async () => {
55-
const log = mockLog();
57+
const log = createMock<AuthLogger>();
5658
const glean = mockGlean();
5759
await mockedDelivery(log, glean).handleDelivery(
5860
mockMessage({
@@ -67,7 +69,7 @@ describe('delivery messages', () => {
6769
});
6870

6971
it('should log delivery', async () => {
70-
const log = mockLog();
72+
const log = createMock<AuthLogger>();
7173
const glean = mockGlean();
7274
const mockMsg = mockMessage({
7375
notificationType: 'Delivery',
@@ -112,7 +114,7 @@ describe('delivery messages', () => {
112114
});
113115

114116
it('should emit flow metrics', async () => {
115-
const log = mockLog();
117+
const log = createMock<AuthLogger>();
116118
const glean = mockGlean();
117119
const mockMsg = mockMessage({
118120
notificationType: 'Delivery',
@@ -175,7 +177,7 @@ describe('delivery messages', () => {
175177
});
176178

177179
it('should log popular email domain', async () => {
178-
const log = mockLog();
180+
const log = createMock<AuthLogger>();
179181
const glean = mockGlean();
180182
const mockMsg = mockMessage({
181183
notificationType: 'Delivery',
@@ -242,7 +244,7 @@ describe('delivery messages', () => {
242244
jest
243245
.spyOn(emailHelpers, 'logAccountEventFromMessage')
244246
.mockReturnValue(Promise.resolve());
245-
const log = mockLog();
247+
const log = createMock<AuthLogger>();
246248
const glean = mockGlean();
247249
const mockMsg = mockMessage({
248250
notificationType: 'Delivery',
@@ -285,7 +287,7 @@ describe('delivery messages', () => {
285287
});
286288

287289
it('should log glean event for successful email delivery', async () => {
288-
const log = mockLog();
290+
const log = createMock<AuthLogger>();
289291
const glean = mockGlean();
290292
const mockMsg = mockMessage({
291293
notificationType: 'Delivery',

packages/fxa-auth-server/lib/email/notifications.spec.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
44

55
import Container from 'typedi';
6+
import { createMock } from '@golevelup/ts-jest';
67
import { StripeHelper } from '../payments/stripe';
8+
import { AuthLogger } from '../types';
79

810
const { AppError: error } = require('@fxa/accounts/errors');
9-
const { mockLog } = require('../../test/mocks');
1011
const notifications = require('./notifications');
1112

1213
const SIX_HOURS = 1000 * 60 * 60 * 6;
@@ -28,7 +29,7 @@ describe('lib/email/notifications:', () => {
2829
now = Date.now();
2930
jest.spyOn(Date, 'now').mockImplementation(() => now);
3031
del = jest.fn();
31-
log = mockLog();
32+
log = createMock<AuthLogger>();
3233
queue = {
3334
start: jest.fn(),
3435
on: jest.fn(),

0 commit comments

Comments
 (0)