11import { IocContract } from '@adonisjs/fold'
2- import { gql } from '@apollo/client'
2+ import { ApolloClient , gql , NormalizedCacheObject } from '@apollo/client'
33import { AppServices } from '../../app'
4- import { createTestApp , TestContainer } from '../../tests/app'
4+ import {
5+ createApolloClient ,
6+ createTestApp ,
7+ TestContainer
8+ } from '../../tests/app'
59import { initIocContainer } from '../..'
610import { Config } from '../../config/app'
711import { truncateTables } from '../../tests/tableManager'
@@ -16,8 +20,12 @@ import {
1620 createCombinedPayment ,
1721 toCombinedPayment
1822} from '../../tests/combinedPayment'
19- import { PaymentType } from '../../open_payments/payment/combined/model'
23+ import {
24+ CombinedPayment ,
25+ PaymentType
26+ } from '../../open_payments/payment/combined/model'
2027import { getPageTests } from './page.test'
28+ import { createTenant } from '../../tests/tenant'
2129
2230describe ( 'Payment' , ( ) : void => {
2331 let deps : IocContract < AppServices >
@@ -240,4 +248,144 @@ describe('Payment', (): void => {
240248 createdAt : combinedOutgoingPayment . createdAt . toISOString ( )
241249 } )
242250 } )
251+
252+ describe ( 'tenant boundaries' , ( ) : void => {
253+ let operatorPayment : CombinedPayment
254+ let tenantPayment : CombinedPayment
255+ let secondTenantPayment : CombinedPayment
256+ let tenenatedApolloClient : ApolloClient < NormalizedCacheObject >
257+
258+ const pageQuery = gql `
259+ query Payments($tenantId: String) {
260+ payments(tenantId: $tenantId) {
261+ edges {
262+ node {
263+ id
264+ }
265+ }
266+ }
267+ }
268+ `
269+
270+ beforeEach ( async ( ) : Promise < void > => {
271+ operatorPayment = await createCombinedPayment ( deps )
272+ const tenant = await createTenant ( deps )
273+ tenenatedApolloClient = await createApolloClient (
274+ appContainer . container ,
275+ appContainer . app ,
276+ tenant . id
277+ )
278+ tenantPayment = await createCombinedPayment ( deps , { tenantId : tenant . id } )
279+ secondTenantPayment = await createCombinedPayment ( deps , {
280+ tenantId : tenant . id
281+ } )
282+ } )
283+
284+ test ( 'operator can get payments across all tenants' , async ( ) : Promise < void > => {
285+ const query = await appContainer . apolloClient
286+ . query ( {
287+ query : pageQuery
288+ } )
289+ . then ( ( query ) : PaymentConnection => {
290+ if ( query . data ) {
291+ return query . data . payments
292+ } else {
293+ throw new Error ( 'data was empty' )
294+ }
295+ } )
296+ expect ( query . edges ) . toHaveLength ( 3 )
297+ expect ( query . edges ) . toEqual (
298+ expect . arrayContaining ( [
299+ expect . objectContaining ( {
300+ node : expect . objectContaining ( { id : operatorPayment . id } )
301+ } ) ,
302+ expect . objectContaining ( {
303+ node : expect . objectContaining ( { id : tenantPayment . id } )
304+ } ) ,
305+ expect . objectContaining ( {
306+ node : expect . objectContaining ( { id : secondTenantPayment . id } )
307+ } )
308+ ] )
309+ )
310+ } )
311+
312+ test ( 'tenant cannot get payments across all tenants' , async ( ) : Promise < void > => {
313+ const query = await tenenatedApolloClient
314+ . query ( {
315+ query : pageQuery
316+ } )
317+ . then ( ( query ) : PaymentConnection => {
318+ if ( query . data ) {
319+ return query . data . payments
320+ } else {
321+ throw new Error ( 'data was empty' )
322+ }
323+ } )
324+ expect ( query . edges ) . toHaveLength ( 2 )
325+ expect ( query . edges ) . toEqual (
326+ expect . arrayContaining ( [
327+ expect . objectContaining ( {
328+ node : expect . objectContaining ( { id : tenantPayment . id } )
329+ } ) ,
330+ expect . objectContaining ( {
331+ node : expect . objectContaining ( { id : secondTenantPayment . id } )
332+ } )
333+ ] )
334+ )
335+ } )
336+
337+ test ( 'operator can filter payments across all tenants' , async ( ) : Promise < void > => {
338+ const query = await appContainer . apolloClient
339+ . query ( {
340+ query : pageQuery ,
341+ variables : { tenantId : tenantPayment . tenantId }
342+ } )
343+ . then ( ( query ) : PaymentConnection => {
344+ if ( query . data ) {
345+ return query . data . payments
346+ } else {
347+ throw new Error ( 'data was empty' )
348+ }
349+ } )
350+ expect ( query . edges ) . toHaveLength ( 2 )
351+ expect ( query . edges ) . toEqual (
352+ expect . arrayContaining ( [
353+ expect . objectContaining ( {
354+ node : expect . objectContaining ( { id : tenantPayment . id } )
355+ } ) ,
356+ expect . objectContaining ( {
357+ node : expect . objectContaining ( { id : secondTenantPayment . id } )
358+ } )
359+ ] )
360+ )
361+ } )
362+
363+ test ( 'tenant cannot filter payments across all tenants' , async ( ) : Promise < void > => {
364+ const query = await tenenatedApolloClient
365+ . query ( {
366+ query : pageQuery ,
367+ variables : {
368+ tenantId : operatorPayment . tenantId
369+ }
370+ } )
371+ . then ( ( query ) : PaymentConnection => {
372+ if ( query . data ) {
373+ return query . data . payments
374+ } else {
375+ throw new Error ( 'data was empty' )
376+ }
377+ } )
378+ expect ( query . edges ) . toHaveLength ( 2 )
379+ expect ( query . edges ) . toEqual (
380+ expect . arrayContaining ( [
381+ expect . objectContaining ( {
382+ node : expect . objectContaining ( { id : tenantPayment . id } )
383+ } ) ,
384+ expect . objectContaining ( {
385+ node : expect . objectContaining ( { id : secondTenantPayment . id } )
386+ } )
387+ ] )
388+ )
389+ } )
390+ } )
243391} )
0 commit comments