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