presenceforge 0.1.0

A library for Discord Rich Presence (IPC) integration
Documentation
use presenceforge::ActivityBuilder;

#[test]
fn default_activity_valid() {
    let activity = ActivityBuilder::new().build();
    assert!(activity.validate().is_ok());
}

#[test]
fn set_state_and_details() {
    let activity = ActivityBuilder::new()
        .state("Playing")
        .details("In game")
        .build();
    assert_eq!(activity.state.as_deref(), Some("Playing"));
    assert_eq!(activity.details.as_deref(), Some("In game"));
    assert!(activity.validate().is_ok());
}

#[test]
fn state_length_exceeds_limit() {
    let long_state = "a".repeat(129);
    let activity = ActivityBuilder::new().state(long_state).build();
    assert!(activity.validate().is_err());
}

#[test]
fn button_limit_exceeded() {
    let activity = ActivityBuilder::new()
        .button("label1", "http://example.com/1")
        .button("label2", "http://example.com/2")
        .button("label3", "http://example.com/3")
        .build();
    assert!(activity.validate().is_err());
}

#[test]
fn invalid_button_url_scheme() {
    let activity = ActivityBuilder::new()
        .button("Play", "ftp://example.com")
        .build();
    assert!(activity.validate().is_err());
}

#[test]
fn large_image_key_too_long() {
    let activity = ActivityBuilder::new().large_image("x".repeat(257)).build();
    assert!(activity.validate().is_err());
}

#[test]
fn valid_party_and_buttons_pass_validation() {
    let activity = ActivityBuilder::new()
        .state("Raiding")
        .party("raid-123", 3, 6)
        .button("Join", "https://example.com/join")
        .button("Watch", "https://example.com/watch")
        .build();

    assert!(activity.validate().is_ok());
}

#[test]
fn party_size_invalid() {
    let activity = ActivityBuilder::new().party("id", 5, 4).build();
    assert!(activity.validate().is_err());
}