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