Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tests/budgeting//votes: test storing several tokens in session #4876

Merged
merged 1 commit into from
Jan 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 92 additions & 1 deletion tests/budgeting/test_views_integration.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import pytest
from dateutil.parser import parse
from django.core import mail
from django.urls import reverse
from django.utils.translation import gettext_lazy as _

from adhocracy4.test.helpers import assert_template_response
from adhocracy4.test.helpers import freeze_phase
from adhocracy4.test.helpers import freeze_time
from adhocracy4.test.helpers import redirect_target
from adhocracy4.test.helpers import setup_phase
from meinberlin.apps.budgeting import models
Expand Down Expand Up @@ -56,12 +58,56 @@ def test_list_view_ordering_choices(client, phase_factory, proposal_factory):
)


@pytest.mark.django_db
def test_list_view_default_filters(client, module, phase_factory, proposal_factory):

support_phase = phase_factory(
phase_content=phases.SupportPhase(),
module=module,
start_date=parse("2022-01-01 00:00:00 UTC"),
end_date=parse("2022-01-01 10:00:00 UTC"),
)
voting_phase = phase_factory(
phase_content=phases.VotingPhase(),
module=module,
start_date=parse("2022-01-01 14:00:00 UTC"),
end_date=parse("2022-01-01 18:00:00 UTC"),
)

between_phases = parse("2022-01-01 12:00:00 UTC")

url = module.get_absolute_url()
with freeze_phase(support_phase):
response = client.get(url)
defaults = response.context["view"].filter_set.defaults
assert "is_archived" in defaults
assert defaults["is_archived"] == "false"
assert "ordering" in defaults
assert defaults["ordering"] == "dailyrandom"

with freeze_time(between_phases):
response = client.get(url)
defaults = response.context["view"].filter_set.defaults
assert "is_archived" in defaults
assert defaults["is_archived"] == "false"
assert "ordering" in defaults
assert defaults["ordering"] == "-positive_rating_count"

with freeze_phase(voting_phase):
response = client.get(url)
defaults = response.context["view"].filter_set.defaults
assert "is_archived" in defaults
assert defaults["is_archived"] == "false"
assert "ordering" in defaults
assert defaults["ordering"] == "dailyrandom"


@pytest.mark.django_db
def test_list_view_token_form(
client, user, phase_factory, proposal_factory, voting_token_factory, module_factory
):
phase, module, project, item = setup_phase(
phase_factory, proposal_factory, phases.RequestPhase
phase_factory, proposal_factory, phases.VotingPhase
)
url = project.get_absolute_url()
token = voting_token_factory(module=module)
Expand All @@ -72,12 +118,16 @@ def test_list_view_token_form(
response = client.get(url)
assert "token_form" in response.context
assert_template_response(response, "meinberlin_budgeting/proposal_list.html")
assert not response.context["valid_token_present"]

response = client.post(url, data)
assert response.status_code == 200
assert "voting_tokens" in client.session
assert "token_form" in response.context

response = client.get(url)
assert response.context["valid_token_present"]

other_module = module_factory()
other_token = voting_token_factory(module=other_module)

Expand All @@ -98,6 +148,47 @@ def test_list_view_token_form(
assert "voting_tokens" not in client.session


@pytest.mark.django_db
def test_list_view_tokens_for_different_modules(
client, phase_factory, proposal_factory, voting_token_factory
):
phase_1, module_1, _, _ = setup_phase(
phase_factory, proposal_factory, phases.VotingPhase
)
url_1 = module_1.get_absolute_url()
token_1 = voting_token_factory(module=module_1)
data_1 = {"token": str(token_1)}

with freeze_phase(phase_1):
response = client.post(url_1, data_1)
assert response.status_code == 200
assert "voting_tokens" in client.session
assert str(module_1.id) in client.session["voting_tokens"]

response = client.get(url_1)
assert response.context["valid_token_present"]

phase_2, module_2, _, _ = setup_phase(
phase_factory, proposal_factory, phases.VotingPhase
)
url_2 = module_2.get_absolute_url()
token_2 = voting_token_factory(module=module_2)
data_2 = {"token": str(token_2)}

with freeze_phase(phase_2):
response = client.post(url_2, data_2)
assert response.status_code == 200
assert "voting_tokens" in client.session
assert str(module_2.id) in client.session["voting_tokens"]
assert str(module_1.id) in client.session["voting_tokens"]

response = client.get(url_2)
assert response.context["valid_token_present"]

response = client.get(url_1)
assert response.context["valid_token_present"]


@pytest.mark.django_db
def test_detail_view(client, phase_factory, proposal_factory):
phase, module, project, item = setup_phase(
Expand Down
57 changes: 57 additions & 0 deletions tests/votes/test_token_vote_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -900,3 +900,60 @@ def test_voting_phase_active_token_inactive_cannot_delete(
assert "Token is inactive." in response.content.decode()

assert TokenVote.objects.all().count() == 1


@pytest.mark.django_db
def test_voting_phase_active_two_valid_tokens_anonymous_can_vote_both(
apiclient, voting_token_factory, phase_factory, proposal_factory
):

phase_1, module_1, project_1, proposal_1 = setup_phase(
phase_factory, proposal_factory, phases.VotingPhase
)
phase_2, module_2, project_2, proposal_2 = setup_phase(
phase_factory, proposal_factory, phases.VotingPhase
)
proposal_ct = ContentType.objects.get_for_model(proposal_1.__class__)
token_1 = voting_token_factory(module=module_1)
token_2 = voting_token_factory(module=module_2)

add_token_to_session(apiclient.session, token_1)

url_1 = reverse(
"tokenvotes-list",
kwargs={"module_pk": module_1.pk, "content_type": proposal_ct.id},
)

data_1 = {"object_id": proposal_1.pk}

with freeze_phase(phase_1):
response = apiclient.post(url_1, data_1, format="json")
assert response.status_code == status.HTTP_201_CREATED
assert TokenVote.objects.all().count() == 1

url_2 = reverse(
"tokenvotes-list",
kwargs={"module_pk": module_2.pk, "content_type": proposal_ct.id},
)

data_2 = {"object_id": proposal_2.pk}

with freeze_phase(phase_2):
response = apiclient.post(url_2, data_2, format="json")
assert response.status_code == status.HTTP_403_FORBIDDEN
assert TokenVote.objects.all().count() == 1

add_token_to_session(apiclient.session, token_2)

with freeze_phase(phase_2):
response = apiclient.post(url_2, data_2, format="json")
assert response.status_code == status.HTTP_201_CREATED
assert TokenVote.objects.all().count() == 2

proposal_3 = proposal_factory(module=module_1)
data_3 = {"object_id": proposal_3.pk}

with freeze_phase(phase_1):
response = apiclient.post(url_1, data_3, format="json")
assert response.status_code == status.HTTP_201_CREATED
assert TokenVote.objects.all().count() == 3