From 1f8c4f17f9b696ddfa12a904ed8c4903fdbfffaa Mon Sep 17 00:00:00 2001 From: "artem.ivanov" Date: Tue, 21 May 2019 10:03:32 +0300 Subject: [PATCH] ST-552: Updated set_fees builder to accept any aliases Signed-off-by: artem.ivanov --- libsovtoken/src/api/mod.rs | 2 +- .../src/logic/config/set_fees_config.rs | 55 ++++++------------- libsovtoken/src/logic/set_fees.rs | 28 +--------- .../tests/build_fees_txn_handler_test.rs | 30 ++++++++-- 4 files changed, 45 insertions(+), 70 deletions(-) diff --git a/libsovtoken/src/api/mod.rs b/libsovtoken/src/api/mod.rs index 032fd3615..0e2046d72 100644 --- a/libsovtoken/src/api/mod.rs +++ b/libsovtoken/src/api/mod.rs @@ -661,7 +661,7 @@ pub extern "C" fn build_get_txn_fees_handler( let did = match opt_res_to_res_opt!(did) { Ok(did) => did, - Err(_e) => None + Err(_) => None }; let did = Some(did.unwrap_or(Did::new("LibsovtokenDid11111111".to_string()))); diff --git a/libsovtoken/src/logic/config/set_fees_config.rs b/libsovtoken/src/logic/config/set_fees_config.rs index def25eba9..c9262cf88 100644 --- a/libsovtoken/src/logic/config/set_fees_config.rs +++ b/libsovtoken/src/logic/config/set_fees_config.rs @@ -89,8 +89,7 @@ impl SetFees { /** Validate `self.fees`. - Checks `self.fees` is not empty and the keys are string - integers. + Checks `self.fees` is not empty. ## Examples @@ -110,25 +109,6 @@ impl SetFees { assert_eq!(SetFeesError::Empty, validated.unwrap_err()); ``` - #### Fees with non-string-integer keys - Returns a [`SetFeesError::KeyNotInteger`]. - ``` - use std::collections::HashMap; - use sovtoken::logic::config::set_fees_config::{ - SetFees, - SetFeesError, - }; - - let mut fees = HashMap::new(); - // Key should be "10001" - let key = String::from("XFER_PUBLIC"); - fees.insert(key.clone(), 10); - let set_fees = SetFees::new(fees); - let validated = set_fees.validate(); - - assert_eq!(SetFeesError::KeyNotInteger(key), validated.unwrap_err()) - ``` - #### Valid Fees ``` use std::collections::HashMap; @@ -148,23 +128,12 @@ impl SetFees { ``` [`SetFeesError::Empty`]: ./enum.SetFeesError.html#variant.Empty - [`SetFeesError::KeyNotInteger`]: ./enum.SetFeesError.html#variant.KeyNotInteger */ pub fn validate(self) -> Result { if self.fees.is_empty() { return Err(SetFeesError::Empty); } - { - let key_not_integer = self.fees - .keys() - .find(|&key| key.parse::().is_err()); - - if let Some(key) = key_not_integer { - return Err(SetFeesError::KeyNotInteger(key.to_owned())); - } - } - return Ok(self); } @@ -175,14 +144,12 @@ impl SetFees { ### Includes - `SetFeesError::Empty` - - `SetFeesError::KeyNotInteger(&str)` [`SetFees::validate`]: ./struct.SetFees.html#method.validate */ #[derive(Debug, PartialEq, Eq)] pub enum SetFeesError { Empty, - KeyNotInteger(String) } impl fmt::Display for SetFeesError { @@ -195,7 +162,6 @@ impl Error for SetFeesError { fn description(&self) -> &str { match self { &SetFeesError::Empty => "Set fees was empty.", - &SetFeesError::KeyNotInteger(_) => "A Set fees key wasn't a integer string.", } } } @@ -225,22 +191,33 @@ mod fees_config_test { } #[test] - fn test_validation_fees_key_not_string_integer() { + fn test_validation_fees_key_string_integer() { + let set_fees_json = json!({ + "1000": 10, + }); + let hash_map: SetFeesMap = serde_json::from_value(set_fees_json).unwrap(); + let set_fees = SetFees::new(hash_map); + assert!(set_fees.validate().is_ok()); + } + + #[test] + fn test_validation_fees_key_aliases() { let set_fees_json = json!({ "XFER_PUBLIC": 10, + "ALIAS": 10, }); - let expected = SetFeesError::KeyNotInteger(String::from("XFER_PUBLIC")); let hash_map: SetFeesMap = serde_json::from_value(set_fees_json).unwrap(); let set_fees = SetFees::new(hash_map); - assert_eq!(expected, set_fees.validate().unwrap_err()); + assert!(set_fees.validate().is_ok()); } #[test] fn create_valid_set_fees_request() { let set_fees_json = json!({ "3": 10, - "1000": 12 + "1000": 12, + "ALIAS": 10, }); let expected = set_fees_json.clone(); diff --git a/libsovtoken/src/logic/set_fees.rs b/libsovtoken/src/logic/set_fees.rs index 7798a14c5..6c08b30bd 100644 --- a/libsovtoken/src/logic/set_fees.rs +++ b/libsovtoken/src/logic/set_fees.rs @@ -8,27 +8,6 @@ use serde_json; use utils::constants::general::{JsonCallback, JsonCallbackUnwrapped}; use utils::ffi_support::string_from_char_ptr; -const NYM: &'static str = "1"; -const ATTRIB: &'static str = "100"; -const SCHEMA: &'static str = "101"; -const CRED_DEF: &'static str = "102"; -const REVOC_REG_DEF: &'static str = "113"; -const REVOC_REG_ENTRY: &'static str = "114"; -const XFER_PUBLIC: &'static str = "10001"; - -fn txn_name_to_code(txn: &str) -> String { - match txn { - "NYM" => NYM.to_string(), - "ATTRIB" => ATTRIB.to_string(), - "SCHEMA" => SCHEMA.to_string(), - "CRED_DEF" => CRED_DEF.to_string(), - "REVOC_REG_DEF" => REVOC_REG_DEF.to_string(), - "REVOC_REG_ENTRY" => REVOC_REG_ENTRY.to_string(), - "XFER_PUBLIC" => XFER_PUBLIC.to_string(), - val @ _ => val.to_string() - } -} - type DeserializedArguments = (Option, SetFees, JsonCallbackUnwrapped); pub fn deserialize_inputs( @@ -51,9 +30,6 @@ pub fn deserialize_inputs( let set_fees_map: SetFeesMap = serde_json::from_str(&set_fees_json).map_err(map_err_err!()) .or(Err(ErrorCode::CommonInvalidStructure))?; - let set_fees_map: SetFeesMap = set_fees_map.iter() - .map(|(key, val)| (txn_name_to_code(key), val.clone())).collect(); - let set_fees = SetFees::new(set_fees_map) .validate().map_err(map_err_err!()) .or(Err(ErrorCode::CommonInvalidStructure))?; @@ -135,7 +111,7 @@ mod test_deserialize_inputs { } #[test] - fn deserialize_fees_key_not_string_int() { + fn deserialize_fees_key_alias() { let invalid_fees = json_c_pointer!({ "XFER_PUBLIC": 5, "3": 1, @@ -144,7 +120,7 @@ mod test_deserialize_inputs { let (_, fees, _) = call_deserialize_inputs(None, Some(invalid_fees), None).unwrap(); assert_eq!(fees.fees.len(), 2); - assert_eq!(fees.fees.get("10001"), Some(&5)); + assert_eq!(fees.fees.get("XFER_PUBLIC"), Some(&5)); assert_eq!(fees.fees.get("3"), Some(&1)); } diff --git a/libsovtoken/tests/build_fees_txn_handler_test.rs b/libsovtoken/tests/build_fees_txn_handler_test.rs index a3b3461c3..6da5e92d9 100644 --- a/libsovtoken/tests/build_fees_txn_handler_test.rs +++ b/libsovtoken/tests/build_fees_txn_handler_test.rs @@ -108,7 +108,29 @@ fn add_fees_json() { assert_eq!(&expected_operation, request_value.get("operation").unwrap()); } +#[test] +fn add_fees_json_for_any_key() { + sovtoken::api::sovtoken_init(); + let fees = json!({ + "3": 6, + "TXN_ALIAS": 12, + "TXN ALIAS WITH SPACE": 12, + }); + let expected_operation = json!({ + "type": "20000", + "fees": fees, + }); + let did = bs58::encode("1234567890123456").into_string(); + let (ec_initial, receiver) = call_set_fees(&did, fees); + let (ec_callback, fees_request) = receiver.recv().unwrap(); + + let request_value: serde_json::value::Value = serde_json::from_str(&fees_request).unwrap(); + + assert_eq!(ErrorCode::Success, ec_initial); + assert_eq!(ErrorCode::Success, ec_callback); + assert_eq!(&expected_operation, request_value.get("operation").unwrap()); +} #[test] pub fn build_and_submit_set_fees() { @@ -167,8 +189,8 @@ pub fn build_and_submit_set_fees_with_names() { let current_fees = fees::get_fees(&wallet, pool_handle, Some(dids[0])); let current_fees_value: serde_json::Value = serde_json::from_str(¤t_fees).unwrap(); - assert_eq!(current_fees_value["1"].as_u64().unwrap(), 1); - assert_eq!(current_fees_value["100"].as_u64().unwrap(), 2); + assert_eq!(current_fees_value["NYM"].as_u64().unwrap(), 1); + assert_eq!(current_fees_value["ATTRIB"].as_u64().unwrap(), 2); let fees = json!({ "NYM": 0, @@ -202,8 +224,8 @@ pub fn build_and_submit_set_fees_with_empty_did() { let current_fees = fees::get_fees(&wallet, pool_handle, None); let current_fees_value: serde_json::Value = serde_json::from_str(¤t_fees).unwrap(); - assert_eq!(current_fees_value["1"].as_u64().unwrap(), 1); - assert_eq!(current_fees_value["100"].as_u64().unwrap(), 2); + assert_eq!(current_fees_value["NYM"].as_u64().unwrap(), 1); + assert_eq!(current_fees_value["ATTRIB"].as_u64().unwrap(), 2); let fees = json!({ "NYM": 0,