Skip to content

Commit

Permalink
Created new tests and DRF routers
Browse files Browse the repository at this point in the history
  • Loading branch information
Szymon-Budziak committed Sep 14, 2023
1 parent 99b4b28 commit 7390f84
Show file tree
Hide file tree
Showing 8 changed files with 162 additions and 21 deletions.
9 changes: 9 additions & 0 deletions Django/Group_3/3_Django_REST/api/routers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from rest_framework.routers import DefaultRouter
from .views import *

router = DefaultRouter()

router.register(r'authors', AuthorViewSet, basename='author_list')
router.register(r'books', BookViewSet, basename='book_list')

urlpatterns = router.urls
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,8 @@ class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ('id', 'title', 'author_id')

def update(self, instance, validated_data):
instance.title = validated_data.get('title', instance.title)
instance.author_id = validated_data.get('author_id', instance.author_id)
return instance
19 changes: 0 additions & 19 deletions Django/Group_3/3_Django_REST/api/tests/test_book_model.py

This file was deleted.

71 changes: 71 additions & 0 deletions Django/Group_3/3_Django_REST/api/tests/test_book_serializer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
from django.test import TestCase

from ..models import Author, Book
from ..serializers import BookSerializer


class BookSerializerTest(TestCase):
def setUp(self) -> None:
self.author = Author.objects.create(
first_name='test_name',
last_name='test_last_name'
)

self.book = Book.objects.create(
title='test_title',
author_id=self.author
)

self.serializer_data = {
'title': 'test_title',
'author_id': self.author.id
}

def test_serializer_contains_expected_fields(self):
serializer = BookSerializer(instance=self.book)
data = serializer.data

self.assertEqual(set(data.keys()), {'id', 'title', 'author_id'})
self.assertEqual(data['title'], self.book.title)
self.assertEqual(data['author_id'], self.book.author_id.id)

def test_serializer_create_valid_date(self):
serializer = BookSerializer(instance=self.book, data=self.serializer_data)

self.assertTrue(serializer.is_valid())
new_book = serializer.save()
self.assertEqual(new_book.author_id.id, self.serializer_data['author_id'])
self.assertEqual(new_book.title, self.serializer_data['title'])

def test_serializer_create_invalid_data(self):
invalid_data = {
'title': 'test_title',
'author_id': None
}

serializer = BookSerializer(instance=self.book, data=invalid_data)
self.assertFalse(serializer.is_valid())

def test_serializer_update_valid_data(self):
updated_data = {
'title': 'updated_title',
'author_id': self.author
}

serializer = BookSerializer(instance=self.book, data=self.serializer_data)
self.assertTrue(serializer.is_valid())
serializer.save()

serializer.update(instance=self.book, validated_data=updated_data)
self.assertTrue(serializer.is_valid())
self.assertEqual(serializer.data['title'], updated_data['title'])
self.assertEqual(serializer.data['author_id'], updated_data['author_id'].id)

def test_serializer_update_invalid_data(self):
invalid_data = {
'title': 'test_title',
'author_id': None
}

serializer = BookSerializer(instance=self.book, data=invalid_data, partial=True)
self.assertFalse(serializer.is_valid())
43 changes: 43 additions & 0 deletions Django/Group_3/3_Django_REST/api/tests/test_book_view.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from django.test import TestCase
from django.urls import reverse
from rest_framework.test import APIClient

from ..models import Author, Book
from ..serializers import BookSerializer


class BookViewTest(TestCase):
def setUp(self) -> None:
self.author = Author.objects.create(
first_name='test_name',
last_name='test_last_name'
)

self.book1 = Book.objects.create(
title='test_title_1',
author_id=self.author
)

self.book2 = Book.objects.create(
title='test_title_2',
author_id=self.author
)

self.client = APIClient()

def test_list_books(self):
response = self.client.get(reverse('book_list'))

self.assertEqual(response.status_code, 200)

expected_data = BookSerializer([self.book1, self.book2], many=True).data

self.assertEqual(response.data, expected_data)

def test_list_books_empty(self):
Book.objects.all().delete()

response = self.client.get(reverse('book_list'))

self.assertEqual(response.status_code, 200)
self.assertEqual(response.data, [])
4 changes: 2 additions & 2 deletions Django/Group_3/3_Django_REST/api/views/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from .author_view import AuthorListView
from .book_view import BookListView
from .author_view import AuthorListView, AuthorViewSet
from .book_view import BookListView, BookViewSet
from .borrow_view import BorrowListView, BorrowRetrieveDestroyView, BorrowUpdateView, BorrowReturnBookUpdateView
from .user_view import UserCreateView
23 changes: 23 additions & 0 deletions Django/Group_3/3_Django_REST/api/views/author_view.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
from rest_framework import generics
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework import status

from ..models import Author
from ..serializers import AuthorSerializer
Expand All @@ -10,3 +13,23 @@ class AuthorListView(generics.ListAPIView):
"""
queryset = Author.objects.all()
serializer_class = AuthorSerializer


class AuthorViewSet(viewsets.ModelViewSet):
"""
Author viewset
"""
queryset = Author.objects.all()
serializer_class = AuthorSerializer

def create(self, request, *args, **kwargs):
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)

def retrieve(self, request, *args, **kwargs):
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)

def update(self, request, *args, **kwargs):
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)

def partial_update(self, request, *args, **kwargs):
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
9 changes: 9 additions & 0 deletions Django/Group_3/3_Django_REST/api/views/book_view.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from rest_framework import generics
from rest_framework import viewsets

from ..models import Book
from ..serializers import BookSerializer
Expand All @@ -10,3 +11,11 @@ class BookListView(generics.ListAPIView):
"""
queryset = Book.objects.all()
serializer_class = BookSerializer


class BookViewSet(viewsets.ModelViewSet):
"""
Book viewset
"""
queryset = Book.objects.all()
serializer_class = BookSerializer

0 comments on commit 7390f84

Please sign in to comment.