diff --git a/backend/requirements/dev.txt b/backend/requirements/dev.txt index b1750203f..b7c3f094e 100644 --- a/backend/requirements/dev.txt +++ b/backend/requirements/dev.txt @@ -1,2 +1,3 @@ flake8==3.7.7 pytest-django==3.5.0 +Faker==1.0.7 diff --git a/backend/src/baserow/api/v0/user/urls.py b/backend/src/baserow/api/v0/user/urls.py index 8349739bc..489522837 100644 --- a/backend/src/baserow/api/v0/user/urls.py +++ b/backend/src/baserow/api/v0/user/urls.py @@ -13,5 +13,5 @@ urlpatterns = [ url(r'^token-auth/$', obtain_jwt_token, name='token_auth'), url(r'^token-refresh/$', refresh_jwt_token, name='token_refresh'), url(r'^token-verify/$', verify_jwt_token, name='token_verify'), - url(r'^$', UserView.as_view(), name='user') + url(r'^$', UserView.as_view(), name='index') ] diff --git a/backend/tests/__init__.py b/backend/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/backend/tests/baserow/api/v0/user/test_token_auth.py b/backend/tests/baserow/api/v0/user/test_token_auth.py new file mode 100644 index 000000000..740ef960d --- /dev/null +++ b/backend/tests/baserow/api/v0/user/test_token_auth.py @@ -0,0 +1,75 @@ +import pytest +from unittest.mock import patch +from datetime import datetime + +from django.shortcuts import reverse +from django.contrib.auth import get_user_model + +from rest_framework_jwt.settings import api_settings + + +jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER +jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER + + +User = get_user_model() + + +@pytest.mark.django_db +def test_token_auth(client, data_fixture): + data_fixture.create_user(email='test@test.nl', password='password', + first_name='Test1') + + response = client.post(reverse('api:user:token_auth'), { + 'username': 'no_existing@test.nl', + 'password': 'password' + }) + json = response.json() + + assert response.status_code == 400 + assert len(json['non_field_errors']) > 0 + + response = client.post(reverse('api:user:token_auth'), { + 'username': 'test@test.nl', + 'password': 'wrong_password' + }) + json = response.json() + + assert response.status_code == 400 + assert len(json['non_field_errors']) > 0 + + response = client.post(reverse('api:user:token_auth'), { + 'username': 'test@test.nl', + 'password': 'password' + }) + json = response.json() + + assert response.status_code == 200 + assert 'token' in json + assert 'user' in json + assert json['user']['username'] == 'test@test.nl' + assert json['user']['first_name'] == 'Test1' + + +@pytest.mark.django_db +def test_token_refresh(client, data_fixture): + user = data_fixture.create_user(email='test@test.nl', password='password', + first_name='Test1') + + response = client.post(reverse('api:user:token_refresh'), {'token': 'WRONG_TOKEN'}) + assert response.status_code == 400 + + payload = jwt_payload_handler(user) + token = jwt_encode_handler(payload) + + response = client.post(reverse('api:user:token_refresh'), {'token': token}) + assert response.status_code == 200 + assert 'token' in response.json() + + with patch('rest_framework_jwt.utils.datetime') as mock_datetime: + mock_datetime.utcnow.return_value = datetime(2019, 1, 1, 1, 1, 1, 0) + payload = jwt_payload_handler(user) + token = jwt_encode_handler(payload) + + response = client.post(reverse('api:user:token_refresh'), {'token': token}) + assert response.status_code == 400 diff --git a/backend/tests/baserow/api/v0/user/test_user_views.py b/backend/tests/baserow/api/v0/user/test_user_views.py new file mode 100644 index 000000000..25f9ba952 --- /dev/null +++ b/backend/tests/baserow/api/v0/user/test_user_views.py @@ -0,0 +1,37 @@ +import pytest + +from django.contrib.auth import get_user_model +from django.shortcuts import reverse + + +User = get_user_model() + + +@pytest.mark.django_db +def test_create_user(client): + response = client.post(reverse('api:user:index'), { + 'name': 'Test1', + 'email': 'test@test.nl', + 'password': 'test12' + }) + + assert response.status_code == 200 + user = User.objects.get(email='test@test.nl') + assert user.first_name == 'Test1' + assert user.email == 'test@test.nl' + assert user.password != '' + + response_failed = client.post(reverse('api:user:index'), { + 'name': 'Test1', + 'email': 'test@test.nl', + 'password': 'test12' + }) + + assert response_failed.status_code == 400 + assert response_failed.json()['error'] == 'ERROR_ALREADY_EXISTS' + + response_failed_2 = client.post(reverse('api:user:index'), { + 'email': 'test' + }) + + assert response_failed_2.status_code == 400 diff --git a/backend/tests/baserow/test_temporary.py b/backend/tests/baserow/test_temporary.py deleted file mode 100644 index 4de29ddbc..000000000 --- a/backend/tests/baserow/test_temporary.py +++ /dev/null @@ -1,2 +0,0 @@ -def test_homepage(): - pass diff --git a/backend/tests/baserow/user/test_user_handler.py b/backend/tests/baserow/user/test_user_handler.py new file mode 100644 index 000000000..68520c81d --- /dev/null +++ b/backend/tests/baserow/user/test_user_handler.py @@ -0,0 +1,18 @@ +import pytest + +from baserow.user.exceptions import UserAlreadyExist +from baserow.user.handler import UserHandler + + +@pytest.mark.django_db +def test_create_user(): + user_handler = UserHandler() + + user = user_handler.create_user('Test1', 'test@test.nl', 'password') + assert user.pk + assert user.first_name == 'Test1' + assert user.email == 'test@test.nl' + assert user.username == 'test@test.nl' + + with pytest.raises(UserAlreadyExist): + user_handler.create_user('Test1', 'test@test.nl', 'password') diff --git a/backend/tests/conftest.py b/backend/tests/conftest.py new file mode 100644 index 000000000..f6224f5b4 --- /dev/null +++ b/backend/tests/conftest.py @@ -0,0 +1,7 @@ +import pytest + + +@pytest.fixture +def data_fixture(): + from .fixtures import Fixtures + return Fixtures() diff --git a/backend/tests/fixtures/__init__.py b/backend/tests/fixtures/__init__.py new file mode 100644 index 000000000..1b2f9b50e --- /dev/null +++ b/backend/tests/fixtures/__init__.py @@ -0,0 +1,5 @@ +from .user import UserFixtures + + +class Fixtures(UserFixtures): + pass diff --git a/backend/tests/fixtures/user.py b/backend/tests/fixtures/user.py new file mode 100644 index 000000000..2b58a1c68 --- /dev/null +++ b/backend/tests/fixtures/user.py @@ -0,0 +1,20 @@ +from django.contrib.auth import get_user_model +from faker import Faker + + +fake = Faker() +User = get_user_model() + + +class UserFixtures: + def create_user(self, **kwargs): + kwargs.setdefault('email', fake.email()) + kwargs.setdefault('username', kwargs['email']) + kwargs.setdefault('first_name', fake.name()) + kwargs.setdefault('password', 'password') + + user = User(**kwargs) + user.set_password(kwargs['password']) + user.save() + + return user