citizen: implement Implement: Tests the integration of the governance and voting contracts
Some checks are pending
CI / build-and-test (push) Waiting to run
CI / slither (push) Waiting to run

This commit is contained in:
sourcebridge_42 2026-04-19 09:11:24 +00:00
parent ef9ce9b719
commit cfae25fc0d

View File

@ -0,0 +1,127 @@
const { expect } = require('chai');
const { ethers } = require('hardhat');
const { time } = require('@openzeppelin/test-helpers');
describe('GovernanceContract Integration Tests', () => {
let governanceContract;
let votingContract;
let owner;
let proposer;
let voter1;
let voter2;
let voter3;
beforeEach(async () => {
const [deployer, _proposer, _voter1, _voter2, _voter3] = await ethers.getSigners();
owner = deployer;
proposer = _proposer;
voter1 = _voter1;
voter2 = _voter2;
voter3 = _voter3;
const VotingContract = await ethers.getContractFactory('VotingContract');
const GovernanceContract = await ethers.getContractFactory('GovernanceContract');
votingContract = await VotingContract.deploy();
await votingContract.deployed();
governanceContract = await GovernanceContract.deploy(votingContract.address);
await governanceContract.deployed();
});
describe('Proposal Creation and Voting', () => {
it('should allow creating a proposal', async () => {
const proposalParams = {
title: 'Community Fund Allocation',
description: 'Proposal to allocate funds for community development',
targetAddress: proposer.address,
votingPeriod: 604800, // 1 week in seconds
requiredQuorum: ethers.utils.parseEther('1000'), // 1000 tokens
proposalType: 0 // Assuming 0 is a standard governance proposal
};
await governanceContract.connect(proposer).createProposal(
proposalParams.title,
proposalParams.description,
proposalParams.targetAddress,
proposalParams.votingPeriod,
proposalParams.requiredQuorum,
proposalParams.proposalType
);
const proposalCount = await governanceContract.getProposalCount();
expect(proposalCount).to.equal(1);
const proposal = await governanceContract.getProposal(0);
expect(proposal.title).to.equal(proposalParams.title);
expect(proposal.proposer).to.equal(proposer.address);
});
it('should handle voting on a proposal', async () => {
// Create proposal
await governanceContract.connect(proposer).createProposal(
'Test Proposal',
'Description',
proposer.address,
604800,
ethers.utils.parseEther('1000'),
0
);
// Simulate voting power allocation
await governanceContract.connect(voter1).delegateVotingPower(voter1.address, ethers.utils.parseEther('500'));
await governanceContract.connect(voter2).delegateVotingPower(voter2.address, ethers.utils.parseEther('300'));
await governanceContract.connect(voter3).delegateVotingPower(voter3.address, ethers.utils.parseEther('200'));
// Cast votes
await governanceContract.connect(voter1).castVote(0, true);
await governanceContract.connect(voter2).castVote(0, true);
await governanceContract.connect(voter3).castVote(0, false);
// Advance time to end voting period
await time.increase(604800);
// Finalize proposal
await governanceContract.connect(proposer).finalizeProposal(0);
const proposal = await governanceContract.getProposal(0);
expect(proposal.status).to.equal(1); // Assuming 1 is PASSED status
expect(proposal.votesFor).to.equal(ethers.utils.parseEther('800'));
expect(proposal.votesAgainst).to.equal(ethers.utils.parseEther('200'));
});
it('should prevent double voting', async () => {
await governanceContract.connect(proposer).createProposal(
'Duplicate Vote Test',
'Preventing multiple votes',
proposer.address,
604800,
ethers.utils.parseEther('1000'),
0
);
await governanceContract.connect(voter1).delegateVotingPower(voter1.address, ethers.utils.parseEther('500'));
await governanceContract.connect(voter1).castVote(0, true);
await expect(
governanceContract.connect(voter1).castVote(0, false)
).to.be.revertedWith('Already voted on this proposal');
});
});
describe('Error Handling', () => {
it('should reject proposal creation from unauthorized address', async () => {
await expect(
governanceContract.connect(voter1).createProposal(
'Unauthorized Proposal',
'Should fail',
voter1.address,
604800,
ethers.utils.parseEther('1000'),
0
)
).to.be.revertedWith('Not authorized to create proposal');
});
});
});