From cdac5108b5c3d34b626410e506278ece8f344913 Mon Sep 17 00:00:00 2001 From: Goodnessukaigwe Date: Sun, 22 Feb 2026 00:47:07 +0100 Subject: [PATCH 1/4] refactor: simplify user retrieval in ranking tests by removing unnecessary clones --- contracts/tests/ranking_test.rs | 103 ++++++++++++++++++-------------- 1 file changed, 58 insertions(+), 45 deletions(-) diff --git a/contracts/tests/ranking_test.rs b/contracts/tests/ranking_test.rs index 964b6069..de2e3c5f 100644 --- a/contracts/tests/ranking_test.rs +++ b/contracts/tests/ranking_test.rs @@ -56,31 +56,33 @@ fn test_get_top_users_basic() { let (_env, client, admin, users) = create_test_env(); setup_rewards_config(&client, &admin); + assert!(users.len() >= 4, "Need at least 4 users for test"); + // Give different amounts to users - client.deposit_flexi(&users.get(0).unwrap().clone(), &1000); // 10,000 points - client.deposit_flexi(&users.get(1).unwrap().clone(), &500); // 5,000 points - client.deposit_flexi(&users.get(2).unwrap().clone(), &2000); // 20,000 points - client.deposit_flexi(&users.get(3).unwrap().clone(), &1500); // 15,000 points + client.deposit_flexi(&users.get(0).unwrap(), &1000); // 10,000 points + client.deposit_flexi(&users.get(1).unwrap(), &500); // 5,000 points + client.deposit_flexi(&users.get(2).unwrap(), &2000); // 20,000 points + client.deposit_flexi(&users.get(3).unwrap(), &1500); // 15,000 points let top_users = client.get_top_users(&10); assert_eq!(top_users.len(), 4, "Should return 4 users with points"); // Check ordering (descending by points) - let top1 = top_users.get(0).unwrap().clone(); - let top2 = top_users.get(1).unwrap().clone(); - let top3 = top_users.get(2).unwrap().clone(); - let top4 = top_users.get(3).unwrap().clone(); + let top1 = top_users.get(0).unwrap(); + let top2 = top_users.get(1).unwrap(); + let top3 = top_users.get(2).unwrap(); + let top4 = top_users.get(3).unwrap(); - assert_eq!(top1.0, users.get(2).unwrap().clone(), "User 2 should be #1"); + assert_eq!(top1.0, users.get(2).unwrap(), "User 2 should be #1"); assert_eq!(top1.1, 20_000, "Top user should have 20,000 points"); - assert_eq!(top2.0, users.get(3).unwrap().clone(), "User 3 should be #2"); + assert_eq!(top2.0, users.get(3).unwrap(), "User 3 should be #2"); assert_eq!(top2.1, 15_000, "Second user should have 15,000 points"); - assert_eq!(top3.0, users.get(0).unwrap().clone(), "User 0 should be #3"); + assert_eq!(top3.0, users.get(0).unwrap(), "User 0 should be #3"); assert_eq!(top3.1, 10_000, "Third user should have 10,000 points"); - assert_eq!(top4.0, users.get(1).unwrap().clone(), "User 1 should be #4"); + assert_eq!(top4.0, users.get(1).unwrap(), "User 1 should be #4"); assert_eq!(top4.1, 5_000, "Fourth user should have 5,000 points"); } @@ -100,8 +102,8 @@ fn test_get_top_users_limit() { assert_eq!(top_users.len(), 3, "Should return only 3 users"); // Top 3 should be users with most deposits (indices 4, 3, 2) - let top1 = top_users.get(0).unwrap().clone(); - assert_eq!(top1.0, users.get(4).unwrap().clone(), "User 4 should be #1"); + let top1 = top_users.get(0).unwrap(); + assert_eq!(top1.0, users.get(4).unwrap(), "User 4 should be #1"); assert_eq!(top1.1, 5_000, "Should have 5,000 points"); } @@ -110,7 +112,8 @@ fn test_get_user_rank_not_ranked() { let (_env, client, admin, users) = create_test_env(); setup_rewards_config(&client, &admin); - let rank = client.get_user_rank(&users.get(0).unwrap().clone()); + assert!(users.len() >= 1, "Need at least 1 user for test"); + let rank = client.get_user_rank(&users.get(0).unwrap()); assert_eq!(rank, 0, "User with no points should have rank 0"); } @@ -119,16 +122,18 @@ fn test_get_user_rank_basic() { let (_env, client, admin, users) = create_test_env(); setup_rewards_config(&client, &admin); + assert!(users.len() >= 4, "Need at least 4 users for test"); + // Give different amounts - client.deposit_flexi(&users.get(0).unwrap().clone(), &1000); // 10,000 points - rank 3 - client.deposit_flexi(&users.get(1).unwrap().clone(), &500); // 5,000 points - rank 4 - client.deposit_flexi(&users.get(2).unwrap().clone(), &2000); // 20,000 points - rank 1 - client.deposit_flexi(&users.get(3).unwrap().clone(), &1500); // 15,000 points - rank 2 + client.deposit_flexi(&users.get(0).unwrap(), &1000); // 10,000 points - rank 3 + client.deposit_flexi(&users.get(1).unwrap(), &500); // 5,000 points - rank 4 + client.deposit_flexi(&users.get(2).unwrap(), &2000); // 20,000 points - rank 1 + client.deposit_flexi(&users.get(3).unwrap(), &1500); // 15,000 points - rank 2 - let rank0 = client.get_user_rank(&users.get(0).unwrap().clone()); - let rank1 = client.get_user_rank(&users.get(1).unwrap().clone()); - let rank2 = client.get_user_rank(&users.get(2).unwrap().clone()); - let rank3 = client.get_user_rank(&users.get(3).unwrap().clone()); + let rank0 = client.get_user_rank(&users.get(0).unwrap()); + let rank1 = client.get_user_rank(&users.get(1).unwrap()); + let rank2 = client.get_user_rank(&users.get(2).unwrap()); + let rank3 = client.get_user_rank(&users.get(3).unwrap()); assert_eq!(rank0, 3, "User 0 should be rank 3"); assert_eq!(rank1, 4, "User 1 should be rank 4"); @@ -141,15 +146,17 @@ fn test_get_user_ranking_details() { let (_env, client, admin, users) = create_test_env(); setup_rewards_config(&client, &admin); + assert!(users.len() >= 2, "Need at least 2 users for test"); + // User with no points - let details0 = client.get_user_ranking_details(&users.get(0).unwrap().clone()); + let details0 = client.get_user_ranking_details(&users.get(0).unwrap()); assert!(details0.is_none(), "User with no points should return None"); // Give points to some users - client.deposit_flexi(&users.get(0).unwrap().clone(), &1000); // 10,000 points - client.deposit_flexi(&users.get(1).unwrap().clone(), &2000); // 20,000 points + client.deposit_flexi(&users.get(0).unwrap(), &1000); // 10,000 points + client.deposit_flexi(&users.get(1).unwrap(), &2000); // 20,000 points - let details0 = client.get_user_ranking_details(&users.get(0).unwrap().clone()); + let details0 = client.get_user_ranking_details(&users.get(0).unwrap()); assert!(details0.is_some(), "User with points should have details"); let (rank, points, total) = details0.unwrap(); @@ -157,7 +164,7 @@ fn test_get_user_ranking_details() { assert_eq!(points, 10_000, "Should have 10,000 points"); assert_eq!(total, 2, "Should be 2 total ranked users"); - let details1 = client.get_user_ranking_details(&users.get(1).unwrap().clone()); + let details1 = client.get_user_ranking_details(&users.get(1).unwrap()); let (rank1, points1, total1) = details1.unwrap(); assert_eq!(rank1, 1, "Should be rank 1"); assert_eq!(points1, 20_000, "Should have 20,000 points"); @@ -169,21 +176,23 @@ fn test_ranking_with_ties() { let (_env, client, admin, users) = create_test_env(); setup_rewards_config(&client, &admin); + assert!(users.len() >= 3, "Need at least 3 users for test"); + // Give same amount to multiple users - client.deposit_flexi(&users.get(0).unwrap().clone(), &1000); // 10,000 points - client.deposit_flexi(&users.get(1).unwrap().clone(), &1000); // 10,000 points - client.deposit_flexi(&users.get(2).unwrap().clone(), &2000); // 20,000 points + client.deposit_flexi(&users.get(0).unwrap(), &1000); // 10,000 points + client.deposit_flexi(&users.get(1).unwrap(), &1000); // 10,000 points + client.deposit_flexi(&users.get(2).unwrap(), &2000); // 20,000 points let top_users = client.get_top_users(&10); assert_eq!(top_users.len(), 3, "Should have 3 users"); // First should be user with 20k points - let top1 = top_users.get(0).unwrap().clone(); + let top1 = top_users.get(0).unwrap(); assert_eq!(top1.1, 20_000, "Top should have 20k points"); // Next two should both have 10k points (order may vary) - let top2 = top_users.get(1).unwrap().clone(); - let top3 = top_users.get(2).unwrap().clone(); + let top2 = top_users.get(1).unwrap(); + let top3 = top_users.get(2).unwrap(); assert_eq!(top2.1, 10_000, "Second should have 10k points"); assert_eq!(top3.1, 10_000, "Third should have 10k points"); } @@ -193,20 +202,22 @@ fn test_ranking_updates_on_new_deposits() { let (_env, client, admin, users) = create_test_env(); setup_rewards_config(&client, &admin); + assert!(users.len() >= 2, "Need at least 2 users for test"); + // Initial deposits - client.deposit_flexi(&users.get(0).unwrap().clone(), &1000); // 10,000 points - client.deposit_flexi(&users.get(1).unwrap().clone(), &500); // 5,000 points + client.deposit_flexi(&users.get(0).unwrap(), &1000); // 10,000 points + client.deposit_flexi(&users.get(1).unwrap(), &500); // 5,000 points - let rank0_before = client.get_user_rank(&users.get(0).unwrap().clone()); - let rank1_before = client.get_user_rank(&users.get(1).unwrap().clone()); + let rank0_before = client.get_user_rank(&users.get(0).unwrap()); + let rank1_before = client.get_user_rank(&users.get(1).unwrap()); assert_eq!(rank0_before, 1, "User 0 should be rank 1 initially"); assert_eq!(rank1_before, 2, "User 1 should be rank 2 initially"); // User 1 makes big deposit to overtake user 0 - client.deposit_flexi(&users.get(1).unwrap().clone(), &2000); // Total: 25,000 points + client.deposit_flexi(&users.get(1).unwrap(), &2000); // Total: 25,000 points - let rank0_after = client.get_user_rank(&users.get(0).unwrap().clone()); - let rank1_after = client.get_user_rank(&users.get(1).unwrap().clone()); + let rank0_after = client.get_user_rank(&users.get(0).unwrap()); + let rank1_after = client.get_user_rank(&users.get(1).unwrap()); assert_eq!(rank1_after, 1, "User 1 should be rank 1 after deposit"); assert_eq!(rank0_after, 2, "User 0 should be rank 2 after deposit"); } @@ -238,7 +249,7 @@ fn test_large_user_set_safety() { // Top user should have most points if top_users.len() > 0 { - let top1 = top_users.get(0).unwrap().clone(); + let top1 = top_users.get(0).unwrap(); assert_eq!(top1.1, 50 * 100 * 10, "Top user should have highest points"); } } @@ -248,14 +259,16 @@ fn test_ranking_read_only() { let (_env, client, admin, users) = create_test_env(); setup_rewards_config(&client, &admin); - client.deposit_flexi(&users.get(0).unwrap().clone(), &1000); + assert!(users.len() >= 1, "Need at least 1 user for test"); + + client.deposit_flexi(&users.get(0).unwrap(), &1000); // Multiple calls should return consistent results (no state mutation) let top1 = client.get_top_users(&5); let top2 = client.get_top_users(&5); assert_eq!(top1.len(), top2.len(), "Should be consistent"); - let rank1 = client.get_user_rank(&users.get(0).unwrap().clone()); - let rank2 = client.get_user_rank(&users.get(0).unwrap().clone()); + let rank1 = client.get_user_rank(&users.get(0).unwrap()); + let rank2 = client.get_user_rank(&users.get(0).unwrap()); assert_eq!(rank1, rank2, "Rank should be consistent"); } From ac217025b303637325cafc8e88abdb51f691b020 Mon Sep 17 00:00:00 2001 From: Goodnessukaigwe Date: Sun, 22 Feb 2026 00:47:14 +0100 Subject: [PATCH 2/4] refactor: clean up imports and improve code formatting in ranking tests --- contracts/tests/ranking_test.rs | 48 ++++++++++++++++----------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/contracts/tests/ranking_test.rs b/contracts/tests/ranking_test.rs index de2e3c5f..f97e3481 100644 --- a/contracts/tests/ranking_test.rs +++ b/contracts/tests/ranking_test.rs @@ -1,9 +1,6 @@ #![cfg(test)] +use soroban_sdk::{testutils::Address as _, Address, BytesN, Env, Vec}; use Nestera::{NesteraContract, NesteraContractClient}; -use soroban_sdk::{ - testutils::Address as _, - Address, BytesN, Env, Vec, -}; fn create_test_env() -> (Env, NesteraContractClient<'static>, Address, Vec
) { let env = Env::default(); @@ -29,16 +26,15 @@ fn create_test_env() -> (Env, NesteraContractClient<'static>, Address, Vec= 4, "Need at least 4 users for test"); - + // Give different amounts to users client.deposit_flexi(&users.get(0).unwrap(), &1000); // 10,000 points - client.deposit_flexi(&users.get(1).unwrap(), &500); // 5,000 points + client.deposit_flexi(&users.get(1).unwrap(), &500); // 5,000 points client.deposit_flexi(&users.get(2).unwrap(), &2000); // 20,000 points client.deposit_flexi(&users.get(3).unwrap(), &1500); // 15,000 points @@ -123,10 +123,10 @@ fn test_get_user_rank_basic() { setup_rewards_config(&client, &admin); assert!(users.len() >= 4, "Need at least 4 users for test"); - + // Give different amounts client.deposit_flexi(&users.get(0).unwrap(), &1000); // 10,000 points - rank 3 - client.deposit_flexi(&users.get(1).unwrap(), &500); // 5,000 points - rank 4 + client.deposit_flexi(&users.get(1).unwrap(), &500); // 5,000 points - rank 4 client.deposit_flexi(&users.get(2).unwrap(), &2000); // 20,000 points - rank 1 client.deposit_flexi(&users.get(3).unwrap(), &1500); // 15,000 points - rank 2 @@ -147,7 +147,7 @@ fn test_get_user_ranking_details() { setup_rewards_config(&client, &admin); assert!(users.len() >= 2, "Need at least 2 users for test"); - + // User with no points let details0 = client.get_user_ranking_details(&users.get(0).unwrap()); assert!(details0.is_none(), "User with no points should return None"); @@ -158,7 +158,7 @@ fn test_get_user_ranking_details() { let details0 = client.get_user_ranking_details(&users.get(0).unwrap()); assert!(details0.is_some(), "User with points should have details"); - + let (rank, points, total) = details0.unwrap(); assert_eq!(rank, 2, "Should be rank 2"); assert_eq!(points, 10_000, "Should have 10,000 points"); @@ -177,7 +177,7 @@ fn test_ranking_with_ties() { setup_rewards_config(&client, &admin); assert!(users.len() >= 3, "Need at least 3 users for test"); - + // Give same amount to multiple users client.deposit_flexi(&users.get(0).unwrap(), &1000); // 10,000 points client.deposit_flexi(&users.get(1).unwrap(), &1000); // 10,000 points @@ -203,10 +203,10 @@ fn test_ranking_updates_on_new_deposits() { setup_rewards_config(&client, &admin); assert!(users.len() >= 2, "Need at least 2 users for test"); - + // Initial deposits client.deposit_flexi(&users.get(0).unwrap(), &1000); // 10,000 points - client.deposit_flexi(&users.get(1).unwrap(), &500); // 5,000 points + client.deposit_flexi(&users.get(1).unwrap(), &500); // 5,000 points let rank0_before = client.get_user_rank(&users.get(0).unwrap()); let rank1_before = client.get_user_rank(&users.get(1).unwrap()); @@ -260,7 +260,7 @@ fn test_ranking_read_only() { setup_rewards_config(&client, &admin); assert!(users.len() >= 1, "Need at least 1 user for test"); - + client.deposit_flexi(&users.get(0).unwrap(), &1000); // Multiple calls should return consistent results (no state mutation) From 766bf6c521d53c45c4b56e08baa0b2ab7c5ed3e6 Mon Sep 17 00:00:00 2001 From: Goodnessukaigwe Date: Sun, 22 Feb 2026 00:49:57 +0100 Subject: [PATCH 3/4] fix: ensure Rust toolchain is specified correctly in CI configuration --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 25cfd8d2..ae8ed5b5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,6 +29,7 @@ jobs: - name: Install Rust uses: dtolnay/rust-toolchain@stable with: + toolchain: stable targets: wasm32-unknown-unknown - name: Cache cargo registry From b642a497369eedb5257f77691f7ac489cf5dc231 Mon Sep 17 00:00:00 2001 From: Goodnessukaigwe Date: Sun, 22 Feb 2026 00:51:36 +0100 Subject: [PATCH 4/4] fix: update Rust toolchain action version in CI configuration --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ae8ed5b5..5aa5d72b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: uses: actions/checkout@v4 - name: Install Rust - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@v1 with: toolchain: stable targets: wasm32-unknown-unknown