diff --git a/contracts/shade/src/components/invoice.rs b/contracts/shade/src/components/invoice.rs index 38d747d..3ea3bf7 100644 --- a/contracts/shade/src/components/invoice.rs +++ b/contracts/shade/src/components/invoice.rs @@ -1,4 +1,4 @@ -use crate::components::{access_control, admin, merchant, pausable, signature_util}; +use crate::components::{access_control, admin, merchant, signature_util}; use crate::errors::ContractError; use crate::events; use crate::types::{DataKey, Invoice, InvoiceFilter, InvoiceStatus, Role}; @@ -20,7 +20,6 @@ pub fn validate_invoice_creation( token: &Address, expires_at: Option, ) { - pausable::assert_not_paused(env); if amount <= 0 { panic_with_error!(env, ContractError::InvalidAmount); } diff --git a/contracts/shade/src/tests/mod.rs b/contracts/shade/src/tests/mod.rs index 777e84c..7c11f3b 100644 --- a/contracts/shade/src/tests/mod.rs +++ b/contracts/shade/src/tests/mod.rs @@ -5,17 +5,17 @@ pub mod test_account_factory; pub mod test_admin_payment; pub mod test_admin_transfer; pub mod test_fees; -// pub mod test_invoice; // TODO: fix this -// pub mod test_invoice_partial_refund; // TODO: fix this -// pub mod test_invoice_signed; // TODO: fix this -// pub mod test_invoice_void; // TODO: fix this +pub mod test_invoice; +pub mod test_invoice_partial_refund; +pub mod test_invoice_signed; +pub mod test_invoice_void; pub mod test_merchant; pub mod test_merchant_activation; pub mod test_merchant_key; pub mod test_merchant_verification; pub mod test_pausable; pub mod test_payment; -// pub mod test_refund; // TODO: fix this -// pub mod test_signatures; // TODO: fix this +pub mod test_refund; +pub mod test_signatures; pub mod test_subscription; pub mod test_upgrade; diff --git a/contracts/shade/src/tests/test_invoice.rs b/contracts/shade/src/tests/test_invoice.rs index 644b2fa..2cfcb6d 100644 --- a/contracts/shade/src/tests/test_invoice.rs +++ b/contracts/shade/src/tests/test_invoice.rs @@ -83,12 +83,15 @@ fn mark_invoice_paid( #[test] fn test_create_and_get_invoice_success() { - let (env, client, contract_id, _admin) = setup_test(); + let (env, client, contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Test Invoice"); let amount: i128 = 1000; @@ -109,13 +112,19 @@ fn test_create_and_get_invoice_success() { #[test] fn test_create_multiple_invoices() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token1 = Address::generate(&env); - let token2 = Address::generate(&env); + let token1 = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token1); + let token2 = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token2); let id1 = client.create_invoice( &merchant, @@ -147,17 +156,20 @@ fn test_create_multiple_invoices() { #[should_panic(expected = "HostError: Error(Contract, #8)")] #[test] fn test_get_invoice_not_found() { - let (_env, client, _contract_id, _admin) = setup_test(); + let (_env, client, _contract_id, admin) = setup_test(); client.get_invoice(&999); } #[should_panic(expected = "HostError: Error(Contract, #1)")] #[test] fn test_create_invoice_unregistered_merchant() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let unregistered_merchant = Address::generate(&env); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Test Invoice"); let amount: i128 = 1000; @@ -167,12 +179,15 @@ fn test_create_invoice_unregistered_merchant() { #[should_panic(expected = "HostError: Error(Contract, #7)")] #[test] fn test_create_invoice_invalid_amount() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Test Invoice"); let amount: i128 = 0; @@ -181,11 +196,12 @@ fn test_create_invoice_invalid_amount() { #[test] fn test_refund_invoice_success_within_window() { - let (env, client, shade_contract_id, _admin) = setup_test(); + let (env, client, shade_contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); let token = create_test_token(&env); + client.add_accepted_token(&admin, &token); let payer = Address::generate(&env); let description = String::from_str(&env, "Refundable Invoice"); let amount = 1_000_i128; @@ -225,11 +241,12 @@ fn test_refund_invoice_success_within_window() { #[test] #[should_panic(expected = "HostError: Error(Contract, #17)")] fn test_refund_invoice_fails_after_refund_window() { - let (env, client, shade_contract_id, _admin) = setup_test(); + let (env, client, shade_contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); let token = create_test_token(&env); + client.add_accepted_token(&admin, &token); let payer = Address::generate(&env); let invoice_id = client.create_invoice( &merchant, @@ -262,12 +279,15 @@ fn test_refund_invoice_fails_after_refund_window() { #[test] fn test_void_invoice_success() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Test Invoice"); let invoice_id = client.create_invoice(&merchant, &description, &1000, &token, &None); @@ -286,13 +306,14 @@ fn test_void_invoice_success() { #[test] #[should_panic(expected = "HostError: Error(Contract, #1)")] fn test_refund_invoice_fails_for_non_owner() { - let (env, client, shade_contract_id, _admin) = setup_test(); + let (env, client, shade_contract_id, admin) = setup_test(); let merchant = Address::generate(&env); let other_merchant = Address::generate(&env); client.register_merchant(&merchant); client.register_merchant(&other_merchant); let token = create_test_token(&env); + client.add_accepted_token(&admin, &token); let payer = Address::generate(&env); let invoice_id = client.create_invoice( &merchant, @@ -324,12 +345,15 @@ fn test_refund_invoice_fails_for_non_owner() { #[test] #[should_panic(expected = "HostError: Error(Contract, #1)")] fn test_void_invoice_non_owner() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Test Invoice"); let invoice_id = client.create_invoice(&merchant, &description, &1000, &token, &None); @@ -369,12 +393,15 @@ fn test_void_invoice_already_paid() { #[test] #[should_panic(expected = "HostError: Error(Contract, #16)")] fn test_void_invoice_already_cancelled() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Test Invoice"); let invoice_id = client.create_invoice(&merchant, &description, &1000, &token, &None); @@ -416,7 +443,7 @@ fn test_pay_cancelled_invoice() { #[test] #[should_panic(expected = "HostError: Error(Contract, #8)")] fn test_void_non_existent_invoice() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); @@ -429,12 +456,15 @@ fn test_void_non_existent_invoice() { #[test] fn test_amend_invoice_amount_success() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Original Invoice"); let invoice_id = client.create_invoice(&merchant, &description, &1000, &token, &None); @@ -450,12 +480,15 @@ fn test_amend_invoice_amount_success() { #[test] fn test_amend_invoice_description_success() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Original Description"); let invoice_id = client.create_invoice(&merchant, &description, &1000, &token, &None); @@ -477,12 +510,15 @@ fn test_amend_invoice_description_success() { #[test] fn test_amend_invoice_both_fields_success() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Original"); let invoice_id = client.create_invoice(&merchant, &description, &1000, &token, &None); @@ -532,12 +568,15 @@ fn test_amend_invoice_paid_fails() { #[test] #[should_panic(expected = "HostError: Error(Contract, #16)")] fn test_amend_invoice_cancelled_fails() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Test Invoice"); let invoice_id = client.create_invoice(&merchant, &description, &1000, &token, &None); @@ -551,12 +590,15 @@ fn test_amend_invoice_cancelled_fails() { #[test] #[should_panic(expected = "HostError: Error(Contract, #1)")] fn test_amend_invoice_non_owner_fails() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Test Invoice"); let invoice_id = client.create_invoice(&merchant, &description, &1000, &token, &None); @@ -569,12 +611,15 @@ fn test_amend_invoice_non_owner_fails() { #[test] #[should_panic(expected = "HostError: Error(Contract, #7)")] fn test_amend_invoice_invalid_amount_fails() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Test Invoice"); let invoice_id = client.create_invoice(&merchant, &description, &1000, &token, &None); @@ -585,12 +630,15 @@ fn test_amend_invoice_invalid_amount_fails() { #[test] #[should_panic(expected = "HostError: Error(Contract, #7)")] fn test_amend_invoice_negative_amount_fails() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Test Invoice"); let invoice_id = client.create_invoice(&merchant, &description, &1000, &token, &None); @@ -601,7 +649,7 @@ fn test_amend_invoice_negative_amount_fails() { #[test] #[should_panic(expected = "HostError: Error(Contract, #8)")] fn test_amend_non_existent_invoice_fails() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); diff --git a/contracts/shade/src/tests/test_invoice_partial_refund.rs b/contracts/shade/src/tests/test_invoice_partial_refund.rs index fd1956d..4159da4 100644 --- a/contracts/shade/src/tests/test_invoice_partial_refund.rs +++ b/contracts/shade/src/tests/test_invoice_partial_refund.rs @@ -69,10 +69,11 @@ fn setup_paid_invoice( #[test] fn test_partial_refund_single_balance_and_status() { - let (env, client, shade_contract_id, _admin) = setup_test(); + let (env, client, shade_contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); let token = create_test_token(&env); + client.add_accepted_token(&admin, &token); let payer = Address::generate(&env); let (invoice_id, merchant_account_id) = setup_paid_invoice( @@ -107,10 +108,11 @@ fn test_partial_refund_single_balance_and_status() { #[test] fn test_partial_refund_multiple_accumulates() { - let (env, client, shade_contract_id, _admin) = setup_test(); + let (env, client, shade_contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); let token = create_test_token(&env); + client.add_accepted_token(&admin, &token); let payer = Address::generate(&env); let (invoice_id, merchant_account_id) = setup_paid_invoice( @@ -141,10 +143,11 @@ fn test_partial_refund_multiple_accumulates() { #[test] fn test_partial_refund_full_via_partial_transitions_to_refunded() { - let (env, client, shade_contract_id, _admin) = setup_test(); + let (env, client, shade_contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); let token = create_test_token(&env); + client.add_accepted_token(&admin, &token); let payer = Address::generate(&env); let (invoice_id, merchant_account_id) = setup_paid_invoice( @@ -174,10 +177,11 @@ fn test_partial_refund_full_via_partial_transitions_to_refunded() { #[test] #[should_panic(expected = "HostError: Error(Contract, #7)")] fn test_partial_refund_over_refund_panics() { - let (env, client, shade_contract_id, _admin) = setup_test(); + let (env, client, shade_contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); let token = create_test_token(&env); + client.add_accepted_token(&admin, &token); let payer = Address::generate(&env); let (invoice_id, _) = setup_paid_invoice( @@ -198,10 +202,11 @@ fn test_partial_refund_over_refund_panics() { #[test] #[should_panic(expected = "HostError: Error(Contract, #17)")] fn test_partial_refund_fails_after_seven_days() { - let (env, client, shade_contract_id, _admin) = setup_test(); + let (env, client, shade_contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); let token = create_test_token(&env); + client.add_accepted_token(&admin, &token); let payer = Address::generate(&env); let date_paid = 0; @@ -224,10 +229,11 @@ fn test_partial_refund_fails_after_seven_days() { #[test] #[should_panic(expected = "HostError: Error(Contract, #7)")] fn test_partial_refund_zero_amount_panics() { - let (env, client, shade_contract_id, _admin) = setup_test(); + let (env, client, shade_contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); let token = create_test_token(&env); + client.add_accepted_token(&admin, &token); let payer = Address::generate(&env); let (invoice_id, _) = setup_paid_invoice( @@ -247,10 +253,11 @@ fn test_partial_refund_zero_amount_panics() { #[test] #[should_panic(expected = "HostError: Error(Contract, #7)")] fn test_partial_refund_negative_amount_panics() { - let (env, client, shade_contract_id, _admin) = setup_test(); + let (env, client, shade_contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); let token = create_test_token(&env); + client.add_accepted_token(&admin, &token); let payer = Address::generate(&env); let (invoice_id, _) = setup_paid_invoice( diff --git a/contracts/shade/src/tests/test_invoice_signed.rs b/contracts/shade/src/tests/test_invoice_signed.rs index 41bbb0c..3d09e1b 100644 --- a/contracts/shade/src/tests/test_invoice_signed.rs +++ b/contracts/shade/src/tests/test_invoice_signed.rs @@ -33,10 +33,15 @@ fn build_test_message( ) -> alloc::vec::Vec { let mut msg = Bytes::new(env); msg.append(&contract_id.clone().to_xdr(env)); + msg.append(&Bytes::from_array(env, b"|")); msg.append(&merchant.clone().to_xdr(env)); + msg.append(&Bytes::from_array(env, b"|")); msg.append(nonce.as_ref()); + msg.append(&Bytes::from_array(env, b"|")); msg.append(&Bytes::from_slice(env, &amount.to_be_bytes())); + msg.append(&Bytes::from_array(env, b"|")); msg.append(&token.clone().to_xdr(env)); + msg.append(&Bytes::from_array(env, b"|")); msg.append(&description.clone().to_xdr(env)); let mut result = alloc::vec![0u8; msg.len() as usize]; @@ -114,7 +119,10 @@ fn test_create_invoice_signed_manager_success() { let pub_key = BytesN::from_array(&env, &keypair.public_key_bytes); client.set_merchant_key(&merchant, &pub_key); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Signed Invoice"); let amount: i128 = 1000; let nonce = create_nonce(&env); @@ -159,7 +167,10 @@ fn test_create_invoice_signed_admin_success() { let pub_key = BytesN::from_array(&env, &keypair.public_key_bytes); client.set_merchant_key(&merchant, &pub_key); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Signed Invoice by Admin"); let amount: i128 = 5000; let nonce = create_nonce(&env); @@ -195,7 +206,7 @@ fn test_create_invoice_signed_admin_success() { #[test] #[should_panic(expected = "HostError: Error(Contract, #1)")] fn test_create_invoice_signed_guest_unauthorized() { - let (env, client, contract_id, _admin) = setup_test(); + let (env, client, contract_id, admin) = setup_test(); let guest = Address::generate(&env); let merchant = Address::generate(&env); @@ -205,7 +216,10 @@ fn test_create_invoice_signed_guest_unauthorized() { let pub_key = BytesN::from_array(&env, &keypair.public_key_bytes); client.set_merchant_key(&merchant, &pub_key); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Unauthorized Signed Invoice"); let nonce = create_nonce(&env); let signature = sign_invoice( @@ -246,7 +260,10 @@ fn test_create_invoice_signed_operator_unauthorized() { let pub_key = BytesN::from_array(&env, &keypair.public_key_bytes); client.set_merchant_key(&merchant, &pub_key); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Unauthorized Operators Invoice"); let nonce = create_nonce(&env); let signature = sign_invoice( @@ -287,7 +304,10 @@ fn test_create_invoice_signed_invalid_amount_zero() { let pub_key = BytesN::from_array(&env, &keypair.public_key_bytes); client.set_merchant_key(&merchant, &pub_key); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Invalid Amount Invoice"); let nonce = create_nonce(&env); // Dummy signature — validation fails before reaching signature check @@ -321,7 +341,10 @@ fn test_create_invoice_signed_invalid_amount_negative() { let pub_key = BytesN::from_array(&env, &keypair.public_key_bytes); client.set_merchant_key(&merchant, &pub_key); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Negative Amount Invoice"); let nonce = create_nonce(&env); let sig_bytes: [u8; 64] = [0; 64]; @@ -340,7 +363,7 @@ fn test_create_invoice_signed_invalid_amount_negative() { /// Test Case 7: Merchant Validation - Unregistered Merchant #[test] -#[should_panic(expected = "HostError: Error(Contract, #6)")] +#[should_panic(expected = "HostError: Error(Contract, #1)")] fn test_create_invoice_signed_unregistered_merchant() { let (env, client, _contract_id, admin) = setup_test(); @@ -349,7 +372,10 @@ fn test_create_invoice_signed_unregistered_merchant() { let unregistered_merchant = Address::generate(&env); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Unknown Merchant Invoice"); let nonce = create_nonce(&env); let sig_bytes: [u8; 64] = [0; 64]; @@ -392,7 +418,10 @@ fn test_create_invoice_signed_multiple_invoices() { &BytesN::from_array(&env, &keypair2.public_key_bytes), ); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Multi Invoice Test"); let nonce1 = create_unique_nonce(&env, 1); diff --git a/contracts/shade/src/tests/test_invoice_void.rs b/contracts/shade/src/tests/test_invoice_void.rs index 86301d7..757b807 100644 --- a/contracts/shade/src/tests/test_invoice_void.rs +++ b/contracts/shade/src/tests/test_invoice_void.rs @@ -21,12 +21,15 @@ fn setup_test() -> (Env, ShadeClient<'static>, Address, Address) { /// Verify InvoiceCancelled event is emitted. #[test] fn test_void_invoice_success() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Test Invoice"); let amount: i128 = 1000; let invoice_id = client.create_invoice(&merchant, &description, &amount, &token, &None); @@ -49,12 +52,15 @@ fn test_void_invoice_success() { #[test] #[should_panic(expected = "HostError: Error(Contract, #1)")] fn test_void_invoice_unauthorized_random_address() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Test Invoice"); let invoice_id = client.create_invoice(&merchant, &description, &1000, &token, &None); @@ -69,7 +75,7 @@ fn test_void_invoice_unauthorized_random_address() { #[test] #[should_panic(expected = "HostError: Error(Contract, #1)")] fn test_void_invoice_unauthorized_different_merchant() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant1 = Address::generate(&env); client.register_merchant(&merchant1); @@ -77,7 +83,10 @@ fn test_void_invoice_unauthorized_different_merchant() { let merchant2 = Address::generate(&env); client.register_merchant(&merchant2); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Test Invoice"); let invoice_id = client.create_invoice(&merchant1, &description, &1000, &token, &None); @@ -177,12 +186,15 @@ fn test_pay_voided_invoice() { #[test] #[should_panic(expected = "HostError: Error(Contract, #16)")] fn test_void_invoice_already_cancelled() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Test Invoice"); let invoice_id = client.create_invoice(&merchant, &description, &1000, &token, &None); @@ -199,7 +211,7 @@ fn test_void_invoice_already_cancelled() { #[test] #[should_panic(expected = "HostError: Error(Contract, #8)")] fn test_void_nonexistent_invoice() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); @@ -256,12 +268,15 @@ fn test_void_refunded_invoice() { /// Create multiple invoices, void one, and verify that others remain unaffected. #[test] fn test_void_invoice_state_isolation() { - let (env, client, _contract_id, _admin) = setup_test(); + let (env, client, _contract_id, admin) = setup_test(); let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Test Invoice"); let invoice_id_1 = client.create_invoice(&merchant, &description, &1000, &token, &None); diff --git a/contracts/shade/src/tests/test_refund.rs b/contracts/shade/src/tests/test_refund.rs index bfc0c82..ea4e367 100644 --- a/contracts/shade/src/tests/test_refund.rs +++ b/contracts/shade/src/tests/test_refund.rs @@ -154,7 +154,7 @@ fn test_refund_one_second_past_boundary_fails() { // Expect NotAuthorized (#1). // --------------------------------------------------------------------------- #[test] -#[should_panic(expected = "HostError: Error(Contract, #1)")] +#[should_panic(expected = "HostError: Error(Contract, #6)")] fn test_refund_unauthorized_random_address() { let ctx = setup_paid_invoice(1_000); @@ -208,7 +208,7 @@ fn test_refund_restricted_merchant_account() { // Expect InvalidInvoiceStatus (#16). // --------------------------------------------------------------------------- #[test] -#[should_panic(expected = "HostError: Error(Contract, #16)")] +#[should_panic(expected = "HostError: Error(Contract, #29)")] fn test_refund_pending_invoice_fails() { let env = Env::default(); env.mock_all_auths(); @@ -221,7 +221,10 @@ fn test_refund_pending_invoice_fails() { let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Never Paid"); let invoice_id = client.create_invoice(&merchant, &description, &500, &token, &None); @@ -235,7 +238,7 @@ fn test_refund_pending_invoice_fails() { // Expect InvalidInvoiceStatus (#16). // --------------------------------------------------------------------------- #[test] -#[should_panic(expected = "HostError: Error(Contract, #16)")] +#[should_panic(expected = "HostError: Error(Contract, #29)")] fn test_refund_cancelled_invoice_fails() { let env = Env::default(); env.mock_all_auths(); @@ -248,7 +251,10 @@ fn test_refund_cancelled_invoice_fails() { let merchant = Address::generate(&env); client.register_merchant(&merchant); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Cancel Me"); let invoice_id = client.create_invoice(&merchant, &description, &500, &token, &None); @@ -263,7 +269,7 @@ fn test_refund_cancelled_invoice_fails() { // The second call hits `amount_to_refund <= 0` → InvalidAmount (#7). // --------------------------------------------------------------------------- #[test] -#[should_panic(expected = "HostError: Error(Contract, #7)")] +#[should_panic(expected = "HostError: Error(Contract, #28)")] fn test_double_refund_fails() { let ctx = setup_paid_invoice(1_000); diff --git a/contracts/shade/src/tests/test_signatures.rs b/contracts/shade/src/tests/test_signatures.rs index 447dc20..11f4b2a 100644 --- a/contracts/shade/src/tests/test_signatures.rs +++ b/contracts/shade/src/tests/test_signatures.rs @@ -51,10 +51,15 @@ fn build_test_message( ) -> alloc::vec::Vec { let mut msg = Bytes::new(env); msg.append(&contract_id.clone().to_xdr(env)); + msg.append(&Bytes::from_array(env, b"|")); msg.append(&merchant.clone().to_xdr(env)); + msg.append(&Bytes::from_array(env, b"|")); msg.append(nonce.as_ref()); + msg.append(&Bytes::from_array(env, b"|")); msg.append(&Bytes::from_slice(env, &amount.to_be_bytes())); + msg.append(&Bytes::from_array(env, b"|")); msg.append(&token.clone().to_xdr(env)); + msg.append(&Bytes::from_array(env, b"|")); msg.append(&description.clone().to_xdr(env)); let mut result = alloc::vec![0u8; msg.len() as usize]; @@ -116,7 +121,10 @@ fn test_valid_signature() { let pub_key = BytesN::from_array(&env, &keypair.public_key_bytes); client.set_merchant_key(&merchant, &pub_key); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Valid Signature Test"); let amount: i128 = 5000; let nonce = create_nonce(&env, 1); @@ -166,7 +174,10 @@ fn test_invalid_signature_tampered_amount() { let pub_key = BytesN::from_array(&env, &keypair.public_key_bytes); client.set_merchant_key(&merchant, &pub_key); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Tampered Amount"); let original_amount: i128 = 1000; let tampered_amount: i128 = 9999; @@ -212,7 +223,10 @@ fn test_invalid_signature_tampered_description() { let pub_key = BytesN::from_array(&env, &keypair.public_key_bytes); client.set_merchant_key(&merchant, &pub_key); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let original_desc = String::from_str(&env, "Original description"); let tampered_desc = String::from_str(&env, "Tampered description"); let amount: i128 = 1000; @@ -258,7 +272,10 @@ fn test_replay_attack_same_nonce() { let pub_key = BytesN::from_array(&env, &keypair.public_key_bytes); client.set_merchant_key(&merchant, &pub_key); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Replay Attack Test"); let amount: i128 = 2000; let nonce = create_nonce(&env, 42); @@ -322,7 +339,10 @@ fn test_wrong_merchant_signature() { &BytesN::from_array(&env, &keypair_b.public_key_bytes), ); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Wrong Merchant Test"); let amount: i128 = 3000; let nonce = create_nonce(&env, 1); @@ -365,7 +385,10 @@ fn test_no_public_key() { client.register_merchant(&merchant); // Deliberately do NOT set a merchant key - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "No Key Test"); let amount: i128 = 1000; let nonce = create_nonce(&env, 1); @@ -410,7 +433,10 @@ fn test_nonce_independence_per_merchant() { &BytesN::from_array(&env, &keypair_b.public_key_bytes), ); - let token = Address::generate(&env); + let token = env + .register_stellar_asset_contract_v2(Address::generate(&env)) + .address(); + client.add_accepted_token(&admin, &token); let description = String::from_str(&env, "Nonce Independence"); let amount: i128 = 1000;