use assert_cmd::Command;
use predicates::prelude::*;
use std::fs;
fn sdkt() -> Command {
let mut cmd = Command::cargo_bin("sdkt").expect("sdkt binary built");
let dir = std::env::temp_dir().join(format!(
"sdkt-cli-plugin-{}",
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_nanos()
));
let _ = fs::create_dir_all(&dir);
cmd.env("SDKT_PLUGIN_DIR", &dir);
cmd.env("SDKT_NETWORK_DIR", &dir);
cmd
}
fn dummy_src(store: &std::path::Path) -> std::path::PathBuf {
let p = store.join("contract.rs");
fs::write(&p, "pub fn hello() {}\n").unwrap();
p
}
fn fixture_plugin(store: &std::path::Path) -> std::path::PathBuf {
let src = store.join("ex_rule.wasm");
fs::write(&src, b"dummy-wasm-bytes").unwrap();
fs::write(
store.join("plugin.toml"),
r#"
id = "example-rule"
name = "Example Rule"
version = "1.0.0"
author = "SaboLabs"
description = "Reference audit rule."
kind = "wasm"
artifact = "ex_rule.wasm"
abi_major = 1
abi_minor = 0
"#,
)
.unwrap();
src
}
#[test]
fn plugin_install_list_show_remove_lifecycle() {
let store = std::env::temp_dir().join(format!(
"sdkt-plugin-life-{}",
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_nanos()
));
let _ = fs::create_dir_all(&store);
let src = fixture_plugin(&store);
sdkt()
.env("SDKT_PLUGIN_DIR", &store)
.args(["plugin", "list"])
.assert()
.success()
.stdout(predicate::str::contains("No plugins installed"));
sdkt()
.env("SDKT_PLUGIN_DIR", &store)
.args(["plugin", "install", src.to_str().unwrap()])
.assert()
.success()
.stdout(predicate::str::contains("Installed plugin 'example-rule'"));
sdkt()
.env("SDKT_PLUGIN_DIR", &store)
.args(["plugin", "list"])
.assert()
.success()
.stdout(predicate::str::contains("example-rule"));
sdkt()
.env("SDKT_PLUGIN_DIR", &store)
.args(["plugin", "show", "example-rule"])
.assert()
.success()
.stdout(predicate::str::contains("kind: wasm"));
let src = dummy_src(&store);
sdkt()
.env("SDKT_PLUGIN_DIR", &store)
.args(["audit", src.to_str().unwrap(), "--rules", "example-rule"])
.assert()
.failure()
.stderr(predicate::str::contains("wasm-plugins"));
sdkt()
.env("SDKT_PLUGIN_DIR", &store)
.args(["plugin", "remove", "example-rule"])
.assert()
.success()
.stdout(predicate::str::contains("Removed plugin"));
let src = dummy_src(&store);
sdkt()
.env("SDKT_PLUGIN_DIR", &store)
.args(["audit", src.to_str().unwrap(), "--rules", "example-rule"])
.assert()
.failure()
.stderr(predicate::str::contains("does not exist"));
let _ = fs::remove_dir_all(&store);
}
#[test]
fn audit_raw_path_still_works_backward_compat() {
let store = std::env::temp_dir().join(format!(
"sdkt-plugin-raw-{}",
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_nanos()
));
let _ = fs::create_dir_all(&store);
let fake_src = store.join("fake.wasm");
fs::write(&fake_src, b"not a real plugin").unwrap();
let src = dummy_src(&store);
sdkt()
.env("SDKT_PLUGIN_DIR", &store)
.args([
"audit",
src.to_str().unwrap(),
"--rules",
fake_src.to_str().unwrap(),
])
.assert()
.failure()
.stderr(predicate::str::contains("wasm-plugins"));
let _ = fs::remove_dir_all(&store);
}