11import { db } from '@sim/db'
2- import { member , organization , outboxEvent , user } from '@sim/db/schema'
2+ import { member , organization , outboxEvent , permissions , user , workspace } from '@sim/db/schema'
33import { readTestDatabaseUrl } from '@sim/db/testing/test-infrastructure'
4+ import { deleteWorkspaceFixture , insertWorkspaceFixture } from '@sim/db/testing/workspace-fixtures'
45import { generateId } from '@sim/utils/id'
56import { and , eq , inArray , sql } from 'drizzle-orm'
67import { afterAll , beforeAll , expect , it } from 'vitest'
@@ -12,6 +13,7 @@ const memberId = generateId()
1213const externalId = generateId ( )
1314const organizationId = generateId ( )
1415const membershipId = generateId ( )
16+ const workspaceId = generateId ( )
1517let runtime : {
1618 membership : typeof import ( '@/lib/billing/organizations/membership' )
1719 resources : typeof import ( '@/lib/organizations/resource-cleanup' )
@@ -45,6 +47,22 @@ beforeAll(async () => {
4547 { id : generateId ( ) , organizationId, userId : ownerId , role : 'owner' , createdAt : new Date ( ) } ,
4648 { id : membershipId , organizationId, userId : memberId , role : 'member' , createdAt : new Date ( ) } ,
4749 ] )
50+ // The external collaborator works in one of the organization's workspaces without membership.
51+ await insertWorkspaceFixture ( db , {
52+ id : workspaceId ,
53+ name : 'Offboarding' ,
54+ ownerId,
55+ billedAccountUserId : ownerId ,
56+ organizationId,
57+ workspaceMode : 'organization' ,
58+ } )
59+ await db . insert ( permissions ) . values ( {
60+ id : generateId ( ) ,
61+ userId : externalId ,
62+ entityType : 'workspace' ,
63+ entityId : workspaceId ,
64+ permissionType : 'write' ,
65+ } )
4866} , 60_000 )
4967
5068afterAll ( async ( ) => {
@@ -56,6 +74,7 @@ afterAll(async () => {
5674 sql `${ outboxEvent . payload } ->'request'->'target'->>'organizationId' = ${ organizationId } `
5775 )
5876 )
77+ await deleteWorkspaceFixture ( db , eq ( workspace . id , workspaceId ) )
5978 await db . delete ( organization ) . where ( eq ( organization . id , organizationId ) )
6079 await db . delete ( user ) . where ( inArray ( user . id , [ ownerId , memberId , externalId ] ) )
6180} )
@@ -101,10 +120,12 @@ it('queues private memory erasure with each committed departure and organization
101120 skipBillingLogic : true ,
102121 onError : 'throw' ,
103122 } )
104- await runtime . membership . removeExternalUserFromOrganizationWorkspaces ( {
105- organizationId,
106- userId : externalId ,
107- } )
123+ expect (
124+ await runtime . membership . removeExternalUserFromOrganizationWorkspaces ( {
125+ organizationId,
126+ userId : externalId ,
127+ } )
128+ ) . toMatchObject ( { success : true , workspaceAccessRevoked : 1 } )
108129 expect ( await queued ( ) ) . toEqual (
109130 [ `organization_member:${ externalId } ` , `organization_member:${ memberId } ` ] . sort ( )
110131 )
0 commit comments