Skip to content

Commit 988e24c

Browse files
CopilotKeboo
andcommitted
Add comprehensive tests for ThemeService
Co-authored-by: Keboo <[email protected]>
1 parent b34bc0e commit 988e24c

File tree

1 file changed

+240
-0
lines changed

1 file changed

+240
-0
lines changed
Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
using Moq;
2+
using Moq.AutoMock;
3+
using PointerStar.Client.Cookies;
4+
using PointerStar.Client.Services;
5+
6+
namespace PointerStar.Client.Tests.Services;
7+
8+
[ConstructorTests(typeof(ThemeService))]
9+
public partial class ThemeServiceTests
10+
{
11+
[Fact]
12+
public async Task InitializeAsync_WithNoSavedPreference_DefaultsToSystem()
13+
{
14+
AutoMocker mocker = new();
15+
mocker.GetMock<ICookie>()
16+
.Setup(x => x.GetValueAsync("ThemePreference", ""))
17+
.ReturnsAsync(string.Empty);
18+
19+
ThemeService service = mocker.CreateInstance<ThemeService>();
20+
21+
await service.InitializeAsync(() => Task.FromResult(false));
22+
23+
Assert.Equal(ThemePreference.System, service.CurrentPreference);
24+
}
25+
26+
[Fact]
27+
public async Task InitializeAsync_WithSavedLightPreference_LoadsPreference()
28+
{
29+
AutoMocker mocker = new();
30+
mocker.GetMock<ICookie>()
31+
.Setup(x => x.GetValueAsync("ThemePreference", ""))
32+
.ReturnsAsync("Light");
33+
34+
ThemeService service = mocker.CreateInstance<ThemeService>();
35+
36+
await service.InitializeAsync(() => Task.FromResult(false));
37+
38+
Assert.Equal(ThemePreference.Light, service.CurrentPreference);
39+
}
40+
41+
[Fact]
42+
public async Task InitializeAsync_WithSavedDarkPreference_LoadsPreference()
43+
{
44+
AutoMocker mocker = new();
45+
mocker.GetMock<ICookie>()
46+
.Setup(x => x.GetValueAsync("ThemePreference", ""))
47+
.ReturnsAsync("Dark");
48+
49+
ThemeService service = mocker.CreateInstance<ThemeService>();
50+
51+
await service.InitializeAsync(() => Task.FromResult(true));
52+
53+
Assert.Equal(ThemePreference.Dark, service.CurrentPreference);
54+
}
55+
56+
[Fact]
57+
public async Task IsDarkMode_WithSystemPreferenceAndDarkSystem_ReturnsTrue()
58+
{
59+
AutoMocker mocker = new();
60+
mocker.GetMock<ICookie>()
61+
.Setup(x => x.GetValueAsync("ThemePreference", ""))
62+
.ReturnsAsync("System");
63+
64+
ThemeService service = mocker.CreateInstance<ThemeService>();
65+
await service.InitializeAsync(() => Task.FromResult(true));
66+
67+
Assert.True(service.IsDarkMode);
68+
}
69+
70+
[Fact]
71+
public async Task IsDarkMode_WithSystemPreferenceAndLightSystem_ReturnsFalse()
72+
{
73+
AutoMocker mocker = new();
74+
mocker.GetMock<ICookie>()
75+
.Setup(x => x.GetValueAsync("ThemePreference", ""))
76+
.ReturnsAsync("System");
77+
78+
ThemeService service = mocker.CreateInstance<ThemeService>();
79+
await service.InitializeAsync(() => Task.FromResult(false));
80+
81+
Assert.False(service.IsDarkMode);
82+
}
83+
84+
[Fact]
85+
public async Task IsDarkMode_WithLightPreference_ReturnsFalse()
86+
{
87+
AutoMocker mocker = new();
88+
mocker.GetMock<ICookie>()
89+
.Setup(x => x.GetValueAsync("ThemePreference", ""))
90+
.ReturnsAsync("Light");
91+
92+
ThemeService service = mocker.CreateInstance<ThemeService>();
93+
await service.InitializeAsync(() => Task.FromResult(true));
94+
95+
Assert.False(service.IsDarkMode);
96+
}
97+
98+
[Fact]
99+
public async Task IsDarkMode_WithDarkPreference_ReturnsTrue()
100+
{
101+
AutoMocker mocker = new();
102+
mocker.GetMock<ICookie>()
103+
.Setup(x => x.GetValueAsync("ThemePreference", ""))
104+
.ReturnsAsync("Dark");
105+
106+
ThemeService service = mocker.CreateInstance<ThemeService>();
107+
await service.InitializeAsync(() => Task.FromResult(false));
108+
109+
Assert.True(service.IsDarkMode);
110+
}
111+
112+
[Fact]
113+
public async Task SetPreferenceAsync_WithNewPreference_UpdatesCookieAndRaisesEvent()
114+
{
115+
AutoMocker mocker = new();
116+
mocker.GetMock<ICookie>()
117+
.Setup(x => x.GetValueAsync("ThemePreference", ""))
118+
.ReturnsAsync("System");
119+
120+
ThemeService service = mocker.CreateInstance<ThemeService>();
121+
await service.InitializeAsync(() => Task.FromResult(false));
122+
123+
bool eventRaised = false;
124+
service.ThemeChanged += (sender, args) => eventRaised = true;
125+
126+
await service.SetPreferenceAsync(ThemePreference.Dark);
127+
128+
Assert.Equal(ThemePreference.Dark, service.CurrentPreference);
129+
Assert.True(eventRaised);
130+
mocker.GetMock<ICookie>().Verify(x => x.SetValueAsync("ThemePreference", "Dark", null), Times.Once);
131+
}
132+
133+
[Fact]
134+
public async Task SetPreferenceAsync_WithSamePreference_DoesNotRaiseEvent()
135+
{
136+
AutoMocker mocker = new();
137+
mocker.GetMock<ICookie>()
138+
.Setup(x => x.GetValueAsync("ThemePreference", ""))
139+
.ReturnsAsync("Dark");
140+
141+
ThemeService service = mocker.CreateInstance<ThemeService>();
142+
await service.InitializeAsync(() => Task.FromResult(false));
143+
144+
bool eventRaised = false;
145+
service.ThemeChanged += (sender, args) => eventRaised = true;
146+
147+
await service.SetPreferenceAsync(ThemePreference.Dark);
148+
149+
Assert.False(eventRaised);
150+
mocker.GetMock<ICookie>().Verify(x => x.SetValueAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int?>()), Times.Never);
151+
}
152+
153+
[Fact]
154+
public async Task CycleThemeAsync_FromSystem_SwitchesToLight()
155+
{
156+
AutoMocker mocker = new();
157+
mocker.GetMock<ICookie>()
158+
.Setup(x => x.GetValueAsync("ThemePreference", ""))
159+
.ReturnsAsync("System");
160+
161+
ThemeService service = mocker.CreateInstance<ThemeService>();
162+
await service.InitializeAsync(() => Task.FromResult(false));
163+
164+
await service.CycleThemeAsync();
165+
166+
Assert.Equal(ThemePreference.Light, service.CurrentPreference);
167+
}
168+
169+
[Fact]
170+
public async Task CycleThemeAsync_FromLight_SwitchesToDark()
171+
{
172+
AutoMocker mocker = new();
173+
mocker.GetMock<ICookie>()
174+
.Setup(x => x.GetValueAsync("ThemePreference", ""))
175+
.ReturnsAsync("Light");
176+
177+
ThemeService service = mocker.CreateInstance<ThemeService>();
178+
await service.InitializeAsync(() => Task.FromResult(false));
179+
180+
await service.CycleThemeAsync();
181+
182+
Assert.Equal(ThemePreference.Dark, service.CurrentPreference);
183+
}
184+
185+
[Fact]
186+
public async Task CycleThemeAsync_FromDark_SwitchesToSystem()
187+
{
188+
AutoMocker mocker = new();
189+
mocker.GetMock<ICookie>()
190+
.Setup(x => x.GetValueAsync("ThemePreference", ""))
191+
.ReturnsAsync("Dark");
192+
193+
ThemeService service = mocker.CreateInstance<ThemeService>();
194+
await service.InitializeAsync(() => Task.FromResult(false));
195+
196+
await service.CycleThemeAsync();
197+
198+
Assert.Equal(ThemePreference.System, service.CurrentPreference);
199+
}
200+
201+
[Fact]
202+
public async Task UpdateSystemPreferenceAsync_WhenSystemModeActive_RaisesThemeChangedEvent()
203+
{
204+
AutoMocker mocker = new();
205+
mocker.GetMock<ICookie>()
206+
.Setup(x => x.GetValueAsync("ThemePreference", ""))
207+
.ReturnsAsync("System");
208+
209+
ThemeService service = mocker.CreateInstance<ThemeService>();
210+
await service.InitializeAsync(() => Task.FromResult(false));
211+
212+
bool eventRaised = false;
213+
service.ThemeChanged += (sender, args) => eventRaised = true;
214+
215+
await service.UpdateSystemPreferenceAsync(true);
216+
217+
Assert.True(eventRaised);
218+
Assert.True(service.IsDarkMode);
219+
}
220+
221+
[Fact]
222+
public async Task UpdateSystemPreferenceAsync_WhenNotSystemMode_DoesNotRaiseEvent()
223+
{
224+
AutoMocker mocker = new();
225+
mocker.GetMock<ICookie>()
226+
.Setup(x => x.GetValueAsync("ThemePreference", ""))
227+
.ReturnsAsync("Light");
228+
229+
ThemeService service = mocker.CreateInstance<ThemeService>();
230+
await service.InitializeAsync(() => Task.FromResult(false));
231+
232+
bool eventRaised = false;
233+
service.ThemeChanged += (sender, args) => eventRaised = true;
234+
235+
await service.UpdateSystemPreferenceAsync(true);
236+
237+
Assert.False(eventRaised);
238+
Assert.False(service.IsDarkMode); // Still light mode
239+
}
240+
}

0 commit comments

Comments
 (0)