Skip to content

Commit ad9873c

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

File tree

60 files changed

+5099
-619
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+5099
-619
lines changed

src/UniGetUI.Core.SecureSettings/SecureSettings.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ namespace UniGetUI.Core.SettingsEngine.SecureSettings;
66

77
public static class SecureSettings
88
{
9+
public static string? TEST_SecureSettingsRootOverride { private get; set; }
10+
911
// Various predefined secure settings keys
1012
public enum K
1113
{
@@ -140,6 +142,11 @@ public static int ApplyForUser(string username, string setting, bool enable)
140142

141143
private static string GetSecureSettingsRoot()
142144
{
145+
if (TEST_SecureSettingsRootOverride is not null)
146+
{
147+
return TEST_SecureSettingsRootOverride;
148+
}
149+
143150
if (OperatingSystem.IsWindows())
144151
{
145152
return Path.Join(
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
using System.Reflection;
2+
using UniGetUI.Core.Tools;
3+
using SecureSettingsStore = UniGetUI.Core.SettingsEngine.SecureSettings.SecureSettings;
4+
5+
namespace UniGetUI.Core.SettingsEngine.Tests;
6+
7+
public sealed class SecureSettingsTests : IDisposable
8+
{
9+
private readonly string _testRoot;
10+
11+
public SecureSettingsTests()
12+
{
13+
_testRoot = Path.Combine(Path.GetTempPath(), $"UniGetUI-SecureSettingsTests-{Guid.NewGuid():N}");
14+
Directory.CreateDirectory(_testRoot);
15+
SecureSettingsStore.TEST_SecureSettingsRootOverride = _testRoot;
16+
ClearSecureSettingsCache();
17+
}
18+
19+
public void Dispose()
20+
{
21+
ClearSecureSettingsCache();
22+
SecureSettingsStore.TEST_SecureSettingsRootOverride = null;
23+
24+
if (Directory.Exists(_testRoot))
25+
{
26+
Directory.Delete(_testRoot, true);
27+
}
28+
}
29+
30+
[Theory]
31+
[InlineData(SecureSettingsStore.K.AllowCLIArguments, "AllowCLIArguments")]
32+
[InlineData(SecureSettingsStore.K.AllowImportingCLIArguments, "AllowImportingCLIArguments")]
33+
[InlineData(SecureSettingsStore.K.AllowPrePostOpCommand, "AllowPrePostInstallCommands")]
34+
[InlineData(SecureSettingsStore.K.AllowImportPrePostOpCommands, "AllowImportingPrePostInstallCommands")]
35+
[InlineData(SecureSettingsStore.K.ForceUserGSudo, "ForceUserGSudo")]
36+
[InlineData(SecureSettingsStore.K.AllowCustomManagerPaths, "AllowCustomManagerPaths")]
37+
public void ResolveKey_ReturnsExpectedMappings(SecureSettingsStore.K key, string expected)
38+
{
39+
Assert.Equal(expected, SecureSettingsStore.ResolveKey(key));
40+
}
41+
42+
[Fact]
43+
public void ResolveKey_ThrowsForUnsetAndUnknownKeys()
44+
{
45+
Assert.Throws<InvalidDataException>(() =>
46+
SecureSettingsStore.ResolveKey(SecureSettingsStore.K.Unset)
47+
);
48+
Assert.Throws<KeyNotFoundException>(() =>
49+
SecureSettingsStore.ResolveKey((SecureSettingsStore.K)999)
50+
);
51+
}
52+
53+
[Fact]
54+
public void Get_ReturnsFalseWhenSettingDoesNotExist()
55+
{
56+
Assert.False(SecureSettingsStore.Get(SecureSettingsStore.K.AllowCLIArguments));
57+
Assert.False(Directory.Exists(GetCurrentUserSettingsDirectory()));
58+
}
59+
60+
[Fact]
61+
public void ApplyForUser_CreatesAndRemovesSanitizedFile()
62+
{
63+
const string username = "test:user?";
64+
const string setting = "setting<with>invalid|chars";
65+
66+
Assert.Equal(0, SecureSettingsStore.ApplyForUser(username, setting, true));
67+
Assert.True(File.Exists(GetSettingsFilePath(username, setting)));
68+
69+
Assert.Equal(0, SecureSettingsStore.ApplyForUser(username, setting, false));
70+
Assert.False(File.Exists(GetSettingsFilePath(username, setting)));
71+
}
72+
73+
[Fact]
74+
public void Get_RefreshesCachedValueAfterApplyForUserWrites()
75+
{
76+
string username = Environment.UserName;
77+
string setting = SecureSettingsStore.ResolveKey(SecureSettingsStore.K.AllowCLIArguments);
78+
79+
Assert.False(SecureSettingsStore.Get(SecureSettingsStore.K.AllowCLIArguments));
80+
81+
Assert.Equal(0, SecureSettingsStore.ApplyForUser(username, setting, true));
82+
Assert.True(File.Exists(GetSettingsFilePath(username, setting)));
83+
Assert.True(SecureSettingsStore.Get(SecureSettingsStore.K.AllowCLIArguments));
84+
85+
Assert.Equal(0, SecureSettingsStore.ApplyForUser(username, setting, false));
86+
Assert.False(File.Exists(GetSettingsFilePath(username, setting)));
87+
Assert.False(SecureSettingsStore.Get(SecureSettingsStore.K.AllowCLIArguments));
88+
}
89+
90+
private string GetCurrentUserSettingsDirectory() =>
91+
Path.Combine(_testRoot, CoreTools.MakeValidFileName(Environment.UserName));
92+
93+
private string GetSettingsFilePath(string username, string setting) =>
94+
Path.Combine(
95+
_testRoot,
96+
CoreTools.MakeValidFileName(username),
97+
CoreTools.MakeValidFileName(setting)
98+
);
99+
100+
private static void ClearSecureSettingsCache()
101+
{
102+
FieldInfo? cacheField = typeof(SecureSettingsStore).GetField(
103+
"_cache",
104+
BindingFlags.NonPublic | BindingFlags.Static
105+
);
106+
Assert.NotNull(cacheField);
107+
108+
var cache = Assert.IsType<Dictionary<string, bool>>(cacheField.GetValue(null));
109+
cache.Clear();
110+
}
111+
}

src/UniGetUI.Core.Settings.Tests/UniGetUI.Core.Settings.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
<ItemGroup>
2626
<ProjectReference Include="..\UniGetUI.Core.Settings\UniGetUI.Core.Settings.csproj" />
27+
<ProjectReference Include="..\UniGetUI.Core.SecureSettings\UniGetUI.Core.SecureSettings.csproj" />
2728
</ItemGroup>
2829

2930
<ItemGroup>

0 commit comments

Comments
 (0)