@@ -6,6 +6,15 @@ import type { InternalToolOperationCall } from '@/lib/internal/tool-operations/t
66const TEST_ACCESS_TOKEN = 'test-access-token'
77
88const mocks = vi . hoisted ( ( ) => ( {
9+ createAssignedPayroll : vi . fn ( ) ,
10+ updateAssignedPayroll : vi . fn ( ) ,
11+ createElementEntry : vi . fn ( ) ,
12+ updateElementEntryValue : vi . fn ( ) ,
13+ createSalary : vi . fn ( ) ,
14+ correctSalary : vi . fn ( ) ,
15+ createTimeEntry : vi . fn ( ) ,
16+ updateTimeEntry : vi . fn ( ) ,
17+ deleteTimeEntry : vi . fn ( ) ,
918 listWorkers : vi . fn ( ) ,
1019 getWorker : vi . fn ( ) ,
1120 listWorkerAssignments : vi . fn ( ) ,
@@ -27,6 +36,15 @@ const mocks = vi.hoisted(() => ({
2736} ) )
2837
2938vi . mock ( '@/lib/internal/oracle-fusion-hcm/operations' , ( ) => ( {
39+ executeOracleFusionHcmCreateAssignedPayroll : mocks . createAssignedPayroll ,
40+ executeOracleFusionHcmUpdateAssignedPayroll : mocks . updateAssignedPayroll ,
41+ executeOracleFusionHcmCreateElementEntry : mocks . createElementEntry ,
42+ executeOracleFusionHcmUpdateElementEntryValue : mocks . updateElementEntryValue ,
43+ executeOracleFusionHcmCreateSalary : mocks . createSalary ,
44+ executeOracleFusionHcmCorrectSalary : mocks . correctSalary ,
45+ executeOracleFusionHcmCreateTimeEntry : mocks . createTimeEntry ,
46+ executeOracleFusionHcmUpdateTimeEntry : mocks . updateTimeEntry ,
47+ executeOracleFusionHcmDeleteTimeEntry : mocks . deleteTimeEntry ,
3048 executeOracleFusionHcmListWorkers : mocks . listWorkers ,
3149 executeOracleFusionHcmGetWorker : mocks . getWorker ,
3250 executeOracleFusionHcmListWorkerAssignments : mocks . listWorkerAssignments ,
@@ -64,6 +82,25 @@ function invokeHcmTool(overrides: Partial<InternalToolOperationCall>) {
6482}
6583
6684describe ( 'Oracle Fusion HCM tool dispatch' , ( ) => {
85+ it ( 'marks ambiguous mutation failures non-retryable without exposing provider details' , async ( ) => {
86+ mocks . createSalary . mockRejectedValueOnce ( new OracleFusionProviderError ( 'Oracle Fusion HCM request timed out' , 504 ) )
87+ const response = await invokeHcmTool ( {
88+ toolId : 'oracle_fusion_hcm_create_salary' ,
89+ input : { ...auth , assignmentId : '1' , salaryBasisId : '2' , salaryAmount : 1200 , dateFrom : '2026-01-01' , dateTo : '4712-12-31' } ,
90+ } )
91+ expect ( response . status ) . toBe ( 504 )
92+ expect ( await response . json ( ) ) . toEqual ( { success : false , error : 'Oracle Fusion HCM request timed out' , retryable : false } )
93+ expect ( mocks . createSalary ) . toHaveBeenCalledOnce ( )
94+ } )
95+
96+ it ( 'rejects a time update missing its version before dispatch' , async ( ) => {
97+ const response = await invokeHcmTool ( {
98+ toolId : 'oracle_fusion_hcm_update_time_entry' ,
99+ input : { ...auth , personNumber : '0007' , timeRecordId : '2' , measure : 8 , referenceDate : '2026-01-01' } ,
100+ } )
101+ expect ( response . status ) . toBe ( 400 )
102+ expect ( mocks . updateTimeEntry ) . not . toHaveBeenCalled ( )
103+ } )
67104 beforeEach ( ( ) => {
68105 vi . clearAllMocks ( )
69106 for ( const mock of Object . values ( mocks ) ) {
0 commit comments