Skip to content

Commit 32a268e

Browse files
committed
Add unit tests for BlazorLocalTimeProvider and LocalTimeService components
1 parent 3f4e3f7 commit 32a268e

6 files changed

Lines changed: 203 additions & 3 deletions

File tree

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using BlazorLocalTime;
2+
using Bunit;
3+
using Microsoft.Extensions.DependencyInjection;
4+
using Microsoft.Extensions.Logging;
5+
using Microsoft.JSInterop;
6+
using Shouldly;
7+
8+
namespace BlazorLocalTimeTest;
9+
10+
public class BlazorLocalTimeProviderCodeTest : TestContext
11+
{
12+
public BlazorLocalTimeProviderCodeTest()
13+
{
14+
Services.AddBlazorLocalTimeService();
15+
Services.AddLogging();
16+
}
17+
18+
[Fact]
19+
public void BlazorLocalTimeProvider_SetsTimeZoneSuccessfully()
20+
{
21+
TestInitializer.JavaScriptInitializer(JSInterop);
22+
23+
var component = RenderComponent<BlazorLocalTimeProvider>();
24+
var localTimeService = Services.GetRequiredService<ILocalTimeService>();
25+
26+
localTimeService.IsTimeZoneInfoAvailable.ShouldBeTrue();
27+
localTimeService.IsSuccessLoadBrowserTimeZone?.ShouldBeTrue();
28+
localTimeService.GetBrowserTimeZone().Id.ShouldBe("Asia/Tokyo");
29+
}
30+
31+
[Fact]
32+
public void BlazorLocalTimeProvider_HandlesJSDisconnectedException()
33+
{
34+
var module = JSInterop.SetupModule(BlazorLocalTimeProvider.JsPath);
35+
module.Setup<string>("getBrowserTimeZone").SetException(new JSDisconnectedException("Test disconnection"));
36+
37+
var component = RenderComponent<BlazorLocalTimeProvider>();
38+
var localTimeService = Services.GetRequiredService<ILocalTimeService>();
39+
40+
localTimeService.IsTimeZoneInfoAvailable.ShouldBeFalse();
41+
localTimeService.IsSuccessLoadBrowserTimeZone?.ShouldBeFalse();
42+
}
43+
44+
[Fact]
45+
public void BlazorLocalTimeProvider_HandlesJSException()
46+
{
47+
var module = JSInterop.SetupModule(BlazorLocalTimeProvider.JsPath);
48+
module.Setup<string>("getBrowserTimeZone").SetException(new JSException("Browser API not supported"));
49+
50+
var component = RenderComponent<BlazorLocalTimeProvider>();
51+
var localTimeService = Services.GetRequiredService<ILocalTimeService>();
52+
53+
localTimeService.IsTimeZoneInfoAvailable.ShouldBeFalse();
54+
localTimeService.IsSuccessLoadBrowserTimeZone?.ShouldBeFalse();
55+
}
56+
57+
[Fact]
58+
public void BlazorLocalTimeProvider_InitialStateIsNull()
59+
{
60+
// Don't setup JS interop to simulate initial state
61+
var localTimeService = Services.GetRequiredService<ILocalTimeService>();
62+
63+
localTimeService.IsSuccessLoadBrowserTimeZone.ShouldBeNull();
64+
localTimeService.IsTimeZoneInfoAvailable.ShouldBeFalse();
65+
}
66+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@inject ILocalTimeService LocalTimeService
2+
@inject TimeProvider TimeProvider
3+
4+
<LocalTime Value="TimeProvider.GetUtcNow()">
5+
<ChildContent Context="dt">
6+
@dt.ToString("yyyy-MM-dd HH:mm:ss")
7+
</ChildContent>
8+
<OnLoading>
9+
Loading
10+
</OnLoading>
11+
<OnError>
12+
Error
13+
</OnError>
14+
</LocalTime>
15+
<BlazorLocalTimeProvider />

tests/BlazorLocalTimeTest/LocalTimeMockService.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,15 @@ public LocalTimeMockService(TimeProvider provider)
1414
}
1515
}
1616

