Skip to content

Commit ddeef7c

Browse files
Add second-wave coverage tests
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent ad9873c commit ddeef7c

31 files changed

+1689
-391
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
using System.Text.Json;
2+
using UniGetUI.Core.Data;
3+
4+
namespace UniGetUI.Core.SettingsEngine.Tests;
5+
6+
public sealed class SettingsImportExportTests : IDisposable
7+
{
8+
private readonly string _testRoot = Path.Combine(
9+
Path.GetTempPath(),
10+
nameof(SettingsImportExportTests),
11+
Guid.NewGuid().ToString("N")
12+
);
13+
14+
public SettingsImportExportTests()
15+
{
16+
Directory.CreateDirectory(_testRoot);
17+
CoreData.TEST_DataDirectoryOverride = Path.Combine(_testRoot, "Data");
18+
Directory.CreateDirectory(CoreData.UniGetUIUserConfigurationDirectory);
19+
Settings.ResetSettings();
20+
}
21+
22+
public void Dispose()
23+
{
24+
Settings.ResetSettings();
25+
CoreData.TEST_DataDirectoryOverride = null;
26+
if (Directory.Exists(_testRoot))
27+
{
28+
Directory.Delete(_testRoot, recursive: true);
29+
}
30+
}
31+
32+
[Fact]
33+
public void ExportToStringJson_ExcludesSensitiveFiles()
34+
{
35+
Settings.Set(Settings.K.FreshBoolSetting, true);
36+
Settings.SetValue(Settings.K.FreshValue, "configured");
37+
File.WriteAllText(Path.Combine(CoreData.UniGetUIUserConfigurationDirectory, "TelemetryClientToken"), "secret");
38+
File.WriteAllText(Path.Combine(CoreData.UniGetUIUserConfigurationDirectory, "CurrentSessionToken"), "secret");
39+
40+
var exported = JsonSerializer.Deserialize<Dictionary<string, string>>(Settings.ExportToString_JSON());
41+
42+
Assert.NotNull(exported);
43+
Assert.Contains(Settings.ResolveKey(Settings.K.FreshBoolSetting), exported.Keys);
44+
Assert.Equal("configured", exported[Settings.ResolveKey(Settings.K.FreshValue)]);
45+
Assert.DoesNotContain("TelemetryClientToken", exported.Keys);
46+
Assert.DoesNotContain("CurrentSessionToken", exported.Keys);
47+
}
48+
49+
[Fact]
50+
public void ImportFromStringJson_ResetsExistingFilesAndReloadsCache()
51+
{
52+
Settings.Set(Settings.K.Test1, true);
53+
Settings.SetValue(Settings.K.FreshValue, "old-value");
54+
55+
string importedJson = JsonSerializer.Serialize(
56+
new Dictionary<string, string>
57+
{
58+
[Settings.ResolveKey(Settings.K.Test2)] = "",
59+
[Settings.ResolveKey(Settings.K.FreshValue)] = "new-value",
60+
}
61+
);
62+
63+
Settings.ImportFromString_JSON(importedJson);
64+
65+
Assert.False(File.Exists(Path.Combine(CoreData.UniGetUIUserConfigurationDirectory, Settings.ResolveKey(Settings.K.Test1))));
66+
Assert.True(Settings.Get(Settings.K.Test2));
67+
Assert.Equal("new-value", Settings.GetValue(Settings.K.FreshValue));
68+
}
69+
70+
[Fact]
71+
public void ImportFromFileJson_CopiesSourceWhenBackupLivesInSettingsDirectory()
72+
{
73+
Settings.SetValue(Settings.K.FreshValue, "before-import");
74+
string exportPath = Path.Combine(CoreData.UniGetUIUserConfigurationDirectory, "settings-backup.json");
75+
76+
Settings.ExportToFile_JSON(exportPath);
77+
Settings.SetValue(Settings.K.FreshValue, "after-export");
78+
79+
Settings.ImportFromFile_JSON(exportPath);
80+
81+
Assert.Equal("before-import", Settings.GetValue(Settings.K.FreshValue));
82+
}
83+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
using Xunit;
2+
3+
[assembly: CollectionBehavior(DisableTestParallelization = true)]

src/UniGetUI.Core.Settings/SettingsEngine_ImportExport.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@ public static void ImportFromString_JSON(string jsonContent)
7777

7878
public static void ResetSettings()
7979
{
80+
booleanSettings.Clear();
81+
valueSettings.Clear();
82+
listSettings.Clear();
83+
_dictionarySettings.Clear();
84+
8085
foreach (
8186
string entry in Directory.EnumerateFiles(CoreData.UniGetUIUserConfigurationDirectory)
8287
)

src/UniGetUI.PackageEngine.Managers.Cargo/CratesIOClient.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,11 @@ internal sealed class CargoManifestPublisher
6363
internal sealed class CratesIOClient
6464
{
6565
public const string ApiUrl = "https://crates.io/api/v1";
66+
internal static string? TEST_ApiUrlOverride { private get; set; }
6667

6768
public static Tuple<Uri, CargoManifest> GetManifest(string packageId)
6869
{
69-
var manifestUrl = new Uri($"{ApiUrl}/crates/{packageId}");
70+
var manifestUrl = new Uri($"{GetApiUrl()}/crates/{packageId}");
7071
var manifest = Fetch<CargoManifest>(manifestUrl);
7172
if (manifest.crate is null)
7273
{
@@ -77,7 +78,7 @@ public static Tuple<Uri, CargoManifest> GetManifest(string packageId)
7778

7879
public static CargoManifestVersion GetManifestVersion(string packageId, string version)
7980
{
80-
var manifestUrl = new Uri($"{ApiUrl}/crates/{packageId}/{version}");
81+
var manifestUrl = new Uri($"{GetApiUrl()}/crates/{packageId}/{version}");
8182
var manifest = Fetch<CargoManifestVersionWrapper>(manifestUrl);
8283
if (manifest.version is null)
8384
{
@@ -86,7 +87,9 @@ public static CargoManifestVersion GetManifestVersion(string packageId, string v
8687
return manifest.version;
8788
}
8889

89-
private static T Fetch<T>(Uri url)
90+
private static string GetApiUrl() => TEST_ApiUrlOverride ?? ApiUrl;
91+
92+
internal static T Fetch<T>(Uri url)
9093
{
9194
HttpClient client = new(CoreTools.GenericHttpClientParameters);
9295
client.DefaultRequestHeaders.UserAgent.ParseAdd(CoreData.UserAgentString);
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
using System.Runtime.CompilerServices;
2+
3+
[assembly: InternalsVisibleTo("UniGetUI.PackageEngine.Tests")]

src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs

Lines changed: 61 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using UniGetUI.PackageEngine.Classes.Manager;
66
using UniGetUI.PackageEngine.Classes.Manager.ManagerHelpers;
77
using UniGetUI.PackageEngine.Enums;
8+
using UniGetUI.PackageEngine.Interfaces;
89
using UniGetUI.PackageEngine.ManagerClasses.Classes;
910
using UniGetUI.PackageEngine.ManagerClasses.Manager;
1011
using UniGetUI.PackageEngine.Managers.Chocolatey;
@@ -105,54 +106,18 @@ protected override IReadOnlyList<Package> _getInstalledPackages_UnSafe()
105106
);
106107
p.Start();
107108

109+
List<string> outputLines = [];
108110
string? line;
109-
bool DashesPassed = false;
110111
while ((line = p.StandardOutput.ReadLine()) is not null)
111112
{
112113
logger.AddToStdOut(line);
113-
if (!DashesPassed)
114-
{
115-
if (line.Contains("----"))
116-
{
117-
DashesPassed = true;
118-
}
119-
}
120-
else
121-
{
122-
string[] elements = Regex.Replace(line, " {2,}", " ").Split(' ');
123-
if (elements.Length < 2)
124-
{
125-
continue;
126-
}
127-
128-
for (int i = 0; i < elements.Length; i++)
129-
{
130-
elements[i] = elements[i].Trim();
131-
}
132-
133-
if (
134-
FALSE_PACKAGE_IDS.Contains(elements[0])
135-
|| FALSE_PACKAGE_VERSIONS.Contains(elements[1])
136-
)
137-
{
138-
continue;
139-
}
140-
141-
Packages.Add(
142-
new Package(
143-
CoreTools.FormatAsName(elements[0]),
144-
elements[0],
145-
elements[1],
146-
DefaultSource,
147-
this,
148-
options
149-
)
150-
);
151-
}
114+
outputLines.Add(line);
152115
}
153116
logger.AddToStdErr(p.StandardError.ReadToEnd());
154117
p.WaitForExit();
155118
logger.Close(p.ExitCode);
119+
120+
Packages.AddRange(ParseInstalledPackages(outputLines, DefaultSource, this, options));
156121
}
157122
return Packages;
158123
}
@@ -211,5 +176,61 @@ protected override void _loadManagerVersion(out string version)
211176
process.Start();
212177
version = process.StandardOutput.ReadToEnd().Trim();
213178
}
179+
180+
internal static IReadOnlyList<Package> ParseInstalledPackages(
181+
IEnumerable<string> outputLines,
182+
IManagerSource source,
183+
IPackageManager manager,
184+
OverridenInstallationOptions options
185+
)
186+
{
187+
List<Package> packages = [];
188+
bool dashesPassed = false;
189+
190+
foreach (string rawLine in outputLines)
191+
{
192+
if (!dashesPassed)
193+
{
194+
if (rawLine.Contains("----"))
195+
{
196+
dashesPassed = true;
197+
}
198+
199+
continue;
200+
}
201+
202+
string[] elements = Regex.Replace(rawLine, " {2,}", " ").Split(' ');
203+
if (elements.Length < 2)
204+
{
205+
continue;
206+
}
207+
208+
for (int i = 0; i < elements.Length; i++)
209+
{
210+
elements[i] = elements[i].Trim();
211+
}
212+
213+
if (
214+
FALSE_PACKAGE_IDS.Contains(elements[0])
215+
|| FALSE_PACKAGE_VERSIONS.Contains(elements[1])
216+
)
217+
{
218+
continue;
219+
}
220+
221+
packages.Add(
222+
new Package(
223+
CoreTools.FormatAsName(elements[0]),
224+
elements[0],
225+
elements[1],
226+
source,
227+
manager,
228+
options
229+
)
230+
);
231+
}
232+
233+
return packages;
234+
}
214235
}
215236
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
using System.Runtime.CompilerServices;
2+
3+
[assembly: InternalsVisibleTo("UniGetUI.PackageEngine.Tests")]
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
using System.Runtime.CompilerServices;
2+
3+
[assembly: InternalsVisibleTo("UniGetUI.PackageEngine.Tests")]
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
using System.Runtime.CompilerServices;
2+
3+
[assembly: InternalsVisibleTo("UniGetUI.PackageEngine.Tests")]

src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs

Lines changed: 48 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -100,48 +100,18 @@ protected override IReadOnlyList<Package> _getInstalledPackages_UnSafe()
100100

101101
p.Start();
102102
string? line;
103-
List<Package> Packages = [];
104-
bool DashesPassed = false;
103+
List<string> outputLines = [];
105104
while ((line = p.StandardOutput.ReadLine()) is not null)
106105
{
107106
logger.AddToStdOut(line);
108-
if (!DashesPassed)
109-
{
110-
if (line.Contains("-----"))
111-
{
112-
DashesPassed = true;
113-
}
114-
}
115-
else
116-
{
117-
string[] elements = Regex.Replace(line, " {2,}", " ").Split(' ');
118-
if (elements.Length < 3)
119-
{
120-
continue;
121-
}
122-
123-
for (int i = 0; i < elements.Length; i++)
124-
{
125-
elements[i] = elements[i].Trim();
126-
}
127-
128-
Packages.Add(
129-
new Package(
130-
CoreTools.FormatAsName(elements[1]),
131-
elements[1],
132-
elements[0],
133-
SourcesHelper.Factory.GetSourceOrDefault(elements[2]),
134-
this
135-
)
136-
);
137-
}
107+
outputLines.Add(line);
138108
}
139109

140110
logger.AddToStdErr(p.StandardError.ReadToEnd());
141111
p.WaitForExit();
142112
logger.Close(p.ExitCode);
143113

144-
return Packages;
114+
return ParseInstalledPackages(outputLines, this);
145115
}
146116

147117
public override List<string> FindCandidateExecutableFiles()
@@ -182,5 +152,50 @@ protected override void _loadManagerVersion(out string version)
182152
process.Start();
183153
version = process.StandardOutput.ReadToEnd().Trim();
184154
}
155+
156+
internal static IReadOnlyList<Package> ParseInstalledPackages(
157+
IEnumerable<string> outputLines,
158+
PowerShell manager
159+
)
160+
{
161+
List<Package> packages = [];
162+
bool dashesPassed = false;
163+
164+
foreach (string rawLine in outputLines)
165+
{
166+
if (!dashesPassed)
167+
{
168+
if (rawLine.Contains("-----"))
169+
{
170+
dashesPassed = true;
171+
}
172+
173+
continue;
174+
}
175+
176+
string[] elements = Regex.Replace(rawLine, " {2,}", " ").Split(' ');
177+
if (elements.Length < 3)
178+
{
179+
continue;
180+
}
181+
182+
for (int i = 0; i < elements.Length; i++)
183+
{
184+
elements[i] = elements[i].Trim();
185+
}
186+
187+
packages.Add(
188+
new Package(
189+
CoreTools.FormatAsName(elements[1]),
190+
elements[1],
191+
elements[0],
192+
manager.SourcesHelper.Factory.GetSourceOrDefault(elements[2]),
193+
manager
194+
)
195+
);
196+
}
197+
198+
return packages;
199+
}
185200
}
186201
}

0 commit comments

Comments
 (0)