refactor TestElectionForm

This commit is contained in:
imperosol
2026-02-09 15:23:50 +01:00
parent 33d4a99a2c
commit b74b1ac691

View File

@@ -1,12 +1,13 @@
from datetime import timedelta from datetime import timedelta
import pytest import pytest
from pytest_django.asserts import assertRedirects
from django.conf import settings from django.conf import settings
from django.test import Client, TestCase from django.test import Client, TestCase
from django.urls import reverse from django.urls import reverse
from django.utils.timezone import now from django.utils.timezone import now
from model_bakery import baker from model_bakery import baker
from model_bakery.recipe import Recipe
from pytest_django.asserts import assertRedirects
from core.baker_recipes import subscriber_user from core.baker_recipes import subscriber_user
from core.models import Group, User from core.models import Group, User
@@ -52,137 +53,103 @@ class TestElectionUpdateView(TestElection):
) )
assert response.status_code == 403 assert response.status_code == 403
class TestElectionForm(TestCase): class TestElectionForm(TestCase):
@classmethod @classmethod
def setUpTestData(cls): def setUpTestData(cls):
cls.election = baker.make( cls.election = baker.make(Election, end_date=now() + timedelta(days=1))
Election,
end_date = now() + timedelta(days=1),
)
cls.group = baker.make(Group) cls.group = baker.make(Group)
cls.election.vote_groups.add(cls.group) cls.election.vote_groups.add(cls.group)
cls.election.edit_groups.add(cls.group) cls.election.edit_groups.add(cls.group)
lists = baker.make(ElectionList, election=cls.election, _quantity=2, _bulk_create=True) lists = baker.make(
cls.roles = baker.make(Role, election=cls.election, _quantity=2, _bulk_create=True) ElectionList, election=cls.election, _quantity=2, _bulk_create=True
)
cls.roles = baker.make(
Role, election=cls.election, _quantity=2, _bulk_create=True
)
users = baker.make(User, _quantity=4, _bulk_create=True) users = baker.make(User, _quantity=4, _bulk_create=True)
recipe = Recipe(Candidature)
cls.cand = [ cls.cand = [
baker.make(Candidature, role=cls.roles[0], user=users[0], election_list=lists[0]), recipe.prepare(role=cls.roles[0], user=users[0], election_list=lists[0]),
baker.make(Candidature, role=cls.roles[0], user=users[1], election_list=lists[1]), recipe.prepare(role=cls.roles[0], user=users[1], election_list=lists[1]),
baker.make(Candidature, role=cls.roles[1], user=users[2], election_list=lists[0]), recipe.prepare(role=cls.roles[1], user=users[2], election_list=lists[0]),
baker.make(Candidature, role=cls.roles[1], user=users[3], election_list=lists[1]), recipe.prepare(role=cls.roles[1], user=users[3], election_list=lists[1]),
] ]
cls.url = reverse("election:vote", kwargs={"election_id": cls.election.id}) Candidature.objects.bulk_create(cls.cand)
cls.vote_url = reverse("election:vote", kwargs={"election_id": cls.election.id})
cls.detail_url = reverse(
"election:detail", kwargs={"election_id": cls.election.id}
)
def test_election_good_form(self): def test_election_good_form(self):
election = self.election postes = (self.roles[0].title, self.roles[1].title)
group = self.group
roles = self.roles
cand = self.cand
votes = [ votes = [
{ {postes[0]: "", postes[1]: str(self.cand[2].id)},
roles[0].title : "", {postes[0]: "", postes[1]: ""},
roles[1].title : str(cand[2].id), {postes[0]: str(self.cand[0].id), postes[1]: str(self.cand[2].id)},
}, {postes[0]: str(self.cand[0].id), postes[1]: str(self.cand[3].id)},
{
roles[0].title : "",
roles[1].title : "",
},
{
roles[0].title : str(cand[0].id),
roles[1].title : str(cand[2].id),
},
{
roles[0].title : str(cand[0].id),
roles[1].title : str(cand[3].id),
},
] ]
voters = subscriber_user.make(_quantity=len(votes), _bulk_create=True) voters = subscriber_user.make(_quantity=len(votes), _bulk_create=True)
group.users.set(voters) self.group.users.set(voters)
for voter, vote in zip(voters, votes): for voter, vote in zip(voters, votes, strict=True):
assert election.can_vote(voter) assert self.election.can_vote(voter)
self.client.force_login(voter) self.client.force_login(voter)
response = self.client.post(self.url, data = vote) response = self.client.post(self.vote_url, data=vote)
assertRedirects( assertRedirects(response, self.detail_url)
response,
reverse("election:detail", kwargs={"election_id": election.id}) assert set(self.election.voters.all()) == set(voters)
) assert self.election.results == {
postes[0]: {
assert set(election.voters.all()) == set(voters) self.cand[0].user.username: {"percent": 50.0, "vote": 2},
assert election.results == { self.cand[1].user.username: {"percent": 0.0, "vote": 0},
roles[0].title: {
cand[0].user.username: {"percent": 50.0, "vote": 2},
cand[1].user.username: {"percent": 0.0, "vote": 0},
"blank vote": {"percent": 50.0, "vote": 2}, "blank vote": {"percent": 50.0, "vote": 2},
"total vote": 4, "total vote": 4,
}, },
roles[1].title: { postes[1]: {
cand[2].user.username: {"percent": 50.0, "vote": 2}, self.cand[2].user.username: {"percent": 50.0, "vote": 2},
cand[3].user.username: {"percent": 25.0, "vote": 1}, self.cand[3].user.username: {"percent": 25.0, "vote": 1},
"blank vote": {"percent": 25.0, "vote": 1}, "blank vote": {"percent": 25.0, "vote": 1},
"total vote": 4, "total vote": 4,
}, },
} }
def test_election_bad_form(self): def test_election_bad_form(self):
election = self.election postes = (self.roles[0].title, self.roles[1].title)
group = self.group
roles = self.roles
cand = self.cand
unknow_user = baker.make(User, _quantity=1, _bulk_create=True)
votes = [ votes = [
{postes[0]: "", postes[1]: str(self.cand[0].id)}, # wrong candidate
{postes[0]: ""},
{ {
roles[0].title : "", postes[0]: "0123456789", # unknow users
roles[1].title : str(cand[0].id), #wrong candidate postes[1]: str(subscriber_user.make().id), # not a candidate
}, },
{},
{
roles[0].title : "",
},
{
roles[0].title : "0123456789", #unknow users
roles[1].title : str(unknow_user[0].id), #not a candidate
},
{
},
] ]
voters = subscriber_user.make(_quantity=len(votes), _bulk_create=True) voters = subscriber_user.make(_quantity=len(votes), _bulk_create=True)
group.users.set(voters) self.group.users.set(voters)
for voter, vote in zip(voters, votes): for voter, vote in zip(voters, votes, strict=True):
assert election.can_vote(voter)
self.client.force_login(voter) self.client.force_login(voter)
response = self.client.post(self.url, data = vote) response = self.client.post(self.vote_url, data=vote)
assertRedirects( assertRedirects(response, self.detail_url)
response,
reverse("election:detail", kwargs={"election_id": election.id})
)
assert election.results == { assert self.election.results == {
roles[0].title: { postes[0]: {
cand[0].user.username: {"percent": 0.0, "vote": 0}, self.cand[0].user.username: {"percent": 0.0, "vote": 0},
cand[1].user.username: {"percent": 0.0, "vote": 0}, self.cand[1].user.username: {"percent": 0.0, "vote": 0},
"blank vote": {"percent": 100.0, "vote": 2}, "blank vote": {"percent": 100.0, "vote": 2},
"total vote": 2, "total vote": 2,
}, },
roles[1].title: { postes[1]: {
cand[2].user.username: {"percent": 0.0, "vote": 0}, self.cand[2].user.username: {"percent": 0.0, "vote": 0},
cand[3].user.username: {"percent": 0.0, "vote": 0}, self.cand[3].user.username: {"percent": 0.0, "vote": 0},
"blank vote": {"percent": 100.0, "vote": 2}, "blank vote": {"percent": 100.0, "vote": 2},
"total vote": 2, "total vote": 2,
}, },
} }
@pytest.mark.django_db @pytest.mark.django_db
def test_election_create_list_permission(client: Client): def test_election_create_list_permission(client: Client):
election = baker.make(Election, end_candidature=now() + timedelta(hours=1)) election = baker.make(Election, end_candidature=now() + timedelta(hours=1))
@@ -245,4 +212,4 @@ def test_election_results():
"blank vote": {"percent": 25.0, "vote": 25}, "blank vote": {"percent": 25.0, "vote": 25},
"total vote": 100, "total vote": 100,
}, },
} }