diff --git a/creator-keys/tests/governance_polls.rs b/creator-keys/tests/governance_polls.rs index 7a678574..4bef68d5 100644 --- a/creator-keys/tests/governance_polls.rs +++ b/creator-keys/tests/governance_polls.rs @@ -131,6 +131,56 @@ fn changing_vote_before_expiry_updates_tally() { assert_eq!(result.total_weight, 3); } +#[test] +fn changing_vote_before_expiry_removes_previous_weight_without_double_counting() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register(CreatorKeysContract, ()); + let client = CreatorKeysContractClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + client.set_key_price(&admin, &100); + + let creator = Address::generate(&env); + client.register_creator( + &creator_keys::RegisterCreatorParams { + creator: creator.clone(), + handle: String::from_str(&env, "alice"), + }, + &None, + &None, + &None, + &None, + &None, + ); + + let holder = Address::generate(&env); + for _ in 0..10 { + client.buy_key(&creator, &holder, &100, &None); + } + + let poll_id = client.create_poll( + &creator, + &String::from_str(&env, "Pick one"), + &poll_options(&env), + &10, + ); + + client.cast_vote(&creator, &holder, &poll_id, &0); + + let after_first_vote = client.get_poll_result(&creator, &poll_id); + assert_eq!(after_first_vote.vote_counts.get(0).unwrap(), 10); + assert_eq!(after_first_vote.vote_counts.get(1).unwrap(), 0); + assert_eq!(after_first_vote.total_weight, 10); + + client.cast_vote(&creator, &holder, &poll_id, &1); + + let after_revote = client.get_poll_result(&creator, &poll_id); + assert_eq!(after_revote.vote_counts.get(0).unwrap(), 0); + assert_eq!(after_revote.vote_counts.get(1).unwrap(), 10); + assert_eq!(after_revote.total_weight, 10); +} + #[test] fn vote_after_expiry_reverts_with_poll_expired() { let env = Env::default();