tests: sort out gateway client testing
This commit is contained in:
@@ -125,6 +125,15 @@ public sealed class DiscordGatewayClientTests : IDisposable
|
|||||||
|
|
||||||
var mockWebSocket = new Mock<IWebSocket>();
|
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
|
_mockWebSocketFactory
|
||||||
.Setup(static x => x.Create())
|
.Setup(static x => x.Create())
|
||||||
.Returns(mockWebSocket.Object);
|
.Returns(mockWebSocket.Object);
|
||||||
@@ -152,17 +161,26 @@ public sealed class DiscordGatewayClientTests : IDisposable
|
|||||||
|
|
||||||
var mockWebSocket = new Mock<IWebSocket>();
|
var mockWebSocket = new Mock<IWebSocket>();
|
||||||
|
|
||||||
|
var socketState = WebSocketState.Closed;
|
||||||
|
|
||||||
|
mockWebSocket
|
||||||
|
.Setup(static x => x.State)
|
||||||
|
.Returns(() => socketState);
|
||||||
|
|
||||||
mockWebSocket
|
mockWebSocket
|
||||||
.Setup(static x => x.ConnectAsync(It.IsAny<Uri>(), It.IsAny<CancellationToken>()))
|
.Setup(static x => x.ConnectAsync(It.IsAny<Uri>(), It.IsAny<CancellationToken>()))
|
||||||
|
.Callback(() => socketState = WebSocketState.Open)
|
||||||
.Returns(Task.CompletedTask);
|
.Returns(Task.CompletedTask);
|
||||||
|
|
||||||
mockWebSocket
|
|
||||||
.SetupSequence(static x => x.State)
|
|
||||||
.Returns(WebSocketState.Closed)
|
|
||||||
.Returns(WebSocketState.Open);
|
|
||||||
|
|
||||||
var messagesToReceive = new Queue<(WebSocketReceiveResult, byte[])>();
|
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 payload = CreateEventPayload(helloEvent);
|
||||||
var result = new WebSocketReceiveResult(payload.Bytes.Length, WebSocketMessageType.Text, true);
|
var result = new WebSocketReceiveResult(payload.Bytes.Length, WebSocketMessageType.Text, true);
|
||||||
messagesToReceive.Enqueue((result, payload.Bytes));
|
messagesToReceive.Enqueue((result, payload.Bytes));
|
||||||
@@ -176,13 +194,12 @@ public sealed class DiscordGatewayClientTests : IDisposable
|
|||||||
using var cts = new CancellationTokenSource();
|
using var cts = new CancellationTokenSource();
|
||||||
|
|
||||||
await _discordGatewayClient.ConnectAsync(cts.Token);
|
await _discordGatewayClient.ConnectAsync(cts.Token);
|
||||||
await Task.Delay(100);
|
await Task.Delay((int)(heartbeatInterval * 1.5));
|
||||||
await cts.CancelAsync();
|
await cts.CancelAsync();
|
||||||
|
|
||||||
var heartbeatEvent = new HeartbeatDiscordEvent(helloEvent.Sequence);
|
var heartbeatEvent = new HeartbeatDiscordEvent(helloEvent.Sequence);
|
||||||
var heartbeatPayload = CreateEventPayload(heartbeatEvent);
|
var heartbeatPayload = CreateEventPayload(heartbeatEvent);
|
||||||
|
|
||||||
// it should send a heartbeat
|
|
||||||
mockWebSocket
|
mockWebSocket
|
||||||
.Verify(
|
.Verify(
|
||||||
x => x.SendAsync(
|
x => x.SendAsync(
|
||||||
@@ -194,12 +211,33 @@ public sealed class DiscordGatewayClientTests : IDisposable
|
|||||||
Times.Once
|
Times.Once
|
||||||
);
|
);
|
||||||
|
|
||||||
// it should send a identify event
|
var identifyEvent = new IdentifyDiscordEvent(
|
||||||
// mockWebSocket
|
_options.AppToken,
|
||||||
// .Verify(
|
_options.Intents,
|
||||||
// x => x.SendAsync(),
|
new UpdatePresenceData
|
||||||
// Times.Once
|
{
|
||||||
// );
|
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(
|
private static void SetupReceiveMessageSequence(
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ public class HelloDiscordEventTests
|
|||||||
var helloEvent = new HelloDiscordEvent();
|
var helloEvent = new HelloDiscordEvent();
|
||||||
var helloData = new HelloData();
|
var helloData = new HelloData();
|
||||||
|
|
||||||
helloEvent.OpCode.Should().Be(0);
|
helloEvent.OpCode.Should().Be(DiscordOpCodes.Hello);
|
||||||
helloEvent.Sequence.Should().BeNull();
|
helloEvent.Sequence.Should().BeNull();
|
||||||
helloEvent.Type.Should().BeNull();
|
helloEvent.Type.Should().BeNull();
|
||||||
helloEvent.Data.Should().BeEquivalentTo(helloData);
|
helloEvent.Data.Should().BeEquivalentTo(helloData);
|
||||||
|
|||||||
@@ -420,7 +420,7 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient
|
|||||||
{
|
{
|
||||||
var identify = new IdentifyDiscordEvent(
|
var identify = new IdentifyDiscordEvent(
|
||||||
_options.AppToken,
|
_options.AppToken,
|
||||||
DiscordIntents.All,
|
_options.Intents,
|
||||||
new UpdatePresenceData
|
new UpdatePresenceData
|
||||||
{
|
{
|
||||||
Status = PresenceStatus.Online,
|
Status = PresenceStatus.Online,
|
||||||
@@ -430,7 +430,7 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient
|
|||||||
Name = "Helping Stevan",
|
Name = "Helping Stevan",
|
||||||
State = "Helping Stevan"
|
State = "Helping Stevan"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -716,12 +716,6 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient
|
|||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
_heartbeatCts?.Cancel();
|
|
||||||
_linkedHeartbeatCts?.Cancel();
|
|
||||||
|
|
||||||
_receiveMessageCts?.Cancel();
|
|
||||||
_linkedReceiveMessageCts?.Cancel();
|
|
||||||
|
|
||||||
_heartbeatCts?.Dispose();
|
_heartbeatCts?.Dispose();
|
||||||
_linkedHeartbeatCts?.Dispose();
|
_linkedHeartbeatCts?.Dispose();
|
||||||
|
|
||||||
|
|||||||
@@ -4,4 +4,9 @@ internal sealed record HelloDiscordEvent : DiscordEvent
|
|||||||
{
|
{
|
||||||
[JsonPropertyName("d")]
|
[JsonPropertyName("d")]
|
||||||
public new HelloData Data { get; init; } = new HelloData();
|
public new HelloData Data { get; init; } = new HelloData();
|
||||||
|
|
||||||
|
public HelloDiscordEvent()
|
||||||
|
{
|
||||||
|
OpCode = DiscordOpCodes.Hello;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user