From 81e5132553f89eeb32bd037c59b707ff8abb352f Mon Sep 17 00:00:00 2001 From: Julian Baumann Date: Sun, 22 Oct 2023 22:38:18 +0200 Subject: [PATCH] remove live_server and serialized_rollback from tests (#1106) * remove live_server and serialized_rollback * add test for signup --- .../federation/external_event_list.html | 3 +- ephios/plugins/federation/views/api.py | 2 +- ephios/plugins/federation/views/frontend.py | 2 +- tests/conftest.py | 2 +- tests/plugins/federation/conftest.py | 77 ++++++++++++------- .../federation/test_federation_setup.py | 18 +++-- .../federation/test_federation_views.py | 59 ++++++++------ tests/settings.py | 4 + 8 files changed, 110 insertions(+), 57 deletions(-) diff --git a/ephios/plugins/federation/templates/federation/external_event_list.html b/ephios/plugins/federation/templates/federation/external_event_list.html index ceb0bbccc..05a9916fb 100644 --- a/ephios/plugins/federation/templates/federation/external_event_list.html +++ b/ephios/plugins/federation/templates/federation/external_event_list.html @@ -1,4 +1,5 @@ {% extends "base.html" %} +{% load settings_extras %} {% load i18n %} {% block title %} @@ -16,7 +17,7 @@

{% translate "External events" %}

+ href="{{ event.signup_url }}?referrer={% site_url %}">
diff --git a/ephios/plugins/federation/views/api.py b/ephios/plugins/federation/views/api.py index b577171d0..778f4be74 100644 --- a/ephios/plugins/federation/views/api.py +++ b/ephios/plugins/federation/views/api.py @@ -134,7 +134,7 @@ def _oauth_callback(self): ) except FederatedUser.DoesNotExist: user = self._create_user(user_data) - self.request.session["federation_user"] = user.pk + self.request.session["federated_user"] = user.pk def _create_user(self, user_data): user = FederatedUser.objects.create( diff --git a/ephios/plugins/federation/views/frontend.py b/ephios/plugins/federation/views/frontend.py index b75318c41..b567f4f3b 100644 --- a/ephios/plugins/federation/views/frontend.py +++ b/ephios/plugins/federation/views/frontend.py @@ -107,7 +107,7 @@ class FederatedUserShiftActionView(CheckFederatedAccessTokenMixin, BaseShiftActi def get_participant(self): try: return FederatedUser.objects.get( - pk=self.request.session["federation_user"] + pk=self.request.session["federated_user"] ).as_participant() except FederatedUser.DoesNotExist as e: raise PermissionDenied from e diff --git a/tests/conftest.py b/tests/conftest.py index d7ee5c7c4..975178c4a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -52,7 +52,7 @@ def csrf_exempt_django_app(django_app_factory): def pytest_collection_modifyitems(items): # mark all tests for use with django_db, as we basically need it everywhere for item in items: - item.add_marker(pytest.mark.django_db(transaction=True, serialized_rollback=True)) + item.add_marker("django_db") @pytest.fixture(autouse=True) diff --git a/tests/plugins/federation/conftest.py b/tests/plugins/federation/conftest.py index 04948d503..b4b9ec000 100644 --- a/tests/plugins/federation/conftest.py +++ b/tests/plugins/federation/conftest.py @@ -1,11 +1,18 @@ import secrets +from datetime import date import pytest from django.urls import reverse from oauth2_provider.generators import generate_client_secret from ephios.api.models import AccessToken, Application -from ephios.plugins.federation.models import FederatedGuest, FederatedHost, InviteCode +from ephios.plugins.federation.models import ( + FederatedEventShare, + FederatedGuest, + FederatedHost, + FederatedUser, + InviteCode, +) @pytest.fixture @@ -15,28 +22,46 @@ def invite_code(): @pytest.fixture def federation(): - def _setup(url): - access_token = AccessToken.objects.create(token=secrets.token_hex()) - oauth_client_secret = generate_client_secret() - oauth_app = Application.objects.create( - client_secret=oauth_client_secret, - client_type=Application.CLIENT_CONFIDENTIAL, - authorization_grant_type=Application.GRANT_AUTHORIZATION_CODE, - redirect_uris=f"{url}{reverse('federation:oauth_callback')}", - ) - host = FederatedHost.objects.create( - name="Test", - url=url, - access_token=access_token.token, - oauth_application=oauth_app, - ) - guest = FederatedGuest.objects.create( - name="Test", - url=url, - access_token=access_token, - client_id=oauth_app.client_id, - client_secret=oauth_client_secret, - ) - return host, guest - - return _setup + access_token = AccessToken.objects.create(token=secrets.token_hex()) + oauth_client_secret = generate_client_secret() + oauth_app = Application.objects.create( + client_secret=oauth_client_secret, + client_type=Application.CLIENT_CONFIDENTIAL, + authorization_grant_type=Application.GRANT_AUTHORIZATION_CODE, + redirect_uris=f"http://localhost:8080/{reverse('federation:oauth_callback')}", + ) + host = FederatedHost.objects.create( + name="Test", + url="http://localhost:8000", + access_token=access_token.token, + oauth_application=oauth_app, + ) + guest = FederatedGuest.objects.create( + name="Test", + url="http://localhost:8080", + access_token=access_token, + client_id=oauth_app.client_id, + client_secret=oauth_client_secret, + ) + return host, guest + + +@pytest.fixture +def federated_user(federation): + host, guest = federation + return FederatedUser.objects.create( + email="test@localhost", + first_name="Federated", + last_name="Testuser", + date_of_birth=date(2000, 1, 1), + phone="12345", + federated_instance=guest, + ) + + +@pytest.fixture +def federated_event(event, federation): + host, guest = federation + share = FederatedEventShare.objects.create(event=event) + share.shared_with.add(guest) + return event diff --git a/tests/plugins/federation/test_federation_setup.py b/tests/plugins/federation/test_federation_setup.py index 7d44c9980..2a369b376 100644 --- a/tests/plugins/federation/test_federation_setup.py +++ b/tests/plugins/federation/test_federation_setup.py @@ -1,5 +1,6 @@ import base64 import json +from unittest.mock import patch from django.urls import reverse from dynamic_preferences.registries import global_preferences_registry @@ -14,18 +15,25 @@ def test_create_invitecode(django_app, superuser): assert InviteCode.objects.get().url == "https://example.com" -def test_redeem_invitecode_frontend( - django_app, superuser, invite_code, live_server, django_db_serialized_rollback -): +@patch("ephios.plugins.federation.forms.requests") +def test_redeem_invitecode_frontend(mock_requests, django_app, superuser, invite_code): + mock_requests.post.return_value.json.return_value = { + "name": "Test", + "host_url": "http://localhost:8000", + "access_token": "test", + } global_preferences_registry.manager()["general__organization_name"] = "Test" form = django_app.get(reverse("federation:frontend_redeem_invite_code"), user=superuser).form form["code"] = base64.b64encode( json.dumps( - {"guest_url": invite_code.url, "code": invite_code.code, "host_url": live_server.url} + { + "guest_url": invite_code.url, + "code": invite_code.code, + "host_url": "http://localhost:8000", + } ).encode("ascii") ).decode("ascii") response = form.submit().follow() - assert FederatedGuest.objects.count() == 1 assert FederatedHost.objects.count() == 1 diff --git a/tests/plugins/federation/test_federation_views.py b/tests/plugins/federation/test_federation_views.py index 656c83f62..3f9a7e771 100644 --- a/tests/plugins/federation/test_federation_views.py +++ b/tests/plugins/federation/test_federation_views.py @@ -1,35 +1,50 @@ -from django.urls import reverse +from importlib import import_module +from unittest.mock import patch -from ephios.plugins.federation.models import FederatedEventShare +from django.urls import reverse +from ephios.plugins.federation.models import FederatedParticipation +from ephios.plugins.federation.serializers import SharedEventSerializer -def test_federation_get_shared_events( - django_app, volunteer, live_server, federation, event, django_db_serialized_rollback -): - host, guest = federation(live_server.url) - share = FederatedEventShare.objects.create(event=event) - share.shared_with.add(guest) +def test_federation_get_shared_events(django_app, volunteer, federation, federated_event): + host, guest = federation response = django_app.get( reverse("federation:shared_event_list_view"), headers={"Authorization": f"Bearer {host.access_token}"}, ) - assert event.title in response.text + assert federated_event.title in response.text + + +@patch("ephios.plugins.federation.views.frontend.requests") +def test_federation_shared_event_list( + mock_requests, django_app, volunteer, federation, federated_event, settings +): + host, guest = federation + mock_requests.get.return_value.json.return_value = { + "results": [SharedEventSerializer(federated_event).data] + } + + response = django_app.get(reverse("federation:external_event_list"), user=volunteer) + assert response.status_code == 200 + assert federated_event.title in response.text -def test_federation_shared_event_detail( - django_app, volunteer, live_server, federation, event, settings, django_db_serialized_rollback +def test_federation_shared_event_detail_and_signup( + django_app, volunteer, federation, federated_user, federated_event, settings ): - settings.GET_SITE_URL = lambda: live_server.url - host, guest = federation(live_server.url) - share = FederatedEventShare.objects.create(event=event) - share.shared_with.add(guest) - - event_url = reverse("federation:event_detail", kwargs={"pk": event.pk}) - response = django_app.get(f"{event_url}?referrer={live_server.url}", user=volunteer) - response = response.follow() + host, guest = federation + session = django_app.session or import_module(settings.SESSION_ENGINE).SessionStore() + session["federation_access_token"] = "token" + session["federation_guest_pk"] = guest.pk + session["federated_user"] = federated_user.pk + session.save() + django_app.set_cookie(settings.SESSION_COOKIE_NAME, session.session_key) + + response = django_app.get(reverse("federation:event_detail", kwargs={"pk": federated_event.pk})) assert response.status_code == 200 - assert "Authorize" in response.text - response = response.form.submit("allow").follow().follow() + assert federated_event.title in response.text + + response = response.form.submit(name="signup_choice", value="sign_up").follow() assert response.status_code == 200 - assert event.title in response.text + assert FederatedParticipation.objects.count() == 1 diff --git a/tests/settings.py b/tests/settings.py index 3ef841c87..8f13c9b94 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -2,3 +2,7 @@ LANGUAGE_CODE = "en" os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1" + + +def GET_SITE_URL(): + return "http://localhost:8000"