//! Device registration and listing, including the name edge cases (empty, //! unicode) and the unauthenticated rejection. use crate::common::*; const DEVICES_PATH: &str = "/api/v1/sync/devices"; // ── Device management ── #[tokio::test] async fn register_device_success() { let kit = MockKit::start().await; kit.post(DEVICES_PATH).json(device_json()).await; let device = kit .authed() .register_device("MacBook", "macos") .await .unwrap(); assert_eq!(device.device_name, "Test Device"); } #[tokio::test] async fn register_device_retries_on_transient() { let kit = MockKit::start().await; kit.post(DEVICES_PATH) .code(502) .once() .text("Bad Gateway") .await; kit.post(DEVICES_PATH).json(device_json()).await; let result = kit.authed().register_device("MacBook", "macos").await; assert!(result.is_ok(), "Should succeed after retry: {result:?}"); } #[tokio::test] async fn list_devices_success() { let kit = MockKit::start().await; kit.get(DEVICES_PATH).json(json!([device_json()])).await; let devices = kit.authed().list_devices().await.unwrap(); assert_eq!(devices.len(), 1); assert_eq!(devices[0].device_name, "Test Device"); } // ── List devices without auth ── #[tokio::test] async fn list_devices_without_auth_returns_not_authenticated() { let kit = MockKit::start().await; let err = kit.client().list_devices().await.unwrap_err(); assert!(matches!(err, SyncKitError::NotAuthenticated)); } // ── Device management edge cases ── #[tokio::test] async fn register_device_with_empty_name() { let kit = MockKit::start().await; kit.post(DEVICES_PATH).json(device_json()).await; // Empty name should not panic; server may accept or reject let result = kit.authed().register_device("", "macos").await; assert!(result.is_ok(), "Empty device name should not panic"); } #[tokio::test] async fn register_device_with_unicode_name() { let kit = MockKit::start().await; let (user_id, app_id) = test_ids(); kit.post(DEVICES_PATH) .json(json!({ "id": Uuid::new_v4(), "app_id": app_id, "user_id": user_id, "device_name": "\u{30DE}\u{30C3}\u{30AF}\u{30D6}\u{30C3}\u{30AF}", "platform": "macos", "last_seen_at": "2025-01-01T00:00:00Z", "created_at": "2025-01-01T00:00:00Z", })) .await; let device = kit .authed() .register_device("\u{30DE}\u{30C3}\u{30AF}\u{30D6}\u{30C3}\u{30AF}", "macos") .await .unwrap(); assert_eq!( device.device_name, "\u{30DE}\u{30C3}\u{30AF}\u{30D6}\u{30C3}\u{30AF}" ); } #[tokio::test] async fn list_devices_empty_array() { let kit = MockKit::start().await; kit.get(DEVICES_PATH).json(json!([])).await; let devices = kit.authed().list_devices().await.unwrap(); assert!(devices.is_empty()); }