@@ -24,6 +24,7 @@ describe("JobsService schedule rows", () => {
2424 upsertSchedule : ReturnType < typeof vi . fn > ;
2525 deleteSchedulesForInactiveProviders : ReturnType < typeof vi . fn > ;
2626 deleteSchedulesByJobType : ReturnType < typeof vi . fn > ;
27+ deleteSchedulesForAddresses : ReturnType < typeof vi . fn > ;
2728 countPausedSchedules : ReturnType < typeof vi . fn > ;
2829 findDueSchedulesWithManager : ReturnType < typeof vi . fn > ;
2930 runTransaction : ReturnType < typeof vi . fn > ;
@@ -90,6 +91,7 @@ describe("JobsService schedule rows", () => {
9091 upsertSchedule : vi . fn ( ) ,
9192 deleteSchedulesForInactiveProviders : vi . fn ( async ( ) => [ ] ) ,
9293 deleteSchedulesByJobType : vi . fn ( async ( ) => 0 ) ,
94+ deleteSchedulesForAddresses : vi . fn ( async ( ) => [ ] ) ,
9395 countPausedSchedules : vi . fn ( async ( ) => [ ] ) ,
9496 findDueSchedulesWithManager : vi . fn ( ) ,
9597 runTransaction : vi . fn ( async ( callback : ( manager : unknown ) => Promise < void > ) => {
@@ -151,6 +153,8 @@ describe("JobsService schedule rows", () => {
151153 maintenanceWindowMinutes : 20 ,
152154 blockedSpIds : new Set ( ) ,
153155 blockedSpAddresses : new Set ( ) ,
156+ expectedApprovedSpIds : new Set ( ) ,
157+ expectedApprovedSpAddresses : new Set ( ) ,
154158 pieceCleanupPerSpPerHour : 1 ,
155159 maxPieceCleanupRuntimeSeconds : 300 ,
156160 maxDatasetStorageSizeBytes : 24 * 1024 * 1024 * 1024 ,
@@ -1337,7 +1341,7 @@ describe("JobsService schedule rows", () => {
13371341 } ;
13381342
13391343 const providerRegistryRepository = {
1340- findByAddress : vi . fn ( ( ) => ( { id : 1 , name : "test-provider" } ) ) ,
1344+ findByAddress : vi . fn ( ( ) => ( { id : 1 , name : "test-provider" , isApproved : true } ) ) ,
13411345 } ;
13421346
13431347 service = buildService ( {
@@ -1474,7 +1478,9 @@ describe("JobsService schedule rows", () => {
14741478 } as unknown as JobsServiceDeps [ 0 ] ;
14751479
14761480 const dataSetLifecycleService = { runLifecycleCheck : vi . fn ( async ( ) => undefined ) } ;
1477- const providerRegistryRepository = { findByAddress : vi . fn ( ( ) => ( { id : 1 , name : "test-provider" } ) ) } ;
1481+ const providerRegistryRepository = {
1482+ findByAddress : vi . fn ( ( ) => ( { id : 1 , name : "test-provider" , isApproved : true } ) ) ,
1483+ } ;
14781484
14791485 service = buildService ( {
14801486 configService,
@@ -1519,7 +1525,7 @@ describe("JobsService schedule rows", () => {
15191525 } as unknown as JobsServiceDeps [ 0 ] ;
15201526 service = buildService ( { configService } ) ;
15211527
1522- providerRegistryRepositoryMock . findActiveAddresses . mockResolvedValueOnce ( [ { address : "0xaaa" } ] ) ;
1528+ providerRegistryRepositoryMock . findActiveAddresses . mockResolvedValueOnce ( [ { address : "0xaaa" , isApproved : true } ] ) ;
15231529
15241530 await callPrivate ( service , "ensureScheduleRows" , DEFAULT_NETWORK ) ;
15251531
@@ -1529,11 +1535,12 @@ describe("JobsService schedule rows", () => {
15291535 expect ( lifecycleUpserts ) . toHaveLength ( 1 ) ;
15301536 expect ( lifecycleUpserts [ 0 ] [ 1 ] ) . toBe ( "0xaaa" ) ;
15311537 expect ( jobScheduleRepositoryMock . deleteSchedulesByJobType ) . not . toHaveBeenCalled ( ) ;
1538+ expect ( jobScheduleRepositoryMock . deleteSchedulesForAddresses ) . not . toHaveBeenCalled ( ) ;
15321539 } ) ;
15331540
15341541 it ( "removes data_set_lifecycle_check schedules when disabled" , async ( ) => {
15351542 // base config has dataSetLifecycleCheckEnabled=false
1536- providerRegistryRepositoryMock . findActiveAddresses . mockResolvedValueOnce ( [ { address : "0xaaa" } ] ) ;
1543+ providerRegistryRepositoryMock . findActiveAddresses . mockResolvedValueOnce ( [ { address : "0xaaa" , isApproved : true } ] ) ;
15371544
15381545 await callPrivate ( service , "ensureScheduleRows" , DEFAULT_NETWORK ) ;
15391546
@@ -1547,6 +1554,35 @@ describe("JobsService schedule rows", () => {
15471554 ) ;
15481555 } ) ;
15491556
1557+ it ( "does not schedule data_set_lifecycle_check for trickle-tier providers, and clears stale rows" , async ( ) => {
1558+ baseConfigValues = {
1559+ ...baseConfigValues ,
1560+ networks : {
1561+ calibration : { ...( baseConfigValues . networks as any ) . calibration , dataSetLifecycleCheckEnabled : true } ,
1562+ } as unknown as IConfig [ "networks" ] ,
1563+ } ;
1564+ configService = {
1565+ get : vi . fn ( ( key : keyof IConfig ) => baseConfigValues [ key ] ) ,
1566+ } as unknown as JobsServiceDeps [ 0 ] ;
1567+ service = buildService ( { configService } ) ;
1568+
1569+ // Neither approved nor on the expected-approved list -> trickle tier.
1570+ providerRegistryRepositoryMock . findActiveAddresses . mockResolvedValueOnce ( [ { address : "0xaaa" , isApproved : false } ] ) ;
1571+
1572+ await callPrivate ( service , "ensureScheduleRows" , DEFAULT_NETWORK ) ;
1573+
1574+ const lifecycleUpserts = jobScheduleRepositoryMock . upsertSchedule . mock . calls . filter (
1575+ ( call ) => call [ 0 ] === "data_set_lifecycle_check" ,
1576+ ) ;
1577+ expect ( lifecycleUpserts ) . toHaveLength ( 0 ) ;
1578+ expect ( jobScheduleRepositoryMock . deleteSchedulesByJobType ) . not . toHaveBeenCalled ( ) ;
1579+ expect ( jobScheduleRepositoryMock . deleteSchedulesForAddresses ) . toHaveBeenCalledWith (
1580+ "data_set_lifecycle_check" ,
1581+ [ "0xaaa" ] ,
1582+ DEFAULT_NETWORK ,
1583+ ) ;
1584+ } ) ;
1585+
15501586 it ( "sets active, inactive, and tested provider gauge values after refresh" , async ( ) => {
15511587 providerRegistryRepositoryMock . countByNetwork . mockResolvedValueOnce ( 10 ) ;
15521588 providerRegistryRepositoryMock . countActiveByNetwork . mockResolvedValueOnce ( 7 ) ;
0 commit comments