From c44340e94120cc3e3a1a71a55b418f64438ea7ac Mon Sep 17 00:00:00 2001 From: Samuel Meenzen Date: Tue, 26 Dec 2023 16:23:36 +0100 Subject: [PATCH] test: verify that events are raised correctly --- .../IStreamlabsClient.cs | 4 +- .../StreamlabsClient.cs | 8 +- .../MessageTypeTests.cs | 73 +++++++++++++++---- .../Streamlabs.SocketClient.Tests.csproj | 1 + 4 files changed, 67 insertions(+), 19 deletions(-) diff --git a/src/Streamlabs.SocketClient/IStreamlabsClient.cs b/src/Streamlabs.SocketClient/IStreamlabsClient.cs index 1dc81b0..9706146 100644 --- a/src/Streamlabs.SocketClient/IStreamlabsClient.cs +++ b/src/Streamlabs.SocketClient/IStreamlabsClient.cs @@ -24,6 +24,6 @@ public interface IStreamlabsClient : IDisposable event EventHandler? OnFollow; event EventHandler? OnRaid; event EventHandler? OnRollEndCredits; - event EventHandler? OnStreamlabelsMessage; - event EventHandler? OnStreamlabelsUnderlyingMessage; + event EventHandler? OnStreamlabels; + event EventHandler? OnStreamlabelsUnderlying; } diff --git a/src/Streamlabs.SocketClient/StreamlabsClient.cs b/src/Streamlabs.SocketClient/StreamlabsClient.cs index b95fdaf..8e33dec 100644 --- a/src/Streamlabs.SocketClient/StreamlabsClient.cs +++ b/src/Streamlabs.SocketClient/StreamlabsClient.cs @@ -107,8 +107,8 @@ public StreamlabsClient(ILogger logger, IOptions? OnFollow; public event EventHandler? OnRaid; public event EventHandler? OnRollEndCredits; - public event EventHandler? OnStreamlabelsMessage; - public event EventHandler? OnStreamlabelsUnderlyingMessage; + public event EventHandler? OnStreamlabels; + public event EventHandler? OnStreamlabelsUnderlying; private void OnEventInternal(SocketIOResponse response) => Dispatch(response.ToString()); @@ -194,10 +194,10 @@ private void Dispatch(IStreamlabsEvent streamlabsEvent) OnRollEndCredits?.Invoke(this, rollEndCreditsEvent.Message); break; case StreamlabelsEvent streamlabelsEvent: - OnStreamlabelsMessage?.Invoke(this, streamlabelsEvent.Message); + OnStreamlabels?.Invoke(this, streamlabelsEvent.Message); break; case StreamlabelsUnderlyingEvent streamlabelsUnderlyingEvent: - OnStreamlabelsUnderlyingMessage?.Invoke(this, streamlabelsUnderlyingEvent.Message); + OnStreamlabelsUnderlying?.Invoke(this, streamlabelsUnderlyingEvent.Message); break; case AlertPlayingEvent alertPlayingEvent: switch (alertPlayingEvent.Message) diff --git a/test/Streamlabs.SocketClient.Tests/MessageTypeTests.cs b/test/Streamlabs.SocketClient.Tests/MessageTypeTests.cs index 019407e..f272865 100644 --- a/test/Streamlabs.SocketClient.Tests/MessageTypeTests.cs +++ b/test/Streamlabs.SocketClient.Tests/MessageTypeTests.cs @@ -1,4 +1,8 @@ using System.Text; +using FluentAssertions.Events; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using NSubstitute; using Streamlabs.SocketClient.Events; using Streamlabs.SocketClient.InternalExtensions; @@ -6,27 +10,70 @@ namespace Streamlabs.SocketClient.Tests; public class MessageTypeTests { + public sealed record JsonFile(string FileName, Type ExpectedType, string? EventName = null) + { + public string GetJson() => File.ReadAllText(Path.Combine("./MessageJson", FileName), Encoding.UTF8); + }; + + public static IReadOnlyCollection All { get; } = + new List + { + new("donation.json", typeof(DonationEvent)), + new("bits.json", typeof(BitsEvent)), + new("donationDelete.json", typeof(DonationDeleteEvent)), + new("alertPlaying_subscription.json", typeof(AlertPlayingEvent), "SubscriptionAlertPlaying"), + new("alertPlaying_bits.json", typeof(AlertPlayingEvent), "BitsAlertPlaying"), + new("follow.json", typeof(FollowEvent)), + new("raid.json", typeof(RaidEvent)), + new("rollEndCredits.json", typeof(RollEndCreditsEvent)), + new("streamlabels.json", typeof(StreamlabelsEvent)), + new("streamlabelsUnderlying.json", typeof(StreamlabelsUnderlyingEvent)), + }; + + public static TheoryData GetTheoryData() + { + var data = new TheoryData(); + foreach (var jsonFile in All) + { + data.Add(jsonFile); + } + + return data; + } + [Theory] - [InlineData("donation.json", typeof(DonationEvent))] - [InlineData("bits.json", typeof(BitsEvent))] - [InlineData("donationDelete.json", typeof(DonationDeleteEvent))] - [InlineData("alertPlaying_subscription.json", typeof(AlertPlayingEvent))] - [InlineData("alertPlaying_bits.json", typeof(AlertPlayingEvent))] - [InlineData("follow.json", typeof(FollowEvent))] - [InlineData("raid.json", typeof(RaidEvent))] - [InlineData("rollEndCredits.json", typeof(RollEndCreditsEvent))] - [InlineData("streamlabels.json", typeof(StreamlabelsEvent))] - [InlineData("streamlabelsUnderlying.json", typeof(StreamlabelsUnderlyingEvent))] - public void MessageTypes_CanBeDeserialized(string fileName, Type expectedType) + [MemberData(nameof(GetTheoryData))] + public void MessageTypes_CanBeDeserialized(JsonFile file) { // Arrange - string json = File.ReadAllText(Path.Combine("./MessageJson", fileName), Encoding.UTF8); + string json = file.GetJson(); // Act var messages = json.Deserialize(); // Assert messages.Should().HaveCount(1); - messages.Should().AllBeOfType(expectedType); + messages.Should().AllBeOfType(file.ExpectedType); + } + + [Theory] + [MemberData(nameof(GetTheoryData))] + public void Events_AreRaised_WhenMessageIsDispatched(JsonFile file) + { + // Arrange + var logger = Substitute.For>(); + var options = new StreamlabsOptions(); + var client = new StreamlabsClient(logger, new OptionsWrapper(options)); + using IMonitor sut = client.Monitor(); + string json = file.GetJson(); + + // Act + client.Dispatch(json); + + // Assert + sut.Should().Raise(nameof(client.OnEventRaw)); + sut.Should().Raise(nameof(client.OnEvent)); + string eventName = file.EventName ?? file.ExpectedType.Name.Replace("Event", string.Empty); + sut.Should().Raise($"On{eventName}"); } } diff --git a/test/Streamlabs.SocketClient.Tests/Streamlabs.SocketClient.Tests.csproj b/test/Streamlabs.SocketClient.Tests/Streamlabs.SocketClient.Tests.csproj index f8586e9..1bc1dc1 100644 --- a/test/Streamlabs.SocketClient.Tests/Streamlabs.SocketClient.Tests.csproj +++ b/test/Streamlabs.SocketClient.Tests/Streamlabs.SocketClient.Tests.csproj @@ -16,6 +16,7 @@ + runtime; build; native; contentfiles; analyzers; buildtransitive