Skip to content

Commit

Permalink
Add tests for DataportenUser
Browse files Browse the repository at this point in the history
Includes all the leg work for creating factories for the entire user
object graph structure. A lot of django-allauth dependencies...
  • Loading branch information
JakobGM committed Jul 27, 2017
1 parent 63fd3b6 commit e7cd774
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 3 deletions.
4 changes: 2 additions & 2 deletions dataporten/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
50 changes: 50 additions & 0 deletions dataporten/tests/factories.py
Original file line number Diff line number Diff line change
@@ -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
35 changes: 34 additions & 1 deletion dataporten/tests/test_models.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,52 @@
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

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

0 comments on commit e7cd774

Please sign in to comment.