From 804dabbdf9f9539d26ec9f082e84be9e6168c3a6 Mon Sep 17 00:00:00 2001 From: Akrm Al-Hakimi Date: Mon, 3 Nov 2025 09:56:20 -0500 Subject: [PATCH] test(core,ui): inital smoke and model/builder tests --- nmrs-core/Cargo.toml | 2 +- nmrs-core/src/config.rs | 4 ---- nmrs-core/src/lib.rs | 1 - nmrs-core/tests/models_test.rs | 25 +++++++++++++++++++++++++ nmrs-core/tests/wifi_buillders_test.rs | 26 ++++++++++++++++++++++++++ nmrs-ui/src/lib.rs | 18 ++++++++++++++++++ nmrs-ui/src/main.rs | 19 +------------------ nmrs-ui/tests/smoke_test.rs | 13 +++++++++++++ nmrs-ui/tests/style_test.rs | 9 +++++++++ 9 files changed, 93 insertions(+), 24 deletions(-) delete mode 100644 nmrs-core/src/config.rs create mode 100644 nmrs-core/tests/models_test.rs create mode 100644 nmrs-core/tests/wifi_buillders_test.rs create mode 100644 nmrs-ui/src/lib.rs create mode 100644 nmrs-ui/tests/smoke_test.rs create mode 100644 nmrs-ui/tests/style_test.rs diff --git a/nmrs-core/Cargo.toml b/nmrs-core/Cargo.toml index 4163f713..ea680cb8 100644 --- a/nmrs-core/Cargo.toml +++ b/nmrs-core/Cargo.toml @@ -9,7 +9,7 @@ zvariant = "5.7.0" serde = { version = "1", features = ["derive"] } thiserror = "2.0.16" tracing = "0.1.41" -tokio = "1.47.1" +tokio = { version = "1.48.0", features = ["rt-multi-thread", "macros", "sync", "time"] } async-io = "2.6.0" futures-timer = "3.0.3" futures-util = "0.3.31" diff --git a/nmrs-core/src/config.rs b/nmrs-core/src/config.rs deleted file mode 100644 index 9c3de96f..00000000 --- a/nmrs-core/src/config.rs +++ /dev/null @@ -1,4 +0,0 @@ -#[derive(Debug, Default)] -pub struct Config { - pub auto_connect: bool, -} diff --git a/nmrs-core/src/lib.rs b/nmrs-core/src/lib.rs index e97c2549..a8cd3a08 100644 --- a/nmrs-core/src/lib.rs +++ b/nmrs-core/src/lib.rs @@ -1,4 +1,3 @@ -pub mod config; pub mod dbus; pub mod models; pub mod wifi_builders; diff --git a/nmrs-core/tests/models_test.rs b/nmrs-core/tests/models_test.rs new file mode 100644 index 00000000..3bb7362e --- /dev/null +++ b/nmrs-core/tests/models_test.rs @@ -0,0 +1,25 @@ +use nmrs_core::models::*; + +#[test] +fn device_type_from_u32_matches_expected() { + assert_eq!(DeviceType::from(1), DeviceType::Ethernet); + assert_eq!(DeviceType::from(2), DeviceType::Wifi); + assert_eq!(DeviceType::from(999), DeviceType::Other(999)); +} + +#[test] +fn device_state_from_u32_matches_expected() { + assert_eq!(DeviceState::from(100), DeviceState::Activated); + assert_eq!(DeviceState::from(120), DeviceState::Failed); + assert_eq!(DeviceState::from(7), DeviceState::Other(7)); +} + +#[test] +fn wifi_security_flags_are_correct() { + let open = WifiSecurity::Open; + let psk = WifiSecurity::WpaPsk { psk: "abc".into() }; + assert!(!open.secured()); + assert!(psk.secured()); + assert!(psk.is_psk()); + assert!(!psk.is_eap()); +} diff --git a/nmrs-core/tests/wifi_buillders_test.rs b/nmrs-core/tests/wifi_buillders_test.rs new file mode 100644 index 00000000..7c455192 --- /dev/null +++ b/nmrs-core/tests/wifi_buillders_test.rs @@ -0,0 +1,26 @@ +use nmrs_core::models::WifiSecurity; +use nmrs_core::wifi_builders::build_wifi_connection; +use zvariant::Value; + +#[test] +fn builds_open_wifi_connection() { + let conn = build_wifi_connection("testnet", &WifiSecurity::Open); + assert!(conn.contains_key("connection")); + assert!(conn.contains_key("802-11-wireless")); + assert!(conn.contains_key("ipv4")); + assert!(conn.contains_key("ipv6")); +} + +#[test] +fn builds_psk_wifi_connection_with_security_section() { + let conn = build_wifi_connection( + "secure", + &WifiSecurity::WpaPsk { + psk: "pw123".into(), + }, + ); + let has_sec = conn.contains_key("802-11-wireless-security"); + assert!(has_sec, "security section missing"); + let sec = conn.get("802-11-wireless-security").unwrap(); + assert_eq!(sec.get("psk"), Some(&Value::from("pw123".to_string()))); +} diff --git a/nmrs-ui/src/lib.rs b/nmrs-ui/src/lib.rs new file mode 100644 index 00000000..6f7ce114 --- /dev/null +++ b/nmrs-ui/src/lib.rs @@ -0,0 +1,18 @@ +pub mod style; +pub mod ui; + +use gtk::Application; +use gtk::prelude::*; + +pub fn run() { + let app = Application::builder() + .application_id("org.netrs.ui") + .build(); + + app.connect_activate(|app| { + crate::style::load_css(); + crate::ui::build_ui(app); + }); + + app.run(); +} diff --git a/nmrs-ui/src/main.rs b/nmrs-ui/src/main.rs index 9740a696..98c2b7c0 100644 --- a/nmrs-ui/src/main.rs +++ b/nmrs-ui/src/main.rs @@ -1,21 +1,4 @@ -use gtk::Application; -use gtk::prelude::*; - -mod style; -mod ui; - -use crate::style::load_css; - #[tokio::main(flavor = "current_thread")] async fn main() { - let app = Application::builder() - .application_id("org.netrs.ui") - .build(); - - app.connect_activate(move |app| { - load_css(); - ui::build_ui(app); - }); - - app.run(); + nmrs_ui::run(); } diff --git a/nmrs-ui/tests/smoke_test.rs b/nmrs-ui/tests/smoke_test.rs new file mode 100644 index 00000000..fbe65051 --- /dev/null +++ b/nmrs-ui/tests/smoke_test.rs @@ -0,0 +1,13 @@ +#[test] +fn app_initializes_without_panic() { + // Skip when no display (e.g. in CI) + if std::env::var("CI").is_ok() { + return; + } + + gtk::init().unwrap(); + let result = std::panic::catch_unwind(|| { + nmrs_ui::run(); + }); + assert!(result.is_ok(), "UI startup panicked"); +} diff --git a/nmrs-ui/tests/style_test.rs b/nmrs-ui/tests/style_test.rs new file mode 100644 index 00000000..227fda5e --- /dev/null +++ b/nmrs-ui/tests/style_test.rs @@ -0,0 +1,9 @@ +#[test] +fn style_css_loads() { + if std::env::var("CI").is_ok() { + return; + } + + gtk::init().unwrap(); + nmrs_ui::style::load_css(); +}