diff --git a/core/sdk/src/api/accessory.rs b/core/sdk/src/api/accessory.rs index 82377100b..2c2649390 100644 --- a/core/sdk/src/api/accessory.rs +++ b/core/sdk/src/api/accessory.rs @@ -25,7 +25,7 @@ use crate::{ use super::device::device_accessory::{AccessoryDeviceListResponse, AccessoryDeviceResponse}; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub enum RemoteAccessoryResponse { None(()), @@ -58,3 +58,15 @@ impl ExtnPayloadProvider for RemoteAccessoryResponse { RippleContract::RemoteAccessory } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + #[test] + fn test_extn_payload_provider_for_remote_accessory_response() { + let remote_accessory_response = RemoteAccessoryResponse::Boolean(true); + let contract_type = RippleContract::RemoteAccessory; + test_extn_payload_provider(remote_accessory_response, contract_type); + } +} diff --git a/core/sdk/src/api/account_link.rs b/core/sdk/src/api/account_link.rs index bbf83c41f..3468dc890 100644 --- a/core/sdk/src/api/account_link.rs +++ b/core/sdk/src/api/account_link.rs @@ -26,7 +26,7 @@ use super::{ gateway::rpc_gateway_api::CallContext, }; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub enum AccountLinkRequest { SignIn(CallContext), @@ -36,7 +36,7 @@ pub enum AccountLinkRequest { Watched(WatchedRequest), } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct WatchedRequest { pub context: CallContext, @@ -61,3 +61,30 @@ impl ExtnPayloadProvider for AccountLinkRequest { RippleContract::AccountLink } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::api::account_link::AccountLinkRequest; + use crate::api::gateway::rpc_gateway_api::{ApiProtocol, CallContext}; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_account_link() { + let call_context = CallContext { + session_id: "test_session_id".to_string(), + request_id: "test_request_id".to_string(), + app_id: "test_app_id".to_string(), + call_id: 123, + protocol: ApiProtocol::Bridge, + method: "some_method".to_string(), + cid: Some("test_cid".to_string()), + gateway_secure: true, + }; + + let account_link_request = AccountLinkRequest::SignIn(call_context); + let contract_type: RippleContract = RippleContract::AccountLink; + + test_extn_payload_provider(account_link_request, contract_type); + } +} diff --git a/core/sdk/src/api/app_catalog.rs b/core/sdk/src/api/app_catalog.rs index 677ab154f..821ffc381 100644 --- a/core/sdk/src/api/app_catalog.rs +++ b/core/sdk/src/api/app_catalog.rs @@ -5,7 +5,7 @@ use crate::{ framework::ripple_contract::RippleContract, }; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum AppCatalogRequest { CheckForUpdates, } @@ -27,7 +27,7 @@ impl ExtnPayloadProvider for AppCatalogRequest { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AppMetadata { pub id: String, pub title: String, @@ -54,7 +54,7 @@ impl AppMetadata { } } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub struct AppsUpdate { pub apps: Vec, } @@ -82,3 +82,31 @@ impl ExtnPayloadProvider for AppsUpdate { RippleContract::AppCatalog } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_app_catalog() { + let check_for_updates_request = AppCatalogRequest::CheckForUpdates; + let contract_type: RippleContract = RippleContract::AppCatalog; + test_extn_payload_provider(check_for_updates_request, contract_type); + } + + #[test] + fn test_extn_payload_provider_for_apps_update() { + let apps_update = AppsUpdate { + apps: vec![AppMetadata { + id: String::from("app1"), + title: String::from("App 1"), + version: String::from("1.0"), + uri: String::from("https://example.com/app1"), + data: Some(String::from("app1_data")), + }], + }; + let contract_type: RippleContract = RippleContract::AppCatalog; + test_extn_payload_provider(apps_update, contract_type); + } +} diff --git a/core/sdk/src/api/apps.rs b/core/sdk/src/api/apps.rs index df3bb8e54..6d6f8a64f 100644 --- a/core/sdk/src/api/apps.rs +++ b/core/sdk/src/api/apps.rs @@ -37,7 +37,7 @@ use super::{ gateway::rpc_gateway_api::CallContext, }; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AppSession { pub app: AppBasicInfo, #[serde(skip_serializing_if = "Option::is_none")] @@ -68,7 +68,7 @@ impl AppSession { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AppBasicInfo { pub id: String, pub catalog: Option, @@ -76,7 +76,7 @@ pub struct AppBasicInfo { pub title: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "lowercase")] pub enum AppRuntimeTransport { Bridge, @@ -87,14 +87,14 @@ fn runtime_transport_default() -> AppRuntimeTransport { AppRuntimeTransport::Websocket } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AppRuntime { pub id: Option, #[serde(default = "runtime_transport_default")] pub transport: AppRuntimeTransport, } -#[derive(Debug, Default, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Default, Serialize, Deserialize, Clone)] pub struct AppLaunchInfo { #[serde(default, skip_serializing_if = "Option::is_none")] pub intent: Option, @@ -177,7 +177,7 @@ impl AppRequest { } } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub enum AppManagerResponse { None, State(LifecycleState), @@ -227,7 +227,7 @@ pub enum AppMethod { NewLoadedSession(AppSession), } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub enum CloseReason { RemoteButton, @@ -274,7 +274,7 @@ pub struct AppEvent { pub app_id: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum AppEventRequest { Emit(AppEvent), Register(CallContext, String, ListenRequest), @@ -301,3 +301,29 @@ impl ExtnPayloadProvider for AppEventRequest { RippleContract::AppEvents } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_payload_provider_for_app_response() { + let app_response: AppResponse = Ok(AppManagerResponse::State(LifecycleState::Initializing)); + let contract_type: RippleContract = RippleContract::LifecycleManagement; + test_extn_payload_provider(app_response, contract_type); + } + + #[test] + fn test_extn_payload_provider_for_app_event_request() { + let app_event_request = AppEventRequest::Emit(AppEvent { + event_name: String::from("your_event_name"), + result: serde_json::to_value("your_event_result").unwrap(), + context: Some(serde_json::to_value("your_event_context").unwrap()), + app_id: Some(String::from("your_app_id")), + }); + + let contract_type: RippleContract = RippleContract::AppEvents; + test_extn_payload_provider(app_event_request, contract_type); + } +} diff --git a/core/sdk/src/api/caps.rs b/core/sdk/src/api/caps.rs index c1d387dd4..c9b84d837 100644 --- a/core/sdk/src/api/caps.rs +++ b/core/sdk/src/api/caps.rs @@ -23,7 +23,7 @@ use crate::{ use super::firebolt::fb_capabilities::RoleInfo; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub enum CapsRequest { Permitted(String, Vec), @@ -47,3 +47,30 @@ impl ExtnPayloadProvider for CapsRequest { RippleContract::Caps } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::api::firebolt::fb_capabilities::{CapabilityRole, FireboltCap}; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_caps() { + let app_id = "test_app_id".to_string(); + let role_infos = vec![ + RoleInfo { + role: Some(CapabilityRole::Use), + capability: FireboltCap::Short("test_short_cap".to_string()), + }, + RoleInfo { + role: Some(CapabilityRole::Manage), + capability: FireboltCap::Full("test_full_cap".to_string()), + }, + ]; + + let caps_request = CapsRequest::Permitted(app_id, role_infos); + + let contract_type: RippleContract = RippleContract::Caps; + test_extn_payload_provider(caps_request, contract_type); + } +} diff --git a/core/sdk/src/api/config.rs b/core/sdk/src/api/config.rs index 52c034bf6..87f71b672 100644 --- a/core/sdk/src/api/config.rs +++ b/core/sdk/src/api/config.rs @@ -32,7 +32,7 @@ use super::manifest::{ use super::manifest::device_manifest::AppLibraryEntry; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub enum Config { AllDefaultApps, DefaultApp, @@ -87,7 +87,7 @@ impl ExtnPayloadProvider for Config { } } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub struct RfcRequest { pub flag: String, } @@ -122,7 +122,7 @@ pub enum ConfigResponse { IdSalt(IdSalt), } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub struct LauncherConfig { pub retention_policy: RetentionPolicy, pub lifecycle_policy: LifecyclePolicy, @@ -150,3 +150,53 @@ impl ExtnPayloadProvider for LauncherConfig { RippleContract::Config } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::api::manifest::device_manifest::{AppManifestLoad, BootState}; + use crate::utils::test_utils::test_extn_payload_provider; + use std::collections::HashMap; + + #[test] + fn test_extn_request_config() { + let contract_type: RippleContract = RippleContract::Config; + test_extn_payload_provider(Config::DefaultValues, contract_type); + } + + #[test] + fn test_extn_payload_provider_for_rfc_request() { + let rfc_request = RfcRequest { + flag: String::from("test_flag"), + }; + let contract_type: RippleContract = RippleContract::RemoteFeatureControl; + test_extn_payload_provider(rfc_request, contract_type); + } + + #[test] + fn test_extn_payload_provider_for_launcher_config() { + let launcher_config = LauncherConfig { + retention_policy: RetentionPolicy { + max_retained: 10, + min_available_mem_kb: 1024, + always_retained: vec!["app1".to_string(), "app2".to_string()], + }, + lifecycle_policy: LifecyclePolicy { + app_ready_timeout_ms: 5000, + app_finished_timeout_ms: 10000, + }, + app_library_state: AppLibraryState { + default_apps: vec![AppLibraryEntry { + app_id: "app1".to_string(), + manifest: AppManifestLoad::Remote( + "https://example.com/app1/manifest".to_string(), + ), + boot_state: BootState::Inactive, + }], + providers: HashMap::new(), + }, + }; + let contract_type: RippleContract = RippleContract::Config; + test_extn_payload_provider(launcher_config, contract_type); + } +} diff --git a/core/sdk/src/api/context.rs b/core/sdk/src/api/context.rs index 401d30d7e..768f540fd 100644 --- a/core/sdk/src/api/context.rs +++ b/core/sdk/src/api/context.rs @@ -30,7 +30,7 @@ use super::device::device_request::{ AccountToken, InternetConnectionStatus, SystemPowerState, TimeZone, }; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub enum ActivationStatus { NotActivated, AccountToken(AccountToken), @@ -53,7 +53,7 @@ impl From for ActivationStatus { } } -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] pub struct RippleContext { pub activation_status: ActivationStatus, pub internet_connectivity: InternetConnectionStatus, @@ -62,7 +62,7 @@ pub struct RippleContext { pub update_type: Option, } -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] pub enum RippleContextUpdateType { ActivationStatusChanged, TokenChanged, @@ -160,7 +160,7 @@ impl ExtnPayloadProvider for RippleContext { } } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub enum RippleContextUpdateRequest { Activation(bool), Token(AccountToken), @@ -192,3 +192,37 @@ impl ExtnPayloadProvider for RippleContextUpdateRequest { RippleContract::RippleContext } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::api::device::device_request::PowerState; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_ripple_context_update() { + let activation_request = RippleContextUpdateRequest::Activation(true); + let contract_type: RippleContract = RippleContract::RippleContext; + test_extn_payload_provider(activation_request, contract_type); + } + + #[test] + fn test_extn_payload_provider_for_ripple_context() { + let ripple_context = RippleContext { + activation_status: ActivationStatus::NotActivated, + internet_connectivity: InternetConnectionStatus::FullyConnected, + system_power_state: SystemPowerState { + power_state: PowerState::On, + current_power_state: PowerState::On, + }, + time_zone: TimeZone { + time_zone: String::from("America/Los_Angeles"), + offset: -28800, + }, + update_type: None, + }; + + let contract_type: RippleContract = RippleContract::RippleContext; + test_extn_payload_provider(ripple_context, contract_type); + } +} diff --git a/core/sdk/src/api/device/device_accessory.rs b/core/sdk/src/api/device/device_accessory.rs index cde73dcb1..3f9af5805 100644 --- a/core/sdk/src/api/device/device_accessory.rs +++ b/core/sdk/src/api/device/device_accessory.rs @@ -24,7 +24,7 @@ use crate::{ use async_trait::async_trait; use serde::{Deserialize, Serialize}; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum RemoteAccessoryRequest { Pair(AccessoryPairRequest), List(AccessoryListRequest), @@ -63,7 +63,7 @@ pub trait AccessoryService { /// AccessoryPairRequest{_type: AccessoryType::Remote, protocol: AccessoryProtocol::BluetoothLE , timeout: 180}; /// -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AccessoryPairRequest { #[serde(rename = "type")] pub _type: AccessoryType, @@ -109,7 +109,7 @@ pub enum AccessoryType { /// AccessoryListType::Speaker; // List of Speakers connected to the Device. /// AccessoryListType::All; // All Paired accesories connected to the Device. /// ``` -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum AccessoryListType { Remote, Speaker, @@ -127,7 +127,7 @@ pub enum AccessoryListType { /// AccessoryProtocolListType::All; // All Paired accesories connected to the Device. /// ``` /// -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum AccessoryProtocolListType { BluetoothLE, RF4CE, @@ -154,7 +154,7 @@ pub enum AccessoryProtocolListType { /// use ripple_sdk::api::device::device_accessory::{AccessoryListType,AccessoryProtocolListType,AccessoryListRequest}; /// AccessoryListRequest{_type: Some(AccessoryListType::All), protocol: Some(AccessoryProtocolListType::All)}; /// ``` -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AccessoryListRequest { #[serde(rename = "type")] pub _type: Option, @@ -206,7 +206,7 @@ impl AccessoryProtocol { /// let response = AccessoryDeviceResponse{_type: AccessoryType::Remote, protocol: AccessoryProtocol::BluetoothLE , make: "Some Company".into(), model: "Some model".into()}; /// ``` /// -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AccessoryDeviceResponse { #[serde(rename = "type")] pub _type: AccessoryType, @@ -215,7 +215,27 @@ pub struct AccessoryDeviceResponse { pub protocol: AccessoryProtocol, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AccessoryDeviceListResponse { pub list: Vec, } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_payload_provider_for_remote_accessory_request() { + let accessory_pair_request = AccessoryPairRequest { + _type: AccessoryType::Remote, + protocol: AccessoryProtocol::BluetoothLE, + timeout: 5000, + }; + + let remote_accessory_request = RemoteAccessoryRequest::Pair(accessory_pair_request); + + let contract_type: RippleContract = RippleContract::RemoteAccessory; + test_extn_payload_provider(remote_accessory_request, contract_type); + } +} diff --git a/core/sdk/src/api/device/device_apps.rs b/core/sdk/src/api/device/device_apps.rs index 029f3699d..58e0b4039 100644 --- a/core/sdk/src/api/device/device_apps.rs +++ b/core/sdk/src/api/device/device_apps.rs @@ -24,7 +24,7 @@ use crate::{ use super::device_request::DeviceRequest; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum AppsRequest { GetApps(Option), InstallApp(AppMetadata), @@ -82,3 +82,17 @@ impl ExtnPayloadProvider for AppsRequest { RippleContract::Apps } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_payload_provider_for_apps_request_get_apps() { + let get_apps_request = AppsRequest::GetApps(Some(String::from("filter_criteria"))); + + let contract_type: RippleContract = RippleContract::Apps; + test_extn_payload_provider(get_apps_request, contract_type); + } +} diff --git a/core/sdk/src/api/device/device_browser.rs b/core/sdk/src/api/device/device_browser.rs index 3af1e6d54..85100be97 100644 --- a/core/sdk/src/api/device/device_browser.rs +++ b/core/sdk/src/api/device/device_browser.rs @@ -24,7 +24,7 @@ use crate::{ use super::device_request::DeviceRequest; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "lowercase")] pub struct BrowserProps { pub user_agent: Option, @@ -43,7 +43,7 @@ impl BrowserProps { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct BrowserLaunchParams { pub uri: String, pub browser_name: String, @@ -69,19 +69,19 @@ impl BrowserLaunchParams { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct BrowserDestroyParams { pub browser_name: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct BrowserNameRequestParams { pub runtime: String, pub name: String, pub instances: usize, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum BrowserRequest { Start(BrowserLaunchParams), Destroy(BrowserDestroyParams), @@ -105,3 +105,38 @@ impl ExtnPayloadProvider for BrowserRequest { RippleContract::Browser } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_payload_provider_for_browser_request_start() { + let start_params = BrowserLaunchParams { + uri: String::from("https://example.com"), + browser_name: String::from("chrome"), + _type: String::from("web"), + visible: true, + suspend: false, + focused: true, + name: String::from("browser_instance"), + x: 0, + y: 0, + w: 800, + h: 600, + properties: Some(BrowserProps { + user_agent: Some(String::from("Mozilla/5.0")), + http_cookie_accept_policy: Some(String::from("all")), + local_storage_enabled: Some(true), + languages: Some(String::from("en-US")), + headers: Some(String::from("custom-headers")), + }), + }; + + let browser_start_request = BrowserRequest::Start(start_params); + + let contract_type: RippleContract = RippleContract::Browser; + test_extn_payload_provider(browser_start_request, contract_type); + } +} diff --git a/core/sdk/src/api/device/device_events.rs b/core/sdk/src/api/device/device_events.rs index 64805cb9a..8575e112f 100644 --- a/core/sdk/src/api/device/device_events.rs +++ b/core/sdk/src/api/device/device_events.rs @@ -42,7 +42,7 @@ pub const POWER_STATE_CHANGED: &str = "device.onPowerStateChanged"; pub const TIME_ZONE_CHANGED: &str = "localization.onTimeZoneChanged"; // Is this from the device to thunder event handler??? -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub enum DeviceEvent { InputChanged, HdrChanged, @@ -76,7 +76,7 @@ impl FromStr for DeviceEvent { } } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub enum DeviceEventCallback { FireboltAppEvent(String), ExtnEvent, @@ -91,7 +91,7 @@ impl DeviceEventCallback { } } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub struct DeviceEventRequest { pub event: DeviceEvent, pub subscribe: bool, @@ -139,3 +139,20 @@ impl ExtnPayloadProvider for DeviceEventRequest { RippleContract::DeviceEvents(EventAdjective::Input) } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_device_event() { + let device_event_request = DeviceEventRequest { + event: DeviceEvent::InputChanged, + subscribe: true, + callback_type: DeviceEventCallback::FireboltAppEvent("id".to_string()), + }; + let contract_type: RippleContract = RippleContract::DeviceEvents(EventAdjective::Input); + test_extn_payload_provider(device_event_request, contract_type); + } +} diff --git a/core/sdk/src/api/device/device_info_request.rs b/core/sdk/src/api/device/device_info_request.rs index 7411e5e6b..a74f36c42 100644 --- a/core/sdk/src/api/device/device_info_request.rs +++ b/core/sdk/src/api/device/device_info_request.rs @@ -33,7 +33,7 @@ pub const DEVICE_SKU_AUTHORIZED: &str = "device_sku_authorized"; pub const DEVICE_MAKE_MODEL_AUTHORIZED: &str = "device_make_model_authorized"; pub const DEVICE_NETWORK_STATUS_AUTHORIZED: &str = "network_status_authorized"; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub enum DeviceInfoRequest { MacAddress, Model, @@ -83,7 +83,7 @@ impl ExtnPayloadProvider for DeviceInfoRequest { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct DeviceCapabilities { pub video_resolution: Option>, @@ -105,7 +105,7 @@ pub struct PlatformBuildInfo { pub debug: bool, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub enum DeviceResponse { CustomError(String), AudioProfileResponse(HashMap), @@ -143,3 +143,23 @@ impl ExtnPayloadProvider for DeviceResponse { RippleContract::DeviceInfo } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_device_info_request() { + let contract_type: RippleContract = RippleContract::DeviceInfo; + test_extn_payload_provider(DeviceInfoRequest::MacAddress, contract_type); + } + + #[test] + fn test_extn_payload_provider_for_device_response() { + let device_response = DeviceResponse::PowerState(PowerState::Standby); + + let contract_type: RippleContract = RippleContract::DeviceInfo; + test_extn_payload_provider(device_response, contract_type); + } +} diff --git a/core/sdk/src/api/device/device_peristence.rs b/core/sdk/src/api/device/device_peristence.rs index f5fd163f2..59bac523f 100644 --- a/core/sdk/src/api/device/device_peristence.rs +++ b/core/sdk/src/api/device/device_peristence.rs @@ -26,7 +26,7 @@ use serde_json::Value; use super::device_request::DeviceRequest; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct StorageData { pub value: Value, pub update_time: String, // ISO 8601/RFC3339 format @@ -71,13 +71,13 @@ pub struct SetF32Property { pub value: f32, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct GetStorageProperty { pub namespace: String, pub key: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct SetStorageProperty { pub namespace: String, pub key: String, @@ -86,7 +86,7 @@ pub struct SetStorageProperty { pub type DeleteStorageProperty = GetStorageProperty; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum DevicePersistenceRequest { Get(GetStorageProperty), Set(SetStorageProperty), @@ -110,3 +110,22 @@ impl ExtnPayloadProvider for DevicePersistenceRequest { RippleContract::Storage(StorageAdjective::Local) } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_payload_provider_for_device_persistence_request_get() { + let get_request = GetStorageProperty { + namespace: String::from("example_namespace"), + key: String::from("example_key"), + }; + + let device_persistence_get_request = DevicePersistenceRequest::Get(get_request); + + let contract_type: RippleContract = RippleContract::Storage(StorageAdjective::Local); + test_extn_payload_provider(device_persistence_get_request, contract_type); + } +} diff --git a/core/sdk/src/api/device/device_request.rs b/core/sdk/src/api/device/device_request.rs index 09cedfc4f..b6b055983 100644 --- a/core/sdk/src/api/device/device_request.rs +++ b/core/sdk/src/api/device/device_request.rs @@ -93,7 +93,7 @@ impl std::fmt::Display for AudioProfile { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AccountToken { pub token: String, pub expires: u64, @@ -162,7 +162,7 @@ impl FromStr for NetworkType { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct HDCPStatus { pub is_connected: bool, @@ -208,7 +208,7 @@ impl Resolution { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct OnInternetConnectedRequest { pub timeout: u64, } @@ -250,7 +250,7 @@ impl FromStr for PowerState { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct SystemPowerState { pub power_state: PowerState, @@ -292,7 +292,7 @@ impl ExtnPayloadProvider for TimeZone { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct VoiceGuidanceState { pub state: bool, @@ -319,6 +319,7 @@ impl ExtnPayloadProvider for VoiceGuidanceState { #[cfg(test)] mod tests { use super::*; + use crate::utils::test_utils::test_extn_payload_provider; #[test] fn test_language_serializer() { @@ -342,4 +343,23 @@ mod tests { // let tz = "{\"value\":\"America/New_York\"}"; // assert!(serde_json::from_str::(tz).is_ok()); // } + + #[test] + fn test_extn_payload_provider_for_time_zone() { + let time_zone = TimeZone { + time_zone: String::from("America/Los_Angeles"), + offset: -28800, + }; + + let contract_type: RippleContract = RippleContract::DeviceEvents(EventAdjective::TimeZone); + test_extn_payload_provider(time_zone, contract_type); + } + + #[test] + fn test_extn_payload_provider_for_voice_guidance_state() { + let voice_guidance_state = VoiceGuidanceState { state: true }; + + let contract_type: RippleContract = RippleContract::VoiceGuidance; + test_extn_payload_provider(voice_guidance_state, contract_type); + } } diff --git a/core/sdk/src/api/device/device_wifi.rs b/core/sdk/src/api/device/device_wifi.rs index 9702e0e9f..582c64d1c 100644 --- a/core/sdk/src/api/device/device_wifi.rs +++ b/core/sdk/src/api/device/device_wifi.rs @@ -25,7 +25,7 @@ use crate::{ use super::device_request::DeviceRequest; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub enum WifiSecurityMode { None, @@ -45,7 +45,7 @@ pub enum WifiSecurityMode { Wpa3Sae, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct AccessPointRequest { pub ssid: String, @@ -59,13 +59,13 @@ pub struct WifiScanRequest { pub timeout: u64, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum WifiRequest { Scan(u64), Connect(AccessPointRequest), } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct AccessPoint { pub ssid: String, @@ -74,7 +74,7 @@ pub struct AccessPoint { pub frequency: f32, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AccessPointList { pub list: Vec, } @@ -96,3 +96,17 @@ impl ExtnPayloadProvider for WifiRequest { RippleContract::Wifi } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_payload_provider_for_wifi_scan_request() { + let wifi_scan_request = WifiRequest::Scan(5000); + + let contract_type: RippleContract = RippleContract::Wifi; + test_extn_payload_provider(wifi_scan_request, contract_type); + } +} diff --git a/core/sdk/src/api/device/device_window_manager.rs b/core/sdk/src/api/device/device_window_manager.rs index f88c5316a..73cfe71c6 100644 --- a/core/sdk/src/api/device/device_window_manager.rs +++ b/core/sdk/src/api/device/device_window_manager.rs @@ -25,7 +25,7 @@ use crate::{ use super::device_request::DeviceRequest; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum WindowManagerRequest { Visibility(String, bool), MoveToFront(String), @@ -81,3 +81,18 @@ impl ExtnPayloadProvider for WindowManagerRequest { RippleContract::WindowManager } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_payload_provider_for_visibility_request() { + let visibility_request = + WindowManagerRequest::Visibility(String::from("window_id_1"), true); + + let contract_type: RippleContract = RippleContract::WindowManager; + test_extn_payload_provider(visibility_request, contract_type); + } +} diff --git a/core/sdk/src/api/device/entertainment_data.rs b/core/sdk/src/api/device/entertainment_data.rs index 2bc37439b..905a4750b 100644 --- a/core/sdk/src/api/device/entertainment_data.rs +++ b/core/sdk/src/api/device/entertainment_data.rs @@ -203,7 +203,7 @@ impl Default for EntityInfo { #[allow(dead_code)] pub const SYNOPSIS: &str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc."; -#[derive(Clone, Serialize, Deserialize, Debug)] +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)] #[serde(rename_all = "camelCase")] pub enum ProgramType { Movie, @@ -220,7 +220,7 @@ pub enum ProgramType { Minisode, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub enum MusicType { Song, @@ -384,7 +384,7 @@ pub struct ContentPolicy { pub remember_watched_programs: bool, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(untagged)] pub enum NavigationIntent { NavigationIntentStrict(NavigationIntentStrict), @@ -393,7 +393,7 @@ pub enum NavigationIntent { // Original Navigation Intent is untagged meaning it cant be used to serialize again when passed between extensions which also uses serde // To avoid the data loss during IEC InternalNavigationIntent is created so the Firebolt specification is not affected -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum InternalNavigationIntent { NavigationIntentStrict(InternalNavigationIntentStrict), NavigationIntentLoose(NavigationIntentLoose), @@ -428,7 +428,7 @@ impl Default for NavigationIntent { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(tag = "action", rename_all = "kebab-case", deny_unknown_fields)] pub enum NavigationIntentStrict { @@ -444,7 +444,7 @@ pub enum NavigationIntentStrict { PlayQuery(PlayQueryIntent), } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(tag = "action", rename_all = "kebab-case", deny_unknown_fields)] pub enum InternalNavigationIntentStrict { @@ -505,7 +505,7 @@ pub struct Context { } */ -#[derive(Serialize, Deserialize, Clone, Debug)] +#[derive(Serialize, PartialEq, Deserialize, Clone, Debug)] pub struct NavigationIntentLoose { pub action: String, pub data: Option, @@ -518,7 +518,7 @@ impl Default for NavigationIntentStrict { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct HomeIntent { pub context: DiscoveryContext, } @@ -533,19 +533,19 @@ impl Default for HomeIntent { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct LaunchIntent { pub context: DiscoveryContext, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct EntityIntent { #[serde(deserialize_with = "entity_data_deserialize")] pub data: EntityIntentData, pub context: DiscoveryContext, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct InternalEntityIntent { pub data: EntityIntentData, pub context: DiscoveryContext, @@ -569,7 +569,7 @@ impl From for InternalEntityIntent { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(untagged)] pub enum EntityIntentData { Program(ProgramEntityIntentData), @@ -631,7 +631,7 @@ where Ok(val) } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(tag = "programType", rename_all = "camelCase")] pub enum ProgramEntityIntentData { #[serde(alias = "Movie", alias = "MOVIE")] @@ -660,7 +660,7 @@ pub enum ProgramEntityIntentData { Extra(AdditionalEntity), } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct BaseEntity { #[serde(default)] @@ -672,7 +672,7 @@ pub struct BaseEntity { pub app_content_data: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AppContentDataString(String); impl fmt::Display for AppContentDataString { @@ -687,7 +687,7 @@ impl fmt::Display for AppContentDataString { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct ProgramEntityType(String); impl Default for ProgramEntityType { @@ -696,14 +696,14 @@ impl Default for ProgramEntityType { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct MovieEntity { #[serde(flatten)] pub base_entity: BaseEntity, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct TVEpisodeEntity { #[serde(flatten)] @@ -712,7 +712,7 @@ pub struct TVEpisodeEntity { pub season_id: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct TVSeasonEntity { #[serde(flatten)] @@ -720,28 +720,28 @@ pub struct TVSeasonEntity { pub series_id: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct TVSeriesEntity { #[serde(flatten)] pub base_entity: BaseEntity, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct AdditionalEntity { #[serde(flatten)] pub base_entity: BaseEntity, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct PlaylistEntity { #[serde(flatten)] pub base_entity: BaseEntity, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct UntypedEntity { pub entity_id: String, @@ -749,19 +749,19 @@ pub struct UntypedEntity { pub app_content_data: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct TuneIntent { pub data: TuneIntentData, pub context: DiscoveryContext, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct TuneIntentData { pub entity: ChannelEntity, pub options: TuneIntentDataOptions, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct ChannelEntityType(String); impl Default for ChannelEntityType { @@ -770,7 +770,7 @@ impl Default for ChannelEntityType { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct ChannelEntity { #[serde(default)] @@ -780,14 +780,14 @@ pub struct ChannelEntity { pub app_content_data: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "lowercase")] pub enum ChannelType { Streaming, OverTheAir, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct TuneIntentDataOptions { pub asset_id: Option, @@ -795,13 +795,13 @@ pub struct TuneIntentDataOptions { pub time: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct PlaybackIntent { pub data: ProgramTypeEntity, pub context: DiscoveryContext, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct PlayEntityIntent { #[serde(deserialize_with = "play_entity_intent_validator")] pub data: PlayEntityIntentData, @@ -830,13 +830,13 @@ where Ok(val) } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct PlayEntityIntentData { pub entity: BaseEntity, pub options: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct PlayEntityIntentDataOptions { pub play_first_id: Option, @@ -858,26 +858,26 @@ impl PlayEntityIntentDataOptions { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct PlayQueryIntent { pub data: PlayQueryIntentData, pub context: DiscoveryContext, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct PlayQueryIntentData { pub query: String, pub options: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct PlayQueryIntentDataOptions { pub program_types: Option>, pub music_types: Option>, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(tag = "programType", rename_all = "camelCase")] pub enum ProgramTypeEntity { #[serde(alias = "Movie", alias = "MOVIE")] @@ -904,30 +904,30 @@ pub enum ProgramTypeEntity { Playlist(PlaylistEntity), } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct SearchIntent { pub data: SearchIntentData, pub context: DiscoveryContext, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct SearchIntentData { pub query: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct SectionIntent { pub data: SectionIntentData, pub context: DiscoveryContext, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct SectionIntentData { pub section_name: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct ProviderRequestIntent { pub context: DiscoveryContext, } diff --git a/core/sdk/src/api/distributor/distributor_discovery.rs b/core/sdk/src/api/distributor/distributor_discovery.rs index 5f7d73eb0..0cadd54b3 100644 --- a/core/sdk/src/api/distributor/distributor_discovery.rs +++ b/core/sdk/src/api/distributor/distributor_discovery.rs @@ -28,7 +28,7 @@ use crate::{ use super::distributor_request::DistributorRequest; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum DiscoveryRequest { SetContentAccess(ContentAccessListSetParams), ClearContent(ClearContentSetParams), @@ -57,7 +57,7 @@ impl ExtnPayloadProvider for DiscoveryRequest { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum MediaEventRequest { MediaEventAccountLink(MediaEventsAccountLinkRequestParams), } @@ -83,3 +83,76 @@ impl ExtnPayloadProvider for MediaEventRequest { RippleContract::MediaEvents } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::api::firebolt::fb_discovery::{ + ContentAccessEntitlement, ContentAccessInfo, ContentAccessListSetParams, SessionParams, + }; + use crate::api::firebolt::fb_discovery::{MediaEvent, ProgressUnit}; + use crate::api::session::AccountSession; + use crate::utils::test_utils::test_extn_payload_provider; + use std::collections::HashSet; + + #[test] + fn test_extn_request_discovery() { + let content_access_entitlement = ContentAccessEntitlement { + entitlement_id: "test_entitlement_id".to_string(), + start_time: Some("2024-01-26T12:00:00Z".to_string()), + end_time: Some("2024-02-01T12:00:00Z".to_string()), + }; + + let content_access_info = ContentAccessInfo { + availabilities: Some(vec![]), + entitlements: Some(vec![content_access_entitlement]), + }; + + let session_params = SessionParams { + app_id: "test_app_id".to_string(), + dist_session: AccountSession { + id: "test_session_id".to_string(), + token: "test_token".to_string(), + account_id: "test_account_id".to_string(), + device_id: "test_device_id".to_string(), + }, + }; + + let content_access_list_set_params = ContentAccessListSetParams { + session_info: session_params, + content_access_info, + }; + + let discovery_request = DiscoveryRequest::SetContentAccess(content_access_list_set_params); + let contract_type: RippleContract = RippleContract::Discovery; + + test_extn_payload_provider(discovery_request, contract_type); + } + + #[test] + fn test_extn_payload_provider_for_media_event_request() { + let media_event_request = + MediaEventRequest::MediaEventAccountLink(MediaEventsAccountLinkRequestParams { + media_event: MediaEvent { + content_id: String::from("your_content_id"), + completed: true, + progress: 0.75, + progress_unit: Some(ProgressUnit::Percent), + watched_on: Some(String::from("2024-01-26")), + app_id: String::from("your_app_id"), + }, + content_partner_id: String::from("your_content_partner_id"), + client_supports_opt_out: true, + dist_session: AccountSession { + id: String::from("your_session_id"), + token: String::from("your_token"), + account_id: String::from("your_account_id"), + device_id: String::from("your_device_id"), + }, + data_tags: HashSet::new(), + }); + + let contract_type: RippleContract = RippleContract::MediaEvents; + test_extn_payload_provider(media_event_request, contract_type); + } +} diff --git a/core/sdk/src/api/distributor/distributor_encoder.rs b/core/sdk/src/api/distributor/distributor_encoder.rs index 66b4e5d79..cfe91d3eb 100644 --- a/core/sdk/src/api/distributor/distributor_encoder.rs +++ b/core/sdk/src/api/distributor/distributor_encoder.rs @@ -24,7 +24,7 @@ use crate::{ use super::distributor_request::DistributorRequest; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct EncoderRequest { pub reference: String, pub scope: String, @@ -50,3 +50,20 @@ impl ExtnPayloadProvider for EncoderRequest { RippleContract::Encoder } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_payload_provider_for_encoder_request() { + let encoder_request = EncoderRequest { + reference: String::from("example_reference"), + scope: String::from("example_scope"), + }; + + let contract_type: RippleContract = RippleContract::Encoder; + test_extn_payload_provider(encoder_request, contract_type); + } +} diff --git a/core/sdk/src/api/distributor/distributor_permissions.rs b/core/sdk/src/api/distributor/distributor_permissions.rs index b969d0153..ed419a977 100644 --- a/core/sdk/src/api/distributor/distributor_permissions.rs +++ b/core/sdk/src/api/distributor/distributor_permissions.rs @@ -23,7 +23,7 @@ use crate::{ framework::ripple_contract::RippleContract, }; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub struct PermissionRequest { pub app_id: String, pub session: AccountSession, @@ -66,3 +66,47 @@ impl ExtnPayloadProvider for PermissionResponse { RippleContract::Permissions } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::api::firebolt::fb_capabilities::{CapabilityRole, FireboltCap}; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_permission() { + let account_session = AccountSession { + id: "test_session_id".to_string(), + token: "test_token".to_string(), + account_id: "test_account_id".to_string(), + device_id: "test_device_id".to_string(), + }; + + let permission_request = PermissionRequest { + app_id: "test_app_id".to_string(), + session: account_session, + }; + + let contract_type: RippleContract = RippleContract::Permissions; + + test_extn_payload_provider(permission_request, contract_type); + } + + #[test] + fn test_extn_response_permission() { + let permission1 = FireboltPermission { + cap: FireboltCap::Short("test_cap1".to_string()), + role: CapabilityRole::Use, + }; + + let permission2 = FireboltPermission { + cap: FireboltCap::Full("test_cap2".to_string()), + role: CapabilityRole::Manage, + }; + + let permission_response: PermissionResponse = vec![permission1, permission2]; + let contract_type: RippleContract = RippleContract::Permissions; + + test_extn_payload_provider(permission_response, contract_type); + } +} diff --git a/core/sdk/src/api/distributor/distributor_platform.rs b/core/sdk/src/api/distributor/distributor_platform.rs index fa21f8887..90c101c6f 100644 --- a/core/sdk/src/api/distributor/distributor_platform.rs +++ b/core/sdk/src/api/distributor/distributor_platform.rs @@ -23,13 +23,13 @@ use crate::{ framework::ripple_contract::RippleContract, }; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct PlatformTokenRequest { pub options: Vec, pub context: PlatformTokenContext, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct PlatformTokenContext { pub app_id: String, pub content_provider: String, @@ -55,3 +55,34 @@ impl ExtnPayloadProvider for PlatformTokenRequest { RippleContract::Session(crate::api::session::SessionAdjective::Platform) } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_platform_token() { + let options_vec = vec!["option1".to_string(), "option2".to_string()]; + + let platform_token_request = PlatformTokenRequest { + options: options_vec, + context: PlatformTokenContext { + app_id: "test_app_id".to_string(), + content_provider: "test_content_provider".to_string(), + device_session_id: "test_device_session_id".to_string(), + app_session_id: "test_app_session_id".to_string(), + dist_session: AccountSession { + id: "test_session_id".to_string(), + token: "test_token".to_string(), + account_id: "test_account_id".to_string(), + device_id: "test_device_id".to_string(), + }, + }, + }; + + let contract_type: RippleContract = + RippleContract::Session(crate::api::session::SessionAdjective::Platform); + test_extn_payload_provider(platform_token_request, contract_type); + } +} diff --git a/core/sdk/src/api/distributor/distributor_privacy.rs b/core/sdk/src/api/distributor/distributor_privacy.rs index e9be4b004..3ac220f12 100644 --- a/core/sdk/src/api/distributor/distributor_privacy.rs +++ b/core/sdk/src/api/distributor/distributor_privacy.rs @@ -28,7 +28,7 @@ use crate::{ framework::ripple_contract::RippleContract, }; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum PrivacySetting { AppDataCollection(String), AppEntitlementCollection(String), @@ -47,7 +47,7 @@ pub enum PrivacySetting { CameraAnalytics, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct PrivacySettings { #[serde(rename = "allowACRCollection")] @@ -92,14 +92,14 @@ impl Default for PrivacySettings { } } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub enum PrivacySettingsStoreRequest { GetPrivacySettings(StorageProperty), SetPrivacySettings(StorageProperty, bool), SetAllPrivacySettings(PrivacySettingsData), } -#[derive(Default, Debug, Clone, Serialize, Deserialize)] +#[derive(Default, PartialEq, Debug, Clone, Serialize, Deserialize)] pub struct PrivacySettingsData { pub allow_acr_collection: Option, pub allow_resume_points: Option, @@ -188,20 +188,20 @@ pub struct ContentListenRequest { pub listen: bool, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub struct GetPropertyParams { pub setting: PrivacySetting, pub dist_session: AccountSession, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub struct SetPropertyParams { pub setting: PrivacySetting, pub value: bool, pub dist_session: AccountSession, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub enum PrivacyCloudRequest { GetProperty(GetPropertyParams), GetProperties(AccountSession), @@ -238,14 +238,14 @@ impl ExtnPayloadProvider for PrivacyCloudRequest { } } -#[derive(Debug, Default, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Default, Serialize, Deserialize, Clone)] pub struct ExclusionPolicyData { pub data_events: Vec, pub entity_reference: Vec, pub derivative_propagation: bool, } -#[derive(Debug, Default, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Default, Serialize, Deserialize, Clone)] pub struct ExclusionPolicy { pub acr: Option, pub app_content_ad_targeting: Option, @@ -299,3 +299,160 @@ impl FromStr for DataEventType { } } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_privacy_cloud() { + let get_property_params = GetPropertyParams { + setting: PrivacySetting::AppDataCollection("test_app_data_collection".to_string()), + dist_session: AccountSession { + id: "test_session_id".to_string(), + token: "test_token".to_string(), + account_id: "test_account_id".to_string(), + device_id: "test_device_id".to_string(), + }, + }; + + let privacy_cloud_request = PrivacyCloudRequest::GetProperty(get_property_params); + let contract_type: RippleContract = RippleContract::Storage(StorageAdjective::PrivacyCloud); + + test_extn_payload_provider(privacy_cloud_request, contract_type); + } + + #[test] + fn test_extn_request_privacy_settings_store() { + let storage_property = StorageProperty::ClosedCaptionsEnabled; + let privacy_settings_request = + PrivacySettingsStoreRequest::GetPrivacySettings(storage_property); + let contract_type: RippleContract = RippleContract::Storage(StorageAdjective::PrivacyLocal); + test_extn_payload_provider(privacy_settings_request, contract_type); + } + + #[test] + fn test_extn_payload_provider_for_exclusion_policy() { + let exclusion_policy = ExclusionPolicy { + acr: Some(ExclusionPolicyData { + data_events: vec![DataEventType::Watched, DataEventType::BusinessIntelligence], + entity_reference: vec![String::from("entity_reference_acr")], + derivative_propagation: true, + }), + app_content_ad_targeting: Some(ExclusionPolicyData { + data_events: vec![DataEventType::Watched], + entity_reference: vec![String::from("entity_reference_app_content_ad_targeting")], + derivative_propagation: false, + }), + business_analytics: Some(ExclusionPolicyData { + data_events: vec![DataEventType::Watched, DataEventType::BusinessIntelligence], + entity_reference: vec![String::from("entity_reference_business_analytics")], + derivative_propagation: false, + }), + camera_analytics: Some(ExclusionPolicyData { + data_events: vec![DataEventType::Watched], + entity_reference: vec![String::from("entity_reference_camera_analytics")], + derivative_propagation: true, + }), + continue_watching: Some(ExclusionPolicyData { + data_events: vec![DataEventType::Watched], + entity_reference: vec![String::from("entity_reference_continue_watching")], + derivative_propagation: true, + }), + personalization: Some(ExclusionPolicyData { + data_events: vec![DataEventType::Watched], + entity_reference: vec![String::from("entity_reference_personalization")], + derivative_propagation: true, + }), + primary_browse_ad_targeting: Some(ExclusionPolicyData { + data_events: vec![DataEventType::Watched], + entity_reference: vec![String::from( + "entity_reference_primary_browse_ad_targeting", + )], + derivative_propagation: true, + }), + primary_content_ad_targeting: Some(ExclusionPolicyData { + data_events: vec![DataEventType::Watched], + entity_reference: vec![String::from( + "entity_reference_primary_content_ad_targeting", + )], + derivative_propagation: true, + }), + product_analytics: Some(ExclusionPolicyData { + data_events: vec![DataEventType::Watched], + entity_reference: vec![String::from("entity_reference_product_analytics")], + derivative_propagation: true, + }), + remote_diagnostics: Some(ExclusionPolicyData { + data_events: vec![DataEventType::Watched], + entity_reference: vec![String::from("entity_reference_remote_diagnostics")], + derivative_propagation: true, + }), + unentitled_continue_watching: Some(ExclusionPolicyData { + data_events: vec![DataEventType::Watched], + entity_reference: vec![String::from( + "entity_reference_unentitled_continue_watching", + )], + derivative_propagation: true, + }), + unentitled_personalization: Some(ExclusionPolicyData { + data_events: vec![DataEventType::Watched], + entity_reference: vec![String::from("entity_reference_unentitled_personalization")], + derivative_propagation: true, + }), + watch_history: Some(ExclusionPolicyData { + data_events: vec![DataEventType::Watched], + entity_reference: vec![String::from("entity_reference_watch_history")], + derivative_propagation: true, + }), + }; + + let contract_type: RippleContract = RippleContract::Storage(StorageAdjective::PrivacyCloud); + test_extn_payload_provider(exclusion_policy, contract_type); + } + + #[test] + fn test_extn_payload_provider_for_privacy_settings() { + let privacy_settings = PrivacySettings { + allow_acr_collection: true, + allow_resume_points: true, + allow_app_content_ad_targeting: true, + allow_business_analytics: true, + allow_camera_analytics: true, + allow_personalization: true, + allow_primary_browse_ad_targeting: true, + allow_primary_content_ad_targeting: true, + allow_product_analytics: true, + allow_remote_diagnostics: true, + allow_unentitled_personalization: true, + allow_unentitled_resume_points: true, + allow_watch_history: true, + }; + + let contract_type: RippleContract = RippleContract::Storage(StorageAdjective::PrivacyCloud); + test_extn_payload_provider(privacy_settings, contract_type); + } + + #[test] + fn test_extn_payload_provider_for_privacy_settings_data() { + let privacy_settings_data = PrivacySettingsData { + allow_acr_collection: Some(true), + allow_resume_points: Some(true), + allow_app_content_ad_targeting: Some(true), + allow_business_analytics: Some(true), + allow_camera_analytics: Some(true), + allow_personalization: Some(true), + allow_primary_browse_ad_targeting: Some(true), + allow_primary_content_ad_targeting: Some(true), + allow_product_analytics: Some(true), + allow_remote_diagnostics: Some(true), + allow_unentitled_personalization: Some(true), + allow_unentitled_resume_points: Some(true), + allow_watch_history: Some(true), + }; + + let contract_type: RippleContract = RippleContract::Storage(StorageAdjective::PrivacyLocal); + test_extn_payload_provider(privacy_settings_data, contract_type); + } +} diff --git a/core/sdk/src/api/distributor/distributor_sync.rs b/core/sdk/src/api/distributor/distributor_sync.rs index 8600daca4..a01967a63 100644 --- a/core/sdk/src/api/distributor/distributor_sync.rs +++ b/core/sdk/src/api/distributor/distributor_sync.rs @@ -23,7 +23,7 @@ use crate::{ framework::ripple_contract::RippleContract, }; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub enum SyncAndMonitorRequest { SyncAndMonitor(SyncAndMonitorModule, AccountSession), UpdateDistributorToken(String), @@ -52,3 +52,26 @@ impl ExtnPayloadProvider for SyncAndMonitorRequest { RippleContract::CloudSync } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_sync_and_monitor() { + let sync_and_monitor_module = SyncAndMonitorModule::Privacy; + let account_session = AccountSession { + id: "test_session_id".to_string(), + token: "test_token".to_string(), + account_id: "test_account_id".to_string(), + device_id: "test_device_id".to_string(), + }; + + let sync_and_monitor_request = + SyncAndMonitorRequest::SyncAndMonitor(sync_and_monitor_module, account_session); + let contract_type: RippleContract = RippleContract::CloudSync; + + test_extn_payload_provider(sync_and_monitor_request, contract_type); + } +} diff --git a/core/sdk/src/api/distributor/distributor_token.rs b/core/sdk/src/api/distributor/distributor_token.rs index 752825e4c..72c47c0d1 100644 --- a/core/sdk/src/api/distributor/distributor_token.rs +++ b/core/sdk/src/api/distributor/distributor_token.rs @@ -23,12 +23,12 @@ use crate::{ framework::ripple_contract::RippleContract, }; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct DistributorTokenRequest { pub context: DistributorTokenContext, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct DistributorTokenContext { pub app_id: String, pub dist_session: AccountSession, @@ -51,3 +51,28 @@ impl ExtnPayloadProvider for DistributorTokenRequest { RippleContract::Session(crate::api::session::SessionAdjective::Distributor) } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_distributor_token() { + let distributor_token_request = DistributorTokenRequest { + context: DistributorTokenContext { + app_id: "test_app_id".to_string(), + dist_session: AccountSession { + id: "test_session_id".to_string(), + token: "test_token".to_string(), + account_id: "test_account_id".to_string(), + device_id: "test_device_id".to_string(), + }, + }, + }; + + let contract_type: RippleContract = + RippleContract::Session(crate::api::session::SessionAdjective::Distributor); + test_extn_payload_provider(distributor_token_request, contract_type); + } +} diff --git a/core/sdk/src/api/distributor/distributor_usergrants.rs b/core/sdk/src/api/distributor/distributor_usergrants.rs index ae1e797aa..3dfac0a23 100644 --- a/core/sdk/src/api/distributor/distributor_usergrants.rs +++ b/core/sdk/src/api/distributor/distributor_usergrants.rs @@ -26,18 +26,18 @@ use crate::{ framework::ripple_contract::RippleContract, }; -#[derive(Clone, Debug, Deserialize, Serialize)] +#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)] pub struct UserGrantsCloudGetParams { pub app_id: String, pub permission: FireboltPermission, pub account_session: AccountSession, } -#[derive(Clone, Debug, Deserialize, Serialize)] +#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)] pub struct UserGrantsCloudSetParams { pub account_session: AccountSession, pub user_grant_info: UserGrantInfo, } -#[derive(Clone, Debug, Deserialize, Serialize)] +#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)] pub enum UserGrantsCloudStoreRequest { GetCloudUserGrants(UserGrantsCloudGetParams), SetCloudUserGrants(UserGrantsCloudSetParams), @@ -59,3 +59,33 @@ impl ExtnPayloadProvider for UserGrantsCloudStoreRequest { RippleContract::Storage(StorageAdjective::UsergrantCloud) } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::api::firebolt::fb_capabilities::{CapabilityRole, FireboltCap}; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_user_grants_cloud_store() { + let user_grants_get_params = UserGrantsCloudGetParams { + app_id: "test_app_id".to_string(), + permission: FireboltPermission { + cap: FireboltCap::Short("test_short_cap".to_string()), + role: CapabilityRole::Use, + }, + account_session: AccountSession { + id: "test_session_id".to_string(), + token: "test_token".to_string(), + account_id: "test_account_id".to_string(), + device_id: "test_device_id".to_string(), + }, + }; + + let user_grants_request = + UserGrantsCloudStoreRequest::GetCloudUserGrants(user_grants_get_params); + + let contract_type = RippleContract::Storage(StorageAdjective::UsergrantCloud); + test_extn_payload_provider(user_grants_request, contract_type); + } +} diff --git a/core/sdk/src/api/firebolt/fb_advertising.rs b/core/sdk/src/api/firebolt/fb_advertising.rs index acf2f1ddf..adf2ca49d 100644 --- a/core/sdk/src/api/firebolt/fb_advertising.rs +++ b/core/sdk/src/api/firebolt/fb_advertising.rs @@ -24,14 +24,14 @@ use crate::{ framework::ripple_contract::RippleContract, }; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub enum AdvertisingRequest { GetAdIdObject(AdIdRequestParams), ResetAdIdentifier(AccountSession), GetAdConfig(AdConfigRequestParams), } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AdIdRequestParams { pub privacy_data: HashMap, pub app_id: String, @@ -39,14 +39,14 @@ pub struct AdIdRequestParams { pub scope: HashMap, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AdIdResponse { pub ifa: String, pub ifa_type: String, pub lmt: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AdConfigRequestParams { pub privacy_data: HashMap, pub durable_app_id: String, @@ -55,7 +55,7 @@ pub struct AdConfigRequestParams { pub scope: HashMap, } -#[derive(Debug, Serialize, Deserialize, Clone, Default)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone, Default)] pub struct AdConfigResponse { pub ad_server_url: String, pub ad_server_url_template: String, @@ -85,7 +85,7 @@ impl ExtnPayloadProvider for AdvertisingRequest { } } -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, PartialEq, Deserialize, Debug, Clone)] pub enum AdvertisingResponse { None, AdIdObject(AdIdResponse), @@ -174,3 +174,43 @@ impl Default for GetAdConfig { } } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_payload_provider_for_advertising_request() { + let ad_id_request_params = AdIdRequestParams { + privacy_data: HashMap::new(), + app_id: String::from("test_app"), + dist_session: AccountSession { + id: String::from("test_id"), + token: String::from("test_token"), + account_id: String::from("test_account_id"), + device_id: String::from("test_device_id"), + }, + scope: HashMap::new(), + }; + + let advertising_request = AdvertisingRequest::GetAdIdObject(ad_id_request_params); + + let contract_type: RippleContract = RippleContract::Advertising; + test_extn_payload_provider(advertising_request, contract_type); + } + + #[test] + fn test_extn_payload_provider_for_advertising_response() { + let ad_id_response = AdIdResponse { + ifa: String::from("test_ifa"), + ifa_type: String::from("test_ifa_type"), + lmt: String::from("test_lmt"), + }; + + let advertising_response = AdvertisingResponse::AdIdObject(ad_id_response); + + let contract_type: RippleContract = RippleContract::Advertising; + test_extn_payload_provider(advertising_response, contract_type); + } +} diff --git a/core/sdk/src/api/firebolt/fb_authentication.rs b/core/sdk/src/api/firebolt/fb_authentication.rs index 857a70b14..eb31a1044 100644 --- a/core/sdk/src/api/firebolt/fb_authentication.rs +++ b/core/sdk/src/api/firebolt/fb_authentication.rs @@ -23,7 +23,7 @@ use crate::{ framework::ripple_contract::RippleContract, }; -#[derive(Clone, Serialize, Deserialize)] +#[derive(Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct TokenResult { pub value: String, @@ -74,3 +74,24 @@ impl ExtnPayloadProvider for TokenResult { RippleContract::Session(SessionAdjective::Device) } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_token_result() { + let token_result = TokenResult { + value: "test_value".to_string(), + expires: Some("2024-12-31T23:59:59Z".to_string()), + _type: TokenType::Platform, + scope: Some("test_scope".to_string()), + expires_in: Some(3600), + token_type: Some("Bearer".to_string()), + }; + + let contract_type: RippleContract = RippleContract::Session(SessionAdjective::Device); + test_extn_payload_provider(token_result, contract_type); + } +} diff --git a/core/sdk/src/api/firebolt/fb_capabilities.rs b/core/sdk/src/api/firebolt/fb_capabilities.rs index 273094499..c27dafa6f 100644 --- a/core/sdk/src/api/firebolt/fb_capabilities.rs +++ b/core/sdk/src/api/firebolt/fb_capabilities.rs @@ -425,7 +425,7 @@ pub struct CapRequestRpcRequest { pub grants: Vec, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct RoleInfo { pub role: Option, pub capability: FireboltCap, diff --git a/core/sdk/src/api/firebolt/fb_discovery.rs b/core/sdk/src/api/firebolt/fb_discovery.rs index 1b421f5b9..5e6592d30 100644 --- a/core/sdk/src/api/firebolt/fb_discovery.rs +++ b/core/sdk/src/api/firebolt/fb_discovery.rs @@ -42,7 +42,7 @@ impl DiscoveryContext { } } -#[derive(Deserialize, Serialize, Clone, Debug)] +#[derive(Deserialize, PartialEq, Serialize, Clone, Debug)] pub struct LaunchRequest { #[serde(rename = "appId")] pub app_id: String, @@ -58,7 +58,7 @@ impl LaunchRequest { //TODO: need to update 1.0 code -#[derive(Debug, Serialize, Deserialize, Clone, Default)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone, Default)] #[serde(rename_all = "camelCase")] pub struct EntitlementData { pub entitlement_id: String, @@ -103,7 +103,7 @@ pub enum LocalizedString { Locale(HashMap), } -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, PartialEq, Deserialize, Serialize, Clone)] #[serde(rename_all = "camelCase")] pub struct WatchedInfo { pub entity_id: String, @@ -142,7 +142,7 @@ pub struct NavigateCompanyPageRequest { pub company_id: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct ContentAccessRequest { pub ids: ContentAccessIdentifiers, } @@ -155,7 +155,7 @@ pub const EVENT_ON_SIGN_OUT: &str = "discovery.onSignOut"; pub const PURCHASED_CONTENT_CAPABILITY: &str = "discovery:purchased-content"; pub const EVENT_DISCOVERY_POLICY_CHANGED: &str = "discovery.onPolicyChanged"; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "kebab-case")] pub enum ContentType { ChannelLineup, @@ -170,7 +170,7 @@ impl ContentType { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct Availability { #[serde(rename = "type")] @@ -192,7 +192,7 @@ pub struct Availability { pub end_time: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct ContentAccessIdentifiers { #[serde(skip_serializing_if = "Option::is_none")] @@ -227,7 +227,7 @@ impl From for ContentAccessRequest { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct ContentAccessEntitlement { pub entitlement_id: String, @@ -237,7 +237,7 @@ pub struct ContentAccessEntitlement { pub end_time: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct ContentAccessAvailability { #[serde(rename = "type")] @@ -250,13 +250,13 @@ pub struct ContentAccessAvailability { #[serde(skip_serializing_if = "Option::is_none")] pub end_time: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct SessionParams { pub app_id: String, // eg: Netflix pub dist_session: AccountSession, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct ContentAccessInfo { #[serde(skip_serializing_if = "Option::is_none")] @@ -265,11 +265,11 @@ pub struct ContentAccessInfo { pub entitlements: Option>, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct ClearContentSetParams { pub session_info: SessionParams, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct ContentAccessListSetParams { pub session_info: SessionParams, pub content_access_info: ContentAccessInfo, @@ -277,7 +277,7 @@ pub struct ContentAccessListSetParams { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ContentAccessResponse {} -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct SignInRequestParams { pub session_info: SessionParams, pub is_signed_in: bool, /*true for signIn, false for signOut */ @@ -311,14 +311,14 @@ pub struct DiscoveryEntitlement { pub end_time: i64, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub enum ProgressUnit { Seconds, Percent, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct MediaEvent { pub content_id: String, pub completed: bool, @@ -360,7 +360,7 @@ pub struct DataTagInfo { pub propagation_state: bool, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct MediaEventsAccountLinkRequestParams { pub media_event: MediaEvent, pub content_partner_id: String, diff --git a/core/sdk/src/api/firebolt/fb_general.rs b/core/sdk/src/api/firebolt/fb_general.rs index cd47f06f9..d4a922f6b 100644 --- a/core/sdk/src/api/firebolt/fb_general.rs +++ b/core/sdk/src/api/firebolt/fb_general.rs @@ -17,7 +17,7 @@ use serde::{Deserialize, Serialize}; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct ListenRequest { pub listen: bool, } diff --git a/core/sdk/src/api/firebolt/fb_keyboard.rs b/core/sdk/src/api/firebolt/fb_keyboard.rs index 58bd1f265..5eafc03a2 100644 --- a/core/sdk/src/api/firebolt/fb_keyboard.rs +++ b/core/sdk/src/api/firebolt/fb_keyboard.rs @@ -31,7 +31,7 @@ pub const STANDARD_EVENT_PREFIX: &str = "keyboard.onRequestStandard"; pub const KEYBOARD_PROVIDER_CAPABILITY: &str = "xrn:firebolt:capability:input:keyboard"; -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] #[serde(rename_all = "lowercase")] pub enum KeyboardType { Email, @@ -91,7 +91,7 @@ impl KeyboardProviderResponse { } } -#[derive(Serialize, Deserialize, Clone, Debug)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] pub struct KeyboardSessionRequest { #[serde(rename = "type")] pub _type: KeyboardType, @@ -117,7 +117,7 @@ impl ExtnPayloadProvider for KeyboardSessionRequest { } } -#[derive(Serialize, Deserialize, Clone, Debug)] +#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] pub struct KeyboardSessionResponse { pub text: String, pub canceled: bool, @@ -153,3 +153,41 @@ pub enum PrefillType { SignIn, SignUp, } + +#[cfg(test)] +mod tests { + use super::*; + use crate::api::gateway::rpc_gateway_api::{ApiProtocol, CallContext}; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_keyboard_session() { + let keyboard_session_request = KeyboardSessionRequest { + _type: KeyboardType::Email, + ctx: CallContext { + session_id: "test_session_id".to_string(), + request_id: "test_request_id".to_string(), + app_id: "test_app_id".to_string(), + call_id: 123, + protocol: ApiProtocol::Extn, + method: "POST".to_string(), + cid: Some("test_cid".to_string()), + gateway_secure: true, + }, + message: "test_message".to_string(), + }; + let contract_type: RippleContract = RippleContract::Keyboard; + test_extn_payload_provider(keyboard_session_request, contract_type); + } + + #[test] + fn test_extn_response_keyboard_session() { + let keyboard_session_response = KeyboardSessionResponse { + text: "Test response text".to_string(), + canceled: false, + }; + + let contract_type: RippleContract = RippleContract::Keyboard; + test_extn_payload_provider(keyboard_session_response, contract_type); + } +} diff --git a/core/sdk/src/api/firebolt/fb_lifecycle_management.rs b/core/sdk/src/api/firebolt/fb_lifecycle_management.rs index 8470f2245..995b3fe62 100644 --- a/core/sdk/src/api/firebolt/fb_lifecycle_management.rs +++ b/core/sdk/src/api/firebolt/fb_lifecycle_management.rs @@ -37,7 +37,7 @@ pub const LCM_EVENT_ON_SESSION_TRANSITION_COMPLETED: &str = pub const LCM_EVENT_ON_SESSION_TRANSITION_CANCELED: &str = "lifecyclemanagement.onSessionTransitionCanceled"; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum LifecycleManagementEventRequest { Launch(LifecycleManagementLaunchEvent), Ready(LifecycleManagementReadyEvent), @@ -67,7 +67,7 @@ impl ExtnPayloadProvider for LifecycleManagementEventRequest { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum LifecycleManagementRequest { Session(AppSessionRequest), SetState(SetStateRequest), @@ -95,12 +95,12 @@ impl ExtnPayloadProvider for LifecycleManagementRequest { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct LifecycleManagementLaunchEvent { pub parameters: LifecycleManagementLaunchParameters, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct LifecycleManagementLaunchParameters { pub app_id: String, @@ -124,61 +124,61 @@ impl LifecycleManagementLaunchParameters { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct LifecycleManagementReadyEvent { pub parameters: LifecycleManagementReadyParameters, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct LifecycleManagementReadyParameters { pub app_id: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct LifecycleManagementCloseEvent { pub parameters: LifecycleManagementCloseParameters, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct LifecycleManagementCloseParameters { pub app_id: String, pub reason: CloseReason, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct LifecycleManagementFinishedEvent { pub parameters: LifecycleManagementFinishedParameters, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum LifecycleManagementProviderEvent { Add(String), Remove(String), } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct LifecycleManagementFinishedParameters { pub app_id: String, } -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct SetStateRequest { pub app_id: String, pub state: LifecycleState, } -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, PartialEq, Deserialize, Debug, Clone)] #[serde(untagged)] pub enum SessionResponse { Pending(PendingSessionResponse), Completed(CompletedSessionResponse), } -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] #[serde(rename_all = "camelCase", deny_unknown_fields)] pub struct CompletedSessionResponse { pub app_id: String, @@ -188,7 +188,7 @@ pub struct CompletedSessionResponse { pub active_session_id: Option, pub transition_pending: bool, } -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] #[serde(rename_all = "camelCase", deny_unknown_fields)] pub struct PendingSessionResponse { pub app_id: String, @@ -199,7 +199,61 @@ pub struct PendingSessionResponse { pub transition_pending: bool, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AppSessionRequest { pub session: AppSession, } + +#[cfg(test)] +mod tests { + use super::*; + use crate::api::apps::{ + AppBasicInfo, AppLaunchInfo, AppRuntime, AppRuntimeTransport, AppSession, + }; + use crate::api::device::entertainment_data::{ + HomeIntent, InternalNavigationIntent, InternalNavigationIntentStrict, + }; + use crate::api::firebolt::fb_discovery::DiscoveryContext; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_lifecycle_management() { + let app_session_request = AppSessionRequest { + session: AppSession { + app: AppBasicInfo { + id: "sample_id".to_string(), + catalog: None, + url: None, + title: None, + }, + runtime: Some(AppRuntime { + id: Some("sample_runtime_id".to_string()), + transport: AppRuntimeTransport::Bridge, + }), + launch: AppLaunchInfo::default(), + }, + }; + let lifecycle_management_request = LifecycleManagementRequest::Session(app_session_request); + let contract_type: RippleContract = RippleContract::LifecycleManagement; + test_extn_payload_provider(lifecycle_management_request, contract_type); + } + + #[test] + fn test_lifecycle_management_launch_event_serialization() { + let launch_event = + LifecycleManagementEventRequest::Launch(LifecycleManagementLaunchEvent { + parameters: LifecycleManagementLaunchParameters { + app_id: "example_app".to_string(), + intent: Some(InternalNavigationIntent::NavigationIntentStrict( + InternalNavigationIntentStrict::Home(HomeIntent { + context: DiscoveryContext { + source: "test_source".to_string(), + }, + }), + )), + }, + }); + let contract_type: RippleContract = RippleContract::Launcher; + test_extn_payload_provider(launch_event, contract_type); + } +} diff --git a/core/sdk/src/api/firebolt/fb_metrics.rs b/core/sdk/src/api/firebolt/fb_metrics.rs index 93cc6f324..1584942a0 100644 --- a/core/sdk/src/api/firebolt/fb_metrics.rs +++ b/core/sdk/src/api/firebolt/fb_metrics.rs @@ -31,7 +31,7 @@ use super::fb_telemetry::TelemetryPayload; //https://developer.comcast.com/firebolt/core/sdk/latest/api/metrics -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct BehavioralMetricContext { pub app_id: String, @@ -57,7 +57,7 @@ impl From for BehavioralMetricContext { } } -#[derive(Debug, Serialize, Deserialize, Clone, Default)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone, Default)] pub struct AppDataGovernanceState { pub data_tags_to_apply: HashSet, } @@ -85,38 +85,38 @@ pub trait MetricsContextProvider: core::fmt::Debug { async fn provide_context(&mut self) -> Option; } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct Ready { pub context: BehavioralMetricContext, pub ttmu_ms: u32, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum MediaPositionType { None, PercentageProgress(f32), AbsolutePosition(i32), } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct SignIn { pub context: BehavioralMetricContext, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct SignOut { pub context: BehavioralMetricContext, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct StartContent { pub context: BehavioralMetricContext, pub entity_id: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct StopContent { pub context: BehavioralMetricContext, pub entity_id: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct Page { pub context: BehavioralMetricContext, pub page_id: String, @@ -129,13 +129,13 @@ pub enum ActionType { app, } #[allow(non_camel_case_types)] -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum CategoryType { user, app, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct Param { pub name: String, pub value: String, @@ -154,7 +154,7 @@ pub fn hashmap_to_param_vec(the_map: Option>) -> Vec, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct MediaSeeking { pub context: BehavioralMetricContext, pub entity_id: String, pub target: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct MediaSeeked { pub context: BehavioralMetricContext, pub entity_id: String, pub position: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct MediaRateChanged { pub context: BehavioralMetricContext, pub entity_id: String, pub rate: u32, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct MediaRenditionChanged { pub context: BehavioralMetricContext, pub entity_id: String, @@ -277,18 +277,18 @@ pub struct MediaRenditionChanged { pub height: u32, pub profile: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct MediaEnded { pub context: BehavioralMetricContext, pub entity_id: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct RawBehaviorMetricRequest { pub context: BehavioralMetricContext, pub value: Value, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum AppLifecycleState { #[serde(rename = "launching")] Launching, @@ -307,13 +307,13 @@ pub enum AppLifecycleState { #[serde(rename = "ready")] Ready, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AppLifecycleStateChange { pub context: BehavioralMetricContext, pub previous_state: Option, pub new_state: AppLifecycleState, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum BehavioralMetricPayload { Ready(Ready), SignIn(SignIn), @@ -397,7 +397,7 @@ impl BehavioralMetricPayload { /// process starts, so this service may need a way to wait for the values /// to become available /// This design assumes that all of the items will be available at the same times -#[derive(Debug, Serialize, Deserialize, Clone, Default)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone, Default)] pub struct MetricsContext { pub device_language: String, pub device_model: String, @@ -481,7 +481,7 @@ pub trait ContextualMetricsService { pub trait MetricsManager: Send + Sync { async fn send_metric(&mut self, metrics: BehavioralMetricPayload) -> (); } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct BehavioralMetricRequest { pub context: Option, pub payload: BehavioralMetricPayload, @@ -506,7 +506,7 @@ impl ExtnPayloadProvider for BehavioralMetricRequest { } } -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] pub enum MetricsResponse { None, Boolean, @@ -534,13 +534,13 @@ impl ExtnPayloadProvider for MetricsResponse { } } -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] pub enum MetricsPayload { BehaviorMetric(BehavioralMetricPayload, CallContext), OperationalMetric(TelemetryPayload), } -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] pub struct MetricsRequest { pub payload: MetricsPayload, /// Additional info extensions want to send which can be appended to the context of the Metrics data @@ -589,9 +589,10 @@ pub struct SystemErrorParams { #[cfg(test)] mod tests { - use serde_json::json; - use super::*; + use crate::api::gateway::rpc_gateway_api::ApiProtocol; + use crate::utils::test_utils::test_extn_payload_provider; + use serde_json::json; #[test] fn test_initialize_params() { @@ -606,4 +607,95 @@ mod tests { let value = json!({ "version":{"major": 0,"minor": 13,"patch": 0,"readable": 1}} ); assert!(InternalInitializeParams::deserialize(value).is_err()); } + + #[test] + fn test_extn_request_behavioral_metric() { + let behavioral_metric_context = BehavioralMetricContext { + app_id: "test_app_id".to_string(), + app_version: "test_app_version".to_string(), + partner_id: "test_partner_id".to_string(), + app_session_id: "test_app_session_id".to_string(), + app_user_session_id: Some("test_user_session_id".to_string()), + durable_app_id: "test_durable_app_id".to_string(), + governance_state: Some(AppDataGovernanceState { + data_tags_to_apply: HashSet::new(), + }), + }; + + let ready_payload = Ready { + context: behavioral_metric_context, + ttmu_ms: 100, + }; + + let behavioral_metric_request = BehavioralMetricRequest { + context: Some(MetricsContext { + device_language: "en".to_string(), + device_model: "iPhone".to_string(), + device_id: "test_device_id".to_string(), + account_id: "test_account_id".to_string(), + device_timezone: "GMT".to_string(), + device_timezone_offset: "+0:00".to_string(), + device_name: "TestDevice".to_string(), + platform: "iOS".to_string(), + os_ver: "14.0".to_string(), + distribution_tenant_id: "test_distribution_tenant_id".to_string(), + device_session_id: "test_device_session_id".to_string(), + mac_address: "test_mac_address".to_string(), + serial_number: "test_serial_number".to_string(), + }), + payload: BehavioralMetricPayload::Ready(ready_payload), + session: AccountSession { + id: "test_session_id".to_string(), + token: "test_token".to_string(), + account_id: "test_account_id".to_string(), + device_id: "test_device_id".to_string(), + }, + }; + + let contract_type: RippleContract = RippleContract::BehaviorMetrics; + test_extn_payload_provider(behavioral_metric_request, contract_type); + } + + #[test] + fn test_extn_request_metrics() { + let behavior_metric_payload = BehavioralMetricPayload::Ready(Ready { + context: BehavioralMetricContext { + app_id: "test_app_id".to_string(), + app_version: "test_app_version".to_string(), + partner_id: "test_partner_id".to_string(), + app_session_id: "test_app_session_id".to_string(), + app_user_session_id: Some("test_user_session_id".to_string()), + durable_app_id: "test_durable_app_id".to_string(), + governance_state: Some(AppDataGovernanceState { + data_tags_to_apply: HashSet::new(), + }), + }, + ttmu_ms: 100, + }); + let call_context = CallContext { + session_id: "test_session_id".to_string(), + request_id: "test_request_id".to_string(), + app_id: "test_app_id".to_string(), + call_id: 123, + protocol: ApiProtocol::Extn, + method: "some method".to_string(), + cid: Some("test_cid".to_string()), + gateway_secure: true, + }; + + let metrics_request = MetricsRequest { + payload: MetricsPayload::BehaviorMetric(behavior_metric_payload, call_context), + context: None, + }; + + let contract_type: RippleContract = RippleContract::Metrics; + test_extn_payload_provider(metrics_request, contract_type); + } + + #[test] + fn test_extn_response_metrics() { + let metrics_response = MetricsResponse::None; + let contract_type: RippleContract = RippleContract::BehaviorMetrics; + test_extn_payload_provider(metrics_response, contract_type); + } } diff --git a/core/sdk/src/api/firebolt/fb_openrpc.rs b/core/sdk/src/api/firebolt/fb_openrpc.rs index da1afd414..bd1bf974d 100644 --- a/core/sdk/src/api/firebolt/fb_openrpc.rs +++ b/core/sdk/src/api/firebolt/fb_openrpc.rs @@ -25,7 +25,7 @@ use super::fb_capabilities::{ FireboltPermission, }; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct FireboltSemanticVersion { pub major: u32, pub minor: u32, diff --git a/core/sdk/src/api/firebolt/fb_parameters.rs b/core/sdk/src/api/firebolt/fb_parameters.rs index 48f5c2c81..848c4fbeb 100644 --- a/core/sdk/src/api/firebolt/fb_parameters.rs +++ b/core/sdk/src/api/firebolt/fb_parameters.rs @@ -18,7 +18,7 @@ use serde::{Deserialize, Serialize}; use crate::api::device::entertainment_data::NavigationIntent; -#[derive(Deserialize, Serialize, Debug, Clone)] +#[derive(Deserialize, PartialEq, Serialize, Debug, Clone)] pub struct SecondScreenEvent { #[serde(rename = "type")] pub _type: String, diff --git a/core/sdk/src/api/firebolt/fb_pin.rs b/core/sdk/src/api/firebolt/fb_pin.rs index 37e893d77..da7d372d0 100644 --- a/core/sdk/src/api/firebolt/fb_pin.rs +++ b/core/sdk/src/api/firebolt/fb_pin.rs @@ -45,7 +45,7 @@ impl From for PinChallengeRequest { } } -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] #[serde(rename_all = "camelCase")] pub struct PinChallengeRequestWithContext { pub pin_space: PinSpace, @@ -82,7 +82,7 @@ pub enum PinChallengeResultReason { Cancelled, } -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct PinChallengeResponse { pub granted: Option, pub reason: PinChallengeResultReason, @@ -99,7 +99,7 @@ impl PinChallengeResponse { } } -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] #[serde(rename_all = "lowercase")] pub enum PinSpace { Purchase, @@ -129,3 +129,45 @@ impl ExtnPayloadProvider for PinChallengeResponse { RippleContract::PinChallenge } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::api::gateway::rpc_gateway_api::{ApiProtocol, CallContext}; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_pin_challenge_with_context() { + let pin_challenge_request = PinChallengeRequestWithContext { + pin_space: PinSpace::Purchase, + requestor: ChallengeRequestor { + id: "test_requestor_id".to_string(), + name: "eest_requestor_name".to_string(), + }, + capability: Some("test_capability".to_string()), + call_ctx: CallContext { + session_id: "test_session_id".to_string(), + request_id: "test_request_id".to_string(), + app_id: "test_app_id".to_string(), + call_id: 123, + protocol: ApiProtocol::Bridge, + method: "POST".to_string(), + cid: Some("test_cid".to_string()), + gateway_secure: true, + }, + }; + let contract_type: RippleContract = RippleContract::PinChallenge; + test_extn_payload_provider(pin_challenge_request, contract_type); + } + + #[test] + fn test_extn_response_pin_challenge() { + let pin_challenge_response = PinChallengeResponse { + granted: Some(true), + reason: PinChallengeResultReason::NoPinRequired, + }; + + let contract_type: RippleContract = RippleContract::PinChallenge; + test_extn_payload_provider(pin_challenge_response, contract_type); + } +} diff --git a/core/sdk/src/api/firebolt/fb_secure_storage.rs b/core/sdk/src/api/firebolt/fb_secure_storage.rs index 91e9bdd4f..74a7f7dc0 100644 --- a/core/sdk/src/api/firebolt/fb_secure_storage.rs +++ b/core/sdk/src/api/firebolt/fb_secure_storage.rs @@ -22,25 +22,25 @@ use crate::{ extn::extn_client_message::{ExtnPayload, ExtnPayloadProvider, ExtnRequest, ExtnResponse}, framework::ripple_contract::RippleContract, }; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub enum StorageScope { Device, Account, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct SecureStorageGetRequest { pub scope: StorageScope, pub key: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct StorageOptions { pub ttl: i32, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct SecureStorageSetRequest { pub app_id: Option, @@ -50,7 +50,7 @@ pub struct SecureStorageSetRequest { #[serde(skip_serializing_if = "Option::is_none")] pub options: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct SecureStorageRemoveRequest { pub scope: StorageScope, @@ -58,21 +58,21 @@ pub struct SecureStorageRemoveRequest { pub app_id: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct SecureStorageClearRequest { pub app_id: Option, pub scope: StorageScope, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct SecureStorageGetResponse { pub value: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct SecureStorageDefaultResponse {} -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum SecureStorageRequest { Get(String, SecureStorageGetRequest, AccountSession), Set(SecureStorageSetRequest, AccountSession), @@ -117,7 +117,7 @@ impl ExtnPayloadProvider for SecureStorageRequest { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum SecureStorageResponse { Get(SecureStorageGetResponse), Set(SecureStorageDefaultResponse), @@ -142,3 +142,44 @@ impl ExtnPayloadProvider for SecureStorageResponse { RippleContract::Storage(StorageAdjective::Secure) } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_secure_storage() { + let account_session = AccountSession { + id: "test_session_id".to_string(), + token: "test_token".to_string(), + account_id: "test_account_id".to_string(), + device_id: "test_device_id".to_string(), + }; + + let get_request = SecureStorageGetRequest { + scope: StorageScope::Device, + key: "test_key".to_string(), + }; + + let secure_storage_request = SecureStorageRequest::Get( + "test_secure_storage".to_string(), + get_request, + account_session, + ); + + let contract_type: RippleContract = RippleContract::Storage(StorageAdjective::Secure); + test_extn_payload_provider(secure_storage_request, contract_type); + } + + #[test] + fn test_extn_response_secure_storage() { + let secure_storage_get_response = SecureStorageGetResponse { + value: Some("secret_value".to_string()), + }; + let secure_storage_response = SecureStorageResponse::Get(secure_storage_get_response); + let contract_type: RippleContract = RippleContract::Storage(StorageAdjective::Secure); + + test_extn_payload_provider(secure_storage_response, contract_type); + } +} diff --git a/core/sdk/src/api/firebolt/fb_telemetry.rs b/core/sdk/src/api/firebolt/fb_telemetry.rs index ef5ad92bc..1085db8a6 100644 --- a/core/sdk/src/api/firebolt/fb_telemetry.rs +++ b/core/sdk/src/api/firebolt/fb_telemetry.rs @@ -25,7 +25,7 @@ use crate::{ use super::fb_metrics::{ErrorParams, ErrorType, Param, SystemErrorParams}; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AppLoadStart { pub app_id: String, pub app_version: Option, @@ -34,7 +34,7 @@ pub struct AppLoadStart { pub ripple_version: String, pub ripple_context: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AppLoadStop { pub app_id: String, pub stop_time: i64, @@ -43,7 +43,7 @@ pub struct AppLoadStop { pub success: bool, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AppSDKLoaded { pub app_id: String, pub stop_time: i64, @@ -52,7 +52,7 @@ pub struct AppSDKLoaded { pub app_session_id: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct TelemetryAppError { pub app_id: String, pub error_type: String, @@ -96,7 +96,7 @@ fn get_error_type(error_type: ErrorType) -> String { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct TelemetrySystemError { pub error_name: String, pub component: String, @@ -117,21 +117,21 @@ impl From for TelemetrySystemError { } } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct TelemetrySignIn { pub app_id: String, pub ripple_session_id: String, pub app_session_id: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct TelemetrySignOut { pub app_id: String, pub ripple_session_id: String, pub app_session_id: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct InternalInitialize { pub app_id: String, pub ripple_session_id: String, @@ -139,7 +139,7 @@ pub struct InternalInitialize { pub semantic_version: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct FireboltInteraction { pub app_id: String, pub method: String, @@ -150,7 +150,7 @@ pub struct FireboltInteraction { pub app_session_id: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum TelemetryPayload { AppLoadStart(AppLoadStart), AppLoadStop(AppLoadStop), @@ -196,7 +196,7 @@ impl ExtnPayloadProvider for TelemetryPayload { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum OperationalMetricRequest { Subscribe, UnSubscribe, @@ -218,3 +218,31 @@ impl ExtnPayloadProvider for OperationalMetricRequest { RippleContract::OperationalMetricListener } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_operational_metric() { + let operational_metric_request = OperationalMetricRequest::Subscribe; + let contract_type: RippleContract = RippleContract::OperationalMetricListener; + test_extn_payload_provider(operational_metric_request, contract_type); + } + + #[test] + fn test_extn_payload_provider_for_telemetry_payload() { + let app_load_start_payload = AppLoadStart { + app_id: "example_app".to_string(), + app_version: Some("1.0.0".to_string()), + start_time: 1634816400, + ripple_session_id: "session_id".to_string(), + ripple_version: "1.2.3".to_string(), + ripple_context: Some("context_data".to_string()), + }; + let telemetry_payload = TelemetryPayload::AppLoadStart(app_load_start_payload); + let contract_type: RippleContract = RippleContract::OperationalMetricListener; + test_extn_payload_provider(telemetry_payload, contract_type); + } +} diff --git a/core/sdk/src/api/firebolt/provider.rs b/core/sdk/src/api/firebolt/provider.rs index c7b4881b5..bfd188619 100644 --- a/core/sdk/src/api/firebolt/provider.rs +++ b/core/sdk/src/api/firebolt/provider.rs @@ -140,7 +140,7 @@ pub struct ChallengeError { pub data: Option, } -#[derive(Serialize, Deserialize, Clone, Debug)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] pub struct ChallengeRequestor { pub id: String, pub name: String, diff --git a/core/sdk/src/api/gateway/rpc_gateway_api.rs b/core/sdk/src/api/gateway/rpc_gateway_api.rs index 3e48131ab..c9bad49a9 100644 --- a/core/sdk/src/api/gateway/rpc_gateway_api.rs +++ b/core/sdk/src/api/gateway/rpc_gateway_api.rs @@ -51,7 +51,7 @@ impl From for AppIdentification { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct CallContext { pub session_id: String, pub request_id: String, @@ -96,14 +96,14 @@ impl CallContext { } } -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] pub enum ApiProtocol { Bridge, Extn, JsonRpc, } -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] pub struct ApiMessage { pub protocol: ApiProtocol, pub jsonrpc_msg: String, @@ -156,7 +156,7 @@ pub struct JsonRpcApiResponse { pub error: Option, } -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] pub struct RpcRequest { pub method: String, pub params_json: String, @@ -287,3 +287,32 @@ pub enum PermissionCommand { session_tx: mpsc::Sender, }, } + +#[cfg(test)] +mod tests { + use super::*; + use crate::api::gateway::rpc_gateway_api::{ApiProtocol, CallContext}; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_rpc() { + let call_context = CallContext { + session_id: "test_session_id".to_string(), + request_id: "test_request_id".to_string(), + app_id: "test_app_id".to_string(), + call_id: 123, + protocol: ApiProtocol::Bridge, + method: "some_method".to_string(), + cid: Some("some_cid".to_string()), + gateway_secure: true, + }; + + let rpc_request = RpcRequest { + method: "some_method".to_string(), + params_json: r#"{"key": "value"}"#.to_string(), + ctx: call_context, + }; + let contract_type: RippleContract = RippleContract::Rpc; + test_extn_payload_provider(rpc_request, contract_type); + } +} diff --git a/core/sdk/src/api/manifest/app_library.rs b/core/sdk/src/api/manifest/app_library.rs index 3ebedc92b..44e89b9ee 100644 --- a/core/sdk/src/api/manifest/app_library.rs +++ b/core/sdk/src/api/manifest/app_library.rs @@ -23,10 +23,10 @@ use log::{error, warn}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; -#[derive(Clone, Default, Serialize, Deserialize)] +#[derive(Clone, PartialEq, Default, Serialize, Deserialize)] pub struct AppLibraryState { - default_apps: Vec, - providers: HashMap, + pub default_apps: Vec, + pub providers: HashMap, } impl std::fmt::Debug for AppLibraryState { diff --git a/core/sdk/src/api/manifest/apps.rs b/core/sdk/src/api/manifest/apps.rs index ff20e615d..3255e6196 100644 --- a/core/sdk/src/api/manifest/apps.rs +++ b/core/sdk/src/api/manifest/apps.rs @@ -24,20 +24,20 @@ const Y_DEFAULT: u32 = 0; const W_DEFAULT: u32 = 1920; const H_DEFAULT: u32 = 1080; -#[derive(Debug, Serialize, Deserialize, Clone, Default)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone, Default)] pub struct Capability { pub required: Vec, pub optional: Vec, } -#[derive(Debug, Serialize, Deserialize, Clone, Default)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone, Default)] pub struct AppCapabilities { pub used: Capability, pub managed: Capability, pub provided: Capability, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct AppProperties { pub user_agent: Option, @@ -59,7 +59,7 @@ impl AppProperties { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct AppManifest { pub app_key: String, pub name: String, diff --git a/core/sdk/src/api/manifest/device_manifest.rs b/core/sdk/src/api/manifest/device_manifest.rs index 20dd041a5..bc9e3b559 100644 --- a/core/sdk/src/api/manifest/device_manifest.rs +++ b/core/sdk/src/api/manifest/device_manifest.rs @@ -163,7 +163,7 @@ pub struct WsConfiguration { pub gateway: String, } -#[derive(Deserialize, Serialize, Debug, Clone)] +#[derive(Deserialize, Serialize, Debug, PartialEq, Clone)] #[serde(rename_all = "camelCase")] pub struct RetentionPolicy { pub max_retained: u64, @@ -181,7 +181,7 @@ pub const DEFAULT_RETENTION_POLICY: RetentionPolicy = RetentionPolicy { always_retained: Vec::new(), }; -#[derive(Deserialize, Serialize, Debug, Clone)] +#[derive(Deserialize, Serialize, Debug, PartialEq, Clone)] #[serde(rename_all = "camelCase")] pub struct LifecyclePolicy { pub app_ready_timeout_ms: u64, @@ -208,14 +208,14 @@ pub struct AppsDistributionConfiguration { pub default_id_salt: Option, } -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] pub struct AppLibraryEntry { pub app_id: String, pub manifest: AppManifestLoad, pub boot_state: BootState, } -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] #[serde(rename_all = "lowercase")] pub enum AppManifestLoad { Remote(String), diff --git a/core/sdk/src/api/manifest/persistent_store.rs b/core/sdk/src/api/manifest/persistent_store.rs index a2a611896..d2b9722ad 100644 --- a/core/sdk/src/api/manifest/persistent_store.rs +++ b/core/sdk/src/api/manifest/persistent_store.rs @@ -24,7 +24,7 @@ use crate::{ utils::error::RippleError, }; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub enum AccessibilityResponse { None(()), String(String), @@ -54,3 +54,16 @@ impl ExtnPayloadProvider for AccessibilityResponse { RippleContract::Storage(StorageAdjective::Local) } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_payload_provider_for_accessibility_response() { + let accessibility_response = AccessibilityResponse::None(()); + let contract_type: RippleContract = RippleContract::Storage(StorageAdjective::Local); + test_extn_payload_provider(accessibility_response, contract_type); + } +} diff --git a/core/sdk/src/api/protocol.rs b/core/sdk/src/api/protocol.rs index 3ea03aa4f..f2eeaa227 100644 --- a/core/sdk/src/api/protocol.rs +++ b/core/sdk/src/api/protocol.rs @@ -24,14 +24,14 @@ use crate::{ use super::gateway::rpc_gateway_api::ApiMessage; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub enum BridgeProtocolRequest { StartSession(BridgeSessionParams), EndSession(String), Send(String, ApiMessage), } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub struct BridgeSessionParams { pub container_id: String, pub session_id: String, @@ -55,3 +55,32 @@ impl ExtnPayloadProvider for BridgeProtocolRequest { RippleContract::BridgeProtocol } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::api::session::AccountSessionRequest; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_bridge_protocol() { + let bridge_session_params = BridgeSessionParams { + container_id: "test_container_id".to_string(), + session_id: "test_session_id".to_string(), + app_id: "test_app_id".to_string(), + }; + + let bridge_protocol_request = BridgeProtocolRequest::StartSession(bridge_session_params); + let contract_type: RippleContract = RippleContract::BridgeProtocol; + + test_extn_payload_provider(bridge_protocol_request, contract_type); + } + + #[test] + fn test_extn_request_bridge_protocol_none() { + let other_payload = + ExtnPayload::Request(ExtnRequest::AccountSession(AccountSessionRequest::Get)); + let result = BridgeProtocolRequest::get_from_payload(other_payload); + assert_eq!(result, None); + } +} diff --git a/core/sdk/src/api/pubsub.rs b/core/sdk/src/api/pubsub.rs index 01874cc7d..d98f9daec 100644 --- a/core/sdk/src/api/pubsub.rs +++ b/core/sdk/src/api/pubsub.rs @@ -27,7 +27,7 @@ use crate::{ use super::session::PubSubAdjective; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum PubSubRequest { Connect(PubSubConnectRequest), UpdateConnection(PubSubUpdateConnectionCredentialsRequest), @@ -37,7 +37,7 @@ pub enum PubSubRequest { Disconnect(String), } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum PubSubResponse { Connect(PubSubConnectResponse), Publish(PubSubPublishResponse), @@ -47,20 +47,20 @@ pub enum PubSubResponse { Disconnect(bool), } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct PubSubNotifyTopic { pub connection_id: String, pub topic: String, pub value: Value, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum PubSubConnectionStatus { Connected(String), Disconnected(String), Reconnecting(String), } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum PubSubEvents { PubSubConnectionEvent(PubSubConnectionStatus), PubSubValueChangeEvent(PubSubNotifyTopic), @@ -97,30 +97,30 @@ pub struct PubSubSubscribedParam { // pub result: bool, // } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct PubSubPublishRequest { pub connection_id: String, pub topic: String, pub message: String, pub message_type: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct PubSubPublishResponse { pub result: bool, // pub status_code: String, // pub connection_status: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct Credentials { pub id: String, pub secret: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct PubSubUpdateConnectionCredentialsRequest { pub connection_id: String, pub updated_secret: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct PubSubConnectRequest { pub endpoint_url: String, pub client_name: Option, @@ -129,7 +129,7 @@ pub struct PubSubConnectRequest { pub operation_timeout_in_msec: u32, // pub max_retry_interval: u32, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct PubSubConnectResponse { pub connection_status: String, // status_code: String, @@ -137,26 +137,26 @@ pub struct PubSubConnectResponse { // result: bool, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct PubSubSubscribeRequest { pub connection_id: String, pub topic: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct PubSubUnSubscribeRequest { pub context: String, pub topic: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct PubSubSubscribeResponse { // pub connection_status: String, // pub status_code: String, pub result: bool, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct PubSubUnSubscribeResponse { // pub connection_status: String, // pub status_code: String, @@ -463,3 +463,151 @@ impl ExtnPayloadProvider for PubSubUpdateConnectionCredentialsRequest { RippleContract::PubSub(PubSubAdjective::Provider) } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_payload_provider_for_pub_sub_notify_topic() { + let pub_sub_notify_topic = PubSubNotifyTopic { + topic: String::from("your_topic"), + connection_id: "test_connection_id".to_string(), + value: Value::String(String::from("your_value")), + }; + let contract_type: RippleContract = RippleContract::PubSub(PubSubAdjective::Listener); + test_extn_payload_provider(pub_sub_notify_topic, contract_type); + } + + #[test] + fn test_extn_payload_provider_for_pub_sub_connection_status() { + let pub_sub_connection_status = + PubSubConnectionStatus::Connected("test_connected".to_string()); + let contract_type: RippleContract = RippleContract::PubSub(PubSubAdjective::Listener); + test_extn_payload_provider(pub_sub_connection_status, contract_type); + } + + #[test] + fn test_extn_payload_provider_for_pub_sub_events() { + let pub_sub_events = PubSubEvents::PubSubConnectionEvent( + PubSubConnectionStatus::Connected("test_connected".to_string()), + ); + + let contract_type: RippleContract = RippleContract::PubSub(PubSubAdjective::Listener); + test_extn_payload_provider(pub_sub_events, contract_type); + } + + #[test] + fn test_pub_sub_connect_request() { + let pub_sub_connect_request = PubSubConnectRequest { + endpoint_url: "https://example.com/pubsub".to_string(), + client_name: Some("test_client".to_string()), + credentials: Credentials { + id: "test_id".to_string(), + secret: "test_secret".to_string(), + }, + operation_timeout_in_msec: 5000, + }; + let contract_type: RippleContract = RippleContract::PubSub(PubSubAdjective::Provider); + test_extn_payload_provider(pub_sub_connect_request, contract_type); + } + + #[test] + fn test_pub_sub_subscribe_request() { + let pub_sub_subscribe_request = PubSubSubscribeRequest { + connection_id: "test_connection_id".to_string(), + topic: "test_topic".to_string(), + }; + let contract_type: RippleContract = RippleContract::PubSub(PubSubAdjective::Provider); + test_extn_payload_provider(pub_sub_subscribe_request, contract_type); + } + + #[test] + fn test_pub_sub_unsubscribe_request() { + let pub_sub_unsubscribe_request = PubSubUnSubscribeRequest { + context: "test_context".to_string(), + topic: "test_topic".to_string(), + }; + let contract_type: RippleContract = RippleContract::PubSub(PubSubAdjective::Provider); + test_extn_payload_provider(pub_sub_unsubscribe_request, contract_type); + } + + #[test] + fn test_pub_sub_publish_request() { + let pub_sub_publish_request = PubSubPublishRequest { + connection_id: "test_connection_id".to_string(), + topic: "test_topic".to_string(), + message: "test_message".to_string(), + message_type: "test_message_type".to_string(), + }; + let contract_type: RippleContract = RippleContract::PubSub(PubSubAdjective::Publish); + test_extn_payload_provider(pub_sub_publish_request, contract_type); + } + + #[test] + fn test_extn_response_pub_sub_connect_response() { + let connect_response = PubSubConnectResponse { + connection_status: "connected".to_string(), + connection_id: "test_connection_id".to_string(), + }; + let contract_type: RippleContract = RippleContract::PubSub(PubSubAdjective::Listener); + test_extn_payload_provider(connect_response, contract_type); + } + + #[test] + fn test_pub_sub_subscribe_response() { + let pub_sub_subscribe_response = PubSubSubscribeResponse { result: true }; + let contract_type: RippleContract = RippleContract::PubSub(PubSubAdjective::Listener); + test_extn_payload_provider(pub_sub_subscribe_response, contract_type); + } + + #[test] + fn test_pub_sub_publish_response() { + let pub_sub_publish_response = PubSubPublishResponse { result: true }; + let contract_type: RippleContract = RippleContract::PubSub(PubSubAdjective::Listener); + test_extn_payload_provider(pub_sub_publish_response, contract_type); + } + + #[test] + fn test_pub_sub_unsubscribe_response() { + let pub_sub_unsubscribe_response = PubSubUnSubscribeResponse { result: true }; + let contract_type: RippleContract = RippleContract::PubSub(PubSubAdjective::Listener); + test_extn_payload_provider(pub_sub_unsubscribe_response, contract_type); + } + + #[test] + fn test_pub_sub_request() { + let pub_sub_request = PubSubRequest::Connect(PubSubConnectRequest { + endpoint_url: "test_endpoint".to_string(), + client_name: Some("test_client".to_string()), + credentials: Credentials { + id: "test_id".to_string(), + secret: "test_secret".to_string(), + }, + operation_timeout_in_msec: 1000, + }); + let contract_type: RippleContract = RippleContract::PubSub(PubSubAdjective::Provider); + test_extn_payload_provider(pub_sub_request, contract_type); + } + + #[test] + fn test_pub_sub_response() { + let pub_sub_response = PubSubResponse::Connect(PubSubConnectResponse { + connection_status: "Connected".to_string(), + connection_id: "test_connection_id".to_string(), + }); + let contract_type: RippleContract = RippleContract::PubSub(PubSubAdjective::Listener); + test_extn_payload_provider(pub_sub_response, contract_type); + } + + #[test] + fn test_pub_sub_update_connection_credentials_request() { + let pub_sub_update_request = PubSubUpdateConnectionCredentialsRequest { + connection_id: "test_connection_id".to_string(), + updated_secret: "new_secret".to_string(), + }; + let contract_type: RippleContract = RippleContract::PubSub(PubSubAdjective::Provider); + test_extn_payload_provider(pub_sub_update_request, contract_type); + } +} diff --git a/core/sdk/src/api/session.rs b/core/sdk/src/api/session.rs index d2fe4b203..71c359860 100644 --- a/core/sdk/src/api/session.rs +++ b/core/sdk/src/api/session.rs @@ -39,7 +39,7 @@ where } type Expiry = u32; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct AccountSessionTokenRequest { pub token: String, @@ -47,7 +47,7 @@ pub struct AccountSessionTokenRequest { pub expires_in: Expiry, } -#[derive(Serialize, Clone, Debug, Deserialize)] +#[derive(Serialize, PartialEq, Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ProvisionRequest { pub account_id: String, @@ -55,7 +55,7 @@ pub struct ProvisionRequest { pub distributor_id: Option, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum AccountSessionRequest { Get, Provision(ProvisionRequest), @@ -90,7 +90,7 @@ pub enum AccountSessionResponse { } #[repr(C)] -#[derive(Serialize, Deserialize, Clone)] +#[derive(Serialize, Deserialize, PartialEq, Clone)] pub struct AccountSession { pub id: String, pub token: String, @@ -185,7 +185,7 @@ impl AccountSession { * https://developer.comcast.com/firebolt/core/sdk/latest/api/authentication */ /*TokenType and Token are Firebolt spec types */ -#[derive(Debug, Serialize, Deserialize, Clone, Copy)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone, Copy)] pub enum TokenType { #[serde(rename = "platform")] Platform, @@ -208,13 +208,13 @@ impl ToString for TokenType { } } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub struct TokenContext { pub distributor_id: String, pub app_id: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct SessionTokenRequest { pub token_type: TokenType, pub options: Vec, @@ -297,3 +297,72 @@ impl ContractAdjective for EventAdjective { RippleContract::DeviceEvents(self.clone()) } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::api::config::Config; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_account_session() { + let account_session_request = AccountSessionRequest::Get; + let contract_type: RippleContract = RippleContract::Session(SessionAdjective::Account); + test_extn_payload_provider(account_session_request, contract_type); + } + + #[test] + fn test_extn_request_account_session_none() { + let other_payload = ExtnPayload::Request(ExtnRequest::Config(Config::DefaultApp)); + let result = AccountSessionRequest::get_from_payload(other_payload); + assert_eq!(result, None); + } + + #[test] + fn test_extn_request_session_token() { + let token_context = TokenContext { + distributor_id: String::from("test_distributor"), + app_id: String::from("test_app"), + }; + let session_token_request = SessionTokenRequest { + token_type: TokenType::Device, + options: vec![String::from("option1"), String::from("option2")], + context: Some(token_context), + }; + + let contract_type: RippleContract = RippleContract::Session(SessionAdjective::Device); + test_extn_payload_provider(session_token_request, contract_type); + } + + #[test] + fn test_extn_request_session_token_none() { + let other_payload = + ExtnPayload::Request(ExtnRequest::AccountSession(AccountSessionRequest::Get)); + let result = SessionTokenRequest::get_from_payload(other_payload); + assert_eq!(result, None); + } + + #[test] + fn test_extn_payload_provider_for_account_session() { + let account_session = AccountSession { + id: String::from("your_id"), + token: String::from("your_token"), + account_id: String::from("your_account_id"), + device_id: String::from("your_device_id"), + }; + + let contract_type: RippleContract = RippleContract::Session(SessionAdjective::Account); + test_extn_payload_provider(account_session, contract_type); + } + + #[test] + fn test_extn_payload_provider_for_account_token() { + let account_token = AccountToken { + token: String::from("your_token"), + expires: 123456789, + }; + + let contract_type: RippleContract = RippleContract::Session(SessionAdjective::Account); + test_extn_payload_provider(account_token, contract_type); + } +} diff --git a/core/sdk/src/api/settings.rs b/core/sdk/src/api/settings.rs index 20ac76e4a..f9f8872f1 100644 --- a/core/sdk/src/api/settings.rs +++ b/core/sdk/src/api/settings.rs @@ -25,7 +25,7 @@ use crate::{ use super::gateway::rpc_gateway_api::CallContext; -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum SettingKey { VoiceGuidanceEnabled, ClosedCaptions, @@ -72,7 +72,7 @@ impl SettingKey { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct SettingsRequestParam { pub context: CallContext, pub keys: Vec, @@ -102,7 +102,7 @@ impl SettingsRequestParam { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub enum SettingsRequest { Get(SettingsRequestParam), @@ -149,3 +149,33 @@ impl SettingValue { } } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::api::gateway::rpc_gateway_api::ApiProtocol; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_settings() { + let settings_request_param = SettingsRequestParam { + context: CallContext { + session_id: "test_session_id".to_string(), + request_id: "test_request_id".to_string(), + app_id: "test_app_id".to_string(), + call_id: 123, + protocol: ApiProtocol::JsonRpc, + method: "some method".to_string(), + cid: Some("test_cid".to_string()), + gateway_secure: true, + }, + keys: vec![SettingKey::VoiceGuidanceEnabled, SettingKey::ClosedCaptions], + alias_map: Some(HashMap::new()), + }; + + let settings_request = SettingsRequest::Get(settings_request_param); + + let contract_type: RippleContract = RippleContract::Settings; + test_extn_payload_provider(settings_request, contract_type); + } +} diff --git a/core/sdk/src/api/status_update.rs b/core/sdk/src/api/status_update.rs index e4db58dc5..cbdbaa044 100644 --- a/core/sdk/src/api/status_update.rs +++ b/core/sdk/src/api/status_update.rs @@ -45,3 +45,16 @@ impl ExtnPayloadProvider for ExtnStatus { RippleContract::ExtnStatus } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_payload_provider_for_extn_status() { + let extn_status = ExtnStatus::Error; + let contract_type: RippleContract = RippleContract::ExtnStatus; + test_extn_payload_provider(extn_status, contract_type); + } +} diff --git a/core/sdk/src/api/storage_property.rs b/core/sdk/src/api/storage_property.rs index c73e1dc36..c6ff8247a 100644 --- a/core/sdk/src/api/storage_property.rs +++ b/core/sdk/src/api/storage_property.rs @@ -436,7 +436,7 @@ pub struct PropertyData { pub event_names: Option<&'static [&'static str]>, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub enum StorageProperty { ClosedCaptionsEnabled, ClosedCaptionsFontFamily, @@ -656,7 +656,7 @@ impl StorageProperty { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub enum StorageManagerRequest { GetBool(StorageProperty, bool), GetString(StorageProperty), @@ -697,3 +697,18 @@ impl ContractAdjective for StorageAdjective { RippleContract::Storage(self.clone()) } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_storage_manager() { + let storage_request = + StorageManagerRequest::GetBool(StorageProperty::ClosedCaptionsEnabled, true); + let contract_type: RippleContract = RippleContract::Storage(StorageAdjective::Manager); + + test_extn_payload_provider(storage_request, contract_type); + } +} diff --git a/core/sdk/src/api/usergrant_entry.rs b/core/sdk/src/api/usergrant_entry.rs index b0b1a9112..88fead482 100644 --- a/core/sdk/src/api/usergrant_entry.rs +++ b/core/sdk/src/api/usergrant_entry.rs @@ -28,7 +28,7 @@ use super::device::device_user_grants_data::{GrantLifespan, GrantStatus, PolicyP use super::firebolt::fb_capabilities::FireboltPermission; use super::storage_property::StorageAdjective; -#[derive(Clone, Debug, Deserialize, Serialize)] +#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)] pub enum UserGrantsStoreRequest { GetUserGrants(String, FireboltPermission), SetUserGrants(UserGrantInfo), @@ -69,7 +69,7 @@ impl ExtnPayloadProvider for UserGrantsStoreRequest { } } -#[derive(Clone, Debug, Deserialize, Serialize)] +#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)] pub struct UserGrantInfo { pub role: CapabilityRole, pub capability: String, @@ -93,3 +93,26 @@ impl Default for UserGrantInfo { } } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::api::firebolt::fb_capabilities::{CapabilityRole, FireboltCap}; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_request_user_grants_store() { + let user_id = "test_user_id".to_string(); + let firebolt_permission = FireboltPermission { + cap: FireboltCap::Short("test_short_cap".to_string()), + role: CapabilityRole::Use, + }; + + let user_grants_request = + UserGrantsStoreRequest::GetUserGrants(user_id, firebolt_permission); + let contract_type: RippleContract = + RippleContract::Storage(StorageAdjective::UsergrantLocal); + + test_extn_payload_provider(user_grants_request, contract_type); + } +} diff --git a/core/sdk/src/api/wifi.rs b/core/sdk/src/api/wifi.rs index 4cc448cb6..f657ef2ce 100644 --- a/core/sdk/src/api/wifi.rs +++ b/core/sdk/src/api/wifi.rs @@ -58,7 +58,7 @@ impl Default for WifiScanRequestTimeout { } } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub enum WifiResponse { CustomError(String), WifiScanListResponse(AccessPointList), @@ -86,3 +86,29 @@ impl ExtnPayloadProvider for WifiResponse { RippleContract::Wifi } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::api::device::device_wifi::WifiSecurityMode; + use crate::utils::test_utils::test_extn_payload_provider; + + #[test] + fn test_extn_payload_provider_for_wifi_response() { + let access_point_list = AccessPointList { + list: vec![AccessPoint { + ssid: String::from("TestNetwork"), + security_mode: WifiSecurityMode::Wpa2PskAes, + signal_strength: -60, + frequency: 2.4, + }], + }; + + let wifi_response = WifiResponse::WifiScanListResponse(access_point_list); + + let contract_type: RippleContract = RippleContract::Wifi; + test_extn_payload_provider(wifi_response, contract_type); + } + + // Add more test cases as needed +} diff --git a/core/sdk/src/utils/error.rs b/core/sdk/src/utils/error.rs index 6acd94108..bcc4ad380 100644 --- a/core/sdk/src/utils/error.rs +++ b/core/sdk/src/utils/error.rs @@ -19,7 +19,7 @@ use serde::{Deserialize, Serialize}; use crate::api::firebolt::fb_capabilities::DenyReason; -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] pub enum RippleError { MissingInput, InvalidInput, diff --git a/core/sdk/src/utils/mod.rs b/core/sdk/src/utils/mod.rs index d261394b9..c6c893aa5 100644 --- a/core/sdk/src/utils/mod.rs +++ b/core/sdk/src/utils/mod.rs @@ -20,4 +20,5 @@ pub mod error; pub mod extn_utils; pub mod logger; pub mod serde_utils; +pub mod test_utils; pub mod time_utils; diff --git a/core/sdk/src/utils/test_utils.rs b/core/sdk/src/utils/test_utils.rs new file mode 100644 index 000000000..4355c2378 --- /dev/null +++ b/core/sdk/src/utils/test_utils.rs @@ -0,0 +1,31 @@ +// Copyright 2023 Comcast Cable Communications Management, LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: Apache-2.0 + +use crate::extn::extn_client_message::ExtnPayloadProvider; +use crate::framework::ripple_contract::RippleContract; + +pub fn test_extn_payload_provider(request: T, contract_type: RippleContract) +where + T: ExtnPayloadProvider + PartialEq + std::fmt::Debug, +{ + let value = request.get_extn_payload(); + if let Some(v) = T::get_from_payload(value) { + assert_eq!(v, request); + assert_eq!(contract_type, T::contract()); + } else { + panic!("Test failed for ExtnRequest variant: {:?}", request); + } +}