From 86b317ab4e2297b880251ee2feda716a1553a4a5 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Fri, 23 May 2025 08:59:22 -0500 Subject: [PATCH] tests: sort out gateway client testing --- .../Unit/DiscordGatewayClientTests.cs | 66 +++++++++++++++---- .../Unit/HelloDiscordEventTests.cs | 2 +- .../Discord/Gateway/DiscordGatewayClient.cs | 10 +-- .../Gateway/Events/HelloDiscordEvent.cs | 5 ++ 4 files changed, 60 insertions(+), 23 deletions(-) diff --git a/src/StevesBot.Worker.Tests/Unit/DiscordGatewayClientTests.cs b/src/StevesBot.Worker.Tests/Unit/DiscordGatewayClientTests.cs index 6dc46c6..3206121 100644 --- a/src/StevesBot.Worker.Tests/Unit/DiscordGatewayClientTests.cs +++ b/src/StevesBot.Worker.Tests/Unit/DiscordGatewayClientTests.cs @@ -125,6 +125,15 @@ public sealed class DiscordGatewayClientTests : IDisposable var mockWebSocket = new Mock(); + mockWebSocket + .SetupSequence(static x => x.State) + .Returns(WebSocketState.Closed) + .Returns(WebSocketState.Open); + + mockWebSocket + .Setup(static x => x.ConnectAsync(It.IsAny(), It.IsAny())) + .Returns(Task.CompletedTask); + _mockWebSocketFactory .Setup(static x => x.Create()) .Returns(mockWebSocket.Object); @@ -152,17 +161,26 @@ public sealed class DiscordGatewayClientTests : IDisposable var mockWebSocket = new Mock(); + var socketState = WebSocketState.Closed; + + mockWebSocket + .Setup(static x => x.State) + .Returns(() => socketState); + mockWebSocket .Setup(static x => x.ConnectAsync(It.IsAny(), It.IsAny())) + .Callback(() => socketState = WebSocketState.Open) .Returns(Task.CompletedTask); - mockWebSocket - .SetupSequence(static x => x.State) - .Returns(WebSocketState.Closed) - .Returns(WebSocketState.Open); - var messagesToReceive = new Queue<(WebSocketReceiveResult, byte[])>(); - var helloEvent = new HelloDiscordEvent(); + var heartbeatInterval = 100; + var helloEvent = new HelloDiscordEvent() + { + Data = new() + { + HeartbeatInterval = heartbeatInterval, + } + }; var payload = CreateEventPayload(helloEvent); var result = new WebSocketReceiveResult(payload.Bytes.Length, WebSocketMessageType.Text, true); messagesToReceive.Enqueue((result, payload.Bytes)); @@ -176,13 +194,12 @@ public sealed class DiscordGatewayClientTests : IDisposable using var cts = new CancellationTokenSource(); await _discordGatewayClient.ConnectAsync(cts.Token); - await Task.Delay(100); + await Task.Delay((int)(heartbeatInterval * 1.5)); await cts.CancelAsync(); var heartbeatEvent = new HeartbeatDiscordEvent(helloEvent.Sequence); var heartbeatPayload = CreateEventPayload(heartbeatEvent); - // it should send a heartbeat mockWebSocket .Verify( x => x.SendAsync( @@ -194,12 +211,33 @@ public sealed class DiscordGatewayClientTests : IDisposable Times.Once ); - // it should send a identify event - // mockWebSocket - // .Verify( - // x => x.SendAsync(), - // Times.Once - // ); + var identifyEvent = new IdentifyDiscordEvent( + _options.AppToken, + _options.Intents, + new UpdatePresenceData + { + Status = PresenceStatus.Online, + Activities = [ + new() + { + Name = "Helping Stevan", + State = "Helping Stevan" + } + ], + } + ); + var identifyPayload = CreateEventPayload(identifyEvent); + + mockWebSocket + .Verify( + x => x.SendAsync( + It.Is>(b => identifyPayload.Bytes.SequenceEqual(b.Array!)), + It.Is(m => m == WebSocketMessageType.Text), + true, + It.IsAny() + ), + Times.Once + ); } private static void SetupReceiveMessageSequence( diff --git a/src/StevesBot.Worker.Tests/Unit/HelloDiscordEventTests.cs b/src/StevesBot.Worker.Tests/Unit/HelloDiscordEventTests.cs index eb8f2be..fc0f554 100644 --- a/src/StevesBot.Worker.Tests/Unit/HelloDiscordEventTests.cs +++ b/src/StevesBot.Worker.Tests/Unit/HelloDiscordEventTests.cs @@ -8,7 +8,7 @@ public class HelloDiscordEventTests var helloEvent = new HelloDiscordEvent(); var helloData = new HelloData(); - helloEvent.OpCode.Should().Be(0); + helloEvent.OpCode.Should().Be(DiscordOpCodes.Hello); helloEvent.Sequence.Should().BeNull(); helloEvent.Type.Should().BeNull(); helloEvent.Data.Should().BeEquivalentTo(helloData); diff --git a/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs b/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs index a55bfe9..15d4a1e 100644 --- a/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs +++ b/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs @@ -420,7 +420,7 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient { var identify = new IdentifyDiscordEvent( _options.AppToken, - DiscordIntents.All, + _options.Intents, new UpdatePresenceData { Status = PresenceStatus.Online, @@ -430,7 +430,7 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient Name = "Helping Stevan", State = "Helping Stevan" } - ], + ], } ); @@ -716,12 +716,6 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient public void Dispose() { - _heartbeatCts?.Cancel(); - _linkedHeartbeatCts?.Cancel(); - - _receiveMessageCts?.Cancel(); - _linkedReceiveMessageCts?.Cancel(); - _heartbeatCts?.Dispose(); _linkedHeartbeatCts?.Dispose(); diff --git a/src/StevesBot.Worker/Discord/Gateway/Events/HelloDiscordEvent.cs b/src/StevesBot.Worker/Discord/Gateway/Events/HelloDiscordEvent.cs index ab2c0e7..9396211 100644 --- a/src/StevesBot.Worker/Discord/Gateway/Events/HelloDiscordEvent.cs +++ b/src/StevesBot.Worker/Discord/Gateway/Events/HelloDiscordEvent.cs @@ -4,4 +4,9 @@ internal sealed record HelloDiscordEvent : DiscordEvent { [JsonPropertyName("d")] public new HelloData Data { get; init; } = new HelloData(); + + public HelloDiscordEvent() + { + OpCode = DiscordOpCodes.Hello; + } }