@@ -75,6 +75,7 @@ const mockSeedInsert = vi.mocked(insertPackagistPackages)
7575const qx = { } as QueryExecutor
7676const PURL = 'pkg:composer/monolog/monolog'
7777const RUN_DATE = '2026-07-15'
78+ const SCHEDULED_AT = '2026-07-15T00:00:00.000Z'
7879
7980const statsJson = {
8081 package : { name : 'monolog/monolog' , downloads : { total : 1000 , monthly : 300 , daily : 10 } } ,
@@ -113,7 +114,7 @@ describe('ingestOnePackagistMetadata', () => {
113114 it ( 'audits phase 1 immediately and phase 2 separately, then marks scanned with the fresh Last-Modified' , async ( ) => {
114115 happyMocks ( )
115116
116- await ingestOnePackagistMetadata ( qx , candidate )
117+ await ingestOnePackagistMetadata ( qx , candidate , SCHEDULED_AT )
117118
118119 expect ( mockPersistInfo ) . toHaveBeenCalledWith ( qx , PURL , expect . anything ( ) )
119120 expect ( mockFetchP2 ) . toHaveBeenCalledWith ( 'monolog/monolog' , 'Tue, 30 Jun 2026 00:00:00 GMT' )
@@ -127,15 +128,15 @@ describe('ingestOnePackagistMetadata', () => {
127128 qx ,
128129 PURL ,
129130 expect . objectContaining ( { status : 'success' , attempts : 1 } ) ,
130- 'Wed, 01 Jul 2026 00:00:00 GMT' ,
131+ { metadataLastModified : 'Wed, 01 Jul 2026 00:00:00 GMT' } ,
131132 )
132133 } )
133134
134135 it ( 'records a p2 NOT_MODIFIED as success: info persisted, versions skipped' , async ( ) => {
135136 happyMocks ( )
136137 mockFetchP2 . mockResolvedValue ( { kind : 'NOT_MODIFIED' } as never )
137138
138- await ingestOnePackagistMetadata ( qx , candidate )
139+ await ingestOnePackagistMetadata ( qx , candidate , SCHEDULED_AT )
139140
140141 expect ( mockPersistInfo ) . toHaveBeenCalled ( )
141142 expect ( mockPersistMetadata ) . not . toHaveBeenCalled ( )
@@ -144,7 +145,7 @@ describe('ingestOnePackagistMetadata', () => {
144145 qx ,
145146 PURL ,
146147 expect . objectContaining ( { status : 'success' } ) ,
147- null ,
148+ { metadataLastModified : null } ,
148149 )
149150 } )
150151
@@ -156,7 +157,7 @@ describe('ingestOnePackagistMetadata', () => {
156157 message : 'not found' ,
157158 } as never )
158159
159- const p = ingestOnePackagistMetadata ( qx , candidate )
160+ const p = ingestOnePackagistMetadata ( qx , candidate , SCHEDULED_AT )
160161 await vi . runAllTimersAsync ( )
161162 await p
162163
@@ -167,6 +168,7 @@ describe('ingestOnePackagistMetadata', () => {
167168 qx ,
168169 PURL ,
169170 expect . objectContaining ( { status : 'error' , errorKind : 'NOT_FOUND' , httpStatus : 404 } ) ,
171+ { notBefore : SCHEDULED_AT } ,
170172 )
171173 } )
172174
@@ -177,7 +179,7 @@ describe('ingestOnePackagistMetadata', () => {
177179 message : 'HTTP 500' ,
178180 } as never )
179181
180- await expect ( ingestOnePackagistMetadata ( qx , candidate ) ) . rejects . toThrow ( )
182+ await expect ( ingestOnePackagistMetadata ( qx , candidate , SCHEDULED_AT ) ) . rejects . toThrow ( )
181183 expect ( mockMarkMetadata ) . not . toHaveBeenCalled ( )
182184 expect ( mockFetchStats ) . toHaveBeenCalledTimes ( 1 )
183185 } )
@@ -192,7 +194,7 @@ describe('ingestOnePackagistMetadata', () => {
192194 message : 'not found' ,
193195 } as never )
194196
195- const p = ingestOnePackagistMetadata ( qx , candidate )
197+ const p = ingestOnePackagistMetadata ( qx , candidate , SCHEDULED_AT )
196198 await vi . runAllTimersAsync ( )
197199 await p
198200
@@ -203,8 +205,7 @@ describe('ingestOnePackagistMetadata', () => {
203205 qx ,
204206 PURL ,
205207 expect . objectContaining ( { status : 'error' , errorKind : 'NOT_FOUND' } ) ,
206- undefined ,
207- false ,
208+ { bumpLastRunAt : false , notBefore : SCHEDULED_AT } ,
208209 )
209210 } )
210211
@@ -219,7 +220,7 @@ describe('ingestOnePackagistMetadata', () => {
219220 message : 'not found' ,
220221 } as never )
221222
222- const p = ingestOnePackagistMetadata ( qx , candidate )
223+ const p = ingestOnePackagistMetadata ( qx , candidate , SCHEDULED_AT )
223224 await vi . runAllTimersAsync ( )
224225 await p
225226
@@ -228,8 +229,7 @@ describe('ingestOnePackagistMetadata', () => {
228229 qx ,
229230 PURL ,
230231 expect . objectContaining ( { status : 'error' , errorKind : 'NOT_FOUND' } ) ,
231- undefined ,
232- false ,
232+ { bumpLastRunAt : false , notBefore : SCHEDULED_AT } ,
233233 )
234234 } )
235235
@@ -238,7 +238,7 @@ describe('ingestOnePackagistMetadata', () => {
238238 mockPersistInfo . mockResolvedValue ( { found : true , changedFields : [ 'packages.description' ] } )
239239 mockFetchP2 . mockResolvedValue ( { kind : 'TRANSIENT' , message : 'HTTP 502' } as never )
240240
241- await expect ( ingestOnePackagistMetadata ( qx , candidate ) ) . rejects . toThrow ( )
241+ await expect ( ingestOnePackagistMetadata ( qx , candidate , SCHEDULED_AT ) ) . rejects . toThrow ( )
242242 expect ( mockMarkMetadata ) . not . toHaveBeenCalled ( )
243243 // phase-1 writes are already committed when the throw happens — a retry re-runs
244244 // phase 1 idempotently and reports no changes, so this audit event can't be deferred
@@ -252,7 +252,7 @@ describe('ingestOnePackagist30dWindow', () => {
252252 mockFetchStats . mockResolvedValue ( statsJson as never )
253253 mockPersist30d . mockResolvedValue ( [ 'downloads_last_30d.count' , 'packages.downloads_last_30d' ] )
254254
255- await ingestOnePackagist30dWindow ( qx , PURL , RUN_DATE )
255+ await ingestOnePackagist30dWindow ( qx , PURL , RUN_DATE , SCHEDULED_AT )
256256
257257 expect ( mockPersist30d ) . toHaveBeenCalledWith ( qx , PURL , 300 , RUN_DATE )
258258 expect ( mockAudit ) . toHaveBeenCalledWith ( qx , 'packagist' , PURL , [
@@ -274,7 +274,7 @@ describe('ingestOnePackagist30dWindow', () => {
274274 message : 'not found' ,
275275 } as never )
276276
277- const p = ingestOnePackagist30dWindow ( qx , PURL , RUN_DATE )
277+ const p = ingestOnePackagist30dWindow ( qx , PURL , RUN_DATE , SCHEDULED_AT )
278278 await vi . runAllTimersAsync ( )
279279 await p
280280
@@ -283,13 +283,14 @@ describe('ingestOnePackagist30dWindow', () => {
283283 qx ,
284284 PURL ,
285285 expect . objectContaining ( { status : 'error' , errorKind : 'NOT_FOUND' } ) ,
286+ SCHEDULED_AT ,
286287 )
287288 } )
288289
289290 it ( 'throws on a transient result without marking processed' , async ( ) => {
290291 mockFetchStats . mockResolvedValue ( { kind : 'TRANSIENT' , message : 'HTTP 503' } as never )
291292
292- await expect ( ingestOnePackagist30dWindow ( qx , PURL , RUN_DATE ) ) . rejects . toThrow ( )
293+ await expect ( ingestOnePackagist30dWindow ( qx , PURL , RUN_DATE , SCHEDULED_AT ) ) . rejects . toThrow ( )
293294 expect ( mockMark30d ) . not . toHaveBeenCalled ( )
294295 } )
295296} )
@@ -302,7 +303,7 @@ describe('ingestOnePackagistDailyDownload', () => {
302303 mockFetchStats . mockResolvedValue ( statsJson as never )
303304 mockDaily . mockResolvedValue ( [ 'downloads_daily.date' , 'downloads_daily.count' ] )
304305
305- await ingestOnePackagistDailyDownload ( qx , candidate , RUN_DATE )
306+ await ingestOnePackagistDailyDownload ( qx , candidate , RUN_DATE , SCHEDULED_AT )
306307
307308 expect ( mockDaily ) . toHaveBeenCalledWith ( qx , '7' , [ { day : RUN_DATE , downloads : 10 } ] )
308309 expect ( mockAudit ) . toHaveBeenCalledWith ( qx , 'packagist' , PURL , [
@@ -319,7 +320,7 @@ describe('ingestOnePackagistDailyDownload', () => {
319320 it ( 'marks success without inserting or auditing when the registry reports no daily count' , async ( ) => {
320321 mockFetchStats . mockResolvedValue ( { package : { name : 'monolog/monolog' } } as never )
321322
322- await ingestOnePackagistDailyDownload ( qx , candidate , RUN_DATE )
323+ await ingestOnePackagistDailyDownload ( qx , candidate , RUN_DATE , SCHEDULED_AT )
323324
324325 expect ( mockDaily ) . not . toHaveBeenCalled ( )
325326 expect ( mockAudit ) . not . toHaveBeenCalled ( )
@@ -333,7 +334,9 @@ describe('ingestOnePackagistDailyDownload', () => {
333334 it ( 'throws on a transient result without marking processed' , async ( ) => {
334335 mockFetchStats . mockResolvedValue ( { kind : 'TRANSIENT' , message : 'HTTP 503' } as never )
335336
336- await expect ( ingestOnePackagistDailyDownload ( qx , candidate , RUN_DATE ) ) . rejects . toThrow ( )
337+ await expect (
338+ ingestOnePackagistDailyDownload ( qx , candidate , RUN_DATE , SCHEDULED_AT ) ,
339+ ) . rejects . toThrow ( )
337340 expect ( mockMarkDaily ) . not . toHaveBeenCalled ( )
338341 } )
339342} )
0 commit comments