@@ -20,7 +20,10 @@ vi.mock('@/lib/resource-policies/repository', () => ({
2020 requireResourcePolicy : mocks . requirePolicy ,
2121} ) )
2222
23- import { requireCredentialGroupCredentialAccess } from '@/lib/credential-groups/application/authorization'
23+ import {
24+ requireCredentialGroupCredentialAccess ,
25+ requireCredentialGroupWorkflowActor ,
26+ } from '@/lib/credential-groups/application/authorization'
2427
2528const context = {
2629 workspaceId : 'workspace-1' ,
@@ -216,3 +219,60 @@ describe('requireCredentialGroupCredentialAccess', () => {
216219 expect ( mocks . loadEnrollmentAccess ) . not . toHaveBeenCalled ( )
217220 } )
218221} )
222+
223+ describe ( 'requireCredentialGroupWorkflowActor' , ( ) => {
224+ it ( 'returns the external subject a Slack-triggered run acts as' , ( ) => {
225+ expect ( requireCredentialGroupWorkflowActor ( executorPrincipal ( ) ) ) . toEqual ( {
226+ kind : 'external_user' ,
227+ provider : 'slack' ,
228+ tenantId : 'T123' ,
229+ subjectId : 'U123' ,
230+ } )
231+ } )
232+
233+ it ( 'returns no subject for an actorless deployed run' , ( ) => {
234+ const principal = executorPrincipal ( )
235+ principal . delegationContext ! . principal = {
236+ kind : 'system' ,
237+ serviceId : 'schedule' ,
238+ workspaceId : 'workspace-1' ,
239+ workflowId : 'root-workflow' ,
240+ }
241+
242+ expect ( requireCredentialGroupWorkflowActor ( principal ) ) . toBeNull ( )
243+ } )
244+
245+ it ( 'returns the Sim subject a session-actor run acts as' , ( ) => {
246+ const principal = executorPrincipal ( )
247+ principal . subjectUserId = 'user-1'
248+ principal . delegationContext ! . principal = {
249+ kind : 'session' ,
250+ userId : 'user-1' ,
251+ sessionId : 'session-1' ,
252+ }
253+
254+ expect ( requireCredentialGroupWorkflowActor ( principal ) ) . toEqual ( {
255+ kind : 'sim_user' ,
256+ userId : 'user-1' ,
257+ } )
258+ } )
259+
260+ it ( 'rejects a delegation whose asserted subject contradicts its run' , ( ) => {
261+ const invented = executorPrincipal ( )
262+ invented . subjectUserId = 'invented-user'
263+ expect ( ( ) => requireCredentialGroupWorkflowActor ( invented ) ) . toThrow (
264+ 'Credential Group actor access required'
265+ )
266+
267+ const mismatched = executorPrincipal ( )
268+ mismatched . subjectUserId = 'user-2'
269+ mismatched . delegationContext ! . principal = {
270+ kind : 'session' ,
271+ userId : 'user-1' ,
272+ sessionId : 'session-1' ,
273+ }
274+ expect ( ( ) => requireCredentialGroupWorkflowActor ( mismatched ) ) . toThrow (
275+ 'Credential Group actor access required'
276+ )
277+ } )
278+ } )
0 commit comments