SMART-3 Merge pull request 'backend' (#5) from backend into develop
Reviewed-on: #5
This commit is contained in:
commit
d2e6f7660d
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -20,7 +20,7 @@ class UserSerializer(serializers.ModelSerializer):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = UserProfile
|
model = UserProfile
|
||||||
fields = ('first_name', 'last_name')
|
fields = ('username', 'first_name', 'last_name')
|
||||||
|
|
||||||
|
|
||||||
class UserRegistrationSerializer(serializers.ModelSerializer):
|
class UserRegistrationSerializer(serializers.ModelSerializer):
|
||||||
@ -39,6 +39,7 @@ class UserRegistrationSerializer(serializers.ModelSerializer):
|
|||||||
user = User.objects.create_user(**validated_data)
|
user = User.objects.create_user(**validated_data)
|
||||||
UserProfile.objects.create(
|
UserProfile.objects.create(
|
||||||
user=user,
|
user=user,
|
||||||
|
username=profile_data['username'],
|
||||||
first_name=profile_data['first_name'],
|
first_name=profile_data['first_name'],
|
||||||
last_name=profile_data['last_name']
|
last_name=profile_data['last_name']
|
||||||
)
|
)
|
||||||
|
@ -1,29 +1,63 @@
|
|||||||
|
"""
|
||||||
|
@author: p.dolata
|
||||||
|
"""
|
||||||
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.test import APITestCase, APIClient
|
from rest_framework.test import APITestCase, APIClient
|
||||||
|
|
||||||
from smartpicasso.app.user.models import User, UserManager
|
from smartpicasso.app.user.models import User
|
||||||
from smartpicasso.app.user.serializers import UserLoginSerializer, UserRegistrationSerializer
|
from smartpicasso.app.user.serializers import UserLoginSerializer, UserRegistrationSerializer
|
||||||
|
from smartpicasso.app.user_profile.models import UserProfile
|
||||||
|
|
||||||
|
|
||||||
class UserApiTest(APITestCase):
|
class UserApiTest(APITestCase):
|
||||||
client = APIClient()
|
client = APIClient()
|
||||||
|
authenticate_url = reverse('authenticate')
|
||||||
|
register_url = reverse('register')
|
||||||
|
profile = {"username": 'test', "first_name": "test", "last_name": "test"}
|
||||||
|
|
||||||
def test_login_when_user_non_exist(self):
|
def test_login_when_user_non_exist(self):
|
||||||
url = reverse('authenticate')
|
response = self.client.post(self.authenticate_url, {'email': 'non-exist', 'password': '123'}, format='json')
|
||||||
response = self.client.post(url, {'email': 'non-exist', 'password': '123'}, format='json')
|
|
||||||
assert response.status_code == 400
|
assert response.status_code == 400
|
||||||
|
|
||||||
def test_login_when_user_exist(self):
|
def test_login_when_user_exist(self):
|
||||||
User.objects.create_user(email='test@test.com', password='test')
|
User.objects.create_user(email='test@test.com', password='test')
|
||||||
url = reverse('authenticate')
|
response = self.client.post(self.authenticate_url, {'email': 'test@test.com', 'password': 'test'},
|
||||||
response = self.client.post(url, {'email': 'test@test.com', 'password': 'test'}, format='json')
|
format='json')
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
self.assertEqual(response.data['success'], 'True')
|
self.assertEqual(response.data['success'], 'True')
|
||||||
self.assertIn('token', response.data)
|
self.assertIn('token', response.data)
|
||||||
|
|
||||||
|
def test_register_when_user_non_exist(self):
|
||||||
|
response = self.client.post(self.register_url, {'email': 'test@test.com', 'password': 'test',
|
||||||
|
'profile': self.profile}, format='json')
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
||||||
|
self.assertEqual(response.data['success'], 'True')
|
||||||
|
|
||||||
|
def test_register_when_email_exist(self):
|
||||||
|
User.objects.create_user(email='test@test.com', password='test')
|
||||||
|
response = self.client.post(self.register_url, {'email': 'test@test.com', 'password': 'test',
|
||||||
|
'profile': self.profile}, format='json')
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
||||||
|
self.assertIn('email', response.data)
|
||||||
|
|
||||||
|
def test_register_when_username_exist(self):
|
||||||
|
user = User.objects.create_user(email='test2@test.com', password='test')
|
||||||
|
UserProfile.objects.create(
|
||||||
|
user=user,
|
||||||
|
username=self.profile['username'],
|
||||||
|
first_name=self.profile['first_name'],
|
||||||
|
last_name=self.profile['last_name']
|
||||||
|
)
|
||||||
|
response = self.client.post(self.register_url, {'email': 'test@test.com', 'password': 'test',
|
||||||
|
'profile': self.profile}, format='json')
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
||||||
|
self.assertIn('profile', response.data)
|
||||||
|
self.assertIn('username', response.data['profile'])
|
||||||
|
|
||||||
|
|
||||||
class UserTest(TestCase):
|
class UserTest(TestCase):
|
||||||
|
|
||||||
@ -52,7 +86,7 @@ class UserRegistrationSerializerTest(TestCase):
|
|||||||
serializer = UserRegistrationSerializer()
|
serializer = UserRegistrationSerializer()
|
||||||
|
|
||||||
def test_create(self):
|
def test_create(self):
|
||||||
profile = {"first_name": "test", "last_name": "test"}
|
profile = {"username": 'test', "first_name": "test", "last_name": "test"}
|
||||||
user = self.serializer.create({"email": "test@test.com", "password": "test", "profile": profile})
|
user = self.serializer.create({"email": "test@test.com", "password": "test", "profile": profile})
|
||||||
|
|
||||||
self.assertNotEqual(user, None)
|
self.assertNotEqual(user, None)
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
"""
|
||||||
|
@author: p.dolata
|
||||||
|
"""
|
||||||
|
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.generics import RetrieveAPIView, CreateAPIView
|
from rest_framework.generics import RetrieveAPIView, CreateAPIView
|
||||||
from rest_framework.permissions import AllowAny
|
from rest_framework.permissions import AllowAny
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,20 @@
|
|||||||
|
# Generated by Django 3.1.3 on 2020-12-09 18:34
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
atomic = False
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('user_profile', '0002_remove_userprofile_phone_number'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='userprofile',
|
||||||
|
name='username',
|
||||||
|
field=models.CharField(default='', max_length=50, unique=True),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
Binary file not shown.
Binary file not shown.
@ -13,9 +13,13 @@ class UserProfile(models.Model):
|
|||||||
"""
|
"""
|
||||||
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||||
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
|
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
|
||||||
|
username = models.CharField(max_length=50, unique=True)
|
||||||
first_name = models.CharField(max_length=50, unique=False)
|
first_name = models.CharField(max_length=50, unique=False)
|
||||||
last_name = models.CharField(max_length=50, unique=False)
|
last_name = models.CharField(max_length=50, unique=False)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return str(self.username) + ' - ' + str(self.first_name) + ' ' + str(self.last_name)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
"""
|
"""
|
||||||
Meta to se table name in database
|
Meta to se table name in database
|
||||||
|
@ -1,3 +1,65 @@
|
|||||||
from django.test import TestCase
|
"""
|
||||||
|
@author: p.dolata
|
||||||
|
"""
|
||||||
|
|
||||||
# Create your tests here.
|
from django.test import TestCase
|
||||||
|
from django.urls import reverse
|
||||||
|
from rest_framework import status
|
||||||
|
from rest_framework.test import APITestCase, APIClient
|
||||||
|
|
||||||
|
from smartpicasso.app.user.models import User
|
||||||
|
from smartpicasso.app.user_profile.models import UserProfile
|
||||||
|
|
||||||
|
|
||||||
|
class UserProfileApiTest(APITestCase):
|
||||||
|
client = APIClient()
|
||||||
|
profile_url = reverse('profile')
|
||||||
|
authenticate_url = reverse('authenticate')
|
||||||
|
profile = {"username": 'test_user', "first_name": "first", "last_name": "last"}
|
||||||
|
|
||||||
|
def test_get_profile_without_auth(self):
|
||||||
|
response = self.client.get(self.profile_url, format='json')
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
|
||||||
|
|
||||||
|
def test_get_profile_with_invalid_token(self):
|
||||||
|
self.client.force_authenticate(user=None)
|
||||||
|
response = self.client.get(self.profile_url, format='json')
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
|
||||||
|
|
||||||
|
def test_get_profile_when_user_without_profile(self):
|
||||||
|
user = User.objects.create_user(email='test@test.com', password='test')
|
||||||
|
self.client.force_authenticate(user=user)
|
||||||
|
response = self.client.get(self.profile_url, format='json')
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
||||||
|
self.assertEqual(response.data['success'], 'False')
|
||||||
|
|
||||||
|
def test_get_profile(self):
|
||||||
|
user = User.objects.create_user(email='test@test.com', password='test')
|
||||||
|
UserProfile.objects.create(
|
||||||
|
user=user,
|
||||||
|
username=self.profile['username'],
|
||||||
|
first_name=self.profile['first_name'],
|
||||||
|
last_name=self.profile['last_name']
|
||||||
|
)
|
||||||
|
self.client.force_authenticate(user=user)
|
||||||
|
response = self.client.get(self.profile_url, format='json')
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
self.assertEqual(response.data['success'], 'True')
|
||||||
|
profile = response.data['profile']
|
||||||
|
self.assertEqual(profile['username'], self.profile['username'])
|
||||||
|
self.assertEqual(profile['first_name'], self.profile['first_name'])
|
||||||
|
self.assertEqual(profile['last_name'], self.profile['last_name'])
|
||||||
|
|
||||||
|
|
||||||
|
class UserProfileTest(TestCase):
|
||||||
|
profile = {"username": 'test_user', "first_name": "first", "last_name": "last"}
|
||||||
|
|
||||||
|
def test_user_profile_str(self):
|
||||||
|
user = User.objects.create_user(email='test@test.com', password='test')
|
||||||
|
user_profile = UserProfile.objects.create(
|
||||||
|
user=user,
|
||||||
|
username=self.profile['username'],
|
||||||
|
first_name=self.profile['first_name'],
|
||||||
|
last_name=self.profile['last_name']
|
||||||
|
)
|
||||||
|
self.assertEqual(str(user_profile), 'test_user - first last')
|
||||||
|
11
rest-app/smartpicasso/app/user_profile/urls.py
Normal file
11
rest-app/smartpicasso/app/user_profile/urls.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
"""
|
||||||
|
@author: p.dolata
|
||||||
|
"""
|
||||||
|
|
||||||
|
from django.conf.urls import url
|
||||||
|
|
||||||
|
from smartpicasso.app.user_profile.views import UserProfileView
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
url(r'^profile', UserProfileView.as_view(), name='profile')
|
||||||
|
]
|
@ -1,3 +1,40 @@
|
|||||||
from django.shortcuts import render
|
"""
|
||||||
|
@author: p.dolata
|
||||||
|
"""
|
||||||
|
|
||||||
# Create your views here.
|
from rest_framework import status
|
||||||
|
from rest_framework.generics import RetrieveAPIView
|
||||||
|
from rest_framework.permissions import IsAuthenticated
|
||||||
|
from rest_framework.response import Response
|
||||||
|
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
|
||||||
|
|
||||||
|
from smartpicasso.app.user_profile.models import UserProfile
|
||||||
|
|
||||||
|
|
||||||
|
class UserProfileView(RetrieveAPIView):
|
||||||
|
permission_classes = (IsAuthenticated,)
|
||||||
|
authentication_class = JSONWebTokenAuthentication
|
||||||
|
|
||||||
|
def get(self, request):
|
||||||
|
try:
|
||||||
|
user_profile = UserProfile.objects.get(user=request.user)
|
||||||
|
status_code = status.HTTP_200_OK
|
||||||
|
response = {
|
||||||
|
'success': 'True',
|
||||||
|
'status_code': status_code,
|
||||||
|
'message': 'User profile fetched successfully',
|
||||||
|
'profile': {
|
||||||
|
'username': user_profile.username,
|
||||||
|
'first_name': user_profile.first_name,
|
||||||
|
'last_name': user_profile.last_name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
except Exception as e:
|
||||||
|
status_code = status.HTTP_400_BAD_REQUEST
|
||||||
|
response = {
|
||||||
|
'success': 'False',
|
||||||
|
'status_code': status_code,
|
||||||
|
'message': 'User profile does not exist',
|
||||||
|
'error': str(e)
|
||||||
|
}
|
||||||
|
return Response(response, status=status_code)
|
||||||
|
@ -18,5 +18,6 @@ from django.urls import path, include
|
|||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('api/', include('smartpicasso.app.user.urls')),
|
path('api/', include('smartpicasso.app.user.urls')),
|
||||||
|
path('api/', include('smartpicasso.app.user_profile.urls')),
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user