307 lines
9.6 KiB
C#
307 lines
9.6 KiB
C#
using System.Text.Json;
|
|
using Newtonsoft.Json;
|
|
using Xunit.Abstractions;
|
|
using JsonSerializer = System.Text.Json.JsonSerializer;
|
|
|
|
namespace Discord.API.Tests;
|
|
using Xunit;
|
|
using Discord.API;
|
|
|
|
public class JsonTests
|
|
{
|
|
private readonly ITestOutputHelper _testOutputHelper;
|
|
|
|
public JsonTests(ITestOutputHelper testOutputHelper)
|
|
{
|
|
_testOutputHelper = testOutputHelper;
|
|
}
|
|
|
|
[Fact]
|
|
public void InvalidSessionDeserialize()
|
|
{
|
|
string src = """
|
|
{
|
|
"op": 9
|
|
}
|
|
""";
|
|
GatewayPacket? gateway_packet = JsonSerializer.Deserialize(src, SourceGenerationContext.Default.GatewayPacket);
|
|
Assert.IsType<InvalidSessionPacket>(gateway_packet);
|
|
}
|
|
|
|
[Fact]
|
|
public void ReconnectPacketDeserialize()
|
|
{
|
|
string src = """
|
|
{
|
|
"op": 7,
|
|
"d": null
|
|
}
|
|
""";
|
|
GatewayPacket? gateway_packet = JsonSerializer.Deserialize(src, SourceGenerationContext.Default.GatewayPacket);
|
|
|
|
Assert.IsType<ReconnectPacket>(gateway_packet);
|
|
}
|
|
|
|
[Fact]
|
|
public void ResumePacketSerialize()
|
|
{
|
|
ResumePacket gateway_packet = new()
|
|
{
|
|
Data = new()
|
|
{
|
|
Token = "tokenlol",
|
|
Sequence = 10,
|
|
SessionId = "sessionlol69"
|
|
}
|
|
};
|
|
|
|
string serialized = JsonSerializer.Serialize(gateway_packet, SourceGenerationContext.Default.GatewayPacket);
|
|
|
|
_testOutputHelper.WriteLine($"Serilazed Resume packet: {serialized}");
|
|
|
|
//TODO: Verify the string
|
|
}
|
|
|
|
[Fact]
|
|
public void HelloPacketDeserialize()
|
|
{
|
|
string src = """
|
|
{
|
|
"op": 10,
|
|
"d": {
|
|
"heartbeat_interval": 45000
|
|
}
|
|
}
|
|
""";
|
|
|
|
GatewayPacket? gateway_packet = JsonSerializer.Deserialize(src, SourceGenerationContext.Default.GatewayPacket);
|
|
Assert.IsType<HelloPacket>(gateway_packet);
|
|
Assert.True(gateway_packet is HelloPacket
|
|
{
|
|
Op: GatewayPacket.Opcode.Hello,
|
|
Data.HeartbeatInterval: 45000
|
|
});
|
|
}
|
|
|
|
[Fact]
|
|
public void HeartbeatAckDeserialize()
|
|
{
|
|
string src = """
|
|
{"op":11}
|
|
""";
|
|
|
|
GatewayPacket? gateway_packet = JsonSerializer.Deserialize(src, SourceGenerationContext.Default.GatewayPacket);
|
|
|
|
Assert.IsType<HeartbeatAckPacket>(gateway_packet);
|
|
Assert.Equal(GatewayPacket.Opcode.HeartbeatAck, gateway_packet.Op);
|
|
}
|
|
|
|
[Fact]
|
|
public void HeartbeatPacketSerialize()
|
|
{
|
|
HeartbeatPacket heartbeat_packet = new()
|
|
{
|
|
Sequence = 69
|
|
};
|
|
string serialized = JsonSerializer.Serialize(heartbeat_packet, SourceGenerationContext.Default.GatewayPacket);
|
|
|
|
JsonDocument json_doc = JsonDocument.Parse(serialized);
|
|
Assert.True(json_doc.RootElement.TryGetProperty("op", out var opcode) &&
|
|
opcode.ValueKind == JsonValueKind.Number &&
|
|
opcode.TryGetInt32(out int op) && op == (int)GatewayPacket.Opcode.Heartbeat);
|
|
|
|
Assert.True(json_doc.RootElement.TryGetProperty("d", out var sequence) &&
|
|
sequence.ValueKind == JsonValueKind.Number &&
|
|
sequence.TryGetUInt64(out ulong seq) && seq == 69);
|
|
}
|
|
|
|
[Fact]
|
|
public void IdentifyPacketSerialize()
|
|
{
|
|
IdentifyPacket identify_packet = new()
|
|
{
|
|
Data = new()
|
|
{
|
|
Token = "token_lol",
|
|
Intents = 6969,
|
|
Shard = [1, 2],
|
|
LargeThreshold = 42
|
|
}
|
|
};
|
|
|
|
string serialized =
|
|
JsonSerializer.Serialize(identify_packet, SourceGenerationContext.Default.GatewayPacket);
|
|
|
|
_testOutputHelper.WriteLine($"Serialized Identify packet: {serialized}");
|
|
|
|
//TODO: Test the output string
|
|
}
|
|
|
|
[Fact]
|
|
public void ReadyPacketDeserialize()
|
|
{
|
|
const string src = """
|
|
{
|
|
"op":0,
|
|
"t":"READY",
|
|
"s":1,
|
|
"d":{
|
|
"v":10,
|
|
"user":{
|
|
"id":"1234",
|
|
"username":"abrakadabra",
|
|
"discriminator":"1111",
|
|
"global_name":"glblname"
|
|
},
|
|
"guilds":[
|
|
{
|
|
"id":"5678",
|
|
"unavailable":true
|
|
}
|
|
],
|
|
"session_id":"abcd",
|
|
"resume_gateway_url":"dfgh",
|
|
"application":{
|
|
"id":"3333",
|
|
"flags":5555
|
|
}
|
|
}
|
|
}
|
|
""";
|
|
GatewayPacket? packet =
|
|
JsonSerializer.Deserialize<GatewayPacket>(src, SourceGenerationContext.Default.GatewayPacket);
|
|
|
|
Assert.NotNull(packet);
|
|
Assert.IsType<ReadyPacket>(packet);
|
|
|
|
Assert.True(packet is ReadyPacket
|
|
{
|
|
Op: GatewayPacket.Opcode.Dispatch,
|
|
Event: "READY",
|
|
Sequence: 1,
|
|
Data:
|
|
{
|
|
User:
|
|
{
|
|
Id:1234,
|
|
Username: "abrakadabra",
|
|
Discriminator: "1111",
|
|
GlobalName: "glblname"
|
|
},
|
|
Version: 10,
|
|
SessionId: "abcd",
|
|
ResumeGatewayUrl: "dfgh",
|
|
Guilds:[
|
|
{
|
|
Id: 5678,
|
|
Unavailable: true
|
|
}
|
|
],
|
|
Application:
|
|
{
|
|
Id: 3333,
|
|
Flags: 5555
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
[Fact]
|
|
public void ChannelCreateDeserialize()
|
|
{
|
|
string src = """
|
|
{
|
|
"op":0,
|
|
"t":"CHANNEL_CREATE",
|
|
"s":1,
|
|
"d":{
|
|
"id": "922243411795390570",
|
|
"type": 2,
|
|
"guild_id": "5678",
|
|
"position": 3,
|
|
"name": "voice csennel",
|
|
"topic": "A very interesting topic",
|
|
"nsfw": true,
|
|
"last_message_id":"6969",
|
|
"bitrate":420,
|
|
"parent_id": "5555"
|
|
}
|
|
}
|
|
""";
|
|
|
|
var gateway_packet =
|
|
JsonSerializer.Deserialize(src, SourceGenerationContext.Default.GatewayPacket);
|
|
|
|
Assert.IsType<ChannelCreatePacket>(gateway_packet);
|
|
|
|
Assert.True(gateway_packet is ChannelCreatePacket
|
|
{
|
|
Op: GatewayPacket.Opcode.Dispatch,
|
|
Event: "CHANNEL_CREATE",
|
|
Sequence: 1,
|
|
Data:
|
|
{
|
|
Id: 922243411795390570,
|
|
Name: "voice csennel",
|
|
GuildId: 5678,
|
|
Type: 2,
|
|
Position: 3,
|
|
Topic: "A very interesting topic",
|
|
Nsfw: true,
|
|
Bitrate: 420,
|
|
ParentId: 5555,
|
|
LastMessageId: 6969
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
[Fact]
|
|
public void ChannelUpdateDeserialize()
|
|
{
|
|
string src = """
|
|
{
|
|
"op":0,
|
|
"t":"CHANNEL_UPDATE",
|
|
"s":1,
|
|
"d":{
|
|
"id": "922243411795390570",
|
|
"type": 2,
|
|
"guild_id": "5678",
|
|
"position": 3,
|
|
"name": "voice csennel",
|
|
"topic": "A very interesting topic",
|
|
"nsfw": true,
|
|
"last_message_id":"6969",
|
|
"bitrate":420,
|
|
"parent_id": "5555"
|
|
}
|
|
}
|
|
""";
|
|
|
|
var gateway_packet =
|
|
JsonSerializer.Deserialize(src, SourceGenerationContext.Default.GatewayPacket);
|
|
|
|
Assert.IsType<ChannelUpdatePacket>(gateway_packet);
|
|
|
|
Assert.True(gateway_packet is ChannelUpdatePacket
|
|
{
|
|
Op: GatewayPacket.Opcode.Dispatch,
|
|
Event: "CHANNEL_UPDATE",
|
|
Sequence: 1,
|
|
Data:
|
|
{
|
|
Id: 922243411795390570,
|
|
Name: "voice csennel",
|
|
GuildId: 5678,
|
|
Type: 2,
|
|
Position: 3,
|
|
Topic: "A very interesting topic",
|
|
Nsfw: true,
|
|
Bitrate: 420,
|
|
ParentId: 5555,
|
|
LastMessageId: 6969
|
|
}
|
|
});
|
|
}
|
|
} |