def get_fake_ballot( self, election: InternalElectionDescription, ballot_id: str = None, with_trues=True, ) -> PlaintextBallot: """ Get a single Fake Ballot object that is manually constructed with default vaules """ if ballot_id is None: ballot_id = "some-unique-ballot-id-123" contests: List[PlaintextBallotContest] = [] for contest in election.get_contests_for( election.ballot_styles[0].object_id): contests.append( self.get_random_contest_from(contest, Random(), with_trues=with_trues)) fake_ballot = PlaintextBallot(ballot_id, election.ballot_styles[0].object_id, contests) return fake_ballot
def plaintext_voted_ballot(draw: _DrawType, metadata: InternalElectionDescription): """ Given an `InternalElectionDescription` object, generates an arbitrary `PlaintextBallot` with the choices made randomly. :param draw: Hidden argument, used by Hypothesis. :param metadata: Any `InternalElectionDescription` """ num_ballot_styles = len(metadata.ballot_styles) assert num_ballot_styles > 0, "invalid election with no ballot styles" # pick a ballot style at random ballot_style = metadata.ballot_styles[draw( integers(0, num_ballot_styles - 1))] contests = metadata.get_contests_for(ballot_style.object_id) assert len(contests) > 0, "invalid ballot style with no contests in it" voted_contests: List[PlaintextBallotContest] = [] for contest in contests: assert contest.is_valid(), "every contest needs to be valid" n = contest.number_elected # we need exactly this many 1's, and the rest 0's ballot_selections = contest.ballot_selections assert len(ballot_selections) >= n random = Random(draw(integers())) random.shuffle(ballot_selections) cut_point = draw(integers(0, n)) yes_votes = ballot_selections[:cut_point] no_votes = ballot_selections[cut_point:] voted_selections = [ selection_from( description, is_placeholder=False, is_affirmative=True) for description in yes_votes ] + [ selection_from( description, is_placeholder=False, is_affirmative=False) for description in no_votes ] voted_contests.append( PlaintextBallotContest(contest.object_id, voted_selections)) return PlaintextBallot(str(draw(uuids())), ballot_style.object_id, voted_contests)
def generate_fake_plaintext_ballots_for_election( self, election: InternalElectionDescription, number_of_ballots: int ) -> List[PlaintextBallot]: ballots: List[PlaintextBallot] = [] for _i in range(number_of_ballots): style_index = randint(0, len(election.ballot_styles) - 1) ballot_style = election.ballot_styles[style_index] ballot_id = f"ballot-{uuid.uuid1()}" contests: List[PlaintextBallotContest] = [] for contest in election.get_contests_for(ballot_style.object_id): contests.append( self.get_random_contest_from(contest, Random(), with_trues=True) ) ballots.append(PlaintextBallot(ballot_id, ballot_style.object_id, contests)) return ballots