@@ -46,7 +46,9 @@ await Should.NotThrowAsync(() =>
4646 destAcrName : "myacr.azurecr.io" ,
4747 srcTagName : "repo:tag" ,
4848 srcRegistryName : "docker.io" ,
49- isDryRun : true ) ) ;
49+ sourceCredentials : null ,
50+ isDryRun : true ,
51+ copyReferrers : true ) ) ;
5052 }
5153
5254 /// <summary>
@@ -94,7 +96,9 @@ await service.ImportImageAsync(
9496 destAcrName : "myacr.azurecr.io" ,
9597 srcTagName : "repo:tag" ,
9698 srcRegistryName : "docker.io" ,
97- isDryRun : false ) ;
99+ sourceCredentials : null ,
100+ isDryRun : false ,
101+ copyReferrers : true ) ;
98102
99103 // Verify the importer was called, proving execution reached the import step
100104 // (past the external registry lookup that previously threw)
@@ -137,7 +141,9 @@ await service.ImportImageAsync(
137141 destAcrName : "myacr.azurecr.io" ,
138142 srcTagName : "repo:tag" ,
139143 srcRegistryName : "myacr.azurecr.io" ,
140- isDryRun : false ) ;
144+ sourceCredentials : null ,
145+ isDryRun : false ,
146+ copyReferrers : true ) ;
141147
142148 // Main image import with TargetTags
143149 mockImporter . Verify (
@@ -203,7 +209,9 @@ await service.ImportImageAsync(
203209 destAcrName : "myacr.azurecr.io" ,
204210 srcTagName : "repo:tag" ,
205211 srcRegistryName : "myacr.azurecr.io" ,
206- isDryRun : false ) ;
212+ sourceCredentials : null ,
213+ isDryRun : false ,
214+ copyReferrers : true ) ;
207215
208216 mockImporter . Verify (
209217 x => x . ImportImageAsync (
@@ -213,6 +221,47 @@ await service.ImportImageAsync(
213221 Times . Once ) ;
214222 }
215223
224+ /// <summary>
225+ /// When copyReferrers is false, referrer discovery and referrer imports are
226+ /// both skipped. Only the main image is imported.
227+ /// </summary>
228+ [ Fact ]
229+ public async Task ImportImageAsync_CopyReferrersFalse_SkipsReferrerDiscoveryAndImport ( )
230+ {
231+ PublishConfiguration publishConfig = CreateAcrPublishConfig ( "myacr.azurecr.io" ) ;
232+
233+ var mockImporter = new Mock < IAcrImageImporter > ( ) ;
234+ var mockOras = new Mock < IOrasService > ( ) ;
235+
236+ var service = new CopyImageService (
237+ Mock . Of < ILogger < CopyImageService > > ( ) ,
238+ mockImporter . Object ,
239+ mockOras . Object ,
240+ ConfigurationHelper . CreateOptionsMock ( publishConfig ) ) ;
241+
242+ await service . ImportImageAsync (
243+ destTagNames : [ "mirror/repo:tag" ] ,
244+ destAcrName : "myacr.azurecr.io" ,
245+ srcTagName : "repo:tag" ,
246+ srcRegistryName : "myacr.azurecr.io" ,
247+ sourceCredentials : null ,
248+ isDryRun : false ,
249+ copyReferrers : false ) ;
250+
251+ // GetReferrersAsync should never be called when copyReferrers is false
252+ mockOras . Verify (
253+ o => o . GetReferrersAsync ( It . IsAny < string > ( ) , It . IsAny < bool > ( ) , It . IsAny < CancellationToken > ( ) ) ,
254+ Times . Never ) ;
255+
256+ // Only the main image should be imported (no referrers)
257+ mockImporter . Verify (
258+ x => x . ImportImageAsync (
259+ It . IsAny < string > ( ) ,
260+ It . IsAny < ResourceIdentifier > ( ) ,
261+ It . IsAny < ContainerRegistryImportImageContent > ( ) ) ,
262+ Times . Once ) ;
263+ }
264+
216265 /// <summary>
217266 /// In dry-run mode, referrer discovery and ACR imports are both skipped.
218267 /// The ORAS service receives the dry-run flag and returns an empty list
@@ -239,7 +288,9 @@ await service.ImportImageAsync(
239288 destAcrName : "myacr.azurecr.io" ,
240289 srcTagName : "repo:tag" ,
241290 srcRegistryName : "myacr.azurecr.io" ,
242- isDryRun : true ) ;
291+ sourceCredentials : null ,
292+ isDryRun : true ,
293+ copyReferrers : true ) ;
243294
244295 mockOras . Verify (
245296 o => o . GetReferrersAsync ( It . IsAny < string > ( ) , true , It . IsAny < CancellationToken > ( ) ) ,
0 commit comments