Skip to content

Commit

Permalink
trying to define more factories and unittests so we can have a suite
Browse files Browse the repository at this point in the history
before really switching to Keoycloak

Ref: #71
  • Loading branch information
oliveratfoodcoopx committed Dec 1, 2022
1 parent 8ce4bb4 commit d5fc6be
Show file tree
Hide file tree
Showing 9 changed files with 270 additions and 55 deletions.
16 changes: 14 additions & 2 deletions tapir/accounts/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from django.contrib.auth.tokens import default_token_generator
from django.contrib.auth import get_user_model
from django.core.mail import EmailMultiAlternatives
from django.db import connections, router, models
from django.db import connections, router, models, transaction
from django.template import loader
from django.urls import reverse
from django.utils import translation
Expand Down Expand Up @@ -102,6 +102,18 @@ def has_perm(self, perm, obj=None):
return True

return super().has_perm(perm=perm, obj=obj)

@transaction.atomic
def add_perm(self, perm):
user_dn = self.get_ldap().build_dn()
for group_cn in settings.PERMISSIONS.get(perm, []):
group, _ = LdapGroup.objects.get_or_create(
cn=group_cn,
defaults={"dn": f"cn={group_cn},{settings.REG_GROUP_BASE_DN}"}
)
group.members.append(user_dn)
group.save()



class TapirUserQuerySet(models.QuerySet):
Expand Down Expand Up @@ -201,7 +213,7 @@ def has_perm(self, perm, obj=None):
return True

return super().has_perm(perm=perm, obj=obj)

def get_permissions_display(self):
user_perms = [perm for perm in PERMISSIONS if self.has_perm(perm)]
if len(user_perms) == 0:
Expand Down
2 changes: 1 addition & 1 deletion tapir/accounts/templates/accounts/user_detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ <h5 class="card-header d-flex justify-content-between align-items-center">
<div class="d-flex m-1 mt-4">
<div class="d-flex justify-content-end gap-2">
{% if perms.accounts.manage %}
<form method="post" action="{% url "accounts:send_user_welcome_email" object.pk %}">
<form id="send-user-welcome-mail-form" method="post" action="{% url "accounts:send_user_welcome_email" object.pk %}">
{% csrf_token %}
<button type="submit" class="btn tapir-btn btn-info ms-3">
<span class="material-icons">send</span>{% translate "Send account activation email" %}
Expand Down
2 changes: 1 addition & 1 deletion tapir/accounts/tests/factories/factories.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def password(self, create, password, **kwargs):
def is_in_member_office(self, create, is_in_member_office, **kwargs):
if not create:
return

group_cn = settings.GROUP_MEMBER_OFFICE
group = LdapGroup.objects.get(cn=group_cn)
user_dn = self.get_ldap().build_dn()
Expand Down
7 changes: 4 additions & 3 deletions tapir/accounts/tests/test_keycloak.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from django.contrib.auth import authenticate, login
from tapir.utils.tests_utils import TapirFactoryTestBase
from tapir.utils.tests_utils import KeycloakServiceTestCase
from tapir.accounts.tests.factories.factories import TapirUserFactory
from django.test import RequestFactory

class KeycloakServerBackendAuthenticationTests(TapirFactoryTestBase):

class KeycloakServerBackendAuthenticationTests(KeycloakServiceTestCase):
"""
This testa are run against the keycloak server within this project
(Docker server keycloak-server)
Expand All @@ -23,7 +24,7 @@ def test_differentiates_between_different_realms(self):



class KeycloakServerSignupTests(TapirFactoryTestBase):
class KeycloakServerSignupTests(KeycloakServiceTestCase):
"""
This testa are run against the keycloak server within this project
(Docker server keycloak-server)
Expand Down
19 changes: 4 additions & 15 deletions tapir/accounts/tests/test_models.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,14 @@
from unittest import mock
from django.test import TestCase
from django.core.exceptions import ValidationError
from django.contrib.auth import get_user_model
from tapir.utils.tests_utils import KeycloakTestCase

User = get_user_model()

class TapirUserTests(TestCase):

def setUp(self):
super().setUp()
has_ldap_patch = mock.patch("tapir.accounts.models.LdapUser.has_ldap")
self.has_ldap = has_ldap_patch.start()

ldap_save_patch = mock.patch("tapir.accounts.models.LdapPerson.save")
self.ldap_save = ldap_save_patch.start()

self.addCleanup(has_ldap_patch.stop)
self.addCleanup(ldap_save_patch.stop)
class TapirUserTests(KeycloakTestCase):

def test_model_validates_usernames(self):
self.has_ldap.return_value = 0
self.has_ldap.return_value = False
self.ldap_save.return_value = None

