From e7cd774037cacbaeedeaa75d79722ff1ff1403d4 Mon Sep 17 00:00:00 2001 From: Jakob Gerhard Martinussen Date: Fri, 28 Jul 2017 01:03:36 +0200 Subject: [PATCH] Add tests for DataportenUser Includes all the leg work for creating factories for the entire user object graph structure. A lot of django-allauth dependencies... --- dataporten/models.py | 4 +-- dataporten/tests/factories.py | 50 +++++++++++++++++++++++++++++++++ dataporten/tests/test_models.py | 35 ++++++++++++++++++++++- 3 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 dataporten/tests/factories.py diff --git a/dataporten/models.py b/dataporten/models.py index c2fd5bb..a5234cd 100644 --- a/dataporten/models.py +++ b/dataporten/models.py @@ -57,8 +57,8 @@ def token(self) -> str: def dataporten(self): return DataportenGroupManager(self.token) - @classmethod - def valid_request(cls, request: HttpRequest) -> bool: + @staticmethod + def valid_request(request: HttpRequest) -> bool: if hasattr(request, 'user') and request.user.is_authenticated(): return SocialToken.objects.filter( account__user=request.user, diff --git a/dataporten/tests/factories.py b/dataporten/tests/factories.py new file mode 100644 index 0000000..6f32d8f --- /dev/null +++ b/dataporten/tests/factories.py @@ -0,0 +1,50 @@ +from django.contrib.auth.models import User +from allauth.socialaccount.models import SocialAccount, SocialApp, SocialToken +import factory + +from ..models import DataportenUser + +# See the direct inspiration of these factories here: +# https://factoryboy.readthedocs.io/en/latest/recipes.html#example-django-s-profile + + +class SocialAccountFactory(factory.django.DjangoModelFactory): + + user = factory.SubFactory( + 'dataporten.tests.factories.DataportenUserFactory', + social_account=None, + ) + social_token = factory.RelatedFactory( + 'dataporten.tests.factories.SocialTokenFactory', + 'account', + ) + provider = 'dataporten' + + class Meta: + model = SocialAccount + + +class SocialAppFactory(factory.django.DjangoModelFactory): + class Meta: + model = SocialApp + + +class SocialTokenFactory(factory.django.DjangoModelFactory): + token = 'dummy_token' + account = factory.SubFactory(SocialAccountFactory, social_token=None) + app = factory.SubFactory(SocialAppFactory) + + class Meta: + model = SocialToken + + +class UserFactory(factory.django.DjangoModelFactory): + class Meta: + model = User + + +class DataportenUserFactory(factory.django.DjangoModelFactory): + social_account = factory.RelatedFactory(SocialAccountFactory, 'user') + + class Meta: + model = DataportenUser diff --git a/dataporten/tests/test_models.py b/dataporten/tests/test_models.py index 9152f1f..d2e585f 100644 --- a/dataporten/tests/test_models.py +++ b/dataporten/tests/test_models.py @@ -1,15 +1,31 @@ import pytest +from .factories import DataportenUserFactory from .utils import mock_usergroups_request -from ..models import DataportenGroupManager +from ..models import DataportenGroupManager, DataportenUser from ..tests.test_api import responses +#== FIXTURES ==# + @pytest.fixture @responses.activate def dataporten(): group_json = mock_usergroups_request() return DataportenGroupManager('dummy_token') +@pytest.fixture +@pytest.mark.django_db +def dataporten_user(): + return DataportenUserFactory() + +@pytest.fixture +@pytest.mark.django_db +def user(): + return DataportenUserFactory.build() + + +#== TESTS ==# + def test_dataporten_courses(dataporten): assert 'EXPH0004' in dataporten.inactive_courses assert 'EXPH0004' not in dataporten.active_courses @@ -17,3 +33,20 @@ def test_dataporten_courses(dataporten): assert 'TMA4180' not in dataporten.inactive_courses assert 'TMA4180' in dataporten.active_courses + +@pytest.mark.django_db +def test_dataporten_user(dataporten_user): + assert dataporten_user.token == 'dummy_token' + + +@pytest.mark.django_db +def test_dataporten_user_validation(rf, user, dataporten_user): + # pytest-django provides a RequestFactory fixture named rf + request = rf.get('') + assert DataportenUser.valid_request(request) == False + + request.user = user + assert DataportenUser.valid_request(request) == False + + request.user = dataporten_user + assert DataportenUser.valid_request(request) == True