108 lines
3.0 KiB
Python
108 lines
3.0 KiB
Python
|
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=QuorumKind.NONE,
|
||
|
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()
|