diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 25cfd8d2..5aa5d72b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,8 +27,9 @@ 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 - name: Cache cargo registry diff --git a/contracts/tests/ranking_test.rs b/contracts/tests/ranking_test.rs index 6d47c98b..16acab62 100644 --- a/contracts/tests/ranking_test.rs +++ b/contracts/tests/ranking_test.rs @@ -56,6 +56,8 @@ 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 @@ -66,21 +68,21 @@ fn test_get_top_users_basic() { 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 - 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 - 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"); }