@@ -7,6 +7,32 @@ import "../src/ValidatorFactory.sol";
77import "../src/oracles/MockLLMOracle.sol " ;
88import "../test/mock/ERC20TokenMock.sol " ;
99
10+ /**
11+ * @title TransactionManager Test Suite
12+ * @dev This test suite covers the optimistic consensus including:
13+ * - Proposal submission and validation
14+ * (e.g. test_SubmitProposal, test_RevertWhen_SubmitProposal_DuplicateProposal)
15+ * - LLM-based transaction validation (mocked)
16+ * (e.g. test_TestLLMValidation, test_OptimisticApproval_RequiresLLMValidation)
17+ * - Validator signature collection for optimistic approval
18+ * (e.g. test_SignProposal, test_RevertWhen_SignProposal_InvalidSignature)
19+ * - Challenge mechanisms and dispute resolution
20+ * (e.g. test_ChallengeProposal, test_ResolveChallenge_Approved)
21+ * - Voting periods and consensus resolution
22+ * (e.g. test_SubmitVote, test_IsInVotingPeriod, test_VotingPeriodExpiry)
23+ * - Slashing mechanisms for false challenges
24+ * (e.g. test_ResolveChallenge_Rejected with validator slashing)
25+ *
26+ * Test Strategy:
27+ * 1. Unit Tests: Individual function behavior and state changes
28+ * 2. Integration Tests: Complete proposal lifecycle from submission to finalization
29+ * (e.g. test_CompleteProposalLifecycle)
30+ * 3. Edge Cases: Empty validator sets, expired periods, invalid signatures
31+ * (e.g. test_EdgeCase_EmptyValidatorSet, test_RevertWhen_ChallengeProposal_ExpiredChallengePeriod)
32+ * 4. Security Tests: Access control, reentrancy protection, slashing mechanics
33+ * 5. Event Testing: All state changes emit appropriate events
34+ *
35+ */
1036contract TransactionManagerTest is Test {
1137 // Contracts
1238 TransactionManager public transactionManager;
@@ -159,13 +185,13 @@ contract TransactionManagerTest is Test {
159185 assertEq (transactionManager.proposalCount (), 1 );
160186 }
161187
162- function test_SubmitProposal_EmptyTransaction () public {
188+ function test_RevertWhen_SubmitProposal_EmptyTransaction () public {
163189 vm.prank (proposer);
164190 vm.expectRevert ("Empty transaction " );
165191 transactionManager.submitProposal ("" );
166192 }
167193
168- function test_SubmitProposal_DuplicateProposal () public {
194+ function test_RevertWhen_SubmitProposal_DuplicateProposal () public {
169195 vm.startPrank (proposer);
170196
171197 transactionManager.submitProposal (TEST_TRANSACTION);
@@ -225,7 +251,7 @@ contract TransactionManagerTest is Test {
225251 assertEq (signers[0 ], validator1);
226252 }
227253
228- function test_SignProposal_InvalidSignature () public {
254+ function test_RevertWhen_SignProposal_InvalidSignature () public {
229255 vm.prank (proposer);
230256 bytes32 proposalId = transactionManager.submitProposal (TEST_TRANSACTION);
231257
@@ -237,7 +263,7 @@ contract TransactionManagerTest is Test {
237263 transactionManager.signProposal (proposalId, invalidSignature);
238264 }
239265
240- function test_SignProposal_AlreadySigned () public {
266+ function test_RevertWhen_SignProposal_AlreadySigned () public {
241267 vm.prank (proposer);
242268 bytes32 proposalId = transactionManager.submitProposal (TEST_TRANSACTION);
243269
@@ -326,7 +352,7 @@ contract TransactionManagerTest is Test {
326352 assertFalse (executed); // Should revert optimistic execution
327353 }
328354
329- function test_ChallengeProposal_InvalidState () public {
355+ function test_RevertWhen_ChallengeProposal_InvalidState () public {
330356 vm.prank (proposer);
331357 bytes32 proposalId = transactionManager.submitProposal (TEST_TRANSACTION);
332358 // Don't get optimistic approval
@@ -336,7 +362,7 @@ contract TransactionManagerTest is Test {
336362 transactionManager.challengeProposal (proposalId);
337363 }
338364
339- function test_ChallengeProposal_ExpiredChallengePeriod () public {
365+ function test_RevertWhen_ChallengeProposal_ExpiredChallengePeriod () public {
340366 vm.prank (proposer);
341367 bytes32 proposalId = transactionManager.submitProposal (TEST_TRANSACTION);
342368 _signProposalWithValidators (proposalId, TEST_TRANSACTION, 3 );
@@ -400,7 +426,7 @@ contract TransactionManagerTest is Test {
400426 assertEq (noVotes, 0 );
401427 }
402428
403- function test_SubmitVote_InvalidVotingState () public {
429+ function test_RevertWhen_SubmitVote_InvalidVotingState () public {
404430 vm.prank (proposer);
405431 bytes32 proposalId = transactionManager.submitProposal (TEST_TRANSACTION);
406432
@@ -418,7 +444,7 @@ contract TransactionManagerTest is Test {
418444 transactionManager.submitVote (proposalId, support, voteSignature);
419445 }
420446
421- function test_SubmitVote_AlreadyVoted () public {
447+ function test_RevertWhen_SubmitVote_AlreadyVoted () public {
422448 // Setup challenged proposal
423449 vm.prank (proposer);
424450 bytes32 proposalId = transactionManager.submitProposal (TEST_TRANSACTION);
@@ -569,7 +595,7 @@ contract TransactionManagerTest is Test {
569595 assertTrue (executed);
570596 }
571597
572- function test_FinalizeProposal_ChallengePeriodNotEnded () public {
598+ function test_RevertWhen_FinalizeProposal_ChallengePeriodNotEnded () public {
573599 vm.prank (proposer);
574600 bytes32 proposalId = transactionManager.submitProposal (TEST_TRANSACTION);
575601 _signProposalWithValidators (proposalId, TEST_TRANSACTION, 3 );
@@ -716,7 +742,7 @@ contract TransactionManagerTest is Test {
716742 transactionManager.resolveChallenge (proposalId);
717743 }
718744
719- function test_FinalizeProposal_InvalidState () public {
745+ function test_RevertWhen_FinalizeProposal_InvalidState () public {
720746 vm.prank (proposer);
721747 bytes32 proposalId = transactionManager.submitProposal (TEST_TRANSACTION);
722748
0 commit comments