From 2a5e09bf0773863be1fa1fedecd1d158a8483065 Mon Sep 17 00:00:00 2001
From: Tyrrrz <1935960+Tyrrrz@users.noreply.github.com>
Date: Sun, 12 Feb 2023 17:43:45 +0200
Subject: [PATCH] Use a fixed timezone in tests
---
.../DiscordChatExporter.Cli.Tests.csproj | 1 +
.../Specs/HtmlMarkdownSpecs.cs | 254 ++++++++++++------
.../Utils/TimeZoneInfoEx.cs | 14 +
3 files changed, 188 insertions(+), 81 deletions(-)
create mode 100644 DiscordChatExporter.Cli.Tests/Utils/TimeZoneInfoEx.cs
diff --git a/DiscordChatExporter.Cli.Tests/DiscordChatExporter.Cli.Tests.csproj b/DiscordChatExporter.Cli.Tests/DiscordChatExporter.Cli.Tests.csproj
index 3e8b7a5..cd60c7b 100644
--- a/DiscordChatExporter.Cli.Tests/DiscordChatExporter.Cli.Tests.csproj
+++ b/DiscordChatExporter.Cli.Tests/DiscordChatExporter.Cli.Tests.csproj
@@ -20,6 +20,7 @@
+
diff --git a/DiscordChatExporter.Cli.Tests/Specs/HtmlMarkdownSpecs.cs b/DiscordChatExporter.Cli.Tests/Specs/HtmlMarkdownSpecs.cs
index e443672..e889db3 100644
--- a/DiscordChatExporter.Cli.Tests/Specs/HtmlMarkdownSpecs.cs
+++ b/DiscordChatExporter.Cli.Tests/Specs/HtmlMarkdownSpecs.cs
@@ -1,6 +1,8 @@
-using System.Threading.Tasks;
+using System;
+using System.Threading.Tasks;
using AngleSharp.Dom;
using DiscordChatExporter.Cli.Tests.Infra;
+using DiscordChatExporter.Cli.Tests.Utils;
using DiscordChatExporter.Core.Discord;
using FluentAssertions;
using Xunit;
@@ -12,125 +14,215 @@ public class HtmlMarkdownSpecs
[Fact]
public async Task Message_with_a_timestamp_is_rendered_correctly()
{
- // Act
- var message = await ExportWrapper.GetMessageAsHtmlAsync(
- ChannelIds.MarkdownTestCases,
- Snowflake.Parse("1074323136411078787")
- );
-
- // Assert
- message.Text().Should().Contain("Default timestamp: 12-Feb-23 03:36 PM");
- message.InnerHtml.Should().Contain("Sunday, February 12, 2023 3:36 PM");
+ // Date formatting code relies on the local time zone, so we need to set it to a fixed value
+ TimeZoneInfoEx.SetLocal(TimeSpan.FromHours(+2));
+
+ try
+ {
+ // Act
+ var message = await ExportWrapper.GetMessageAsHtmlAsync(
+ ChannelIds.MarkdownTestCases,
+ Snowflake.Parse("1074323136411078787")
+ );
+
+ // Assert
+ message.Text().Should().Contain("Default timestamp: 02/12/2023 3:36 PM");
+ message.InnerHtml.Should().Contain("Sunday, February 12, 2023 3:36 PM");
+ }
+ finally
+ {
+ TimeZoneInfo.ClearCachedData();
+ }
}
[Fact]
public async Task Message_with_a_short_time_timestamp_is_rendered_correctly()
{
- // Act
- var message = await ExportWrapper.GetMessageAsHtmlAsync(
- ChannelIds.MarkdownTestCases,
- Snowflake.Parse("1074323205268967596")
- );
-
- // Assert
- message.Text().Should().Contain("Short time timestamp: 3:36 PM");
- message.InnerHtml.Should().Contain("Sunday, February 12, 2023 3:36 PM");
+ // Date formatting code relies on the local time zone, so we need to set it to a fixed value
+ TimeZoneInfoEx.SetLocal(TimeSpan.FromHours(+2));
+
+ try
+ {
+ // Act
+ var message = await ExportWrapper.GetMessageAsHtmlAsync(
+ ChannelIds.MarkdownTestCases,
+ Snowflake.Parse("1074323205268967596")
+ );
+
+ // Assert
+ message.Text().Should().Contain("Short time timestamp: 3:36 PM");
+ message.InnerHtml.Should().Contain("Sunday, February 12, 2023 3:36 PM");
+ }
+ finally
+ {
+ TimeZoneInfo.ClearCachedData();
+ }
}
[Fact]
public async Task Message_with_a_long_time_timestamp_is_rendered_correctly()
{
- // Act
- var message = await ExportWrapper.GetMessageAsHtmlAsync(
- ChannelIds.MarkdownTestCases,
- Snowflake.Parse("1074323235342139483")
- );
-
- // Assert
- message.Text().Should().Contain("Long time timestamp: 3:36:12 PM");
- message.InnerHtml.Should().Contain("Sunday, February 12, 2023 3:36 PM");
+ // Date formatting code relies on the local time zone, so we need to set it to a fixed value
+ TimeZoneInfoEx.SetLocal(TimeSpan.FromHours(+2));
+
+ try
+ {
+ // Act
+ var message = await ExportWrapper.GetMessageAsHtmlAsync(
+ ChannelIds.MarkdownTestCases,
+ Snowflake.Parse("1074323235342139483")
+ );
+
+ // Assert
+ message.Text().Should().Contain("Long time timestamp: 3:36:12 PM");
+ message.InnerHtml.Should().Contain("Sunday, February 12, 2023 3:36 PM");
+ }
+ finally
+ {
+ TimeZoneInfo.ClearCachedData();
+ }
}
[Fact]
public async Task Message_with_a_short_date_timestamp_is_rendered_correctly()
{
- // Act
- var message = await ExportWrapper.GetMessageAsHtmlAsync(
- ChannelIds.MarkdownTestCases,
- Snowflake.Parse("1074323326727634984")
- );
-
- // Assert
- message.Text().Should().Contain("Short date timestamp: 02/12/2023");
- message.InnerHtml.Should().Contain("Sunday, February 12, 2023 3:36 PM");
+ // Date formatting code relies on the local time zone, so we need to set it to a fixed value
+ TimeZoneInfoEx.SetLocal(TimeSpan.FromHours(+2));
+
+ try
+ {
+ // Act
+ var message = await ExportWrapper.GetMessageAsHtmlAsync(
+ ChannelIds.MarkdownTestCases,
+ Snowflake.Parse("1074323326727634984")
+ );
+
+ // Assert
+ message.Text().Should().Contain("Short date timestamp: 02/12/2023");
+ message.InnerHtml.Should().Contain("Sunday, February 12, 2023 3:36 PM");
+ }
+ finally
+ {
+ TimeZoneInfo.ClearCachedData();
+ }
}
[Fact]
public async Task Message_with_a_long_date_timestamp_is_rendered_correctly()
{
- // Act
- var message = await ExportWrapper.GetMessageAsHtmlAsync(
- ChannelIds.MarkdownTestCases,
- Snowflake.Parse("1074323350731640863")
- );
-
- // Assert
- message.Text().Should().Contain("Long date timestamp: February 12, 2023");
- message.InnerHtml.Should().Contain("Sunday, February 12, 2023 3:36 PM");
+ // Date formatting code relies on the local time zone, so we need to set it to a fixed value
+ TimeZoneInfoEx.SetLocal(TimeSpan.FromHours(+2));
+
+ try
+ {
+ // Act
+ var message = await ExportWrapper.GetMessageAsHtmlAsync(
+ ChannelIds.MarkdownTestCases,
+ Snowflake.Parse("1074323350731640863")
+ );
+
+ // Assert
+ message.Text().Should().Contain("Long date timestamp: February 12, 2023");
+ message.InnerHtml.Should().Contain("Sunday, February 12, 2023 3:36 PM");
+ }
+ finally
+ {
+ TimeZoneInfo.ClearCachedData();
+ }
}
[Fact]
public async Task Message_with_a_full_timestamp_is_rendered_correctly()
{
- // Act
- var message = await ExportWrapper.GetMessageAsHtmlAsync(
- ChannelIds.MarkdownTestCases,
- Snowflake.Parse("1074323374379118593")
- );
-
- // Assert
- message.Text().Should().Contain("Full timestamp: February 12, 2023 3:36 PM");
- message.InnerHtml.Should().Contain("Sunday, February 12, 2023 3:36 PM");
+ // Date formatting code relies on the local time zone, so we need to set it to a fixed value
+ TimeZoneInfoEx.SetLocal(TimeSpan.FromHours(+2));
+
+ try
+ {
+ // Act
+ var message = await ExportWrapper.GetMessageAsHtmlAsync(
+ ChannelIds.MarkdownTestCases,
+ Snowflake.Parse("1074323374379118593")
+ );
+
+ // Assert
+ message.Text().Should().Contain("Full timestamp: February 12, 2023 3:36 PM");
+ message.InnerHtml.Should().Contain("Sunday, February 12, 2023 3:36 PM");
+ }
+ finally
+ {
+ TimeZoneInfo.ClearCachedData();
+ }
}
[Fact]
public async Task Message_with_a_full_long_timestamp_is_rendered_correctly()
{
- // Act
- var message = await ExportWrapper.GetMessageAsHtmlAsync(
- ChannelIds.MarkdownTestCases,
- Snowflake.Parse("1074323409095376947")
- );
-
- // Assert
- message.Text().Should().Contain("Full long timestamp: Sunday, February 12, 2023 3:36 PM");
- message.InnerHtml.Should().Contain("Sunday, February 12, 2023 3:36 PM");
+ // Date formatting code relies on the local time zone, so we need to set it to a fixed value
+ TimeZoneInfoEx.SetLocal(TimeSpan.FromHours(+2));
+
+ try
+ {
+ // Act
+ var message = await ExportWrapper.GetMessageAsHtmlAsync(
+ ChannelIds.MarkdownTestCases,
+ Snowflake.Parse("1074323409095376947")
+ );
+
+ // Assert
+ message.Text().Should().Contain("Full long timestamp: Sunday, February 12, 2023 3:36 PM");
+ message.InnerHtml.Should().Contain("Sunday, February 12, 2023 3:36 PM");
+ }
+ finally
+ {
+ TimeZoneInfo.ClearCachedData();
+ }
}
[Fact]
public async Task Message_with_a_relative_timestamp_is_rendered_as_the_default_timestamp()
{
- // Act
- var message = await ExportWrapper.GetMessageAsHtmlAsync(
- ChannelIds.MarkdownTestCases,
- Snowflake.Parse("1074323436853285004")
- );
-
- // Assert
- message.Text().Should().Contain("Relative timestamp: 12-Feb-23 03:36 PM");
- message.InnerHtml.Should().Contain("Sunday, February 12, 2023 3:36 PM");
+ // Date formatting code relies on the local time zone, so we need to set it to a fixed value
+ TimeZoneInfoEx.SetLocal(TimeSpan.FromHours(+2));
+
+ try
+ {
+ // Act
+ var message = await ExportWrapper.GetMessageAsHtmlAsync(
+ ChannelIds.MarkdownTestCases,
+ Snowflake.Parse("1074323436853285004")
+ );
+
+ // Assert
+ message.Text().Should().Contain("Relative timestamp: 02/12/2023 3:36 PM");
+ message.InnerHtml.Should().Contain("Sunday, February 12, 2023 3:36 PM");
+ }
+ finally
+ {
+ TimeZoneInfo.ClearCachedData();
+ }
}
[Fact]
public async Task Message_with_an_invalid_timestamp_is_rendered_correctly()
{
- // Act
- var message = await ExportWrapper.GetMessageAsHtmlAsync(
- ChannelIds.MarkdownTestCases,
- Snowflake.Parse("1074328534409019563")
- );
-
- // Assert
- message.Text().Should().Contain("Invalid timestamp: Invalid date");
+ // Date formatting code relies on the local time zone, so we need to set it to a fixed value
+ TimeZoneInfoEx.SetLocal(TimeSpan.FromHours(+2));
+
+ try
+ {
+ // Act
+ var message = await ExportWrapper.GetMessageAsHtmlAsync(
+ ChannelIds.MarkdownTestCases,
+ Snowflake.Parse("1074328534409019563")
+ );
+
+ // Assert
+ message.Text().Should().Contain("Invalid timestamp: Invalid date");
+ }
+ finally
+ {
+ TimeZoneInfo.ClearCachedData();
+ }
}
}
\ No newline at end of file
diff --git a/DiscordChatExporter.Cli.Tests/Utils/TimeZoneInfoEx.cs b/DiscordChatExporter.Cli.Tests/Utils/TimeZoneInfoEx.cs
new file mode 100644
index 0000000..87c28c2
--- /dev/null
+++ b/DiscordChatExporter.Cli.Tests/Utils/TimeZoneInfoEx.cs
@@ -0,0 +1,14 @@
+using System;
+using ReflectionMagic;
+
+namespace DiscordChatExporter.Cli.Tests.Utils;
+
+internal static class TimeZoneInfoEx
+{
+ // https://stackoverflow.com/a/63700512/2205454
+ public static void SetLocal(TimeZoneInfo timeZone) =>
+ typeof(TimeZoneInfo).AsDynamicType().s_cachedData._localTimeZone = timeZone;
+
+ public static void SetLocal(TimeSpan offset) =>
+ SetLocal(TimeZoneInfo.CreateCustomTimeZone("test-tz", offset, "test-tz", "test-tz"));
+}
\ No newline at end of file