Skip to content

Commit

Permalink
remove live_server and serialized_rollback from tests (#1106)
Browse files Browse the repository at this point in the history
* remove live_server and serialized_rollback

* add test for signup
  • Loading branch information
jeriox authored Oct 22, 2023
1 parent c6e6d4f commit 81e5132
Show file tree
Hide file tree
Showing 8 changed files with 110 additions and 57 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{% extends "base.html" %}
{% load settings_extras %}
{% load i18n %}

{% block title %}
Expand All @@ -16,7 +17,7 @@ <h1>{% translate "External events" %}</h1>
</div>
</div>
<a class="w-100 text-reset py-2 event-list-item-link"
href="{{ event.signup_url }}?referrer={{ SITE_URL }}">
href="{{ event.signup_url }}?referrer={% site_url %}">
<div class="grid-wrapper m-0 py-0 ps-2 pe-3">
<div class="grid-title">
<div>
Expand Down
2 changes: 1 addition & 1 deletion ephios/plugins/federation/views/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
2 changes: 1 addition & 1 deletion ephios/plugins/federation/views/frontend.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
77 changes: 51 additions & 26 deletions tests/plugins/federation/conftest.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
18 changes: 13 additions & 5 deletions tests/plugins/federation/test_federation_setup.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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


Expand Down
59 changes: 37 additions & 22 deletions tests/plugins/federation/test_federation_views.py
Original file line number Diff line number Diff line change
@@ -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
4 changes: 4 additions & 0 deletions tests/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,7 @@

LANGUAGE_CODE = "en"
os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"


def GET_SITE_URL():
return "http://localhost:8000"

0 comments on commit 81e5132

Please sign in to comment.