182 lines
10 KiB
Rust
182 lines
10 KiB
Rust
// file: crates/ksp-app-solprices-desk/tests/desktop_contract.rs
|
|
// version: 4
|
|
|
|
//! Desktop scaffold, shared-template and Config packaging contract audits for SOL Prices Desk `0.2.12`.
|
|
|
|
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.4"));
|
|
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.4"));
|
|
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\""));
|
|
}
|
|
|
|
#[test]
|
|
fn pre_003_packaging_contains_current_eleven_config_resources() {
|
|
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(), 11);
|
|
assert_eq!(
|
|
resources.get("../../config/composite.ksp-app-solprices-desk.json").and_then(serde_json::Value::as_str),
|
|
std::option::Option::Some("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}");
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn pre_004_market_price_runtime_projects_registry_rows_without_refresh_controls() {
|
|
let root = app_root();
|
|
let manifest = read_text(root.join("Cargo.toml").as_path());
|
|
assert!(manifest.contains(r#"ksp-offchain-transport-lib = { path = "../ksp-offchain-transport-lib" }"#));
|
|
assert!(!manifest.contains("reqwest"));
|
|
let lib_rs = read_text(root.join("src/lib.rs").as_path());
|
|
assert!(lib_rs.contains("mod market_price_runtime;"));
|
|
assert!(lib_rs.contains("MarketPriceProviderRowDto"));
|
|
assert!(lib_rs.contains("MarketPriceRuntime"));
|
|
let tauri_rs = read_text(root.join("src/tauri.rs").as_path());
|
|
assert!(tauri_rs.contains("list_market_prices"));
|
|
for forbidden in ["refresh_market_price", "refresh_market_prices", "refresh_all_market_prices"] {
|
|
assert!(!tauri_rs.contains(forbidden));
|
|
}
|
|
let main_html = read_text(root.join("frontend/main.html").as_path());
|
|
assert!(main_html.contains(r#"id="pricesLoading""#));
|
|
assert!(main_html.contains(r#"id="pricesEmpty""#));
|
|
assert!(main_html.contains(r#"id="marketPriceTable""#));
|
|
assert!(main_html.contains(r#"id="marketPriceRows""#));
|
|
assert!(!main_html.contains("Refresh"));
|
|
let main_typescript = read_text(root.join("frontend/ts/main.ts").as_path());
|
|
assert!(main_typescript.contains(r#""list_market_prices""#));
|
|
assert!(main_typescript.contains("MarketPriceProviderRowDto"));
|
|
assert!(main_typescript.contains(r#"provider.price ?? "—""#));
|
|
assert!(!main_typescript.contains("parseFloat("));
|
|
assert!(!main_typescript.contains("Number(provider.price"));
|
|
}
|