diff --git a/src/StevesBot.Worker.Tests/Unit/DiscordGatewayClientTests.cs b/src/StevesBot.Worker.Tests/Unit/DiscordGatewayClientTests.cs index 32906f3..6dc46c6 100644 --- a/src/StevesBot.Worker.Tests/Unit/DiscordGatewayClientTests.cs +++ b/src/StevesBot.Worker.Tests/Unit/DiscordGatewayClientTests.cs @@ -138,6 +138,70 @@ public sealed class DiscordGatewayClientTests : IDisposable ); } + [Fact] + public async Task ConnectAsync_WhenConnectedAndHelloEventIsReceived_ItShouldStartSendingHeartbeatsAndIdentify() + { + // TODO: This does not work! You need + // to figure it out! When this runs + // concurrently with test above that + // test starts to fail + + _mockDiscordRestClient + .Setup(static x => x.GetGatewayUrlAsync(It.IsAny())) + .ReturnsAsync("wss://gateway.discord.gg"); + + var mockWebSocket = new Mock(); + + mockWebSocket + .Setup(static x => x.ConnectAsync(It.IsAny(), It.IsAny())) + .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 payload = CreateEventPayload(helloEvent); + var result = new WebSocketReceiveResult(payload.Bytes.Length, WebSocketMessageType.Text, true); + messagesToReceive.Enqueue((result, payload.Bytes)); + + SetupReceiveMessageSequence(mockWebSocket, messagesToReceive); + + _mockWebSocketFactory + .Setup(static x => x.Create()) + .Returns(mockWebSocket.Object); + + using var cts = new CancellationTokenSource(); + + await _discordGatewayClient.ConnectAsync(cts.Token); + await Task.Delay(100); + await cts.CancelAsync(); + + var heartbeatEvent = new HeartbeatDiscordEvent(helloEvent.Sequence); + var heartbeatPayload = CreateEventPayload(heartbeatEvent); + + // it should send a heartbeat + mockWebSocket + .Verify( + x => x.SendAsync( + It.Is>(b => heartbeatPayload.Bytes.SequenceEqual(b.Array!)), + It.Is(m => m == WebSocketMessageType.Text), + true, + It.IsAny() + ), + Times.Once + ); + + // it should send a identify event + // mockWebSocket + // .Verify( + // x => x.SendAsync(), + // Times.Once + // ); + } + private static void SetupReceiveMessageSequence( Mock mockWebSocket, Queue<(WebSocketReceiveResult, byte[])> messageQueue diff --git a/src/StevesBot.Worker.Tests/Unit/WelcomeMessageHandlerTests.cs b/src/StevesBot.Worker.Tests/Unit/WelcomeMessageHandlerTests.cs index 45a72bc..3e69bb2 100644 --- a/src/StevesBot.Worker.Tests/Unit/WelcomeMessageHandlerTests.cs +++ b/src/StevesBot.Worker.Tests/Unit/WelcomeMessageHandlerTests.cs @@ -28,4 +28,55 @@ public class WelcomeMessageHandlerTests Times.Never ); } + + [Fact] + public async Task HandleAsync_WhenMessageCreateEventIsNotAUserJoinMessage_ItShouldNotCreateMessage() + { + var @event = new MessageCreateDiscordEvent() + { + Data = new() + { + Type = -1, + }, + }; + + await WelcomeMessageHandler.HandleAsync(@event, _serviceProvider); + + _mockDiscordRestClient + .Verify( + static c => c.CreateMessageAsync(It.IsAny(), It.IsAny(), It.IsAny()), + Times.Never + ); + } + + [Fact] + public async Task HandleAsync_WhenUserJoinMessageCreateEventReceived_ItShouldCreateWelcomeMessage() + { + _mockDiscordRestClient + .Setup(static c => c.CreateMessageAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new DiscordMessage()); + + var @event = new MessageCreateDiscordEvent() + { + Data = new() + { + Type = DiscordMessageTypes.UserJoin, + Id = Guid.NewGuid().ToString(), + ChannelId = Guid.NewGuid().ToString(), + GuildId = Guid.NewGuid().ToString(), + Author = new() + { + Id = Guid.NewGuid().ToString(), + } + } + }; + + await WelcomeMessageHandler.HandleAsync(@event, _serviceProvider); + + _mockDiscordRestClient + .Verify( + static c => c.CreateMessageAsync(It.IsAny(), It.IsAny(), It.IsAny()), + Times.Once + ); + } } \ No newline at end of file diff --git a/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs b/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs index 71c3c66..a55bfe9 100644 --- a/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs +++ b/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs @@ -218,7 +218,6 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient private async Task HandleEventAsync(DiscordEvent e, CancellationToken cancellationToken) { - // TODO: Handle other events await SetSequenceAsync(e.Sequence, cancellationToken); switch (e)