nythos-core 0.2.1

Infrastructure-free Rust core library for Nythos authentication and authorization.
Documentation
use nythos_core::{
    AuthError,
    domain::{DisplayName, Email, LoginIdentifier, Password, Username},
};

#[test]
fn email_round_trips_through_display_and_parse() {
    let email = Email::parse("User@Example.com").unwrap();
    let rendered = email.to_string();

    assert_eq!(rendered, "user@example.com");

    let parsed = Email::parse(&rendered).unwrap();
    assert_eq!(parsed, email);
}

#[test]
fn email_has_stable_comparison_semantics() {
    let left = Email::parse("Admin@Example.com").unwrap();
    let right = Email::parse("  admin@example.com").unwrap();

    assert_eq!(left, right);
}

#[test]
fn email_validation_maps_to_auth_error() {
    let error = Email::parse("bad-email").unwrap_err();

    assert!(matches!(error, AuthError::ValidationError(_)));
}

#[test]
fn username_round_trips_through_display_and_parse() {
    let username = Username::parse("Gencho_XD").unwrap();

    assert_eq!(username.as_str(), "gencho_xd");
    assert_eq!(username.to_string(), "gencho_xd");

    let parsed = Username::parse(&username).unwrap();
    assert_eq!(parsed, username);
}

#[test]
fn username_validation_maps_to_auth_error() {
    let error = Username::parse("ab").unwrap_err();

    assert!(matches!(error, AuthError::ValidationError(_)));
}

#[test]
fn username_rejects_email_like_values() {
    let error = Username::parse("person@example.com").unwrap_err();

    assert!(matches!(error, AuthError::ValidationError(_)));
}

#[test]
fn display_name_round_trips_through_display_and_parse() {
    let display_name = DisplayName::parse("  Evgeni Dochev  ").unwrap();

    assert_eq!(display_name.as_str(), "Evgeni Dochev");
    assert_eq!(display_name.to_string(), "Evgeni Dochev");

    let parsed = DisplayName::parse(&display_name).unwrap();
    assert_eq!(parsed, display_name);
}

#[test]
fn display_name_preserves_unicode_and_casing() {
    let display_name = DisplayName::parse("Генчо Dev").unwrap();

    assert_eq!(display_name.as_str(), "Генчо Dev");
}

#[test]
fn display_name_validation_maps_to_auth_error() {
    let error = DisplayName::parse("line\nbreak").unwrap_err();

    assert!(matches!(error, AuthError::ValidationError(_)));
}

#[test]
fn login_identifier_parses_email_values() {
    let identifier = LoginIdentifier::parse("User@Example.com").unwrap();

    assert!(identifier.is_email());
    assert!(!identifier.is_username());
    assert_eq!(identifier.as_email().unwrap().as_str(), "user@example.com");
    assert!(identifier.as_username().is_none());
}

#[test]
fn login_identifier_parses_username_values() {
    let identifier = LoginIdentifier::parse("Gencho_XD").unwrap();

    assert!(identifier.is_username());
    assert!(!identifier.is_email());
    assert_eq!(identifier.as_username().unwrap().as_str(), "gencho_xd");
    assert!(identifier.as_email().is_none());
}

#[test]
fn login_identifier_validation_maps_to_auth_error() {
    let error = LoginIdentifier::parse("!!bad").unwrap_err();

    assert!(matches!(error, AuthError::ValidationError(_)));
}

#[test]
fn password_validation_maps_to_auth_error() {
    let error = Password::new("short").unwrap_err();

    assert!(matches!(error, AuthError::ValidationError(_)));
}

#[test]
fn password_preserves_raw_value_after_validation() {
    let password = Password::new("super-secret-password").unwrap();

    assert_eq!(password.as_str(), "super-secret-password");
}