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"