@@ -17,9 +17,15 @@ describe('SmsManager', () => {
1717 messages : {
1818 create : jest . fn ( ) ,
1919 } ,
20+ lookups : {
21+ v2 : {
22+ phoneNumbers : jest . fn ( ) ,
23+ } ,
24+ } ,
2025 } ;
2126 const mockMetrics = {
2227 increment : jest . fn ( ) ,
28+ histogram : jest . fn ( ) ,
2329 } ;
2430 const mockLog = {
2531 log : jest . fn ( ) ,
@@ -29,6 +35,7 @@ describe('SmsManager', () => {
2935 validNumberPrefixes : [ '+1' ] ,
3036 maxMessageLength : 160 ,
3137 maxRetries : 2 ,
38+ extraLookupFields : [ 'sms_pumping_risk' ] ,
3239 } ;
3340
3441 let manager : SmsManager ;
@@ -187,4 +194,61 @@ describe('SmsManager', () => {
187194 expect ( number2 ) . toBeDefined ( ) ;
188195 expect ( number1 ) . not . toEqual ( number2 ) ;
189196 } ) ;
197+
198+ describe ( 'phoneNumberLookup' , ( ) => {
199+ it ( 'should increment metrics and return result on success' , async ( ) => {
200+ const phoneNumber = '+15005551111' ;
201+ const mockResult = {
202+ simSwap : { lastSimSwap : { swappedPeriod : '1' } } ,
203+ smsPumpingRisk : { smsPumpingRiskScore : 0.5 } ,
204+ phoneNumberQualityScore : 0.8 ,
205+ toJSON : jest . fn ( ) . mockReturnValue ( { phoneNumber } ) ,
206+ } ;
207+
208+ mockTwilioSmsClient . lookups . v2 . phoneNumbers . mockReturnValue ( {
209+ fetch : jest . fn ( ) . mockResolvedValue ( mockResult ) ,
210+ } ) ;
211+
212+ const result = await manager . phoneNumberLookup ( phoneNumber ) ;
213+
214+ expect ( mockMetrics . increment ) . toHaveBeenCalledWith (
215+ 'sms.phoneNumberLookup.start'
216+ ) ;
217+ expect ( mockMetrics . increment ) . toHaveBeenCalledWith (
218+ 'sms.phoneNumberLookup.success'
219+ ) ;
220+ expect ( mockMetrics . increment ) . toHaveBeenCalledWith (
221+ 'sms.phoneNumberLookup.success.simSwap' ,
222+ { period : '1' }
223+ ) ;
224+ expect ( mockMetrics . histogram ) . toHaveBeenCalledWith (
225+ 'sms.phoneNumberLookup.success.smsPumpingRisk' ,
226+ 0.5
227+ ) ;
228+ expect ( mockMetrics . histogram ) . toHaveBeenCalledWith (
229+ 'sms.phoneNumberLookup.success.phoneNumberQualityScore' ,
230+ 0.8
231+ ) ;
232+ expect ( result ) . toEqual ( { phoneNumber } ) ;
233+ } ) ;
234+
235+ it ( 'should increment failed metric and throw error on failure' , async ( ) => {
236+ const phoneNumber = '+15005551111' ;
237+ const mockError = new Error ( 'Lookup failed' ) ;
238+
239+ mockTwilioSmsClient . lookups . v2 . phoneNumbers . mockReturnValue ( {
240+ fetch : jest . fn ( ) . mockRejectedValue ( mockError ) ,
241+ } ) ;
242+
243+ await expect ( manager . phoneNumberLookup ( phoneNumber ) ) . rejects . toThrow (
244+ mockError
245+ ) ;
246+ expect ( mockMetrics . increment ) . toHaveBeenCalledWith (
247+ 'sms.phoneNumberLookup.start'
248+ ) ;
249+ expect ( mockMetrics . increment ) . toHaveBeenCalledWith (
250+ 'sms.phoneNumberLookup.failure'
251+ ) ;
252+ } ) ;
253+ } ) ;
190254} ) ;
0 commit comments