@@ -248,6 +248,113 @@ public void TestFeedsToUse()
248248 ] , feedsToUse ) ;
249249 }
250250
251+ /// <summary>
252+ /// Verify that NuGet CLI restore excludes private registries and unreachable feeds,
253+ /// while leaving private registries available to dotnet restore.
254+ /// </summary>
255+ [ Fact ]
256+ public void TestNugetExeRestoreFeedsExcludePrivateRegistries ( )
257+ {
258+ // Setup
259+ var logger = new LoggerStub ( ) ;
260+ var dotnet = new DotNetStub ( [ ] , [ ] , [ ] ,
261+ [ "E https://example.com/registry2" , "E https://feed.from/folder1" , "E https://feed.from/folder2" ] ) ;
262+ using var feedManager = new FeedManager ( logger , dotnet , new RegistryProxyStub ( ) ,
263+ new FileProviderStub ( ) , new FeedManagerIOStub ( [ "https://feed.from/folder2" ] ) ) ;
264+
265+ // Execute
266+ var feeds = feedManager . MakeNugetExeRestoreFeeds ( "/path/to/packages.config" ) ;
267+ var dotnetFeeds = feedManager . MakeRestoreFeeds ( "/path/to/project.csproj" ) ;
268+
269+ // Verify
270+ Assert . Equal ( [ "https://feed.from/folder1" ] , feeds ) ;
271+ Assert . Contains ( "https://example.com/registry2" , dotnetFeeds ) ;
272+ }
273+
274+ /// <summary>
275+ /// Verify that NuGet CLI restore excludes private registries that replace NuGet.org,
276+ /// retaining other configured feeds.
277+ /// </summary>
278+ [ Fact ]
279+ public void TestNugetExeRestoreFeedsExcludePrivateBaseRegistries ( )
280+ {
281+ // Setup
282+ var logger = new LoggerStub ( ) ;
283+ var dotnet = new DotNetStub ( [ ] , [ ] , [ ] ,
284+ [ "E https://api.nuget.org/v3/index.json" , "E https://feed.from/folder1" ] ) ;
285+ using var feedManager = new FeedManager ( logger , dotnet , new RegistryProxyStubWithBaseUrls ( ) ,
286+ new FileProviderStub ( ) , new FeedManagerIOStub ( [ ] ) ) ;
287+
288+ // Execute
289+ var feeds = feedManager . MakeNugetExeRestoreFeeds ( "/path/to/packages.config" ) ;
290+
291+ // Verify
292+ Assert . Equal ( [ "https://feed.from/folder1" ] , feeds ) ;
293+ }
294+
295+ /// <summary>
296+ /// Verify that NuGet CLI restore uses an empty local source when only private registries are configured,
297+ /// regardless of their reachability.
298+ /// </summary>
299+ [ Theory ]
300+ [ InlineData ( false ) ]
301+ [ InlineData ( true ) ]
302+ public void TestNugetExeRestoreFeedsWithOnlyPrivateRegistries ( bool unreachable )
303+ {
304+ // Setup
305+ var logger = new LoggerStub ( ) ;
306+ var registryProxy = new RegistryProxyStubWithBaseUrls ( ) ;
307+ var dotnet = new DotNetStub ( [ ] , [ ] , [ ] , [ "E https://api.nuget.org/v3/index.json" ] ) ;
308+ using var feedManager = new FeedManager ( logger , dotnet , registryProxy ,
309+ new FileProviderStub ( ) , new FeedManagerIOStub ( unreachable ? registryProxy . RegistryURLs . ToList ( ) : [ ] ) ) ;
310+
311+ // Execute
312+ var feeds = feedManager . MakeNugetExeRestoreFeeds ( "/path/to/packages.config" ) ;
313+
314+ // Verify
315+ var source = Assert . Single ( feeds ) ;
316+ Assert . True ( Path . IsPathFullyQualified ( source ) ) ;
317+ Assert . True ( Directory . Exists ( source ) ) ;
318+ }
319+
320+ /// <summary>
321+ /// Verify that NuGet CLI restore explicitly selects reachable feeds when no private registries are configured.
322+ /// </summary>
323+ [ Fact ]
324+ public void TestNugetExeRestoreFeedsWithoutPrivateRegistries ( )
325+ {
326+ // Setup
327+ var logger = new LoggerStub ( ) ;
328+ var dotnet = new DotNetStub ( [ ] , [ ] , [ ] , [ "E https://feed.from/folder1" ] ) ;
329+ using var feedManager = new FeedManager ( logger , dotnet , null ,
330+ new FileProviderStub ( ) , new FeedManagerIOStub ( [ ] ) ) ;
331+
332+ // Execute
333+ var feeds = feedManager . MakeNugetExeRestoreFeeds ( "/path/to/packages.config" ) ;
334+
335+ // Verify
336+ Assert . Equal ( [ "https://feed.from/folder1" ] , feeds ) ;
337+ }
338+
339+ /// <summary>
340+ /// Verify that NuGet CLI restore falls back to the default NuGet.org feed when no feeds are configured.
341+ /// </summary>
342+ [ Fact ]
343+ public void TestNugetExeRestoreFeedsUseDefaults ( )
344+ {
345+ // Setup
346+ var logger = new LoggerStub ( ) ;
347+ var dotnet = new DotNetStub ( [ ] , [ ] , [ ] , [ ] ) ;
348+ using var feedManager = new FeedManager ( logger , dotnet , null ,
349+ new FileProviderStub ( ) , new FeedManagerIOStub ( [ ] ) ) ;
350+
351+ // Execute
352+ var feeds = feedManager . MakeNugetExeRestoreFeeds ( "/path/to/packages.config" ) ;
353+
354+ // Verify
355+ Assert . Equal ( [ "https://api.nuget.org/v3/index.json" ] , feeds ) ;
356+ }
357+
251358 /// <summary>
252359 /// Verify that `FeedManager` correctly computes the default feeds and reachable default feeds
253360 /// when no private registries are configured.
0 commit comments