// file: crates/ksp-app-solprices-desk/tests/desktop_contract.rs // version: 3 //! 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::(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.3")); 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.3")); 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::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(""#)); 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("KSP SOL Prices Desk — Chargement")); 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::>().join("\n"); let config_body = config.lines().skip(3).collect::>().join("\n"); let wallet_body = wallet.lines().skip(3).collect::>().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}"); } }