@@ -4,14 +4,15 @@ import { initIocContainer } from '..'
44import { AppServices } from '../app'
55import { Config , IAppConfig } from '../config/app'
66import { TestContainer , createTestApp } from '../tests/app'
7- import { PaymentContext , PaymentRoutes } from './routes'
7+ import { GetPaymentsContext , PaymentContext , PaymentRoutes } from './routes'
88import { PaymentService } from './service'
99import { CardServiceClient , Result } from '../card-service-client/client'
1010import { createContext } from '../tests/context'
1111import { CardServiceClientError } from '../card-service-client/errors'
1212import { webhookWaitMap } from '../webhook-handlers/request-map'
1313import { faker } from '@faker-js/faker'
1414import { withConfigOverride } from '../tests/helpers'
15+ import { IncomingPaymentState } from '../graphql/generated/graphql'
1516
1617describe ( 'Payment Routes' , ( ) => {
1718 let deps : IocContract < AppServices >
@@ -21,6 +22,24 @@ describe('Payment Routes', () => {
2122 let cardServiceClient : CardServiceClient
2223 let config : IAppConfig
2324
25+ function mockPaymentService ( ) {
26+ jest . spyOn ( paymentService , 'getWalletAddress' ) . mockResolvedValueOnce ( {
27+ id : 'id' ,
28+ assetCode : 'USD' ,
29+ assetScale : 1 ,
30+ authServer : 'authServer' ,
31+ resourceServer : 'resourceServer' ,
32+ cardService : 'cardService'
33+ } )
34+ jest . spyOn ( paymentService , 'createIncomingPayment' ) . mockResolvedValueOnce ( {
35+ id : 'incoming-payment-url' ,
36+ url : faker . internet . url ( )
37+ } )
38+ jest
39+ . spyOn ( paymentService , 'getWalletAddressIdByUrl' )
40+ . mockResolvedValueOnce ( faker . internet . url ( ) )
41+ }
42+
2443 beforeAll ( async ( ) => {
2544 deps = initIocContainer ( Config )
2645 appContainer = await createTestApp ( deps )
@@ -135,26 +154,94 @@ describe('Payment Routes', () => {
135154 }
136155 )
137156 )
157+ } )
138158
139- function mockPaymentService ( ) {
140- jest . spyOn ( paymentService , 'getWalletAddress' ) . mockResolvedValueOnce ( {
141- id : 'id' ,
142- assetCode : 'USD' ,
143- assetScale : 1 ,
144- authServer : 'authServer' ,
145- resourceServer : 'resourceServer' ,
146- cardService : 'cardService'
147- } )
159+ describe ( 'get incoming payments' , ( ) : void => {
160+ test ( 'can get incoming payments for pos device' , async ( ) : Promise < void > => {
161+ const walletAddressId = v4 ( )
162+ const mockServiceResponse = {
163+ edges : [
164+ {
165+ node : {
166+ __typename : 'IncomingPayment' as const ,
167+ id : v4 ( ) ,
168+ url : faker . internet . url ( ) ,
169+ walletAddressId,
170+ client : faker . internet . url ( ) ,
171+ state : IncomingPaymentState . Pending ,
172+ incomingAmount : {
173+ __typename : 'Amount' as const ,
174+ value : BigInt ( 500 ) ,
175+ assetCode : 'USD' ,
176+ assetScale : 2
177+ } ,
178+ receivedAmount : {
179+ __typename : 'Amount' as const ,
180+ value : BigInt ( 500 ) ,
181+ assetCode : 'USD' ,
182+ assetScale : 2
183+ } ,
184+ expiresAt : new Date ( ) . toString ( ) ,
185+ createdAt : new Date ( ) . toString ( ) ,
186+ tenantId : v4 ( )
187+ } ,
188+ cursor : walletAddressId
189+ }
190+ ] ,
191+ pageInfo : {
192+ endCursor : walletAddressId ,
193+ hasNextPage : false ,
194+ hasPreviousPage : false ,
195+ startCursor : walletAddressId
196+ }
197+ }
148198 jest
149- . spyOn ( paymentService , 'createIncomingPayment' )
150- . mockResolvedValueOnce ( {
151- id : 'incoming-payment-url' ,
152- url : faker . internet . url ( )
153- } )
199+ . spyOn ( paymentService , 'getIncomingPayments' )
200+ . mockResolvedValue ( mockServiceResponse )
201+ const ctx = createGetPaymentsContext ( )
202+
203+ await paymentRoutes . getPayments ( ctx )
204+ expect ( ctx . status ) . toEqual ( 200 )
205+ expect ( ctx . body ) . toEqual ( {
206+ // Ensure that typename is sanitized
207+ result : mockServiceResponse . edges . map ( ( edge ) => {
208+ const {
209+ __typename : _nodeTypename ,
210+ receivedAmount,
211+ incomingAmount,
212+ ...restOfNode
213+ } = edge . node
214+ const { __typename : _receivedTypename , ...restOfReceived } =
215+ receivedAmount
216+ const { __typename : _incomingTypename , ...restOfIncoming } =
217+ incomingAmount
218+ return {
219+ ...restOfNode ,
220+ incomingAmount : restOfIncoming ,
221+ receivedAmount : restOfReceived
222+ }
223+ } ) ,
224+ pagination : mockServiceResponse . pageInfo
225+ } )
226+ } )
227+
228+ test ( 'returns empty page if no incoming payments' , async ( ) : Promise < void > => {
154229 jest
155- . spyOn ( paymentService , 'getWalletAddressIdByUrl' )
156- . mockResolvedValueOnce ( faker . internet . url ( ) )
157- }
230+ . spyOn ( paymentService , 'getIncomingPayments' )
231+ . mockResolvedValue ( undefined )
232+
233+ const ctx = createGetPaymentsContext ( )
234+
235+ await paymentRoutes . getPayments ( ctx )
236+ expect ( ctx . status ) . toEqual ( 200 )
237+ expect ( ctx . body ) . toMatchObject ( {
238+ result : [ ] ,
239+ pagination : {
240+ hasNextPage : false ,
241+ hasPreviousPage : false
242+ }
243+ } )
244+ } )
158245 } )
159246} )
160247
@@ -173,3 +260,14 @@ function createPaymentContext() {
173260 }
174261 } )
175262}
263+
264+ function createGetPaymentsContext ( ) {
265+ return createContext < GetPaymentsContext > ( {
266+ headers : { Accept : 'application/json' } ,
267+ method : 'GET' ,
268+ url : `/payments` ,
269+ query : {
270+ receiverWalletAddress : faker . internet . url ( )
271+ }
272+ } )
273+ }
0 commit comments