mod common;
use common::*;
use disruption_types::gateway::Event;
use disruption_types::opcodes::GatewayOpcode;
use disruption_types::payloads::{HelloPayloadData, Payload, ReadyPayloadData};
#[test]
fn test_hello_payload_deserialization() {
let json = load_fixture("gateway", "hello.json");
let payload: Payload =
serde_json::from_str(&json).expect("Failed to deserialize Hello payload");
assert_eq!(payload.op, GatewayOpcode::Hello);
assert!(payload.d.is_some());
let hello_data: HelloPayloadData =
serde_json::from_value(payload.d.unwrap()).expect("Failed to parse Hello data");
assert_eq!(hello_data.heartbeat_interval, 45000);
}
#[test]
fn test_ready_payload_deserialization() {
let json = load_fixture("gateway", "ready.json");
let payload: Payload =
serde_json::from_str(&json).expect("Failed to deserialize Ready payload");
assert_eq!(payload.op, GatewayOpcode::Dispatch);
assert_eq!(payload.t, Some("READY".to_string()));
assert_eq!(payload.s, Some(1));
assert!(payload.d.is_some());
let ready_data: ReadyPayloadData =
serde_json::from_value(payload.d.unwrap()).expect("Failed to parse Ready data");
assert_eq!(ready_data.v, 10);
assert_eq!(ready_data.user.id, "123456789012345678");
assert_eq!(ready_data.session_id, "abc123def456");
}
#[test]
fn test_message_create_payload_deserialization() {
let json = load_fixture("gateway", "message_create.json");
let payload: Payload =
serde_json::from_str(&json).expect("Failed to deserialize MESSAGE_CREATE payload");
assert_eq!(payload.op, GatewayOpcode::Dispatch);
assert_eq!(payload.t, Some("MESSAGE_CREATE".to_string()));
assert_eq!(payload.s, Some(42));
assert!(payload.d.is_some());
}
#[test]
fn test_gateway_opcodes() {
let opcodes = vec![
(0, "Dispatch"),
(1, "Heartbeat"),
(2, "Identify"),
(6, "Resume"),
(7, "Reconnect"),
(9, "InvalidSession"),
(10, "Hello"),
(11, "HeartbeatAck"),
];
for (code, name) in opcodes {
let json = format!(r#"{{"op": {}, "d": null}}"#, code);
let payload: Payload =
serde_json::from_str(&json).expect(&format!("Failed to deserialize {} opcode", name));
assert_eq!(payload.op as u8, code);
}
}
#[test]
fn test_event_parsing() {
let events = vec![
"READY",
"MESSAGE_CREATE",
"MESSAGE_UPDATE",
"MESSAGE_DELETE",
"GUILD_CREATE",
"GUILD_UPDATE",
"GUILD_DELETE",
"CHANNEL_CREATE",
"CHANNEL_UPDATE",
"CHANNEL_DELETE",
];
for event_name in events {
let result = Event::try_from(event_name);
assert!(result.is_ok(), "Failed to parse event: {}", event_name);
}
}
#[test]
fn test_heartbeat_payload() {
let json = r#"{"op": 1, "d": 251}"#;
let payload: Payload =
serde_json::from_str(json).expect("Failed to deserialize Heartbeat payload");
assert_eq!(payload.op, GatewayOpcode::Heartbeat);
assert!(payload.d.is_some());
let seq: u64 =
serde_json::from_value(payload.d.unwrap()).expect("Failed to parse sequence number");
assert_eq!(seq, 251);
}