tests: oh we love our tests

This commit is contained in:
Stevan Freeborn
2025-05-22 23:00:42 -05:00
parent ceb693acbc
commit 6c25d25ea1
3 changed files with 115 additions and 1 deletions
@@ -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<CancellationToken>()))
.ReturnsAsync("wss://gateway.discord.gg");
var mockWebSocket = new Mock<IWebSocket>();
mockWebSocket
.Setup(static x => x.ConnectAsync(It.IsAny<Uri>(), It.IsAny<CancellationToken>()))
.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<ArraySegment<byte>>(b => heartbeatPayload.Bytes.SequenceEqual(b.Array!)),
It.Is<WebSocketMessageType>(m => m == WebSocketMessageType.Text),
true,
It.IsAny<CancellationToken>()
),
Times.Once
);
// it should send a identify event
// mockWebSocket
// .Verify(
// x => x.SendAsync(),
// Times.Once
// );
}
private static void SetupReceiveMessageSequence(
Mock<IWebSocket> mockWebSocket,
Queue<(WebSocketReceiveResult, byte[])> messageQueue
@@ -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<string>(), It.IsAny<CreateMessageRequest>(), It.IsAny<CancellationToken>()),
Times.Never
);
}
[Fact]
public async Task HandleAsync_WhenUserJoinMessageCreateEventReceived_ItShouldCreateWelcomeMessage()
{
_mockDiscordRestClient
.Setup(static c => c.CreateMessageAsync(It.IsAny<string>(), It.IsAny<CreateMessageRequest>(), It.IsAny<CancellationToken>()))
.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<string>(), It.IsAny<CreateMessageRequest>(), It.IsAny<CancellationToken>()),
Times.Once
);
}
}
@@ -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)