107 lines
4.8 KiB
Rust
107 lines
4.8 KiB
Rust
// file: crates/ksp-app-store-desk/tests/desktop_contract.rs
|
|
// version: 2
|
|
|
|
//! Desktop template and frontend contract tests for the Store Desk scaffold.
|
|
|
|
fn parse_json(source: &str) -> serde_json::Result<serde_json::Value> {
|
|
return serde_json::from_str::<serde_json::Value>(source);
|
|
}
|
|
|
|
#[test]
|
|
fn pre_002_tauri_package_and_ports_match_store_desk_identity() {
|
|
let parsed = parse_json(include_str!("../tauri.conf.json"));
|
|
assert!(parsed.is_ok(), "committed Tauri JSON must be valid");
|
|
let config = match parsed {
|
|
std::result::Result::Ok(value) => value,
|
|
std::result::Result::Err(_) => return,
|
|
};
|
|
assert_eq!(config["productName"], "KSP Store Desk");
|
|
assert_eq!(config["identifier"], "com.sasedev.ksp-app-store-desk");
|
|
assert_eq!(config["build"]["devUrl"], "http://localhost:1438");
|
|
assert!(config.get("version").is_none());
|
|
let vite = include_str!("../vite.config.ts");
|
|
assert!(vite.contains("port: 1438"));
|
|
assert!(vite.contains("strictPort: true"));
|
|
assert!(vite.contains("port: 1439"));
|
|
}
|
|
|
|
#[test]
|
|
fn pre_002_fix_001_vite_config_matches_ksp_desk_template_except_identity_ports_and_header() {
|
|
let store = include_str!("../vite.config.ts")
|
|
.replace("crates/ksp-app-store-desk/vite.config.ts", "crates/ksp-app-backfill-desk/vite.config.ts")
|
|
.replace("// version: 2", "// version: 1")
|
|
.replace("ksp-app-store-desk", "ksp-app-backfill-desk")
|
|
.replace("1438", "1436")
|
|
.replace("1439", "1437");
|
|
let reference = include_str!("../../ksp-app-backfill-desk/vite.config.ts");
|
|
assert_eq!(store, reference);
|
|
}
|
|
|
|
#[test]
|
|
fn pre_002_frontend_dependency_baseline_is_ksp_owned_and_select_free() {
|
|
let parsed = parse_json(include_str!("../package.json"));
|
|
assert!(parsed.is_ok(), "committed package JSON must be valid");
|
|
let package = match parsed {
|
|
std::result::Result::Ok(value) => value,
|
|
std::result::Result::Err(_) => return,
|
|
};
|
|
let dependencies = &package["dependencies"];
|
|
for required in [
|
|
"@fltsci/tauri-plugin-tracing",
|
|
"@fortawesome/fontawesome-free",
|
|
"@tauri-apps/api",
|
|
"bootstrap",
|
|
"datatables.net-bs5",
|
|
"resize-observer-polyfill",
|
|
"simplebar",
|
|
] {
|
|
assert!(dependencies.get(required).is_some(), "required frontend dependency missing: {required}");
|
|
}
|
|
assert!(dependencies.get("datatables.net-select-bs5").is_none());
|
|
let dev_dependencies = &package["devDependencies"];
|
|
let expected = ["@tauri-apps/cli", "@types/bootstrap", "@types/node", "sass-embedded", "typescript", "vite"];
|
|
let count = match dev_dependencies.as_object() {
|
|
std::option::Option::Some(value) => value.len(),
|
|
std::option::Option::None => 0,
|
|
};
|
|
assert_eq!(count, expected.len());
|
|
for dependency in expected {
|
|
assert!(dev_dependencies.get(dependency).is_some(), "required dev dependency missing: {dependency}");
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn pre_002_binary_assets_reuse_the_ksp_desktop_template_byte_exact() {
|
|
assert_eq!(include_bytes!("../frontend/imgs/logo.png"), include_bytes!("../../ksp-app-backfill-desk/frontend/imgs/logo.png"));
|
|
assert_eq!(include_bytes!("../frontend/imgs/splash.png"), include_bytes!("../../ksp-app-backfill-desk/frontend/imgs/splash.png"));
|
|
assert_eq!(include_bytes!("../frontend/fonts/DOS_Amazigh.ttf"), include_bytes!("../../ksp-app-backfill-desk/frontend/fonts/DOS_Amazigh.ttf"));
|
|
assert_eq!(include_bytes!("../icons/favicon.png"), include_bytes!("../../ksp-app-backfill-desk/icons/favicon.png"));
|
|
assert_eq!(include_bytes!("../icons/favicon.ico"), include_bytes!("../../ksp-app-backfill-desk/icons/favicon.ico"));
|
|
}
|
|
|
|
#[test]
|
|
fn pre_002_shell_exposes_only_planned_store_desk_views_and_empty_table_skeletons() {
|
|
let html = include_str!("../frontend/main.html");
|
|
for view in ["overview", "transactions", "accounts", "diagnostics"] {
|
|
assert!(html.contains(&format!("data-view=\"{view}\"")));
|
|
assert!(html.contains(&format!("data-view-panel=\"{view}\"")));
|
|
}
|
|
assert!(html.contains("id=\"rawTransactionsTable\""));
|
|
assert!(html.contains("id=\"rawAccountsTable\""));
|
|
assert!(html.contains("Aucune capability Store n'est encore invoquée"));
|
|
}
|
|
|
|
#[test]
|
|
fn pre_002_datatables_are_scaffold_only_with_one_pager_owner_and_no_store_pager() {
|
|
let source = include_str!("../frontend/ts/main.ts");
|
|
assert!(source.contains("datatables.net-bs5"));
|
|
assert!(source.contains("paging: true"));
|
|
assert!(source.contains("pageLength: 25"));
|
|
assert!(source.contains("lengthMenu: [25, 50, 100]"));
|
|
assert!(source.contains("serverSide: false"));
|
|
let html = include_str!("../frontend/main.html");
|
|
for forbidden in ["Premier", "Précédent", "Suivant", "storePager", "store-pagination"] {
|
|
assert!(!html.contains(forbidden), "second Store pager marker present: {forbidden}");
|
|
}
|
|
}
|