Skip to content

Commit 02a8c89

Browse files
author
Nikita Khateev
committed
Add tests for add_request_fees
Signed-off-by: Nikita Khateev <[email protected]>
1 parent ab3cf2a commit 02a8c89

File tree

7 files changed

+170
-10
lines changed

7 files changed

+170
-10
lines changed

libindy/src/services/payments.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,18 +206,22 @@ impl PaymentsService {
206206
let inputs: Vec<&str> = serde_json::from_str(inputs).map_err(|_| PaymentsError::CommonError(CommonError::InvalidStructure("Unable to parse inputs".to_string())))?;
207207
let inputs_len = inputs.len();
208208
if inputs_len == 0 {
209+
error!("No inputs for transaction");
209210
return Err(PaymentsError::CommonError(CommonError::InvalidStructure("No inputs for transaction".to_string())));
210211
}
211212
let input_set: HashSet<&str> = inputs.into_iter().collect();
212213
if inputs_len != input_set.len() {
214+
error!("Several equal inputs");
213215
return Err(PaymentsError::CommonError(CommonError::InvalidStructure("Several equal inputs".to_string())));
214216
}
215217
let input_methods: Vec<Option<String>> = input_set.into_iter().map(|s| self._parse_method_from_payment_address(s)).collect();
216218
if input_methods.contains(&None) {
219+
error!("Some payment addresses are incorrectly formed");
217220
return Err(PaymentsError::CommonError(CommonError::InvalidStructure("Some payment addresses are incorrectly formed".to_string())));
218221
}
219222
let input_methods_set: HashSet<String> = input_methods.into_iter().map(|s| s.unwrap()).collect();
220223
if input_methods_set.len() != 1 {
224+
error!("Unable to identify payment method from inputs");
221225
return Err(PaymentsError::IncompatiblePaymentError("Unable to identify payment method from inputs".to_string()));
222226
}
223227
Ok(input_methods_set.into_iter().next().unwrap())
@@ -227,21 +231,25 @@ impl PaymentsService {
227231
let outputs: Vec<Output> = serde_json::from_str(outputs).map_err(|_| PaymentsError::CommonError(CommonError::InvalidStructure("Unable to parse outputs".to_string())))?;
228232
let outputs_len = outputs.len();
229233
if outputs_len == 0 {
234+
error!("No outputs for transaction");
230235
return Err(PaymentsError::CommonError(CommonError::InvalidStructure("No outputs for transaction".to_string())));
231236
}
232237

233238
let payment_address_set: HashSet<String> = outputs.into_iter().map(|s| s.payment_address).collect();
234239
if payment_address_set.len() != outputs_len {
240+
error!("Several equal payment addresses");
235241
return Err(PaymentsError::CommonError(CommonError::InvalidStructure("Several equal payment addresses".to_string())));
236242
}
237243

238244
let payment_methods: Vec<Option<String>> = payment_address_set.into_iter().map(|s| self._parse_method_from_payment_address(s.as_str())).collect();
239245
if payment_methods.contains(&None) {
246+
error!("Some payment addresses are incorrectly formed");
240247
return Err(PaymentsError::CommonError(CommonError::InvalidStructure("Some payment addresses are incorrectly formed".to_string())));
241248
}
242249

243250
let payment_method_set: HashSet<String> = payment_methods.into_iter().map(|s| s.unwrap()).collect();
244251
if payment_method_set.len() != 1 {
252+
error!("Unable to identify payment method from outputs");
245253
return Err(PaymentsError::IncompatiblePaymentError("Unable to identify payment method from outputs".to_string()));
246254
}
247255

libnullpay/src/payment_method.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ pub mod build_payment_req {
166166

167167
_save_response(infos, res.clone())
168168
} else {
169+
_add_response(res.clone(), "INSUFFICIENT_FUNDS".to_string());
169170
ErrorCode::Success
170171
}
171172
} else {

libnullpay/tests/payments.rs

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,16 @@ use utils::test_utils;
2020
use utils::types::*;
2121
use utils::ledger;
2222
use utils::pool;
23+
use utils::did;
2324

2425
use std::collections::HashMap;
2526

2627
static EMPTY_OBJECT: &str = "{}";
2728
static PAYMENT_METHOD_NAME: &str = "null";
2829
static POOL_NAME: &str = "pool_1";
2930
static SUBMITTER_DID: &str = "Th7MpTaRZVRYnPiabds81Y";
31+
static DEST: &str = "FYmoFw55GeQH7SRFa37dkx1d2dZ3zUF8ckg7wmL7ofN4";
32+
static VERKEY: &str = "CnEDk9HrMnmiHXEV1WFgbVCRteYnPqsJwrTdcZaNhFVW";
3033
static FEES: &str = r#"{"1":1, "101":2}"#;
3134

3235
mod high_cases {
@@ -161,17 +164,41 @@ mod high_cases {
161164
plugin::init_plugin();
162165
let wallet_handle = wallet::create_and_open_wallet(POOL_NAME, None).unwrap();
163166
let pool_handle = pool::create_and_open_pool_ledger(POOL_NAME).unwrap();
167+
let (my_did, verkey) = did::create_store_and_publish_my_did_from_trustee(wallet_handle, pool_handle).unwrap();
164168

165-
let addresses = payments_utils::create_addresses(vec!["{}", "{}"], wallet_handle, PAYMENT_METHOD_NAME);
169+
// let addresses = payments_utils::create_addresses(vec!["{}", "{}"], wallet_handle, PAYMENT_METHOD_NAME);
166170

167-
let mint: Vec<(String, i32, Option<&str>)> = addresses.clone().into_iter().enumerate().map(|(i, addr)| (addr, ((i+2)*10) as i32, None)).collect();
168-
payments_utils::mint_tokens(mint, wallet_handle, pool_handle, PAYMENT_METHOD_NAME, SUBMITTER_DID);
171+
// let mint: Vec<(String, i32, Option<&str>)> = addresses.clone().into_iter().enumerate().map(|(i, addr)| (addr, ((i+2)*10) as i32, None)).collect();
172+
// payments_utils::mint_tokens(mint, wallet_handle, pool_handle, PAYMENT_METHOD_NAME, my_did.as_str());
169173

170-
let utxos = payments_utils::get_utxos_with_balance(addresses, wallet_handle, pool_handle, SUBMITTER_DID);
174+
// let utxos = payments_utils::get_utxos_with_balance(addresses.clone(), wallet_handle, pool_handle, my_did.as_str());
171175

172-
payments_utils::set_request_fees(wallet_handle, pool_handle, SUBMITTER_DID, PAYMENT_METHOD_NAME, FEES);
176+
// payments_utils::set_request_fees(wallet_handle, pool_handle, my_did.as_str(), PAYMENT_METHOD_NAME, FEES);
177+
178+
let nym_req = ledger::build_nym_request(my_did.as_str(), DEST, VERKEY, "aaa", "").unwrap();
179+
180+
// let addr_1 = addresses.get(0).unwrap();
181+
// let utxos_1: Vec<String> = utxos.get(addr_1.as_str()).unwrap().into_iter().map(|info| info.input.clone()).collect();
182+
// let inputs = serde_json::to_string(&utxos_1).unwrap();
183+
184+
// let outputs = vec![UTXOOutput{
185+
// payment_address: addresses.get(1).unwrap().to_string(),
186+
// amount: 19,
187+
// extra: None
188+
// }];
189+
// let outputs = serde_json::to_string(&outputs).unwrap();
190+
//
191+
// let (nym_req_with_fees, payment_method) = payments::add_request_fees(wallet_handle, my_did.as_str(), nym_req.as_str(), inputs.as_str(), outputs.as_str()).unwrap();
192+
193+
let nym_response = ledger::sign_and_submit_request(pool_handle, wallet_handle, my_did.as_str(), nym_req.as_str()).unwrap();
194+
trace!("nym response {}", nym_response);
195+
let nym_response_parsed = payments::parse_response_with_fees(PAYMENT_METHOD_NAME, nym_response.as_str()).unwrap();
173196

174-
//TODO: add request fees
197+
// let created_utxos: Vec<UTXOInfo> = serde_json::from_str(nym_response_parsed.as_str()).unwrap();
198+
//
199+
// assert_eq!(created_utxos.len(), 1);
200+
// let new_utxo = created_utxos.get(0).unwrap();
201+
// assert_eq!(new_utxo.amount, 19);
175202

176203
pool::close(pool_handle).unwrap();
177204
wallet::close_wallet(wallet_handle).unwrap();

libnullpay/tests/utils/did.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
use nullpay::ErrorCode;
2+
use std::ffi::CString;
3+
use std::os::raw::c_char;
4+
5+
pub const TRUSTEE_SEED: &'static str = "000000000000000000000000Trustee1";
6+
7+
pub fn create_store_and_publish_my_did_from_trustee(wallet_handle: i32, pool_handle: i32) -> Result<(String, String), ErrorCode> {
8+
let (trustee_did, _) = create_and_store_my_did(wallet_handle, Some(TRUSTEE_SEED))?;
9+
let (my_did, my_vk) = create_and_store_my_did(wallet_handle, None)?;
10+
let nym = super::ledger::build_nym_request(&trustee_did, &my_did, &my_vk, "", "TRUSTEE")?;
11+
super::ledger::sign_and_submit_request(pool_handle, wallet_handle, &trustee_did, &nym)?; //TODO check response type
12+
Ok((my_did, my_vk))
13+
}
14+
15+
pub fn create_and_store_my_did(wallet_handle: i32, seed: Option<&str>) -> Result<(String, String), ErrorCode> {
16+
let (receiver, command_handle, cb) = super::callbacks::_closure_to_cb_ec_string_string();
17+
18+
let my_did_json = seed.map_or("{}".to_string(), |seed| format!("{{\"seed\":\"{}\" }}", seed));
19+
let my_did_json = CString::new(my_did_json).unwrap();
20+
21+
let err = unsafe {
22+
indy_create_and_store_my_did(command_handle, wallet_handle, my_did_json.as_ptr(), cb)
23+
};
24+
25+
super::results::result_to_string_string(err, receiver)
26+
}
27+
28+
extern {
29+
#[no_mangle]
30+
fn indy_create_and_store_my_did(command_handle: i32,
31+
wallet_handle: i32,
32+
did_json: *const c_char,
33+
cb: Option<extern fn(xcommand_handle: i32,
34+
err: ErrorCode,
35+
did: *const c_char,
36+
verkey: *const c_char)>) -> ErrorCode;
37+
}

libnullpay/tests/utils/ledger.rs

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,47 @@ pub fn submit_request(pool_handle: i32, request_json: &str) -> Result<String, Er
77

88
let request_json = CString::new(request_json).unwrap();
99

10-
let err = unsafe {indy_submit_request(command_handle, pool_handle, request_json.as_ptr(), cb)};
10+
let err = unsafe { indy_submit_request(command_handle, pool_handle, request_json.as_ptr(), cb) };
11+
12+
super::results::result_to_string(err, receiver)
13+
}
14+
15+
pub fn sign_and_submit_request(pool_handle: i32, wallet_handle: i32, submitter_did: &str, request_json: &str) -> Result<String, ErrorCode> {
16+
let (receiver, command_handle, cb) = super::callbacks::_closure_to_cb_ec_string();
17+
18+
let submitter_did = CString::new(submitter_did).unwrap();
19+
let request_json = CString::new(request_json).unwrap();
20+
21+
let err = unsafe {
22+
indy_sign_and_submit_request(command_handle,
23+
pool_handle,
24+
wallet_handle,
25+
submitter_did.as_ptr(),
26+
request_json.as_ptr(),
27+
cb)
28+
};
29+
30+
super::results::result_to_string(err, receiver)
31+
}
32+
33+
pub fn build_nym_request(submitter_did: &str, target_did: &str, verkey: &str, alias: &str, role: &str) -> Result<String, ErrorCode> {
34+
let (receiver, command_handle, cb) = super::callbacks::_closure_to_cb_ec_string();
35+
36+
let submitter_did = CString::new(submitter_did).unwrap();
37+
let target_did = CString::new(target_did).unwrap();
38+
let verkey = CString::new(verkey).unwrap();
39+
let alias = CString::new(alias).unwrap();
40+
let role = CString::new(role).unwrap();
41+
42+
let err = unsafe {
43+
indy_build_nym_request(command_handle,
44+
submitter_did.as_ptr(),
45+
target_did.as_ptr(),
46+
verkey.as_ptr(),
47+
alias.as_ptr(),
48+
role.as_ptr(),
49+
cb)
50+
};
1151

1252
super::results::result_to_string(err, receiver)
1353
}
@@ -20,4 +60,25 @@ extern {
2060
cb: Option<extern fn(xcommand_handle: i32,
2161
err: ErrorCode,
2262
request_result_json: *const c_char)>) -> ErrorCode;
63+
64+
#[no_mangle]
65+
fn indy_build_nym_request(command_handle: i32,
66+
submitter_did: *const c_char,
67+
target_did: *const c_char,
68+
verkey: *const c_char,
69+
alias: *const c_char,
70+
role: *const c_char,
71+
cb: Option<extern fn(xcommand_handle: i32,
72+
err: ErrorCode,
73+
request_json: *const c_char)>) -> ErrorCode;
74+
#[no_mangle]
75+
fn indy_sign_and_submit_request(command_handle: i32,
76+
pool_handle: i32,
77+
wallet_handle: i32,
78+
submitter_did: *const c_char,
79+
request_json: *const c_char,
80+
cb: Option<extern fn(xcommand_handle: i32,
81+
err: ErrorCode,
82+
request_result_json: *const c_char)>) -> ErrorCode;
83+
2384
}

libnullpay/tests/utils/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
extern crate libc;
22
extern crate nullpay;
33

4+
pub mod did;
45
pub mod payments;
56
pub mod plugin;
67
pub mod wallet;

libnullpay/tests/utils/payments.rs

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,23 @@ pub fn add_request_fees(wallet_handle: i32, submitter_did: &str, req_json: &str,
5353
super::results::result_to_string_string(err, receiver)
5454
}
5555

56+
pub fn parse_response_with_fees(payment_method: &str, resp_json: &str) -> Result<String, ErrorCode> {
57+
let (receiver, command_handle, cb) =
58+
super::callbacks::_closure_to_cb_ec_string();
59+
60+
let payment_method = CString::new(payment_method).unwrap();
61+
let resp_json = CString::new(resp_json).unwrap();
62+
63+
let err = unsafe {
64+
indy_parse_response_with_fees(command_handle,
65+
payment_method.as_ptr(),
66+
resp_json.as_ptr(),
67+
cb)
68+
};
69+
70+
super::results::result_to_string(err, receiver)
71+
}
72+
5673
pub fn build_get_utxo_request(wallet_handle: i32, submitter_did: &str, payment_address: &str) -> Result<(String, String), ErrorCode> {
5774
let (receiver, command_handle, cb) =
5875
super::callbacks::_closure_to_cb_ec_string_string();
@@ -207,14 +224,14 @@ extern {
207224
config: *const c_char,
208225
cb: Option<extern fn(command_handle_: i32,
209226
err: ErrorCode,
210-
payment_address: *const c_char)>) -> ErrorCode ;
227+
payment_address: *const c_char)>) -> ErrorCode;
211228

212229
#[no_mangle]
213230
fn indy_list_payment_addresses(command_handle: i32,
214231
wallet_handle: i32,
215232
cb: Option<extern fn(command_handle_: i32,
216-
err: ErrorCode,
217-
payment_addresses_json: *const c_char)>) -> ErrorCode;
233+
err: ErrorCode,
234+
payment_addresses_json: *const c_char)>) -> ErrorCode;
218235

219236
#[no_mangle]
220237
fn indy_add_request_fees(command_handle: i32,
@@ -228,6 +245,14 @@ extern {
228245
req_with_fees_json: *const c_char,
229246
payment_method: *const c_char)>) -> ErrorCode;
230247

248+
#[no_mangle]
249+
fn indy_parse_response_with_fees(command_handle: i32,
250+
payment_method: *const c_char,
251+
resp_json: *const c_char,
252+
cb: Option<extern fn(command_handle_: i32,
253+
err: ErrorCode,
254+
utxo_json: *const c_char)>) -> ErrorCode;
255+
231256
#[no_mangle]
232257
fn indy_build_get_utxo_request(command_handle: i32,
233258
wallet_handle: i32,

0 commit comments

Comments
 (0)