From 0d31f1201279d8bb69987235dcf70ed220885264 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Thu, 29 May 2025 22:41:53 -0500 Subject: [PATCH] tests: add tests for library --- .../Telemetry/HostExtensions.cs | 13 ++-- .../YouTube/ILastPostedStreamStore.cs | 4 +- src/src/StevesBot.Webhook/YouTube/IStore.cs | 7 --- .../StevesBot.Library.Tests.csproj | 2 +- .../Unit/DiscordMessageTests.cs | 42 ++++++++++++- .../Unit/DiscordUserTests.cs | 22 ++++++- .../Unit/GatewayResponseTests.cs | 13 ++++ .../Unit/HostExtensionsTests.cs | 59 +++++++++++++++++++ .../Unit/ServicesExtensionsTests.cs | 2 + .../StevesBotWebhookInstrumentationTests.cs | 2 +- src/tests/StevesBot.Library.Tests/Usings.cs | 7 +++ 11 files changed, 155 insertions(+), 18 deletions(-) delete mode 100644 src/src/StevesBot.Webhook/YouTube/IStore.cs diff --git a/src/src/StevesBot.Library/Telemetry/HostExtensions.cs b/src/src/StevesBot.Library/Telemetry/HostExtensions.cs index ea474d3..1afb0d1 100644 --- a/src/src/StevesBot.Library/Telemetry/HostExtensions.cs +++ b/src/src/StevesBot.Library/Telemetry/HostExtensions.cs @@ -14,12 +14,7 @@ public static class HostExtensions public static IHostApplicationBuilder AddTelemetry(this IHostApplicationBuilder builder, Func instrumentationFunc) { ArgumentNullException.ThrowIfNull(builder); - - builder.Services.AddSingleton(instrumentationFunc); - - var instrumentation = builder.Services - .BuildServiceProvider() - .GetRequiredService(); + ArgumentNullException.ThrowIfNull(instrumentationFunc); var seq = new SeqOptions(); builder.Configuration.GetSection(nameof(SeqOptions)).Bind(seq); @@ -29,6 +24,12 @@ public static class HostExtensions return builder; } + builder.Services.AddSingleton(instrumentationFunc()); + + var instrumentation = builder.Services + .BuildServiceProvider() + .GetRequiredService(); + builder.Services.AddOpenTelemetry() .ConfigureResource(resource => { diff --git a/src/src/StevesBot.Webhook/YouTube/ILastPostedStreamStore.cs b/src/src/StevesBot.Webhook/YouTube/ILastPostedStreamStore.cs index fe587f8..84a85f7 100644 --- a/src/src/StevesBot.Webhook/YouTube/ILastPostedStreamStore.cs +++ b/src/src/StevesBot.Webhook/YouTube/ILastPostedStreamStore.cs @@ -1,5 +1,7 @@ namespace StevesBot.Webhook.YouTube; -internal interface ILastPostedStreamStore : IStore +internal interface ILastPostedStreamStore { + void SetValue(string value); + bool HasValue(string value); } \ No newline at end of file diff --git a/src/src/StevesBot.Webhook/YouTube/IStore.cs b/src/src/StevesBot.Webhook/YouTube/IStore.cs deleted file mode 100644 index 994c506..0000000 --- a/src/src/StevesBot.Webhook/YouTube/IStore.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace StevesBot.Webhook.YouTube; - -internal interface IStore -{ - void SetValue(T value); - bool HasValue(T value); -} \ No newline at end of file diff --git a/src/tests/StevesBot.Library.Tests/StevesBot.Library.Tests.csproj b/src/tests/StevesBot.Library.Tests/StevesBot.Library.Tests.csproj index 7694b4b..813a84e 100644 --- a/src/tests/StevesBot.Library.Tests/StevesBot.Library.Tests.csproj +++ b/src/tests/StevesBot.Library.Tests/StevesBot.Library.Tests.csproj @@ -25,7 +25,7 @@ true ./TestResults/Coverage/ cobertura - [StevesBot.Lib]* + [StevesBot.Library]* diff --git a/src/tests/StevesBot.Library.Tests/Unit/DiscordMessageTests.cs b/src/tests/StevesBot.Library.Tests/Unit/DiscordMessageTests.cs index 4e5d120..dd087d4 100644 --- a/src/tests/StevesBot.Library.Tests/Unit/DiscordMessageTests.cs +++ b/src/tests/StevesBot.Library.Tests/Unit/DiscordMessageTests.cs @@ -1 +1,41 @@ -namespace StevesBot.Library.Tests.Unit; \ No newline at end of file +namespace StevesBot.Library.Tests.Unit; + +public class DiscordMessageTests +{ + [Fact] + public void Constructor_WhenCalled_ItShouldReturnAnInstance() + { + var result = new DiscordMessage(); + + result.Id.Should().BeEmpty(); + result.Type.Should().Be(0); + result.ChannelId.Should().BeEmpty(); + result.GuildId.Should().BeEmpty(); + result.Author.Should().BeEquivalentTo(new DiscordUser()); + } + + [Fact] + public void Constructor_WhenCalledWithParameters_ItShouldReturnAnInstance() + { + var id = "12345"; + var type = 1; + var channelId = "67890"; + var guildId = "54321"; + var author = new DiscordUser { Id = "11111" }; + + var result = new DiscordMessage + { + Id = id, + Type = type, + ChannelId = channelId, + GuildId = guildId, + Author = author + }; + + result.Id.Should().Be(id); + result.Type.Should().Be(type); + result.ChannelId.Should().Be(channelId); + result.GuildId.Should().Be(guildId); + result.Author.Should().BeEquivalentTo(author); + } +} \ No newline at end of file diff --git a/src/tests/StevesBot.Library.Tests/Unit/DiscordUserTests.cs b/src/tests/StevesBot.Library.Tests/Unit/DiscordUserTests.cs index 4e5d120..ff0edc0 100644 --- a/src/tests/StevesBot.Library.Tests/Unit/DiscordUserTests.cs +++ b/src/tests/StevesBot.Library.Tests/Unit/DiscordUserTests.cs @@ -1 +1,21 @@ -namespace StevesBot.Library.Tests.Unit; \ No newline at end of file +namespace StevesBot.Library.Tests.Unit; + +public class DiscordUserTests +{ + [Fact] + public void Constructor_WhenCalled_ItShouldReturnAnInstance() + { + var result = new DiscordUser(); + + result.Id.Should().BeEmpty(); + } + + [Fact] + public void Constructor_WhenCalledWithId_ItShouldReturnAnInstanceWithId() + { + var id = "12345"; + var result = new DiscordUser { Id = id }; + + result.Id.Should().Be(id); + } +} \ No newline at end of file diff --git a/src/tests/StevesBot.Library.Tests/Unit/GatewayResponseTests.cs b/src/tests/StevesBot.Library.Tests/Unit/GatewayResponseTests.cs index e69de29..350a81e 100644 --- a/src/tests/StevesBot.Library.Tests/Unit/GatewayResponseTests.cs +++ b/src/tests/StevesBot.Library.Tests/Unit/GatewayResponseTests.cs @@ -0,0 +1,13 @@ +namespace StevesBot.Library.Tests.Unit; + +public class GatewayResponseTests +{ + [Fact] + public void Constructor_WhenCalled_ItShouldReturnAnInstance() + { + var url = "https://example.com"; + var result = new GatewayResponse(url); + + result.Url.Should().Be(url); + } +} \ No newline at end of file diff --git a/src/tests/StevesBot.Library.Tests/Unit/HostExtensionsTests.cs b/src/tests/StevesBot.Library.Tests/Unit/HostExtensionsTests.cs index 8b8f489..48a9200 100644 --- a/src/tests/StevesBot.Library.Tests/Unit/HostExtensionsTests.cs +++ b/src/tests/StevesBot.Library.Tests/Unit/HostExtensionsTests.cs @@ -2,5 +2,64 @@ namespace StevesBot.Library.Tests.Unit; public class HostExtensionsTests { + [Fact] + public void AddTelemetry_WhenCalledAndSeqOptionsNotConfigured_ItShouldNotAddTelemetry() + { + var builder = WebApplication.CreateBuilder(); + builder.AddTelemetry(static () => new StevesBotWebhookInstrumentation()); + + var app = builder.Build(); + + app.Services + .GetService() + .Should() + .BeNull(); + + app.Services + .GetService() + .Should() + .BeNull(); + + app.Services + .GetService() + .Should() + .BeNull(); + } + + [Fact] + public void AddTelemetry_WhenCalledAndSeqOptionsConfigured_ItShouldAddTelemetry() + { + var builder = WebApplication.CreateBuilder(); + + var json = $@"{{ + ""SeqOptions"": {{ + ""ServerUrl"": ""http://localhost:5341"", + ""ApiKey"": ""my-api-key"", + ""ApiKeyHeader"": ""X-Seq-ApiKey"" + }} + }}"; + + builder.Configuration.AddJsonStream(new MemoryStream(Encoding.UTF8.GetBytes(json))); + + builder.AddTelemetry(static () => new StevesBotWebhookInstrumentation()); + + var app = builder.Build(); + + app.Services + .GetService() + .Should() + .NotBeNull(); + + app.Services + .GetServices() + .Where(static p => p is OpenTelemetryLoggerProvider) + .Should() + .NotBeEmpty(); + + app.Services + .GetService() + .Should() + .NotBeNull(); + } } \ No newline at end of file diff --git a/src/tests/StevesBot.Library.Tests/Unit/ServicesExtensionsTests.cs b/src/tests/StevesBot.Library.Tests/Unit/ServicesExtensionsTests.cs index 0737a77..5006291 100644 --- a/src/tests/StevesBot.Library.Tests/Unit/ServicesExtensionsTests.cs +++ b/src/tests/StevesBot.Library.Tests/Unit/ServicesExtensionsTests.cs @@ -7,10 +7,12 @@ public class ServicesExtensionsTests ApiUrl = "https://test.com", AppToken = "test_token", }; + private readonly Mock _instrumentationMock = new(); private readonly ServiceCollection _services = new(); public ServicesExtensionsTests() { + _services.AddSingleton(_instrumentationMock.Object); _services.AddSingleton(_discordClientOptions); } diff --git a/src/tests/StevesBot.Library.Tests/Unit/StevesBotWebhookInstrumentationTests.cs b/src/tests/StevesBot.Library.Tests/Unit/StevesBotWebhookInstrumentationTests.cs index c762d06..8eea5f8 100644 --- a/src/tests/StevesBot.Library.Tests/Unit/StevesBotWebhookInstrumentationTests.cs +++ b/src/tests/StevesBot.Library.Tests/Unit/StevesBotWebhookInstrumentationTests.cs @@ -19,7 +19,7 @@ public sealed class StevesBotWebhookInstrumentationTests : IDisposable [Fact] public void Constructor_WhenCalled_ItShouldReturnInstance() { - using var result = new StevesBotWorkerInstrumentation(); + using var result = new StevesBotWebhookInstrumentation(); using var expectedSource = new ActivitySource(_instrumentation.SourceName, _instrumentation.SourceVersion); result.Source.Should().BeEquivalentTo(expectedSource); diff --git a/src/tests/StevesBot.Library.Tests/Usings.cs b/src/tests/StevesBot.Library.Tests/Usings.cs index 61c33bf..ebcc03a 100644 --- a/src/tests/StevesBot.Library.Tests/Usings.cs +++ b/src/tests/StevesBot.Library.Tests/Usings.cs @@ -1,16 +1,23 @@ global using System.Diagnostics; global using System.Net; +global using System.Text; global using System.Text.Json; +global using Microsoft.AspNetCore.Builder; +global using Microsoft.Extensions.Configuration; global using Microsoft.Extensions.DependencyInjection; global using Microsoft.Extensions.Logging; global using Moq; +global using OpenTelemetry.Logs; +global using OpenTelemetry.Trace; + global using RichardSzalay.MockHttp; global using StevesBot.Library.Discord; global using StevesBot.Library.Discord.Common; global using StevesBot.Library.Discord.Rest; global using StevesBot.Library.Discord.Rest.Requests; +global using StevesBot.Library.Discord.Rest.Responses; global using StevesBot.Library.Telemetry;