#![forbid(unsafe_code)]
use serde::{Deserialize, Serialize};
use crate::{CohortId, NodeId, PeerId, Timestamp};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SessionClaims {
pub sub: PeerId,
pub cohort: CohortId,
pub exp: Timestamp,
pub exit_set: Vec<NodeId>,
pub path: Vec<NodeId>,
}
#[cfg(test)]
mod tests {
use super::*;
fn node(byte: u8) -> NodeId {
NodeId(ulid::Ulid::from_bytes([byte; 16]))
}
fn fixture_claims() -> SessionClaims {
SessionClaims {
sub: PeerId(ulid::Ulid::from_bytes([1; 16])),
cohort: CohortId(ulid::Ulid::from_bytes([2; 16])),
exp: Timestamp::from_offset_date_time(
time::OffsetDateTime::from_unix_timestamp(1_700_000_000).expect("valid timestamp"),
),
exit_set: vec![node(3), node(4)],
path: vec![node(5), node(4)],
}
}
#[test]
fn serde_round_trips_claim_shape() {
let claims = fixture_claims();
let encoded = serde_json::to_value(&claims).expect("claims serialize");
let decoded: SessionClaims = serde_json::from_value(encoded).expect("claims deserialize");
assert_eq!(decoded, claims);
}
#[test]
fn exit_set_and_path_remain_distinct_fields() {
let encoded = serde_json::to_value(fixture_claims()).expect("claims serialize");
assert_ne!(encoded["exit_set"], encoded["path"]);
assert_eq!(encoded["path"][1], encoded["exit_set"][1]);
}
}