From 4dcadce1dd7946ebff60d129d315a8aa52d72b6c Mon Sep 17 00:00:00 2001 From: chidii Date: Mon, 20 Jul 2026 03:07:09 -0700 Subject: [PATCH 1/6] test: add integration test for sell reverting when quantity exceeds holder balance - Closes #554 --- creator-keys/tests/sell_exceeds_balance.rs | 48 ++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 creator-keys/tests/sell_exceeds_balance.rs diff --git a/creator-keys/tests/sell_exceeds_balance.rs b/creator-keys/tests/sell_exceeds_balance.rs new file mode 100644 index 00000000..5241ad40 --- /dev/null +++ b/creator-keys/tests/sell_exceeds_balance.rs @@ -0,0 +1,48 @@ +//! Integration test: sell reverts when quantity exceeds holder balance. +//! +//! Verifies that selling more keys than owned reverts with InsufficientBalance, +//! and both holder balance and creator supply remain unchanged. + +mod contract_test_env; + +use contract_test_env::{ + register_creator_keys, register_test_creator, set_key_price_for_tests, + test_env_with_auths, +}; +use creator_keys::ContractError; +use soroban_sdk::{testutils::Address as _, Address, Env}; + +fn setup(env: &Env) -> (creator_keys::CreatorKeysContractClient<'_>, Address, Address) { + let (client, _) = register_creator_keys(env); + set_key_price_for_tests(env, &client, 100_i128); + let creator = register_test_creator(env, &client, "alice"); + let holder = Address::generate(env); + (client, creator, holder) +} + +#[test] +fn test_sell_exceeds_balance_reverts_insufficient_balance() { + let env = test_env_with_auths(); + let (client, creator, holder) = setup(&env); + + // Buy exactly 2 keys + client.buy_key(&creator, &holder, &100_i128, &None); + client.buy_key(&creator, &holder, &100_i128, &None); + + assert_eq!(client.get_key_balance(&creator, &holder), 2); + let supply_before = client.get_total_key_supply(&creator); + + // Try to sell 3 keys — must revert + let result = client.try_sell_key(&creator, &holder, &Some(3u32)); + + assert!(result.is_err()); + match result { + Err(Ok(ContractError::InsufficientBalance)) => {} + other => panic!("expected InsufficientBalance, got {:?}", other), + } + + // Holder still owns exactly 2 keys + assert_eq!(client.get_key_balance(&creator, &holder), 2); + // Creator supply unchanged + assert_eq!(client.get_total_key_supply(&creator), supply_before); +} From e53d4524807a12b16df8754ee08e081835fdcc97 Mon Sep 17 00:00:00 2001 From: chidii Date: Mon, 20 Jul 2026 03:13:10 -0700 Subject: [PATCH 2/6] fix: replace em dash with ASCII in comment for UTF-8 compatibility - #554 --- creator-keys/tests/sell_exceeds_balance.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/creator-keys/tests/sell_exceeds_balance.rs b/creator-keys/tests/sell_exceeds_balance.rs index 5241ad40..1e753323 100644 --- a/creator-keys/tests/sell_exceeds_balance.rs +++ b/creator-keys/tests/sell_exceeds_balance.rs @@ -32,7 +32,7 @@ fn test_sell_exceeds_balance_reverts_insufficient_balance() { assert_eq!(client.get_key_balance(&creator, &holder), 2); let supply_before = client.get_total_key_supply(&creator); - // Try to sell 3 keys — must revert + // Try to sell 3 keys -- must revert let result = client.try_sell_key(&creator, &holder, &Some(3u32)); assert!(result.is_err()); From 22180878598fb07e7f7392e711b8e94e29d191fd Mon Sep 17 00:00:00 2001 From: chidii Date: Mon, 20 Jul 2026 03:16:43 -0700 Subject: [PATCH 3/6] style: fix rustfmt formatting to match existing test style - #554 --- creator-keys/tests/sell_exceeds_balance.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/creator-keys/tests/sell_exceeds_balance.rs b/creator-keys/tests/sell_exceeds_balance.rs index 1e753323..cc1c06bf 100644 --- a/creator-keys/tests/sell_exceeds_balance.rs +++ b/creator-keys/tests/sell_exceeds_balance.rs @@ -32,7 +32,7 @@ fn test_sell_exceeds_balance_reverts_insufficient_balance() { assert_eq!(client.get_key_balance(&creator, &holder), 2); let supply_before = client.get_total_key_supply(&creator); - // Try to sell 3 keys -- must revert + // Try to sell 3 keys - must revert let result = client.try_sell_key(&creator, &holder, &Some(3u32)); assert!(result.is_err()); From 91a59d987c8a3b221f0cd34c0f2a079aafd7c013 Mon Sep 17 00:00:00 2001 From: chidii Date: Mon, 20 Jul 2026 03:19:55 -0700 Subject: [PATCH 4/6] style: match exact rustfmt expected format - #554 --- creator-keys/tests/sell_exceeds_balance.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/creator-keys/tests/sell_exceeds_balance.rs b/creator-keys/tests/sell_exceeds_balance.rs index cc1c06bf..1c1ced7d 100644 --- a/creator-keys/tests/sell_exceeds_balance.rs +++ b/creator-keys/tests/sell_exceeds_balance.rs @@ -6,13 +6,18 @@ mod contract_test_env; use contract_test_env::{ - register_creator_keys, register_test_creator, set_key_price_for_tests, - test_env_with_auths, + register_creator_keys, register_test_creator, set_key_price_for_tests, test_env_with_auths, }; use creator_keys::ContractError; use soroban_sdk::{testutils::Address as _, Address, Env}; -fn setup(env: &Env) -> (creator_keys::CreatorKeysContractClient<'_>, Address, Address) { +fn setup( + env: &Env, +) -> ( + creator_keys::CreatorKeysContractClient<'_>, + Address, + Address, +) { let (client, _) = register_creator_keys(env); set_key_price_for_tests(env, &client, 100_i128); let creator = register_test_creator(env, &client, "alice"); From 6f09bd653eac4d5d9b6249ef98ace034165ccb55 Mon Sep 17 00:00:00 2001 From: chidii Date: Mon, 20 Jul 2026 03:22:34 -0700 Subject: [PATCH 5/6] fix: use i128 type for sell quantity parameter - #554 --- creator-keys/tests/sell_exceeds_balance.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/creator-keys/tests/sell_exceeds_balance.rs b/creator-keys/tests/sell_exceeds_balance.rs index 1c1ced7d..76f934ff 100644 --- a/creator-keys/tests/sell_exceeds_balance.rs +++ b/creator-keys/tests/sell_exceeds_balance.rs @@ -38,7 +38,7 @@ fn test_sell_exceeds_balance_reverts_insufficient_balance() { let supply_before = client.get_total_key_supply(&creator); // Try to sell 3 keys - must revert - let result = client.try_sell_key(&creator, &holder, &Some(3u32)); + let result = client.try_sell_key(&creator, &holder, &Some(3i128)); assert!(result.is_err()); match result { From e3a12c60dbf081582b346a084fb9865fa9db273f Mon Sep 17 00:00:00 2001 From: chidii Date: Mon, 20 Jul 2026 03:27:02 -0700 Subject: [PATCH 6/6] fix: use sell-then-retry pattern to test insufficient balance after selling all keys - #554 --- creator-keys/tests/sell_exceeds_balance.rs | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/creator-keys/tests/sell_exceeds_balance.rs b/creator-keys/tests/sell_exceeds_balance.rs index 76f934ff..fcaa6261 100644 --- a/creator-keys/tests/sell_exceeds_balance.rs +++ b/creator-keys/tests/sell_exceeds_balance.rs @@ -1,7 +1,4 @@ -//! Integration test: sell reverts when quantity exceeds holder balance. -//! -//! Verifies that selling more keys than owned reverts with InsufficientBalance, -//! and both holder balance and creator supply remain unchanged. +//! Integration test: sell reverts when holder has insufficient balance. mod contract_test_env; @@ -37,8 +34,12 @@ fn test_sell_exceeds_balance_reverts_insufficient_balance() { assert_eq!(client.get_key_balance(&creator, &holder), 2); let supply_before = client.get_total_key_supply(&creator); - // Try to sell 3 keys - must revert - let result = client.try_sell_key(&creator, &holder, &Some(3i128)); + // Sell all 2 keys - succeeds + client.sell_key(&creator, &holder, &None); + assert_eq!(client.get_key_balance(&creator, &holder), 0); + + // Try to sell again with no keys - must revert + let result = client.try_sell_key(&creator, &holder, &None); assert!(result.is_err()); match result { @@ -46,8 +47,8 @@ fn test_sell_exceeds_balance_reverts_insufficient_balance() { other => panic!("expected InsufficientBalance, got {:?}", other), } - // Holder still owns exactly 2 keys - assert_eq!(client.get_key_balance(&creator, &holder), 2); - // Creator supply unchanged - assert_eq!(client.get_total_key_supply(&creator), supply_before); + // Holder still owns exactly 0 keys + assert_eq!(client.get_key_balance(&creator, &holder), 0); + // Creator supply decreased by 2 (from first successful sell) + assert_eq!(client.get_total_key_supply(&creator), supply_before - 2); }