import unittest import voting as V from voting import QuorumKind, Quorum, Vote, Voting voters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] class TestAtLeastOneVoter(unittest.TestCase): def test_no_voters(self): self.assertRaises(RuntimeError, Voting, title="Test", quorum=Quorum(), voters=[], ) def test_one_voter(self): Voting(title="Test", quorum=Quorum(), voters=['a']) class TestNoVotesBeforeStart(unittest.TestCase): def setUp(self) -> None: self.voting = Voting(title="Test", quorum=Quorum(), voters=voters) def test_vote_before_started(self): self.assertRaises(RuntimeError, self.voting.vote, voter='a', vote=Vote.YES) def test_vote_after_started(self): self.voting.start() self.voting.vote(voter='a', vote=Vote.YES) class TestQuorumSanity(unittest.TestCase): def test_invalid_absolute_values(self): self.assertRaises(ValueError, Quorum, kind=QuorumKind.ABSOLUTE, value=0) self.assertRaises(ValueError, Quorum, kind=QuorumKind.ABSOLUTE, value=-1) def test_valid_absolute_values(self): Quorum(kind=QuorumKind.ABSOLUTE, value=1) def test_invalid_percent_values(self): self.assertRaises(ValueError, Quorum, kind=QuorumKind.PERCENT, value=0) self.assertRaises(ValueError, Quorum, kind=QuorumKind.PERCENT, value=-1) self.assertRaises(ValueError, Quorum, kind=QuorumKind.PERCENT, value=100.1) def test_valid_percent_values(self): Quorum(kind=QuorumKind.PERCENT, value=0.1) Quorum(kind=QuorumKind.PERCENT, value=100) class TestVoteMustBeLegal(unittest.TestCase): def setUp(self) -> None: self.voting = Voting(title="Test", quorum=Quorum(), voters=voters) self.voting.start() def test_unknown_voter(self): self.assertRaises(ValueError, self.voting.vote, voter='z', vote=Vote.YES) def test_known_voter(self): self.voting.vote('a', Vote.YES) class TestResultAbsoluteQuorum(unittest.TestCase): def setUp(self) -> None: def new_voting(): v = Voting( title="Test", quorum=Quorum(kind=QuorumKind.ABSOLUTE, value=1), voters=voters, ) v.start() return v self.new_voting = new_voting def test_quorum(self): v = self.new_voting() assert not v.result().quorum_reached v.vote(voter='a', vote=Vote.YES) assert v.result().quorum_reached class TestResultPercentQuorum(unittest.TestCase): def setUp(self) -> None: def new_voting(): v = Voting( title="Test", quorum=Quorum(kind=QuorumKind.PERCENT, value=15), voters=voters, ) v.start() return v self.new_voting = new_voting def test_quorum(self): v = self.new_voting() assert not v.result().quorum_reached v.vote('a', Vote.YES) assert not v.result().quorum_reached v.vote('b', Vote.YES) assert v.result().quorum_reached if __name__ == '__main__': unittest.main()