@@ -5,20 +5,17 @@ import { dbChainMockFns, queueTableRows, resetDbChainMock, schemaMock } from '@s
55import { and } from 'drizzle-orm'
66import { beforeEach , describe , expect , it , vi } from 'vitest'
77
8- const { mockGetJob } = vi . hoisted ( ( ) => ( {
8+ const { mockGetJob, mockMaterializeForDisplay } = vi . hoisted ( ( ) => ( {
99 mockGetJob : vi . fn ( ) ,
10+ mockMaterializeForDisplay : vi . fn ( ) ,
1011} ) )
1112
1213vi . mock ( '@/lib/core/async-jobs' , ( ) => ( {
1314 getJobQueue : vi . fn ( ) . mockResolvedValue ( { getJob : mockGetJob } ) ,
1415} ) )
1516
16- vi . mock ( '@/lib/logs/execution/functional-outputs' , ( ) => ( {
17- collectFunctionalBlockOutputs : vi . fn ( ) . mockReturnValue ( new Map ( ) ) ,
18- } ) )
19-
2017vi . mock ( '@/lib/logs/execution/trace-store' , ( ) => ( {
21- materializeExecutionData : vi . fn ( ) ,
18+ materializeExecutionDataForDisplay : mockMaterializeForDisplay ,
2219} ) )
2320
2421vi . mock ( '@/lib/workflows/executor/paused-execution-metadata' , ( ) => ( {
@@ -38,6 +35,54 @@ describe('getWorkflowExecutionStatus queue projection', () => {
3835 beforeEach ( ( ) => {
3936 vi . clearAllMocks ( )
4037 resetDbChainMock ( )
38+ mockMaterializeForDisplay . mockResolvedValue ( { } )
39+ } )
40+
41+ it ( 'selects run outputs only from the secret-safe display projection' , async ( ) => {
42+ queueTableRows ( schemaMock . workflowExecutionLogs , [
43+ {
44+ executionId : 'execution-1' ,
45+ workflowId : 'workflow-1' ,
46+ workspaceId : 'workspace-1' ,
47+ status : 'completed' ,
48+ level : 'info' ,
49+ trigger : 'api' ,
50+ startedAt : new Date ( '2026-08-05T12:00:00.000Z' ) ,
51+ endedAt : new Date ( '2026-08-05T12:00:01.000Z' ) ,
52+ totalDurationMs : 1000 ,
53+ executionData : {
54+ executionState : {
55+ blockStates : { 'block-1' : { output : { token : 'resolved-secret' } } } ,
56+ } ,
57+ } ,
58+ costTotal : null ,
59+ } ,
60+ ] )
61+ queueTableRows ( schemaMock . resumeQueue , [ ] )
62+ queueTableRows ( schemaMock . pausedExecutions , [ ] )
63+ mockMaterializeForDisplay . mockResolvedValueOnce ( {
64+ finalOutput : { token : '[REDACTED]' } ,
65+ traceSpans : [ { blockId : 'block-1' , output : { token : '[REDACTED]' } } ] ,
66+ } )
67+ const status = await getWorkflowExecutionStatus ( {
68+ ...input ,
69+ includeOutput : true ,
70+ selectedOutputs : [ 'block-1' ] ,
71+ } )
72+
73+ expect ( mockMaterializeForDisplay ) . toHaveBeenCalledWith (
74+ expect . objectContaining ( { executionState : expect . anything ( ) } ) ,
75+ {
76+ workspaceId : 'workspace-1' ,
77+ workflowId : 'workflow-1' ,
78+ executionId : 'execution-1' ,
79+ }
80+ )
81+ expect ( status ) . toMatchObject ( {
82+ finalOutput : { token : '[REDACTED]' } ,
83+ blockOutputs : { 'block-1' : { token : '[REDACTED]' } } ,
84+ } )
85+ expect ( JSON . stringify ( status ) ) . not . toContain ( 'resolved-secret' )
4186 } )
4287
4388 it ( 'projects a queued workflow job as an execution resource' , async ( ) => {
0 commit comments