@@ -1220,17 +1220,19 @@ describe('Data Fetcher', () => {
1220
1220
mockClient1 . get
1221
1221
. mockResolvedValueOnce ( { data : { data : [ { node : 'node1' } ] } } ) // nodes
1222
1222
. mockResolvedValueOnce ( { data : { data : [ { store : 'ds1' , total : 1 , used : 0 } ] } } ) // usage
1223
- . mockResolvedValueOnce ( { data : { data : [ ] } } ) // snapshots
1224
- . mockResolvedValueOnce ( { data : { data : [ ] } } ) ; // tasks
1223
+ . mockResolvedValueOnce ( { data : { data : [ ] } } ) // snapshots for ds1
1224
+ . mockResolvedValueOnce ( { data : { data : [ ] } } ) ; // tasks for node1
1225
1225
1226
- // Mock Client 2 (Fail Datastore) - Include fallback and subsequent calls
1226
+ // Mock Client 2 (Fail Datastore, fallback success)
1227
+ const node2Name = 'node2' ;
1228
+ const fallbackDsName = 'fallback-ds-client2' ;
1227
1229
mockClient2 . get
1228
- . mockResolvedValueOnce ( { data : { data : [ { node : 'node2' } ] } } ) // nodes
1229
- . mockRejectedValueOnce ( new Error ( 'DS Error' ) ) // usage fails
1230
- . mockResolvedValueOnce ( { data : { data : [ ] } } ) // fallback /config/datastore
1231
- . mockResolvedValueOnce ( { data : { data : [ ] } } ) // snapshots (on empty stores )
1232
- . mockRejectedValueOnce ( new Error ( 'Task Error' ) ) ; // tasks fail
1233
-
1230
+ . mockResolvedValueOnce ( { data : { data : [ { node : node2Name } ] } } ) // / nodes (success)
1231
+ . mockRejectedValueOnce ( new Error ( 'DS Usage API Error' ) ) // /status/datastore- usage (fail)
1232
+ . mockResolvedValueOnce ( { data : { data : [ { name : fallbackDsName , store : fallbackDsName , path : '/mnt/fb' } ] } } ) // /config/datastore (fallback success, 1 store)
1233
+ . mockResolvedValueOnce ( { data : { data : [ { 'backup-id' : 'snap-fb' } ] } } ) // /admin/datastore/fallback-ds-client2/ snapshots (success )
1234
+ . mockResolvedValueOnce ( { data : { data : [ { upid : 'task-c2' } ] } } ) ; // /nodes/node2/ tasks (success)
1235
+
1234
1236
// Mock Client 3 (Fail Node)
1235
1237
mockClient3 . get . mockRejectedValueOnce ( new Error ( 'Node Error' ) ) ; // nodes fails
1236
1238
@@ -1257,12 +1259,16 @@ describe('Data Fetcher', () => {
1257
1259
expect ( res1 . gcTasks ) . toBeDefined ( ) ;
1258
1260
1259
1261
expect ( res2 ) . toBeDefined ( ) ;
1260
- expect ( res2 . status ) . toBe ( 'ok' ) ; // Still OK because node name succeeded
1261
- expect ( res2 . datastores ) . toEqual ( [ ] ) ;
1262
- // Check tasks were processed (returning empty arrays) even after task fetch failure
1263
- expect ( res2 . backupTasks ) . toEqual ( [ ] ) ;
1264
- expect ( res2 . verifyTasks ) . toEqual ( [ ] ) ;
1265
- expect ( res2 . gcTasks ) . toEqual ( [ ] ) ;
1262
+ expect ( res2 . status ) . toBe ( 'ok' ) ;
1263
+ expect ( res2 . nodeName ) . toBe ( node2Name ) ;
1264
+ expect ( res2 . datastores ) . toHaveLength ( 1 ) ;
1265
+ expect ( res2 . datastores [ 0 ] . name ) . toBe ( fallbackDsName ) ;
1266
+ expect ( res2 . datastores [ 0 ] . snapshots ) . toHaveLength ( 1 ) ;
1267
+ expect ( res2 . datastores [ 0 ] . snapshots [ 0 ] [ 'backup-id' ] ) . toBe ( 'snap-fb' ) ;
1268
+
1269
+ expect ( res2 . backupTasks ) . toEqual ( [ ] ) ; // From mocked processPbsTasks
1270
+ expect ( res2 . verifyTasks ) . toEqual ( [ ] ) ; // From mocked processPbsTasks
1271
+ expect ( res2 . gcTasks ) . toEqual ( [ ] ) ; // From mocked processPbsTasks
1266
1272
1267
1273
// Assert the structure of the failed node instance
1268
1274
expect ( res3 ) . toBeDefined ( ) ;
@@ -1276,7 +1282,7 @@ describe('Data Fetcher', () => {
1276
1282
// Error spy should be called for the node failure on res3 AND the task failure on res2
1277
1283
expect ( consoleErrorSpy ) . toHaveBeenCalledWith ( expect . stringContaining ( 'Failed to fetch PBS nodes list for PBS Node Fail: Node Error' ) ) ;
1278
1284
// Warn spy should be called for the datastore fallback on res2
1279
- expect ( consoleWarnSpy ) . toHaveBeenCalledWith ( expect . stringContaining ( 'Failed to get datastore usage for PBS DS Fail, falling back to /config/datastore. Error: DS Error' ) ) ;
1285
+ expect ( consoleWarnSpy ) . toHaveBeenCalledWith ( expect . stringContaining ( 'Failed to get datastore usage for PBS DS Fail, falling back to /config/datastore. Error: DS Usage API Error' ) ) ;
1280
1286
// Task fetch doesn't happen for res2 in this scenario, so no error logged for it.
1281
1287
// expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining(`Failed to fetch PBS task list for node node2 (PBS DS Fail): Task Error`));
1282
1288
@@ -1339,10 +1345,9 @@ describe('Data Fetcher', () => {
1339
1345
mockPbsClient . get
1340
1346
. mockResolvedValueOnce ( { data : { data : [ { node : pbsNodeName } ] } } ) // /nodes
1341
1347
. mockResolvedValueOnce ( { data : { data : [ ] } } ) // /status/datastore-usage (empty)
1342
- . mockResolvedValueOnce ( { data : { data : [ { name : 'fallback-store' , path : '/mnt/fallback' } ] } } ) ; // /config/datastore (fallback succeeds)
1343
- // Snapshots and tasks will be called after fallback
1344
- // .mockResolvedValueOnce({ data: { data: [] } }) // snapshots
1345
- // .mockResolvedValueOnce({ data: { data: [] } }); // tasks
1348
+ . mockResolvedValueOnce ( { data : { data : [ { name : 'fallback-store' , path : '/mnt/fallback' , store : 'fallback-store' } ] } } ) // /config/datastore (fallback succeeds)
1349
+ . mockResolvedValueOnce ( { data : { data : [ { 'backup-id' : 'snap1' } ] } } ) // snapshots for 'fallback-store'
1350
+ . mockResolvedValueOnce ( { data : { data : [ { upid : 'task1' } ] } } ) ; // tasks for pbsNodeName
1346
1351
1347
1352
// Act
1348
1353
const result = await fetchPbsData ( mockClients ) ;
@@ -1352,11 +1357,24 @@ describe('Data Fetcher', () => {
1352
1357
expect . stringContaining ( `WARN: [DataFetcher] PBS /status/datastore-usage returned empty data for ${ mockClients [ pbsId ] . config . name } . Falling back.` )
1353
1358
) ;
1354
1359
expect ( mockPbsClient . get ) . toHaveBeenCalledWith ( '/config/datastore' ) ; // Check fallback was attempted
1360
+ expect ( mockPbsClient . get ) . toHaveBeenCalledWith ( '/admin/datastore/fallback-store/snapshots' ) ; // Check snapshot call
1361
+ // expect(mockPbsClient.get).toHaveBeenCalledWith(`/nodes/${pbsNodeName}/tasks`); // Check task call - Original failing line
1362
+ expect ( mockPbsClient . get ) . toHaveBeenCalledTimes ( 5 ) ; // nodes, usage, config, snapshots, tasks
1363
+ const callsFallbackTest = mockPbsClient . get . mock . calls ;
1364
+ expect ( callsFallbackTest [ 4 ] [ 0 ] ) . toBe ( `/nodes/${ pbsNodeName } /tasks` ) ; // Check 5th call path
1365
+
1355
1366
expect ( result ) . toHaveLength ( 1 ) ;
1356
1367
expect ( result [ 0 ] . status ) . toBe ( 'ok' ) ;
1357
1368
expect ( result [ 0 ] . datastores ) . toHaveLength ( 1 ) ;
1358
1369
expect ( result [ 0 ] . datastores [ 0 ] . name ) . toBe ( 'fallback-store' ) ;
1359
- expect ( result [ 0 ] . datastores [ 0 ] . total ) . toBeNull ( ) ; // Fallback doesn't have usage stats
1370
+ expect ( result [ 0 ] . datastores [ 0 ] . total ) . toBeNull ( ) ; // Fallback doesn't have usage stats from /config/datastore
1371
+ expect ( result [ 0 ] . datastores [ 0 ] . snapshots ) . toHaveLength ( 1 ) ; // Check snapshots from mock
1372
+ expect ( result [ 0 ] . datastores [ 0 ] . snapshots [ 0 ] [ 'backup-id' ] ) . toBe ( 'snap1' ) ;
1373
+
1374
+ // Check tasks (processed by mocked processPbsTasks)
1375
+ expect ( result [ 0 ] . backupTasks ) . toEqual ( [ ] ) ;
1376
+ expect ( result [ 0 ] . verifyTasks ) . toEqual ( [ ] ) ;
1377
+ expect ( result [ 0 ] . gcTasks ) . toEqual ( [ ] ) ;
1360
1378
1361
1379
consoleWarnSpy . mockRestore ( ) ;
1362
1380
} ) ;
@@ -1415,10 +1433,8 @@ describe('Data Fetcher', () => {
1415
1433
mockPbsClient . get
1416
1434
. mockResolvedValueOnce ( { data : { data : [ { node : pbsNodeName } ] } } ) // /nodes
1417
1435
. mockRejectedValueOnce ( usageError ) // /status/datastore-usage (fails)
1418
- . mockRejectedValueOnce ( configError ) ; // /config/datastore (fallback also fails)
1419
- // Snapshots and tasks will still be called with empty datastore array
1420
- // .mockResolvedValueOnce({ data: { data: [] } }) // snapshots
1421
- // .mockResolvedValueOnce({ data: { data: [] } }); // tasks
1436
+ . mockRejectedValueOnce ( configError ) // /config/datastore (fallback also fails)
1437
+ . mockResolvedValueOnce ( { data : { data : [ { upid : 'task1' } ] } } ) ; // tasks for pbsNodeName (still called)
1422
1438
1423
1439
// Act
1424
1440
const result = await fetchPbsData ( mockClients ) ;
@@ -1432,6 +1448,11 @@ describe('Data Fetcher', () => {
1432
1448
) ;
1433
1449
expect ( mockPbsClient . get ) . toHaveBeenCalledWith ( '/status/datastore-usage' ) ;
1434
1450
expect ( mockPbsClient . get ) . toHaveBeenCalledWith ( '/config/datastore' ) ;
1451
+ // expect(mockPbsClient.get).toHaveBeenCalledWith(`/nodes/${pbsNodeName}/tasks`); // This was the original failing line
1452
+ expect ( mockPbsClient . get ) . toHaveBeenCalledTimes ( 4 ) ; // nodes, usage, config, tasks
1453
+ const callsDoubleFailTest = mockPbsClient . get . mock . calls ;
1454
+ expect ( callsDoubleFailTest [ 3 ] [ 0 ] ) . toBe ( `/nodes/${ pbsNodeName } /tasks` ) ; // Check 4th call path
1455
+
1435
1456
expect ( result ) . toHaveLength ( 1 ) ;
1436
1457
expect ( result [ 0 ] . status ) . toBe ( 'ok' ) ; // Status is still ok as node name succeeded
1437
1458
expect ( result [ 0 ] . datastores ) . toEqual ( [ ] ) ; // Datastores should be empty
0 commit comments