ch-rds 0.2.1

Runtime resource loading and local service orchestration
Documentation
//! Exercises dotenv bootstrap after Tokio's worker threads have started.

use std::fs;
use std::process::Command;

use ch_config::AppConfig;
use ch_rds::{Runtime, RuntimeEnvironment, WebBind};

#[test]
fn runtime_uses_one_snapshot_after_threads_start() {
    if std::env::var_os("RUNTIME_CONFIG_FIXTURE").is_some() {
        tokio::runtime::Builder::new_multi_thread()
            .worker_threads(2)
            .enable_all()
            .build()
            .unwrap()
            .block_on(async {
                tokio::spawn(async {}).await.unwrap();
                let runtime =
                    Runtime::bootstrap_with_environment(RuntimeEnvironment::Production).unwrap();
                assert!(runtime.environment_load().base);
                assert!(runtime.environment_load().override_file);
                let config = AppConfig::from_env(AppConfig::default()).unwrap();
                assert_eq!(
                    config.mariadb.url,
                    "mysql://user:secret@database.invalid/app"
                );
                let bind = runtime.load(WebBind::builder()).await.unwrap();
                assert_eq!(bind.port(), 4123);
                assert_eq!(std::env::var("PORT").unwrap(), "4000");
                assert!(std::env::var_os("DATABASE_URL_FILE").is_none());
            });
        return;
    }
    let directory = tempfile::tempdir().unwrap();
    fs::create_dir_all(directory.path().join("web/build/client")).unwrap();
    let secret = directory.path().join("database-secret");
    fs::write(&secret, "mysql://user:secret@database.invalid/app\n").unwrap();
    fs::write(directory.path().join(".env"), "PORT=4001\n").unwrap();
    fs::write(
        directory.path().join(".env.local"),
        format!("PORT=4123\nDATABASE_URL_FILE='{}'\n", secret.display()),
    )
    .unwrap();
    let output = Command::new(std::env::current_exe().unwrap())
        .args(["--exact", "runtime_uses_one_snapshot_after_threads_start"])
        .env_clear()
        .env("RUNTIME_CONFIG_FIXTURE", "1")
        .env("PORT", "4000")
        .current_dir(directory.path())
        .output()
        .unwrap();
    assert!(
        output.status.success(),
        "{}\n{}",
        String::from_utf8_lossy(&output.stdout),
        String::from_utf8_lossy(&output.stderr)
    );
}