Finalize nx9-wg production release

This commit is contained in:
thakares committed 2026-08-18 22:27:36 +05:30
1 parent 4dfe42fe68
commit d704c1e131
30 files changed
+2502 -370

No files matched your search

@@ -225,3 +225,171 @@ async fn test_backup_metadata_crud() {
.is_none()
);
}
#[tokio::test]
async fn test_server_endpoint_settings_crud_and_persistence() {
let store = Store::connect_in_memory().await.expect("connect");
store.migrate().await.expect("migrate");
// 1. Initial state defaults
let initial = store
.get_server_endpoint_settings()
.await
.expect("get initial");
assert_eq!(initial.host, "");
assert_eq!(initial.port, 51820);
assert!(initial.enabled);
// Initial resolution with no settings returns actionable error
let err = store.resolve_server_endpoint(None).await.unwrap_err();
assert!(
err.to_string()
.contains("No reachable WireGuard server endpoint is configured")
);
// 2. Set structured server endpoint settings
let new_settings = nx9_wg_core::types::settings::ServerEndpointSettings {
host: "vpn.thakares.com".to_string(),
port: 51820,
enabled: true,
};
store
.set_server_endpoint_settings(&new_settings)
.await
.expect("set server endpoint settings");
let loaded = store
.get_server_endpoint_settings()
.await
.expect("get loaded settings");
assert_eq!(loaded.host, "vpn.thakares.com");
assert_eq!(loaded.port, 51820);
assert!(loaded.enabled);
// 3. Resolve persistent setting
let resolved = store.resolve_server_endpoint(None).await.expect("resolve");
assert_eq!(resolved, "vpn.thakares.com:51820");
// 4. IPv6 persistence and formatting
let ipv6_settings = nx9_wg_core::types::settings::ServerEndpointSettings {
host: "2001:db8::10".to_string(),
port: 51821,
enabled: true,
};
store
.set_server_endpoint_settings(&ipv6_settings)
.await
.expect("set ipv6");
let resolved_v6 = store
.resolve_server_endpoint(None)
.await
.expect("resolve v6");
assert_eq!(resolved_v6, "[2001:db8::10]:51821");
// 5. Disable setting
let disabled = nx9_wg_core::types::settings::ServerEndpointSettings {
host: "vpn.thakares.com".to_string(),
port: 51820,
enabled: false,
};
store
.set_server_endpoint_settings(&disabled)
.await
.expect("set disabled");
let err = store.resolve_server_endpoint(None).await.unwrap_err();
assert!(
err.to_string()
.contains("No reachable WireGuard server endpoint is configured")
);
}
#[tokio::test]
async fn test_server_endpoint_resolution_precedence() {
let store = Store::connect_in_memory().await.expect("connect");
store.migrate().await.expect("migrate");
// 1. Explicit override with no settings configured
let ep = store
.resolve_server_endpoint(Some("custom.vpn.net:51820"))
.await
.expect("override");
assert_eq!(ep, "custom.vpn.net:51820");
// 2. Configure persistent settings
let settings = nx9_wg_core::types::settings::ServerEndpointSettings {
host: "persistent.vpn.io".to_string(),
port: 51820,
enabled: true,
};
store
.set_server_endpoint_settings(&settings)
.await
.expect("set");
// Precedence test: explicit override beats persistent setting
let overridden = store
.resolve_server_endpoint(Some("override.vpn.io:5555"))
.await
.expect("override beats persistent");
assert_eq!(overridden, "override.vpn.io:5555");
// Precedence test: None uses persistent setting
let default_resolved = store.resolve_server_endpoint(None).await.expect("default");
assert_eq!(default_resolved, "persistent.vpn.io:51820");
// 3. Legacy fallback test when wireguard.server_host is missing
store
.delete_setting(nx9_wg_core::types::settings::SETTING_SERVER_HOST)
.await
.expect("delete new host");
store
.set_setting("server_endpoint", "legacy.vpn.org:51820", false)
.await
.expect("set legacy");
let legacy_resolved = store
.resolve_server_endpoint(None)
.await
.expect("legacy resolved");
assert_eq!(legacy_resolved, "legacy.vpn.org:51820");
}
#[tokio::test]
async fn test_server_endpoint_survives_reopen() {
let temp_dir = tempfile::tempdir().expect("temp dir");
let db_path = temp_dir.path().join("persist_endpoint.db");
let db_url = format!("sqlite://{}?mode=rwc", db_path.display());
{
let store = Store::connect(&db_url).await.expect("connect 1");
store.migrate().await.expect("migrate 1");
let settings = nx9_wg_core::types::settings::ServerEndpointSettings {
host: "vpn.thakares.com".to_string(),
port: 51820,
enabled: true,
};
store
.set_server_endpoint_settings(&settings)
.await
.expect("set");
}
// Reconnect to existing store on disk
{
let store = Store::connect(&db_url).await.expect("connect 2");
let loaded = store
.get_server_endpoint_settings()
.await
.expect("get after reopen");
assert_eq!(loaded.host, "vpn.thakares.com");
assert_eq!(loaded.port, 51820);
assert!(loaded.enabled);
let resolved = store
.resolve_server_endpoint(None)
.await
.expect("resolve after reopen");
assert_eq!(resolved, "vpn.thakares.com:51820");
}
}