#![allow(dead_code, unused_imports)]
pub mod cli;
pub mod fake_cloud;
pub mod mock_server;
use std::fs;
use std::path::{Path, PathBuf};
use stackql_deploy::commands::base::CommandRunner;
use stackql_deploy::core::utils::UNKNOWN_EXPORT_PLACEHOLDER;
use stackql_deploy::utils::pgwire::PgwireLite;
pub use fake_cloud::FakeCloud;
pub use mock_server::{MockResponse, MockServer};
pub fn init_test_logging() {
let mut builder = env_logger::Builder::from_env(env_logger::Env::default());
if std::env::var_os("RUST_LOG").is_none() {
builder.filter_level(log::LevelFilter::Info);
}
let _ = builder.is_test(true).try_init();
}
pub const UNKNOWN: &str = UNKNOWN_EXPORT_PLACEHOLDER;
pub fn fixture_dir(name: &str) -> PathBuf {
Path::new(env!("CARGO_MANIFEST_DIR"))
.join("tests")
.join("fixtures")
.join(name)
}
pub struct TestStack {
_tempdir: tempfile::TempDir,
pub dir: PathBuf,
}
impl TestStack {
pub fn new(fixture: &str) -> Self {
Self::with_manifest(fixture, "stackql_manifest.yml")
}
pub fn with_manifest(fixture: &str, manifest: &str) -> Self {
init_test_logging();
let source = fixture_dir(fixture);
assert!(
source.is_dir(),
"fixture directory not found: {}",
source.display()
);
let tempdir = tempfile::tempdir().expect("create temp dir");
let dir = tempdir.path().join(fixture);
copy_dir(&source, &dir);
let chosen = source.join(manifest);
assert!(
chosen.is_file(),
"manifest variant not found: {}",
chosen.display()
);
fs::copy(&chosen, dir.join("stackql_manifest.yml")).expect("install manifest");
TestStack {
_tempdir: tempdir,
dir,
}
}
pub fn runner(&self, server: &MockServer, stack_env: &str) -> CommandRunner {
stackql_deploy::globals::init_globals("mock-stackql.invalid".to_string(), server.port());
let client = PgwireLite::new("127.0.0.1", server.port(), false, "default")
.expect("connect to mock server");
let env_file = self.dir.join(".env");
CommandRunner::new(
client,
self.dir.to_str().expect("utf-8 stack dir"),
stack_env,
env_file.to_str().expect("utf-8 env file"),
&[],
)
}
}
fn copy_dir(from: &Path, to: &Path) {
fs::create_dir_all(to).expect("create dir");
for entry in fs::read_dir(from).expect("read fixture dir") {
let entry = entry.expect("dir entry");
let target = to.join(entry.file_name());
if entry.path().is_dir() {
copy_dir(&entry.path(), &target);
} else {
fs::copy(entry.path(), &target).expect("copy fixture file");
}
}
}
pub fn export_value(runner: &CommandRunner, name: &str) -> Option<String> {
runner.global_context.get(name).cloned()
}
pub fn assert_no_unknown_placeholder_sent(server: &MockServer) {
let offenders = server.queries_containing(UNKNOWN);
assert!(
offenders.is_empty(),
"statements containing {} were sent to the server:\n{}",
UNKNOWN,
offenders.join("\n---\n")
);
}