Files
khadhroony-solana-project/crates/ksp-app-solprices-desk/tests/desktop_contract.rs

151 lines
8.6 KiB
Rust

// file: crates/ksp-app-solprices-desk/tests/desktop_contract.rs
// version: 2
//! Desktop scaffold and shared-template contract audits for SOL Prices Desk `0.2.12-pre.002` and its fixes.
fn app_root() -> std::path::PathBuf {
return std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
}
fn read_json(path: &std::path::Path) -> serde_json::Value {
let source = std::fs::read_to_string(path);
assert!(source.is_ok(), "unable to read {}", path.display());
let source = match source {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return serde_json::Value::Null,
};
let parsed = serde_json::from_str::<serde_json::Value>(source.as_str());
assert!(parsed.is_ok(), "unable to parse {}", path.display());
return match parsed {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => serde_json::Value::Null,
};
}
fn read_text(path: &std::path::Path) -> String {
let source = std::fs::read_to_string(path);
assert!(source.is_ok(), "unable to read {}", path.display());
return match source {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => String::new(),
};
}
#[test]
fn pre_002_shell_uses_reserved_ports_windows_and_owned_backend_paths() {
let root = app_root();
let tauri = read_json(root.join("tauri.conf.json").as_path());
assert_eq!(tauri.pointer("/productName").and_then(serde_json::Value::as_str), std::option::Option::Some("KSP SOL Prices Desk"));
assert_eq!(tauri.pointer("/identifier").and_then(serde_json::Value::as_str), std::option::Option::Some("com.sasedev.ksp-app-solprices-desk"));
assert_eq!(tauri.pointer("/version").and_then(serde_json::Value::as_str), std::option::Option::Some("0.2.12-pre.2.fix.1"));
let package = read_json(root.join("package.json").as_path());
assert_eq!(package.pointer("/version").and_then(serde_json::Value::as_str), std::option::Option::Some("0.2.12-pre.2.fix.1"));
assert_eq!(tauri.pointer("/build/devUrl").and_then(serde_json::Value::as_str), std::option::Option::Some("http://localhost:1434"));
assert_eq!(tauri.pointer("/build/beforeDevCommand/script").and_then(serde_json::Value::as_str), std::option::Option::Some("npm run dev"));
assert_eq!(tauri.pointer("/build/beforeDevCommand/cwd").and_then(serde_json::Value::as_str), std::option::Option::Some("."));
assert_eq!(tauri.pointer("/build/beforeBuildCommand/script").and_then(serde_json::Value::as_str), std::option::Option::Some("npm run build"));
assert_eq!(tauri.pointer("/build/beforeBuildCommand/cwd").and_then(serde_json::Value::as_str), std::option::Option::Some("."));
assert_eq!(
tauri.pointer("/build/frontendDist").and_then(serde_json::Value::as_str),
std::option::Option::Some("../../../builds/khadhroony-solana-project/ksp-app-solprices-desk/dist"),
);
let windows = tauri.pointer("/app/windows").and_then(serde_json::Value::as_array);
assert!(windows.is_some());
let labels = match windows {
std::option::Option::Some(values) => {
values.iter().filter_map(|window| return window.get("label").and_then(serde_json::Value::as_str)).collect::<std::vec::Vec<_>>()
},
std::option::Option::None => return,
};
assert_eq!(labels, ["splash", "main"]);
let vite = read_text(root.join("vite.config.ts").as_path());
assert!(vite.contains("port: 1434"));
assert!(vite.contains("port: 1435"));
assert!(vite.contains("strictPort: true"));
assert!(!vite.contains("ksp-app-wallet-desk"));
}
#[test]
fn pre_002_package_is_mixed_lib_bin_and_frontend_is_scaffold_only() {
let root = app_root();
let manifest = read_text(root.join("Cargo.toml").as_path());
assert!(manifest.contains("name = \"ksp-app-solprices-desk\""));
assert!(manifest.contains("name = \"ksp_app_solprices_desk_lib\""));
assert!(manifest.contains("[[bin]]"));
let main_rs = read_text(root.join("src/main.rs").as_path());
assert!(main_rs.contains("ksp_app_solprices_desk_lib::run"));
let lib_rs = read_text(root.join("src/lib.rs").as_path());
assert!(lib_rs.contains("pub use self::tauri::run"));
let tauri_rs = read_text(root.join("src/tauri.rs").as_path());
assert!(tauri_rs.contains("get_runtime_status"));
assert!(!tauri_rs.contains("fn runtime_status("));
let main_html = read_text(root.join("frontend/main.html").as_path());
assert!(main_html.contains("data-view=\"prices\""));
assert!(main_html.contains("data-view=\"diagnostics\""));
assert!(!main_html.contains("<table"));
}
#[test]
fn pre_002_packaging_contains_current_ten_config_resources_only() {
let root = app_root();
let tauri = read_json(root.join("tauri.conf.json").as_path());
let resources = tauri.pointer("/bundle/resources").and_then(serde_json::Value::as_object);
assert!(resources.is_some());
if let std::option::Option::Some(resources) = resources {
assert_eq!(resources.len(), 10);
assert!(!resources.contains_key("../../config/composite.ksp-app-solprices-desk.json"));
assert!(resources.contains_key("../../config/std.offchain_transport.json"));
assert!(resources.contains_key("../../config/schemas/std.offchain_transport.schema.json"));
}
let tauri_source = read_text(root.join("src/tauri.rs").as_path());
assert!(tauri_source.contains("ksp_config_lib::prepare_packaged_runtime"));
assert!(tauri_source.contains("std::env::set_current_dir(layout.runtime_root())"));
}
#[test]
fn pre_002_fix_001_reuses_the_common_ksp_desktop_template() {
let root = app_root();
let package = read_text(root.join("package.json").as_path());
for dependency in ["@fltsci/tauri-plugin-tracing", "@fortawesome/fontawesome-free", "@tauri-apps/api", "bootstrap", "resize-observer-polyfill", "simplebar"]
{
assert!(package.contains(dependency), "missing common frontend dependency {dependency}");
}
let main_typescript = read_text(root.join("frontend/ts/main.ts").as_path());
assert!(main_typescript.contains(r#"import ResizeObserver from "resize-observer-polyfill""#));
assert!(main_typescript.contains(".ResizeObserver = ResizeObserver"));
assert!(main_typescript.contains("getCurrentWindow().label"));
assert!(main_typescript.contains(r#""get_runtime_status""#));
let main_html = read_text(root.join("frontend/main.html").as_path());
assert!(main_html.contains(r#"<footer class="app-footer bg-dark text-light">"#));
assert!(main_html.contains(r#"class="app-placeholder""#));
assert!(main_html.contains(r#"class="row mb-0 app-runtime-list""#));
assert!(!main_html.contains("runtimeVersionBadge"));
let splash_html = read_text(root.join("frontend/splash.html").as_path());
assert!(splash_html.contains("<title>KSP SOL Prices Desk — Chargement</title>"));
let splash_scss = read_text(root.join("frontend/sass/splash.scss").as_path());
assert!(splash_scss.contains("DOS_Amazigh.ttf"));
assert!(splash_scss.contains(r#"font-family: "Dos Amazigh", sans-serif"#));
let font_manifest = read_text(root.join("frontend/fonts/README.md").as_path());
assert!(font_manifest.contains("a01ff4b5a0d699db7cefcf5336bf0e379ff6fbf0d096087571a13c8782f9aa02"));
let font = std::fs::read(root.join("frontend/fonts/DOS_Amazigh.ttf"));
let config_font = std::fs::read(root.join("../ksp-app-config-desk/frontend/fonts/DOS_Amazigh.ttf"));
let wallet_font = std::fs::read(root.join("../ksp-app-wallet-desk/frontend/fonts/DOS_Amazigh.ttf"));
assert!(font.is_ok());
assert!(config_font.is_ok());
assert!(wallet_font.is_ok());
if let (std::result::Result::Ok(font), std::result::Result::Ok(config_font), std::result::Result::Ok(wallet_font)) = (font, config_font, wallet_font) {
assert_eq!(font, config_font);
assert_eq!(font, wallet_font);
}
for relative in ["_bootswatch.scss", "_fontawesome.scss", "_simplebar.scss", "_variables.scss", "main.scss", "splash.scss"] {
let sol = read_text(root.join("frontend/sass").join(relative).as_path());
let config = read_text(root.join("../ksp-app-config-desk/frontend/sass").join(relative).as_path());
let wallet = read_text(root.join("../ksp-app-wallet-desk/frontend/sass").join(relative).as_path());
let sol_body = sol.lines().skip(3).collect::<std::vec::Vec<_>>().join("\n");
let config_body = config.lines().skip(3).collect::<std::vec::Vec<_>>().join("\n");
let wallet_body = wallet.lines().skip(3).collect::<std::vec::Vec<_>>().join("\n");
assert_eq!(sol_body, config_body, "SOL Prices Desk diverges from Config Desk template in {relative}");
assert_eq!(sol_body, wallet_body, "SOL Prices Desk diverges from Wallet Desk template in {relative}");
}
}