@@ -15,6 +15,7 @@ import {
1515 RecoveryNumberRemoveMissingBackupCodes ,
1616} from './recovery-phone.errors' ;
1717import { LOGGER_PROVIDER } from '@fxa/shared/log' ;
18+ import { StatsDService } from '@fxa/shared/metrics/statsd' ;
1819
1920describe ( 'RecoveryPhoneService' , ( ) => {
2021 const phoneNumber = '+15005551234' ;
@@ -24,6 +25,10 @@ describe('RecoveryPhoneService', () => {
2425 const mockLogger = {
2526 error : jest . fn ( ) ,
2627 } ;
28+ const mockMetrics = {
29+ gauge : jest . fn ( ) ,
30+ increment : jest . fn ( ) ,
31+ } ;
2732 const mockSmsManager = {
2833 sendSMS : jest . fn ( ) ,
2934 phoneNumberLookup : jest . fn ( ) ,
@@ -44,6 +49,7 @@ describe('RecoveryPhoneService', () => {
4449 allowedRegions : [ 'US' ] ,
4550 sms : {
4651 validNumberPrefixes : [ '+1500' ] ,
52+ smsPumpingRiskThreshold : 75 ,
4753 } ,
4854 } ;
4955 const mockError = new Error ( 'BOOM' ) ;
@@ -68,6 +74,10 @@ describe('RecoveryPhoneService', () => {
6874 provide : LOGGER_PROVIDER ,
6975 useValue : mockLogger ,
7076 } ,
77+ {
78+ provide : StatsDService ,
79+ useValue : mockMetrics ,
80+ } ,
7181 RecoveryPhoneService ,
7282 ] ,
7383 } ) . compile ( ) ;
@@ -224,7 +234,36 @@ describe('RecoveryPhoneService', () => {
224234 expect ( mockRecoveryPhoneManager . getUnconfirmed ) . toBeCalledWith ( uid , code ) ;
225235 } ) ;
226236
227- it ( 'can handled failed lookup by throwing PhoneNumberNotSupported error' , async ( ) => {
237+ it ( 'can handle smsPumpingRisk score throwing PhoneNumberNotSupported error' , async ( ) => {
238+ const phoneNumber = '+15005550000' ;
239+ const smsPumpingRisk = 95 ;
240+
241+ mockRecoveryPhoneManager . getUnconfirmed . mockReturnValueOnce ( {
242+ isSetup : true ,
243+ phoneNumber,
244+ } ) ;
245+ mockSmsManager . phoneNumberLookup . mockReturnValueOnce ( {
246+ phoneNumber,
247+ smsPumpingRisk,
248+ } ) ;
249+
250+ const promise = service . confirmSetupCode ( uid , code ) ;
251+ await expect ( promise ) . rejects . toThrow ( / P h o n e n u m b e r n o t s u p p o r t e d .* / ) ;
252+ expect ( mockMetrics . gauge ) . toBeCalledWith (
253+ 'sim_pumping_risk' ,
254+ smsPumpingRisk
255+ ) ;
256+ expect ( mockMetrics . increment ) . toBeCalledWith ( 'sim_pumping_risk.denied' ) ;
257+ expect ( mockLogger . error ) . toBeCalledWith (
258+ 'RecoveryPhoneService.smsPumpingRisk' ,
259+ {
260+ phoneNumber,
261+ smsPumpingRisk,
262+ }
263+ ) ;
264+ } ) ;
265+
266+ it ( 'can handle failed lookup by throwing PhoneNumberNotSupported error' , async ( ) => {
228267 mockRecoveryPhoneManager . getUnconfirmed . mockReturnValue ( {
229268 isSetup : true ,
230269 } ) ;
0 commit comments