@@ -9,7 +9,7 @@ import type { Relationship } from './payload-types.js'
99
1010import { initPayloadInt } from '../__helpers/shared/initPayloadInt.js'
1111import { devUser } from '../credentials.js'
12- import { relationshipsSlug , tenantsSlug , usersSlug } from './shared.js'
12+ import { multiTenantPostsSlug , relationshipsSlug , tenantsSlug , usersSlug } from './shared.js'
1313
1414let payload : Payload
1515let restClient : NextRESTClient
@@ -195,7 +195,7 @@ describe('@payloadcms/plugin-multi-tenant', () => {
195195 } )
196196
197197 expect ( result . docs ) . toHaveLength ( 1 )
198- expect ( result . docs [ 0 ] . id ) . toBe ( noTenantUser . id )
198+ expect ( result . docs [ 0 ] ? .id ) . toBe ( noTenantUser . id )
199199
200200 // Cleanup
201201 await payload . delete ( { id : noTenantUser . id , collection : usersSlug } )
@@ -292,4 +292,47 @@ describe('@payloadcms/plugin-multi-tenant', () => {
292292 await payload . delete ( { id : tenantB . id , collection : tenantsSlug } )
293293 } )
294294 } )
295+
296+ describe ( 'hasMany tenant field filtering' , ( ) => {
297+ it ( 'should not double-wrap tenant arrays in filterOptions' , async ( ) => {
298+ const tenant1 = await payload . create ( {
299+ collection : tenantsSlug ,
300+ data : { name : 'Tenant 1' , domain : 'tenant1.test' } ,
301+ } )
302+ const tenant2 = await payload . create ( {
303+ collection : tenantsSlug ,
304+ data : { name : 'Tenant 2' , domain : 'tenant2.test' } ,
305+ } )
306+
307+ // Create a post with multiple tenants (hasMany: true)
308+ const post = await payload . create ( {
309+ collection : multiTenantPostsSlug ,
310+ data : {
311+ title : 'Multi-tenant post' ,
312+ tenant : [ tenant1 . id , tenant2 . id ] ,
313+ } ,
314+ } )
315+
316+ // Get the parent relationship field
317+ const parentField = payload . collections [ multiTenantPostsSlug ] . config . fields . find (
318+ ( f ) => 'name' in f && f . name === 'parent' ,
319+ ) as any
320+
321+ // Call filterOptions - this internally calls filterDocumentsByTenants with the array
322+ const filter = await parentField . filterOptions ( {
323+ data : post ,
324+ relationTo : multiTenantPostsSlug ,
325+ req : { payload } as any ,
326+ } )
327+
328+ // Array should not be double-wrapped
329+ expect ( Array . isArray ( filter . tenant . in [ 0 ] ) ) . toBe ( false )
330+ expect ( Array . isArray ( filter . tenant . in [ 1 ] ) ) . toBe ( false )
331+
332+ // Cleanup
333+ await payload . delete ( { id : post . id , collection : multiTenantPostsSlug } )
334+ await payload . delete ( { id : tenant1 . id , collection : tenantsSlug } )
335+ await payload . delete ( { id : tenant2 . id , collection : tenantsSlug } )
336+ } )
337+ } )
295338} )
0 commit comments