519 lines
20 KiB
C#
519 lines
20 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 GuildUpdateDeserialize()
|
|
{
|
|
string src = """
|
|
{
|
|
"op": 0,
|
|
"t": "GUILD_UPDATE",
|
|
"s": 3,
|
|
"d":{
|
|
"id": "197038439483310086",
|
|
"name": "Discord Testers",
|
|
"icon": "f64c482b807da4f539cff778d174971c",
|
|
"description": "The official place to report Discord Bugs!",
|
|
"splash": null,
|
|
"discovery_splash": null,
|
|
"features": [
|
|
"ANIMATED_ICON",
|
|
"VERIFIED",
|
|
"NEWS",
|
|
"VANITY_URL",
|
|
"DISCOVERABLE",
|
|
"MORE_EMOJI",
|
|
"INVITE_SPLASH",
|
|
"BANNER",
|
|
"COMMUNITY"
|
|
],
|
|
"emojis": [],
|
|
"banner": "9b6439a7de04f1d26af92f84ac9e1e4a",
|
|
"owner_id": "73193882359173120",
|
|
"application_id": null,
|
|
"region": null,
|
|
"afk_channel_id": null,
|
|
"afk_timeout": 300,
|
|
"system_channel_id": null,
|
|
"widget_enabled": true,
|
|
"widget_channel_id": null,
|
|
"verification_level": 3,
|
|
"roles": [],
|
|
"default_message_notifications": 1,
|
|
"mfa_level": 1,
|
|
"explicit_content_filter": 2,
|
|
"max_presences": 40000,
|
|
"max_members": 250000,
|
|
"vanity_url_code": "discord-testers",
|
|
"premium_tier": 3,
|
|
"premium_subscription_count": 33,
|
|
"system_channel_flags": 0,
|
|
"preferred_locale": "en-US",
|
|
"rules_channel_id": "441688182833020939",
|
|
"public_updates_channel_id": "281283303326089216",
|
|
"safety_alerts_channel_id": "281283303326089216",
|
|
"nsfw_level": 0
|
|
}
|
|
}
|
|
""";
|
|
|
|
GatewayPacket? gateway_packet = JsonSerializer.Deserialize(src, SourceGenerationContext.Default.GatewayPacket);
|
|
Assert.IsType<GuildUpdatePacket>(gateway_packet);
|
|
|
|
}
|
|
|
|
[Fact]
|
|
public void GuildCreateDeserialize()
|
|
{
|
|
string src = """
|
|
{
|
|
"op": 0,
|
|
"t": "GUILD_CREATE",
|
|
"s": 3,
|
|
"d":{
|
|
"id": "197038439483310086",
|
|
"name": "Discord Testers",
|
|
"icon": "f64c482b807da4f539cff778d174971c",
|
|
"description": "The official place to report Discord Bugs!",
|
|
"splash": null,
|
|
"discovery_splash": null,
|
|
"features": [
|
|
"ANIMATED_ICON",
|
|
"VERIFIED",
|
|
"NEWS",
|
|
"VANITY_URL",
|
|
"DISCOVERABLE",
|
|
"MORE_EMOJI",
|
|
"INVITE_SPLASH",
|
|
"BANNER",
|
|
"COMMUNITY"
|
|
],
|
|
"emojis": [],
|
|
"banner": "9b6439a7de04f1d26af92f84ac9e1e4a",
|
|
"owner_id": "73193882359173120",
|
|
"application_id": null,
|
|
"region": null,
|
|
"afk_channel_id": null,
|
|
"afk_timeout": 300,
|
|
"system_channel_id": null,
|
|
"widget_enabled": true,
|
|
"widget_channel_id": null,
|
|
"verification_level": 3,
|
|
"roles": [],
|
|
"default_message_notifications": 1,
|
|
"mfa_level": 1,
|
|
"explicit_content_filter": 2,
|
|
"max_presences": 40000,
|
|
"max_members": 250000,
|
|
"vanity_url_code": "discord-testers",
|
|
"premium_tier": 3,
|
|
"premium_subscription_count": 33,
|
|
"system_channel_flags": 0,
|
|
"preferred_locale": "en-US",
|
|
"rules_channel_id": "441688182833020939",
|
|
"public_updates_channel_id": "281283303326089216",
|
|
"safety_alerts_channel_id": "281283303326089216",
|
|
"joined_at": "2024-06-27T11:59:36Z",
|
|
"large": false,
|
|
"nsfw_level": 0,
|
|
"member_count": 69,
|
|
"voice_states": [
|
|
{
|
|
"channel_id": "157733188964188161",
|
|
"user_id": "80351110224678912",
|
|
"session_id": "90326bd25d71d39b9ef95b299e3872ff",
|
|
"deaf": false,
|
|
"mute": false,
|
|
"self_deaf": false,
|
|
"self_mute": true,
|
|
"suppress": false,
|
|
"request_to_speak_timestamp": "2021-03-31T18:45:31.297561+00:00"
|
|
}
|
|
],
|
|
"members":[
|
|
{
|
|
"user": {
|
|
"id": "80351110224678912",
|
|
"username": "Nelly",
|
|
"global_name": null,
|
|
"discriminator": "1337",
|
|
"avatar": "8342729096ea3675442027381ff50dfe",
|
|
"verified": true,
|
|
"email": "nelly@discord.com",
|
|
"flags": 64,
|
|
"banner": "06c16474723fe537c283b8efa61a30c8",
|
|
"accent_color": 16711680,
|
|
"premium_type": 1,
|
|
"public_flags": 64,
|
|
"avatar_decoration_data": {
|
|
"sku_id": "1144058844004233369",
|
|
"asset": "a_fed43ab12698df65902ba06727e20c0e"
|
|
}
|
|
},
|
|
"nick": "NOT API SUPPORT",
|
|
"avatar": null,
|
|
"roles": [],
|
|
"joined_at": "2015-04-26T06:26:56.936000+00:00",
|
|
"deaf": false,
|
|
"mute": false
|
|
}
|
|
],
|
|
"channels":[
|
|
{
|
|
"id": "41771983423143937",
|
|
"guild_id": "197038439483310086",
|
|
"name": "general",
|
|
"type": 0,
|
|
"position": 6,
|
|
"permission_overwrites": [],
|
|
"rate_limit_per_user": 2,
|
|
"nsfw": true,
|
|
"topic": "24/7 chat about how to gank Mike #2",
|
|
"last_message_id": "155117677105512449",
|
|
"parent_id": "399942396007890945",
|
|
"default_auto_archive_duration": 60
|
|
}
|
|
]
|
|
}
|
|
}
|
|
""";
|
|
|
|
GatewayPacket? gateway_packet = JsonSerializer.Deserialize(src, SourceGenerationContext.Default.GatewayPacket);
|
|
Assert.IsType<GuildCreatePacket>(gateway_packet);
|
|
Assert.IsType<GuildCreateData>((gateway_packet as GuildCreatePacket)!.Data);
|
|
|
|
}
|
|
|
|
[Fact]
|
|
public void UnavailableGuildCreateDeserialize()
|
|
{
|
|
string src = """
|
|
{
|
|
"op": 0,
|
|
"t": "GUILD_CREATE",
|
|
"s": 3,
|
|
"d":{
|
|
"id": "922243411795390566",
|
|
"unavailable": true
|
|
}
|
|
}
|
|
""";
|
|
|
|
GatewayPacket? packet =
|
|
JsonSerializer.Deserialize<GatewayPacket>(src, SourceGenerationContext.Default.GatewayPacket);
|
|
|
|
Assert.IsType<GuildCreatePacket>(packet);
|
|
Assert.IsType<UnavailableGuildData>(((GuildCreatePacket)packet).Data);
|
|
Assert.True(packet is GuildCreatePacket
|
|
{
|
|
Data: UnavailableGuildData
|
|
{
|
|
Id: 922243411795390566,
|
|
Unavailable: true
|
|
}
|
|
});
|
|
}
|
|
|
|
[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,
|
|
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
|
|
}
|
|
});
|
|
}
|
|
} |