usernames = [
Expand All @@ -31,4 +20,4 @@ def test_model_validates_usernames(self):
except ValidationError:
continue
self.fail(f"validation error not raised for username: {username}")

38 changes: 5 additions & 33 deletions tapir/accounts/tests/test_registration.py
Original file line number Diff line number Diff line change
@@ -1,44 +1,16 @@
from io import StringIO
from unittest import mock
from django_webtest import WebTest
from django.contrib.auth import get_user_model
from django.urls import reverse
from django.utils import timezone
from django.core.management import call_command
from tapir.wirgarten.models import GrowingPeriod
from tapir.utils.tests_utils import KeycloakTestCase

User = get_user_model()

class WizardTests(WebTest):
class WizardTests(KeycloakTestCase, WebTest):

@classmethod
def setUpTestData(cls):
cls.now = now = timezone.now()

call_command("parameter_definitions", stdout=StringIO())
fixtures = [
"0010_pickup_locations",
"0020_product_types",
"0021_tax_rates",
"0030_products",
"0031_product_prices",
"0040_growing_periods",
"0050_product_capacity",
"0060_pickup_location_capabilities",
]
for fix in fixtures:
call_command("loaddata", f"tapir/wirgarten/fixtures/{fix}", app="wirgarten", stdout=StringIO())

GrowingPeriod.objects.create(
start_date=now.replace(year=now.year - 1, month=3, day=1),
end_date=now.replace(year=now.year + 1, month=2, day=28)
)

@mock.patch('tapir.accounts.models.LdapPerson.save')
@mock.patch('tapir.accounts.models.LdapUser.has_ldap')
def test_simple_signup_flow(self, has_ldap, ldap_save):
has_ldap.return_value = False
ldap_save.return_value = None
def test_simple_signup_flow(self):
self.has_ldap.return_value = False
self.ldap_save.return_value = None

form = self.app.get(reverse('wirgarten:draftuser_register')).form
form["Harvest Shares-harvest_shares_s"] = 1
Expand Down
58 changes: 58 additions & 0 deletions tapir/accounts/tests/test_views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
from io import StringIO
from unittest import mock
from django_webtest import WebTest
from django.contrib.auth import get_user_model
from tapir.accounts.tests.factories.factories import TapirUserFactory
from tapir.wirgarten.factories import MemberFactory, ShareOwnershipFactory, SubscriptionFactory, PaymentFactory
from tapir.utils.tests_utils import KeycloakTestCase
from django.urls import reverse


User = get_user_model()

class PermissionsTests(KeycloakTestCase, WebTest):

def test_send_welcome_mail_form_only_available_with_proper_perm(self):
user = TapirUserFactory()
self.assertFalse(user.has_perm('accounts.manage'))
url = reverse("accounts:user_detail", kwargs={"pk": user.pk})
r = self.app.get(url, user=user)
selector = '#send-user-welcome-mail-form'
self.assertIsNone(r.html.select_one(selector))

user.add_perm('accounts.manage')
self.assertTrue(user.has_perm('accounts.manage'))
r = self.app.get(url, user=user)
self.assertIsNotNone(r.html.select_one(selector))

def test_user_edit_only_available_with_proper_perm(self):
member = ShareOwnershipFactory().member
user = TapirUserFactory()
self.assertFalse(user.has_perm('accounts.manage'))
url = reverse("wirgarten:member_detail", kwargs={"pk": member.pk})
r = self.app.get(url, user=user)
selector = '#tapir_user_edit_button'
self.assertIsNone(r.html.select_one(selector))

user.add_perm('accounts.manage')
self.assertTrue(user.has_perm('accounts.manage'))
r = self.app.get(url, user=user)
self.assertIsNotNone(r.html.select_one(selector))

def test_edit_payment_form_only_available_with_proper_perm(self):
member = SubscriptionFactory().member
PaymentFactory()
user = TapirUserFactory()
self.assertFalse(user.has_perm('coop.manage'))
url = reverse("wirgarten:member_payments", kwargs={"pk": member.pk})
r = self.app.get(url, user=user)
selector = '#edit-payment-form'
self.assertIsNone(r.html.select_one(selector))

user.add_perm('coop.manage')
self.assertTrue(user.has_perm('coop.manage'))
r = self.app.get(url, user=user)
print(r.html)
self.assertIsNotNone(r.html.select_one(selector))


52 changes: 52 additions & 0 deletions tapir/utils/tests_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
import os
import pathlib
import socket
from io import StringIO

import factory.random
from unittest import mock
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from django.db import DEFAULT_DB_ALIAS
from django.test import TestCase, override_settings, Client
Expand All @@ -23,6 +25,9 @@
from tapir.accounts.templatetags.accounts import format_phone_number
from tapir.accounts.tests.factories.factories import TapirUserFactory
from tapir.utils.json_user import JsonUser
from django.utils import timezone
from django.core.management import call_command
from tapir.wirgarten.models import GrowingPeriod

TAPIR_SELENIUM_BASE_FIXTURES = ["admin_account.json", "test_data.json"]

Expand Down Expand Up @@ -214,3 +219,50 @@ def login_as_normal_user(self) -> TapirUser:
user = TapirUserFactory.create(is_in_member_office=False)
self.login_as_user(user)
return user


class KeycloakTestCase(TestCase):
'''once we have enough tests, just remove ldap database'''
databases = {"ldap", DEFAULT_DB_ALIAS}

@classmethod
def setUpTestData(cls):
cls.now = now = timezone.now()

call_command("parameter_definitions", stdout=StringIO())
fixtures = [
"0010_pickup_locations",
"0020_product_types",
"0021_tax_rates",
"0030_products",
"0031_product_prices",
"0040_growing_periods",
"0050_product_capacity",
"0060_pickup_location_capabilities",
]
for fix in fixtures:
call_command("loaddata", f"tapir/wirgarten/fixtures/{fix}", app="wirgarten", stdout=StringIO())

GrowingPeriod.objects.create(
start_date=now.replace(year=now.year - 1, month=3, day=1),
end_date=now.replace(year=now.year + 1, month=2, day=28)
)


class KeycloakServiceTestCase(KeycloakTestCase):
''' base class to interact with a running Keycloak service'''
pass


class MuteLadapTestCase(TestCase):

def setUp(self):
super().setUp()
has_ldap_patch = mock.patch("tapir.accounts.models.LdapUser.has_ldap")
self.has_ldap = has_ldap_patch.start()

ldap_save_patch = mock.patch("tapir.accounts.models.LdapPerson.save")
self.ldap_save = ldap_save_patch.start()

self.addCleanup(has_ldap_patch.stop)
self.addCleanup(ldap_save_patch.stop)
Loading

0 comments on commit d5fc6be

Please sign in to comment.