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)
);
}