|
12 | 12 |
|
13 | 13 | namespace Devolutions.Pinget.Core.Tests; |
14 | 14 |
|
| 15 | +[CollectionDefinition(Name, DisableParallelization = true)] |
| 16 | +public class RepositoryStateCollection |
| 17 | +{ |
| 18 | + public const string Name = "RepositoryState"; |
| 19 | +} |
| 20 | + |
15 | 21 | public class VersionCompareTests |
16 | 22 | { |
17 | 23 | [Theory] |
@@ -112,6 +118,7 @@ public void SelectRestVersion_WithRequestedChannelMismatch_Throws() |
112 | 118 | } |
113 | 119 | } |
114 | 120 |
|
| 121 | +[Collection(RepositoryStateCollection.Name)] |
115 | 122 | public class SourceStoreTests |
116 | 123 | { |
117 | 124 | [Fact] |
@@ -365,6 +372,127 @@ public void PackagedSecureSettingsStub_DelegatesToSystemWingetExport() |
365 | 372 | } |
366 | 373 | } |
367 | 374 |
|
| 375 | + [Theory] |
| 376 | + [InlineData("auto", SourceMode.Auto)] |
| 377 | + [InlineData(" Auto ", SourceMode.Auto)] |
| 378 | + [InlineData("PRIVATE", SourceMode.Private)] |
| 379 | + [InlineData("system-winget-mirror", SourceMode.SystemWingetMirror)] |
| 380 | + [InlineData("SystemWingetMirror", SourceMode.SystemWingetMirror)] |
| 381 | + public void TryParseSourceMode_AcceptsKnownSpellings(string value, SourceMode expected) |
| 382 | + { |
| 383 | + Assert.True(Repository.TryParseSourceMode(value, out var parsed)); |
| 384 | + Assert.Equal(expected, parsed); |
| 385 | + } |
| 386 | + |
| 387 | + [Theory] |
| 388 | + [InlineData(null)] |
| 389 | + [InlineData("")] |
| 390 | + [InlineData("mirror")] |
| 391 | + [InlineData("system_winget_mirror")] |
| 392 | + public void TryParseSourceMode_RejectsUnknownSpellings(string? value) |
| 393 | + { |
| 394 | + Assert.False(Repository.TryParseSourceMode(value, out _)); |
| 395 | + } |
| 396 | + |
| 397 | + [Fact] |
| 398 | + public void ResolveRequestedSourceMode_KeepsPrivateDefaultForACustomAppRoot() |
| 399 | + { |
| 400 | + Assert.Equal( |
| 401 | + SourceMode.Private, |
| 402 | + Repository.ResolveRequestedSourceMode(null, @"C:\custom", null)); |
| 403 | + Assert.Equal( |
| 404 | + SourceMode.Auto, |
| 405 | + Repository.ResolveRequestedSourceMode(null, null, null)); |
| 406 | + } |
| 407 | + |
| 408 | + [Fact] |
| 409 | + public void ResolveRequestedSourceMode_LetsTheEnvironmentOverrideACustomAppRoot() |
| 410 | + { |
| 411 | + Assert.Equal( |
| 412 | + SourceMode.Auto, |
| 413 | + Repository.ResolveRequestedSourceMode(null, @"C:\custom", "auto")); |
| 414 | + Assert.Equal( |
| 415 | + SourceMode.SystemWingetMirror, |
| 416 | + Repository.ResolveRequestedSourceMode(null, @"C:\custom", "system-winget-mirror")); |
| 417 | + Assert.Equal( |
| 418 | + SourceMode.Private, |
| 419 | + Repository.ResolveRequestedSourceMode(null, null, "private")); |
| 420 | + } |
| 421 | + |
| 422 | + [Fact] |
| 423 | + public void ResolveRequestedSourceMode_IgnoresTheEnvironmentWhenTheCallerIsExplicit() |
| 424 | + { |
| 425 | + Assert.Equal( |
| 426 | + SourceMode.SystemWingetMirror, |
| 427 | + Repository.ResolveRequestedSourceMode(SourceMode.SystemWingetMirror, @"C:\custom", "private")); |
| 428 | + Assert.Equal( |
| 429 | + SourceMode.Private, |
| 430 | + Repository.ResolveRequestedSourceMode(SourceMode.Private, null, "auto")); |
| 431 | + } |
| 432 | + |
| 433 | + [Fact] |
| 434 | + public void ResolveRequestedSourceMode_TreatsAnExplicitAutoAsAChoiceRatherThanAnUnsetValue() |
| 435 | + { |
| 436 | + Assert.Equal( |
| 437 | + SourceMode.Auto, |
| 438 | + Repository.ResolveRequestedSourceMode(SourceMode.Auto, @"C:\custom", "private")); |
| 439 | + Assert.Equal( |
| 440 | + SourceMode.Auto, |
| 441 | + Repository.ResolveRequestedSourceMode(SourceMode.Auto, @"C:\custom", null)); |
| 442 | + } |
| 443 | + |
| 444 | + [Fact] |
| 445 | + public void ResolveRequestedSourceMode_IgnoresAnUnparseableEnvironmentValue() |
| 446 | + { |
| 447 | + Assert.Equal( |
| 448 | + SourceMode.Private, |
| 449 | + Repository.ResolveRequestedSourceMode(null, @"C:\custom", "not-a-mode")); |
| 450 | + Assert.Equal( |
| 451 | + SourceMode.Auto, |
| 452 | + Repository.ResolveRequestedSourceMode(null, null, "not-a-mode")); |
| 453 | + } |
| 454 | + |
| 455 | + [Theory] |
| 456 | + [InlineData(null, false)] |
| 457 | + [InlineData("auto", true)] |
| 458 | + [InlineData("system-winget-mirror", true)] |
| 459 | + [InlineData("private", false)] |
| 460 | + [InlineData("not-a-mode", false)] |
| 461 | + public void RepositoryOpen_ReadsTheSourceModeEnvironmentVariable(string? sourceMode, bool expectsMirror) |
| 462 | + { |
| 463 | + var appRoot = TestPaths.CreateTempAppRoot(); |
| 464 | + var originalRunner = SystemWingetSourceStore.CommandRunner; |
| 465 | + var originalSourceMode = Environment.GetEnvironmentVariable("PINGET_SOURCE_MODE"); |
| 466 | + try |
| 467 | + { |
| 468 | + SystemWingetSourceStore.CommandRunner = _ => new WingetCommandResult( |
| 469 | + 0, |
| 470 | + """ |
| 471 | +{"Arg":"https://api.contoso.test/feed","Data":"","Explicit":false,"Identifier":"api.contoso.test","Name":"contoso","TrustLevel":["Trusted"],"Type":"Microsoft.Rest"} |
| 472 | +""", |
| 473 | + ""); |
| 474 | + Environment.SetEnvironmentVariable("PINGET_SOURCE_MODE", sourceMode); |
| 475 | + |
| 476 | + using var repo = Repository.Open(new RepositoryOptions |
| 477 | + { |
| 478 | + AppRoot = appRoot, |
| 479 | + UserAgent = "pinget-dotnet-tests/1.0", |
| 480 | + }); |
| 481 | + |
| 482 | + var mirrorPath = Path.Combine(appRoot, "system-sources.json"); |
| 483 | + Assert.Equal(expectsMirror, File.Exists(mirrorPath)); |
| 484 | + |
| 485 | + if (expectsMirror) |
| 486 | + Assert.Contains("contoso", File.ReadAllText(mirrorPath)); |
| 487 | + } |
| 488 | + finally |
| 489 | + { |
| 490 | + SystemWingetSourceStore.CommandRunner = originalRunner; |
| 491 | + Environment.SetEnvironmentVariable("PINGET_SOURCE_MODE", originalSourceMode); |
| 492 | + TestPaths.DeleteAppRoot(appRoot); |
| 493 | + } |
| 494 | + } |
| 495 | + |
368 | 496 | [Fact] |
369 | 497 | public void RepositoryOpen_UsesCustomAppRoot() |
370 | 498 | { |
@@ -1177,6 +1305,7 @@ PRIMARY KEY (package_id, source_id) |
1177 | 1305 | } |
1178 | 1306 | } |
1179 | 1307 |
|
| 1308 | +[Collection(RepositoryStateCollection.Name)] |
1180 | 1309 | public class RepositoryParityTests |
1181 | 1310 | { |
1182 | 1311 | [Fact] |
@@ -2992,6 +3121,7 @@ public void CreateRepairInstallRequest_ForcesReinstallOfResolvedInstalledPackage |
2992 | 3121 | } |
2993 | 3122 | } |
2994 | 3123 |
|
| 3124 | +[Collection(RepositoryStateCollection.Name)] |
2995 | 3125 | public class RepositoryEmbeddingTests |
2996 | 3126 | { |
2997 | 3127 | private const string TesslPackageId = "tessl.tessl"; |
|
0 commit comments