openauth-cli 0.0.4

Command-line tools for OpenAuth.
Documentation
#![allow(clippy::expect_used)]

use openauth_cli::config::{CliConfig, DatabaseConfig, ProjectConfig};

#[test]
fn parses_default_config_contract() {
    let config: CliConfig = r#"
[project]
framework = "axum"
base_url = "http://localhost:3000/api/auth"
base_path = "/api/auth"
production = false

[database]
adapter = "sqlx"
provider = "sqlite"
url_env = "DATABASE_URL"
migrations_dir = "migrations/openauth"

[security]
secret_env = "OPENAUTH_SECRET"

[plugins]
enabled = ["two-factor"]
"#
    .parse()
    .expect("config should parse");

    assert_eq!(config.project.framework.as_deref(), Some("axum"));
    assert_eq!(config.database.provider.as_deref(), Some("sqlite"));
    assert_eq!(config.plugins.enabled, vec!["two-factor"]);
}

#[test]
fn writes_config_without_dropping_unknown_keys() {
    let source = r#"
[project]
framework = "axum"
custom = "keep"

[plugins]
enabled = ["username"]
"#;

    let updated = CliConfig::add_plugin_to_document(source, "two-factor")
        .expect("plugin update should succeed");

    assert!(updated.contains("custom = \"keep\""));
    assert!(updated.contains("\"username\""));
    assert!(updated.contains("\"two-factor\""));
}

#[test]
fn default_config_uses_stable_contract() {
    let config = CliConfig {
        project: ProjectConfig {
            framework: Some("axum".to_owned()),
            ..ProjectConfig::default()
        },
        database: DatabaseConfig {
            provider: Some("sqlite".to_owned()),
            ..DatabaseConfig::default()
        },
        ..CliConfig::default()
    };

    let rendered = config.to_toml_string().expect("config should render");

    assert!(rendered.contains("[project]"));
    assert!(rendered.contains("framework = \"axum\""));
    assert!(rendered.contains("[database]"));
    assert!(rendered.contains("migrations_dir = \"migrations/openauth\""));
}