tests: sort out gateway client testing

This commit is contained in:
Stevan Freeborn
2025-05-23 08:59:22 -05:00
parent 6c25d25ea1
commit 86b317ab4e
4 changed files with 60 additions and 23 deletions
@@ -125,6 +125,15 @@ public sealed class DiscordGatewayClientTests : IDisposable
var mockWebSocket = new Mock<IWebSocket>();
mockWebSocket
.SetupSequence(static x => x.State)
.Returns(WebSocketState.Closed)
.Returns(WebSocketState.Open);
mockWebSocket
.Setup(static x => x.ConnectAsync(It.IsAny<Uri>(), It.IsAny<CancellationToken>()))
.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<IWebSocket>();
var socketState = WebSocketState.Closed;
mockWebSocket
.Setup(static x => x.State)
.Returns(() => socketState);
mockWebSocket
.Setup(static x => x.ConnectAsync(It.IsAny<Uri>(), It.IsAny<CancellationToken>()))
.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<ArraySegment<byte>>(b => identifyPayload.Bytes.SequenceEqual(b.Array!)),
It.Is<WebSocketMessageType>(m => m == WebSocketMessageType.Text),
true,
It.IsAny<CancellationToken>()
),
Times.Once
);
}
private static void SetupReceiveMessageSequence(
@@ -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);
@@ -420,7 +420,7 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient
{
var identify = new IdentifyDiscordEvent(
_options.AppToken,
DiscordIntents.All,
_options.Intents,
new UpdatePresenceData
{
Status = PresenceStatus.Online,
@@ -716,12 +716,6 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient
public void Dispose()
{
_heartbeatCts?.Cancel();
_linkedHeartbeatCts?.Cancel();
_receiveMessageCts?.Cancel();
_linkedReceiveMessageCts?.Cancel();
_heartbeatCts?.Dispose();
_linkedHeartbeatCts?.Dispose();
@@ -4,4 +4,9 @@ internal sealed record HelloDiscordEvent : DiscordEvent
{
[JsonPropertyName("d")]
public new HelloData Data { get; init; } = new HelloData();
public HelloDiscordEvent()
{
OpCode = DiscordOpCodes.Hello;
}
}