//! Интеграция `Settings1` на session-шине. `#[ignore]` — запуск: `just test-integration` //! (под `dbus-run-session`). Проверяет server-стаб + `sdk::SettingsClient` по реальной шине. use futures_util::StreamExt; use shturman_common::Layout; use shturman_sdk::SettingsClient; use shturman_settings::{store::Store, SettingsService}; use zbus::zvariant::Value; #[tokio::test] #[ignore = "нужна session-шина: just test-integration"] async fn settings_round_trip_and_changed() { let tmp = tempfile::tempdir().unwrap(); let store = Store::load_or_seed(Layout::new(tmp.path())).unwrap(); // сервер на отдельном соединении (владеет ru.shturman.Settings) let server = zbus::Connection::session().await.unwrap(); server .object_server() .at("/ru/shturman/Settings", SettingsService::new(store)) .await .unwrap(); server.request_name("ru.shturman.Settings").await.unwrap(); // клиент на отдельном соединении let client_conn = zbus::Connection::session().await.unwrap(); let client = SettingsClient::new(&client_conn).await.unwrap(); // дефолт засеян let theme: String = client.get("ui.theme").await.unwrap().try_into().unwrap(); assert_eq!(theme, "auto"); // подписка на Changed до изменения let mut changed = client.proxy().receive_changed().await.unwrap(); client.set("ui.theme", &Value::from("night")).await.unwrap(); let got: String = client.get("ui.theme").await.unwrap().try_into().unwrap(); assert_eq!(got, "night"); // сигнал Changed пришёл с нужным ключом let sig = changed.next().await.unwrap(); assert_eq!(sig.args().unwrap().key(), "ui.theme"); }