17+
internal class LocalTimeEmptyMockService : LocalTimeService
18+
{
19+
public LocalTimeEmptyMockService(TimeProvider provider)
20+
: base(provider)
21+
{
22+
BrowserTimeZoneInfo = null;
23+
}
24+
}
25+
1726
internal static class LocalTimeMockServiceExtension
1827
{
1928
public static IServiceCollection AddLocalTimeMockService(this IServiceCollection services)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using BlazorLocalTime;
2+
using Shouldly;
3+
4+
namespace BlazorLocalTimeTest;
5+
6+
public class LocalTimeServiceTest
7+
{
8+
[Fact]
9+
public void LocalTimeService_InitialState_IsSuccessLoadBrowserTimeZoneIsNull()
10+
{
11+
var service = new LocalTimeService(TimeProvider.System);
12+
13+
service.IsSuccessLoadBrowserTimeZone.ShouldBeNull();
14+
((ILocalTimeService)service).IsTimeZoneInfoAvailable.ShouldBeFalse();
15+
}
16+
17+
[Fact]
18+
public void LocalTimeService_SetBrowserTimeZoneInfo_SetsSuccessFlag()
19+
{
20+
var service = new LocalTimeService(TimeProvider.System);
21+
var timeZone = TimeZoneInfo.FindSystemTimeZoneById("America/New_York");
22+
23+
service.SetBrowserTimeZoneInfo(timeZone);
24+
25+
((ILocalTimeService)service).IsTimeZoneInfoAvailable.ShouldBeTrue();
26+
((ILocalTimeService)service).GetBrowserTimeZone().Id.ShouldBe("America/New_York");
27+
}
28+
29+
[Fact]
30+
public void LocalTimeService_TimeZoneConversion_WorksWithSetTimeZone()
31+
{
32+
var service = new LocalTimeService(TimeProvider.System);
33+
var utcTime = new DateTimeOffset(2023, 12, 25, 10, 0, 0, TimeSpan.Zero);
34+
var timeZone = TimeZoneInfo.FindSystemTimeZoneById("Asia/Tokyo");
35+
36+
service.SetBrowserTimeZoneInfo(timeZone);
37+
var localTime = ((ILocalTimeService)service).ToLocalTimeOffset(utcTime);
38+
39+
localTime.Hour.ShouldBe(19); // UTC+9
40+
localTime.Offset.ShouldBe(timeZone.GetUtcOffset(utcTime));
41+
}
42+
}

tests/BlazorLocalTimeTest/LocalTimeTest.razor

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,51 @@
6565
@dtl.ToString("yyyy-MM-dd HH:mm")
6666
</LocalTime>
6767
);
68-
68+
6969
cut.MarkupMatches("2023-10-01 21:30");
7070
}
71-
71+
72+
[Fact]
73+
public void TestLoadingComponent1()
74+
{
75+
Services.AddScoped<ILocalTimeService, LocalTimeEmptyMockService>();
76+
Services.AddSingleton<TimeProvider>(TimeProvider.System);
77+
78+
var dt = new DateTime(2023, 10, 1, 12, 30, 0, DateTimeKind.Utc);
79+
80+
var cut = Render(
81+
@<LocalTime Value="dt">
82+
<ChildContent Context="dtl">
83+
@dtl.ToString("yyyy-MM-dd HH:mm")
84+
</ChildContent>
85+
<OnLoading>
86+
Loading...
87+
</OnLoading>
88+
</LocalTime>
89+
);
90+
91+
cut.MarkupMatches("Loading...");
92+
}
93+
94+
[Fact]
95+
public void TestLoadingComponent2()
96+
{
97+
Services.AddLocalTimeMockService();
98+
99+
var dt = new DateTime(2023, 10, 1, 12, 30, 0, DateTimeKind.Utc);
100+
101+
var cut = Render(
102+
@<LocalTime Value="dt">
103+
<ChildContent Context="dtl">
104+
@dtl.ToString("yyyy-MM-dd HH:mm")
105+
</ChildContent>
106+
<OnLoading>
107+
Loading...
108+
</OnLoading>
109+
</LocalTime>
110+
);
111+
112+
cut.MarkupMatches("2023-10-01 21:30");
113+
}
114+
72115
}

tests/BlazorLocalTimeTest/LocalTimeTotalTest.razor

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
// 12:34+09:00 -> 2023-10-01 21:34:56
1414
cut.MarkupMatches("<p>2023-10-01 21:34:56</p>");
1515
}
16-
16+
1717
[Fact]
1818
public void TestTotalFailed1()
1919
{
@@ -26,4 +26,29 @@
2626
RenderComponent<LocalTimeTotalFailed1>();
2727
});
2828
}
29+
30+
[Fact]
31+
public void TestTotal2Success()
32+
{
33+
var timeProvider = new MockTimeProvider(new(2023, 10, 1, 12, 34, 56, TimeSpan.Zero));
34+
Services.AddBlazorLocalTimeService(timeProvider);
35+
TestInitializer.JavaScriptInitializer(JSInterop);
36+
37+
var cut = RenderComponent<LocalTimeTotal2>();
38+
// 12:34+09:00 -> 2023-10-01 21:34:56
39+
cut.MarkupMatches("2023-10-01 21:34:56");
40+
}
41+
42+
[Fact]
43+
public void TestTotal2Error()
44+
{
45+
var timeProvider = new MockTimeProvider(new(2023, 10, 1, 12, 34, 56, TimeSpan.Zero));
46+
Services.AddBlazorLocalTimeService(timeProvider);
47+
var module = JSInterop.SetupModule(BlazorLocalTimeProvider.JsPath);
48+
module.Setup<string>("getBrowserTimeZone").SetException(new JSException("error"));
49+
50+
var cut = RenderComponent<LocalTimeTotal2>();
51+
cut.MarkupMatches("Error");
52+
}
53+
2954
}

0 commit comments

Comments
 (0)