@@ -221,4 +221,154 @@ describe('download', () => {
221
221
expect . stringContaining ( 'digest validation failed' )
222
222
)
223
223
} )
224
+
225
+ test ( 'downloads a single artifact by ID' , async ( ) => {
226
+ const mockArtifact = {
227
+ id : 456 ,
228
+ name : 'artifact-by-id' ,
229
+ size : 1024 ,
230
+ digest : 'def456'
231
+ }
232
+
233
+ mockInputs ( {
234
+ [ Inputs . Name ] : '' ,
235
+ [ Inputs . Pattern ] : '' ,
236
+ [ Inputs . ArtifactIds ] : '456'
237
+ } )
238
+
239
+ jest . spyOn ( artifact , 'listArtifacts' ) . mockImplementation ( ( ) =>
240
+ Promise . resolve ( {
241
+ artifacts : [ mockArtifact ]
242
+ } )
243
+ )
244
+
245
+ await run ( )
246
+
247
+ expect ( core . info ) . toHaveBeenCalledWith ( 'Downloading artifacts by ID' )
248
+ expect ( core . debug ) . toHaveBeenCalledWith ( 'Parsed artifact IDs: ["456"]' )
249
+ expect ( artifact . downloadArtifact ) . toHaveBeenCalledTimes ( 1 )
250
+ expect ( artifact . downloadArtifact ) . toHaveBeenCalledWith (
251
+ 456 ,
252
+ expect . objectContaining ( {
253
+ expectedHash : mockArtifact . digest
254
+ } )
255
+ )
256
+ expect ( core . info ) . toHaveBeenCalledWith ( 'Total of 1 artifact(s) downloaded' )
257
+ } )
258
+
259
+ test ( 'downloads multiple artifacts by ID' , async ( ) => {
260
+ const mockArtifacts = [
261
+ { id : 123 , name : 'first-artifact' , size : 1024 , digest : 'abc123' } ,
262
+ { id : 456 , name : 'second-artifact' , size : 2048 , digest : 'def456' } ,
263
+ { id : 789 , name : 'third-artifact' , size : 3072 , digest : 'ghi789' }
264
+ ]
265
+
266
+ mockInputs ( {
267
+ [ Inputs . Name ] : '' ,
268
+ [ Inputs . Pattern ] : '' ,
269
+ [ Inputs . ArtifactIds ] : '123, 456, 789'
270
+ } )
271
+
272
+ jest . spyOn ( artifact , 'listArtifacts' ) . mockImplementation ( ( ) =>
273
+ Promise . resolve ( {
274
+ artifacts : mockArtifacts
275
+ } )
276
+ )
277
+
278
+ await run ( )
279
+
280
+ expect ( core . info ) . toHaveBeenCalledWith ( 'Downloading artifacts by ID' )
281
+ expect ( core . debug ) . toHaveBeenCalledWith (
282
+ 'Parsed artifact IDs: ["123","456","789"]'
283
+ )
284
+ expect ( artifact . downloadArtifact ) . toHaveBeenCalledTimes ( 3 )
285
+ mockArtifacts . forEach ( mockArtifact => {
286
+ expect ( artifact . downloadArtifact ) . toHaveBeenCalledWith (
287
+ mockArtifact . id ,
288
+ expect . objectContaining ( {
289
+ expectedHash : mockArtifact . digest
290
+ } )
291
+ )
292
+ } )
293
+ expect ( core . info ) . toHaveBeenCalledWith ( 'Total of 3 artifact(s) downloaded' )
294
+ } )
295
+
296
+ test ( 'warns when some artifact IDs are not found' , async ( ) => {
297
+ const mockArtifacts = [
298
+ { id : 123 , name : 'found-artifact' , size : 1024 , digest : 'abc123' }
299
+ ]
300
+
301
+ mockInputs ( {
302
+ [ Inputs . Name ] : '' ,
303
+ [ Inputs . Pattern ] : '' ,
304
+ [ Inputs . ArtifactIds ] : '123, 456, 789'
305
+ } )
306
+
307
+ jest . spyOn ( artifact , 'listArtifacts' ) . mockImplementation ( ( ) =>
308
+ Promise . resolve ( {
309
+ artifacts : mockArtifacts
310
+ } )
311
+ )
312
+
313
+ await run ( )
314
+
315
+ expect ( core . warning ) . toHaveBeenCalledWith (
316
+ 'Could not find the following artifact IDs: 456, 789'
317
+ )
318
+ expect ( core . debug ) . toHaveBeenCalledWith ( 'Found 1 artifacts by ID' )
319
+ expect ( artifact . downloadArtifact ) . toHaveBeenCalledTimes ( 1 )
320
+ } )
321
+
322
+ test ( 'throws error when no artifacts with requested IDs are found' , async ( ) => {
323
+ mockInputs ( {
324
+ [ Inputs . Name ] : '' ,
325
+ [ Inputs . Pattern ] : '' ,
326
+ [ Inputs . ArtifactIds ] : '123, 456'
327
+ } )
328
+
329
+ jest . spyOn ( artifact , 'listArtifacts' ) . mockImplementation ( ( ) =>
330
+ Promise . resolve ( {
331
+ artifacts : [ ]
332
+ } )
333
+ )
334
+
335
+ await expect ( run ( ) ) . rejects . toThrow (
336
+ 'None of the provided artifact IDs were found'
337
+ )
338
+ } )
339
+
340
+ test ( 'throws error when artifact-ids input is empty' , async ( ) => {
341
+ mockInputs ( {
342
+ [ Inputs . Name ] : '' ,
343
+ [ Inputs . Pattern ] : '' ,
344
+ [ Inputs . ArtifactIds ] : ' '
345
+ } )
346
+
347
+ await expect ( run ( ) ) . rejects . toThrow (
348
+ "No valid artifact IDs provided in 'artifact-ids' input"
349
+ )
350
+ } )
351
+
352
+ test ( 'throws error when some artifact IDs are not valid numbers' , async ( ) => {
353
+ mockInputs ( {
354
+ [ Inputs . Name ] : '' ,
355
+ [ Inputs . Pattern ] : '' ,
356
+ [ Inputs . ArtifactIds ] : '123, abc, 456'
357
+ } )
358
+
359
+ await expect ( run ( ) ) . rejects . toThrow (
360
+ "Invalid artifact ID: 'abc'. Must be a number."
361
+ )
362
+ } )
363
+
364
+ test ( 'throws error when both name and artifact-ids are provided' , async ( ) => {
365
+ mockInputs ( {
366
+ [ Inputs . Name ] : 'some-artifact' ,
367
+ [ Inputs . ArtifactIds ] : '123'
368
+ } )
369
+
370
+ await expect ( run ( ) ) . rejects . toThrow (
371
+ "Inputs 'name' and 'artifact-ids' cannot be used together. Please specify only one."
372
+ )
373
+ } )
224
374
} )
0 commit comments