rustauth-scim 0.3.0

SCIM support for RustAuth.
Documentation
use rustauth_scim::mappings::ScimEmail;
use rustauth_scim::validation::{is_valid_email, validate_emails, validate_scim_user_identity};

#[test]
fn is_valid_email_accepts_common_addresses() {
    assert!(is_valid_email("ada@example.com"));
    assert!(is_valid_email("  Ada@Example.com  "));
}

#[test]
fn is_valid_email_rejects_missing_domain_and_whitespace() {
    assert!(!is_valid_email(""));
    assert!(!is_valid_email("ada"));
    assert!(!is_valid_email("ada@"));
    assert!(!is_valid_email("ada @example.com"));
    assert!(!is_valid_email("@example.com"));
}

#[test]
fn validate_scim_user_identity_requires_email_shaped_user_name_or_emails() {
    let email = validate_scim_user_identity("ada@example.com", &[]).expect("userName should work");
    assert_eq!(email, "ada@example.com");

    let email = validate_scim_user_identity(
        "ignored",
        &[ScimEmail {
            value: "primary@example.com".to_owned(),
            primary: true,
        }],
    )
    .expect("primary email should win");
    assert_eq!(email, "primary@example.com");

    let error = validate_scim_user_identity("ada", &[]).expect_err("bare userName must fail");
    assert_eq!(error.scim_type.as_deref(), Some("invalidValue"));

    let error = validate_scim_user_identity("   ", &[]).expect_err("empty userName must fail");
    assert_eq!(error.detail.as_deref(), Some("userName is required"));
}

#[test]
fn validate_emails_rejects_invalid_and_duplicate_primary_values() {
    validate_emails(&[ScimEmail {
        value: "ada@example.com".to_owned(),
        primary: true,
    }])
    .expect("single primary email should pass");

    let error = validate_emails(&[ScimEmail {
        value: "not-an-email".to_owned(),
        primary: false,
    }])
    .expect_err("invalid email must fail");
    assert_eq!(
        error.detail.as_deref(),
        Some("emails.value must be a valid email address")
    );

    let error = validate_emails(&[
        ScimEmail {
            value: "one@example.com".to_owned(),
            primary: true,
        },
        ScimEmail {
            value: "two@example.com".to_owned(),
            primary: true,
        },
    ])
    .expect_err("duplicate primary must fail");
    assert_eq!(
        error.detail.as_deref(),
        Some("Only one emails value can be primary")
    );
}