rustauth-cli 0.2.0

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

use assert_cmd::Command;
use predicates::prelude::*;
use std::fs;

fn write_config(dir: &std::path::Path, plugins: &[&str]) {
    let plugins = plugins
        .iter()
        .map(|plugin| format!("\"{plugin}\""))
        .collect::<Vec<_>>()
        .join(", ");
    fs::write(
        dir.join("rustauth.toml"),
        format!(
            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/rustauth"

[security]
secret_env = "RUSTAUTH_SECRET"

[plugins]
enabled = [{plugins}]
"#
        ),
    )
    .expect("write config");
}

#[test]
fn schema_print_sqlite_matches_base_snapshot() {
    let temp = tempfile::tempdir().expect("tempdir");
    write_config(temp.path(), &[]);

    Command::cargo_bin("rustauth")
        .expect("binary")
        .args([
            "schema",
            "print",
            "--cwd",
            temp.path().to_str().expect("utf8 path"),
            "--dialect",
            "sqlite",
        ])
        .assert()
        .success()
        .stdout(predicate::str::contains(
            r#"CREATE TABLE IF NOT EXISTS "users""#,
        ))
        .stdout(predicate::str::contains(
            r#"CREATE INDEX IF NOT EXISTS "idx_sessions_user_id""#,
        ));
}

#[test]
fn schema_print_postgres_matches_base_snapshot() {
    let temp = tempfile::tempdir().expect("tempdir");
    write_config(temp.path(), &[]);

    Command::cargo_bin("rustauth")
        .expect("binary")
        .args([
            "schema",
            "print",
            "--cwd",
            temp.path().to_str().expect("utf8 path"),
            "--dialect",
            "postgres",
        ])
        .assert()
        .success()
        .stdout(predicate::str::contains(
            r#"CREATE TABLE IF NOT EXISTS "users""#,
        ))
        .stdout(predicate::str::contains(
            r#""email_verified" BOOLEAN NOT NULL"#,
        ));
}

#[test]
fn schema_print_mysql_matches_base_snapshot() {
    let temp = tempfile::tempdir().expect("tempdir");
    write_config(temp.path(), &[]);

    Command::cargo_bin("rustauth")
        .expect("binary")
        .args([
            "schema",
            "print",
            "--cwd",
            temp.path().to_str().expect("utf8 path"),
            "--dialect",
            "mysql",
        ])
        .assert()
        .success()
        .stdout(predicate::str::contains(
            r#"CREATE TABLE IF NOT EXISTS `users`"#,
        ))
        .stdout(predicate::str::contains(
            r#"`email_verified` BOOLEAN NOT NULL"#,
        ));
}

#[test]
#[cfg(feature = "plugins")]
fn schema_print_plugin_snapshot_includes_schema_plugin_tables() {
    let temp = tempfile::tempdir().expect("tempdir");
    write_config(temp.path(), &["api-key", "organization"]);

    Command::cargo_bin("rustauth")
        .expect("binary")
        .args([
            "schema",
            "print",
            "--cwd",
            temp.path().to_str().expect("utf8 path"),
            "--dialect",
            "sqlite",
        ])
        .assert()
        .success()
        .stdout(predicate::str::contains("api_keys"))
        .stdout(predicate::str::contains("organizations"));
}