122 lines
5.0 KiB
Rust
122 lines
5.0 KiB
Rust
// file: crates/ksp-app-backfill-desk/tests/desktop_contract.rs
|
|
// version: 1
|
|
|
|
//! Structural desktop contract checks for the Backfill Desk scaffold.
|
|
|
|
#![forbid(unsafe_code)]
|
|
#![deny(unreachable_pub)]
|
|
#![warn(missing_docs)]
|
|
|
|
fn app_root() -> std::path::PathBuf {
|
|
return std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
|
}
|
|
|
|
fn workspace_root() -> std::path::PathBuf {
|
|
return app_root().join("../..");
|
|
}
|
|
|
|
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(),
|
|
};
|
|
}
|
|
|
|
fn read_bytes(path: &std::path::Path) -> std::vec::Vec<u8> {
|
|
let source = std::fs::read(path);
|
|
assert!(source.is_ok(), "unable to read {}", path.display());
|
|
return match source {
|
|
std::result::Result::Ok(value) => value,
|
|
std::result::Result::Err(_) => std::vec::Vec::new(),
|
|
};
|
|
}
|
|
|
|
#[test]
|
|
fn pre_002_rust_package_is_mixed_lib_bin_and_workspace_member() {
|
|
let root = app_root();
|
|
let manifest = read_text(root.join("Cargo.toml").as_path());
|
|
assert!(manifest.contains("name = \"ksp-app-backfill-desk\""));
|
|
assert!(manifest.contains("name = \"ksp_app_backfill_desk_lib\""));
|
|
assert!(manifest.contains("[[bin]]"));
|
|
let workspace = read_text(workspace_root().join("Cargo.toml").as_path());
|
|
assert!(workspace.contains("crates/ksp-app-backfill-desk"));
|
|
let launcher = read_text(root.join("src/main.rs").as_path());
|
|
assert!(launcher.contains("ksp_app_backfill_desk_lib::run"));
|
|
assert!(launcher.contains("try_lock_exclusive"));
|
|
}
|
|
|
|
#[test]
|
|
fn pre_002_vite_and_tauri_identity_use_reserved_ports_and_crate_local_hooks() {
|
|
let root = app_root();
|
|
let vite = read_text(root.join("vite.config.ts").as_path());
|
|
assert!(vite.contains("port: 1436"));
|
|
assert!(vite.contains("port: 1437"));
|
|
assert!(vite.contains("strictPort: true"));
|
|
let tauri = read_text(root.join("tauri.conf.json").as_path());
|
|
assert!(tauri.contains("KSP Backfill Desk"));
|
|
assert!(tauri.contains("com.sasedev.ksp-app-backfill-desk"));
|
|
assert!(tauri.contains("http://localhost:1436"));
|
|
assert!(tauri.contains("npm run dev"));
|
|
assert!(tauri.contains("npm run build"));
|
|
assert!(tauri.contains("../../../builds/khadhroony-solana-project/ksp-app-backfill-desk/dist"));
|
|
}
|
|
|
|
#[test]
|
|
fn pre_002_package_dependencies_match_desk_baseline() {
|
|
let package = read_text(app_root().join("package.json").as_path());
|
|
for required in [
|
|
"@fltsci/tauri-plugin-tracing",
|
|
"@fortawesome/fontawesome-free",
|
|
"@tauri-apps/api",
|
|
"bootstrap",
|
|
"resize-observer-polyfill",
|
|
"simplebar",
|
|
"@tauri-apps/cli",
|
|
"@types/bootstrap",
|
|
"@types/node",
|
|
"sass-embedded",
|
|
"typescript",
|
|
"vite",
|
|
] {
|
|
assert!(package.contains(required), "missing Desk package baseline dependency {required}");
|
|
}
|
|
assert!(!package.contains("package-lock"));
|
|
}
|
|
|
|
#[test]
|
|
fn pre_002_splash_assets_and_styles_match_existing_desk_template() {
|
|
let root = app_root();
|
|
let reference = workspace_root().join("crates/ksp-app-solprices-desk");
|
|
for relative in ["frontend/fonts/DOS_Amazigh.ttf", "frontend/imgs/logo.png", "frontend/imgs/splash.png", "icons/favicon.png", "icons/favicon.ico"] {
|
|
assert_eq!(read_bytes(root.join(relative).as_path()), read_bytes(reference.join(relative).as_path()), "Desk asset differs: {relative}");
|
|
}
|
|
let splash = read_text(root.join("frontend/splash.html").as_path());
|
|
assert!(splash.contains("imgs/splash.png"));
|
|
assert!(splash.contains("Backfill Desk"));
|
|
let splash_style = read_text(root.join("frontend/sass/splash.scss").as_path());
|
|
let reference_style = read_text(reference.join("frontend/sass/splash.scss").as_path());
|
|
let normalized = splash_style.replace("crates/ksp-app-backfill-desk", "crates/ksp-app-solprices-desk").replace("// version: 1", "// version: 2");
|
|
assert_eq!(normalized, reference_style);
|
|
}
|
|
|
|
#[test]
|
|
fn pre_002_shell_and_splash_use_shared_frontend_tooling() {
|
|
let root = app_root();
|
|
let shell = read_text(root.join("frontend/main.html").as_path());
|
|
for required in ["app-header", "app-sidebar", "app-sidebar-scroll", "app-content", "app-footer", "data-simplebar"] {
|
|
assert!(shell.contains(required), "Backfill Desk shell is missing template marker {required}");
|
|
}
|
|
let main = read_text(root.join("frontend/ts/main.ts").as_path());
|
|
assert!(main.contains("resize-observer-polyfill"));
|
|
assert!(main.contains("simplebar"));
|
|
assert!(main.contains("bootstrap"));
|
|
assert!(main.contains("Backfill Desk frontend control clicked"));
|
|
assert!(main.contains("Backfill Desk navigation tab clicked"));
|
|
assert!(main.contains("Backfill Desk runtime status refresh button clicked"));
|
|
let splash = read_text(root.join("frontend/ts/splash.ts").as_path());
|
|
assert!(splash.contains("Splash opacity animation started"));
|
|
assert!(splash.contains("Backfill Desk splash frontend loaded"));
|
|
}
|