diff --git a/README.md b/README.md index 75f2f0f..9d2e2e4 100644 --- a/README.md +++ b/README.md @@ -285,39 +285,6 @@ Se puede utilizar la shell de Django para chequear la nueva entrada en Contacto 'DevFzn' ``` -#### Jerarquia de directorios - -```txt -πŸ“‚οΈ . -β”œβ”€β”€ πŸ“‚οΈ backend -β”‚ β”œβ”€β”€ πŸ“‚οΈ core -β”‚ β”‚ β”œβ”€β”€ πŸ“‚οΈ migrations -β”‚ β”‚ β”‚ β”œβ”€β”€ 0001_initial.py -β”‚ β”‚ β”‚ └── __init__.py -β”‚ β”‚ β”œβ”€β”€ __init__.py -β”‚ β”‚ β”œβ”€β”€ admin.py -β”‚ β”‚ β”œβ”€β”€ apps.py -β”‚ β”‚ β”œβ”€β”€ models.py -β”‚ β”‚ β”œβ”€β”€ serializers.py -β”‚ β”‚ β”œβ”€β”€ tests.py -β”‚ β”‚ └── views.py -β”‚ β”œβ”€β”€ πŸ“‚οΈ drf_course -β”‚ β”‚ β”œβ”€β”€ __init__.py -β”‚ β”‚ β”œβ”€β”€ asgi.py -β”‚ β”‚ β”œβ”€β”€ settings.py -β”‚ β”‚ β”œβ”€β”€ urls.py -β”‚ β”‚ └── wsgi.py -β”‚ β”œβ”€β”€ πŸ“‚οΈ utils -β”‚ β”‚ β”œβ”€β”€ __init__.py -β”‚ β”‚ └── model_abstracts.py -β”‚ β”œβ”€β”€ .env -β”‚ └── manage.py -β”œβ”€β”€ .gitignore -β”œβ”€β”€ env.template -β”œβ”€β”€ README.md -└── requirements.txt -``` - ## Tests CreaciΓ³n de pruebas en [./backend/core/tests.py](./backend/core/tests.py). @@ -327,14 +294,14 @@ Utilizando las clases `APIClient` que proporciona un cliente incorporado y #### Test suite para Contact 0. test setup -1. test para mΓ©todo create -2. test para mΓ©todo create cuando nombre no estΓ‘ en los datos -3. test para mΓ©todo create cuando nombre estΓ‘ en blanco -4. test para mΓ©todo create cuando mensaje no estΓ‘ en los datos -5. test para mΓ©todo create cuando mensaje estΓ‘ en blanco -6. test para mΓ©todo create cuando email no estΓ‘ en los datos -7. test para mΓ©todo create cuando email estΓ‘ en blanco -8. test para mΓ©todo create cuando email no es un email +1. test ContactViewSet para mΓ©todo create +2. test ContactViewSet para mΓ©todo create cuando nombre no estΓ‘ en los datos +3. test ContactViewSet para mΓ©todo create cuando nombre estΓ‘ en blanco +4. test ContactViewSet para mΓ©todo create cuando mensaje no estΓ‘ en los datos +5. test ContactViewSet para mΓ©todo create cuando mensaje estΓ‘ en blanco +6. test ContactViewSet para mΓ©todo create cuando email no estΓ‘ en los datos +7. test ContactViewSet para mΓ©todo create cuando email estΓ‘ en blanco +8. test ContactViewSet para mΓ©todo create cuando email no es un email Correr test `./manage.py test` @@ -537,3 +504,79 @@ router.register(r'order', ecommerce_views.OrderViewSet, basename='order') ... ``` +### Ecommerce Tests + +CreaciΓ³n de [test](./backend/ecommerce/tests.py) unitarios para la aplicaciΓ³n. + +0. test setup +1. test ItemsViewSet mΓ©todo list +2. test ItemsViewSet mΓ©todo retrieve +3. test Item.check_stock cuando order.quantity > item.stock +4. test Item.check_stock cuando order.quantity == item.stock +5. test Item.check_stock cuando order.quantity < item.stock +6. test OrdersViewSet mΓ©todo create cuando order.quantity > item.stock +7. test OrdersViewSet mΓ©todo create cuando order.quantity < item.stock +8. test OrdersViewSet mΓ©todo create cuando order.quantity == item.stock +9. test OrdersViewSet mΓ©todo list +10. test OrdersViewSet mΓ©todo retrieve + +Correr tests `./manage.py test`. + +```py +Found 18 test(s). +Creating test database for alias 'default'... +System check identified no issues (0 silenced). +.................. +---------------------------------------------------------------------- +Ran 18 tests in 2.248s + +OK +Destroying test database for alias 'default'... +``` + +---- + +### Jerarquia de directorios + +```txt +πŸ“‚οΈ . +β”œβ”€β”€ πŸ“‚οΈ backend +β”‚ β”œβ”€β”€ πŸ“‚οΈ core +β”‚ β”‚ β”œβ”€β”€ πŸ“‚οΈ migrations +β”‚ β”‚ β”‚ β”œβ”€β”€ 0001_initial.py +β”‚ β”‚ β”‚ └── __init__.py +β”‚ β”‚ β”œβ”€β”€ __init__.py +β”‚ β”‚ β”œβ”€β”€ admin.py +β”‚ β”‚ β”œβ”€β”€ apps.py +β”‚ β”‚ β”œβ”€β”€ models.py +β”‚ β”‚ β”œβ”€β”€ serializers.py +β”‚ β”‚ β”œβ”€β”€ tests.py +β”‚ β”‚ └── views.py +β”‚ β”œβ”€β”€ πŸ“‚οΈ drf_course +β”‚ β”‚ β”œβ”€β”€ __init__.py +β”‚ β”‚ β”œβ”€β”€ asgi.py +β”‚ β”‚ β”œβ”€β”€ settings.py +β”‚ β”‚ β”œβ”€β”€ urls.py +β”‚ β”‚ └── wsgi.py +β”‚ β”œβ”€β”€ πŸ“‚οΈ ecommerce +β”‚ β”‚ β”œβ”€β”€ πŸ“‚οΈ migrations +β”‚ β”‚ β”‚ β”œβ”€β”€ 0001_initial.py +β”‚ β”‚ β”‚ └── __init__.py +β”‚ β”‚ β”œβ”€β”€ __init__.py +β”‚ β”‚ β”œβ”€β”€ admin.py +β”‚ β”‚ β”œβ”€β”€ apps.py +β”‚ β”‚ β”œβ”€β”€ models.py +β”‚ β”‚ β”œβ”€β”€ serializers.py +β”‚ β”‚ β”œβ”€β”€ signals.py +β”‚ β”‚ β”œβ”€β”€ tests.py +β”‚ β”‚ └── views.py +β”‚ β”œβ”€β”€ πŸ“‚οΈ utils +β”‚ β”‚ β”œβ”€β”€ __init__.py +β”‚ β”‚ └── model_abstracts.py +β”‚ β”œβ”€β”€ .env +β”‚ └── manage.py +β”œβ”€β”€ .gitignore +β”œβ”€β”€ env.template +β”œβ”€β”€ README.md +└── requirements.txt +``` diff --git a/backend/core/tests.py b/backend/core/tests.py index aca95a5..9c3169b 100644 --- a/backend/core/tests.py +++ b/backend/core/tests.py @@ -5,7 +5,7 @@ from rest_framework import status class ContactTestCase(APITestCase): """ - Test suite for Contact + Test suite para Contact """ def setUp(self): self.client = APIClient() diff --git a/backend/ecommerce/tests.py b/backend/ecommerce/tests.py index 7ce503c..9218aaf 100644 --- a/backend/ecommerce/tests.py +++ b/backend/ecommerce/tests.py @@ -1,3 +1,121 @@ -from django.test import TestCase +from django.contrib.auth.models import User +from ecommerce.models import Item, Order +from rest_framework.authtoken.models import Token +from rest_framework.test import APIClient +from rest_framework.test import APITestCase +from rest_framework import status -# Create your tests here. + +class EcommerceTestCase(APITestCase): + """ + Conjunto de pruebas para Items y Orders + """ + def setUp(self): + + Item.objects.create(title= "Demo item 1",description= "DescripciΓ³n de prueba para item demo 1",price= 500,stock= 20) + Item.objects.create(title= "Demo item 2",description= "DescripciΓ³n de prueba para item demo 2",price= 700,stock= 15) + Item.objects.create(title= "Demo item 3",description= "DescripciΓ³n de prueba para item demo 3",price= 300,stock= 18) + Item.objects.create(title= "Demo item 4",description= "DescripciΓ³n de prueba para item demo 4",price= 400,stock= 14) + Item.objects.create(title= "Demo item 5",description= "DescripciΓ³n de prueba para item demo 5",price= 500,stock= 30) + self.items = Item.objects.all() + self.user = User.objects.create_user( + username='testuser1', + password='esta_es_una_prueba', + email='testuser1@test.com' + ) + Order.objects.create(item = Item.objects.first(), user = User.objects.first(), quantity=1) + Order.objects.create(item = Item.objects.first(), user = User.objects.first(), quantity=2) + + #The app uses token authentication + self.token = Token.objects.get(user = self.user) + self.client = APIClient() + + #We pass the token in all calls to the API + self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token.key) + + + def test_get_all_items(self): + ''' + test ItemsViewSet mΓ©todo list + ''' + self.assertEqual(self.items.count(), 5) + response = self.client.get('/item/') + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_get_one_item(self): + ''' + test ItemsViewSet mΓ©todo retrieve + ''' + for item in self.items: + response = self.client.get(f'/item/{item.id}/') + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_order_is_more_than_stock(self): + ''' + test Item.check_stock cuando order.quantity > item.stock + ''' + for i in self.items: + current_stock = i.stock + self.assertEqual(i.check_stock(current_stock + 1), False) + + def test_order_equals_stock(self): + ''' + test Item.check_stock cuando order.quantity == item.stock + ''' + for i in self.items: + current_stock = i.stock + self.assertEqual(i.check_stock(current_stock), True) + + def test_order_is_less_than_stock(self): + ''' + test Item.check_stock cuando order.quantity < item.stock + ''' + for i in self.items: + current_stock = i.stock + self.assertTrue(i.check_stock(current_stock - 1), True) + + def test_create_order_with_more_than_stock(self): + ''' + test OrdersViewSet mΓ©todo create cuando order.quantity > item.stock + ''' + for i in self.items: + stock = i.stock + data = {"item": str(i.id), "quantity": str(stock+1)} + response = self.client.post(f'/order/', data) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + + def test_create_order_with_less_than_stock(self): + ''' + test OrdersViewSet mΓ©todo create cuando order.quantity < item.stock + ''' + for i in self.items: + data = {"item": str(i.id), "quantity": 1} + response = self.client.post(f'/order/',data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_create_order_with_equal_stock(self): + ''' + test OrdersViewSet mΓ©todo create cuando order.quantity == item.stock + ''' + for i in self.items: + stock = i.stock + data = {"item": str(i.id), "quantity": str(stock)} + response = self.client.post(f'/order/',data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_get_all_orders(self): + ''' + test OrdersViewSet mΓ©todo list + ''' + self.assertEqual(Order.objects.count(), 2) + response = self.client.get('/order/') + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_get_one_order(self): + ''' + test OrdersViewSet mΓ©todo retrieve + ''' + orders = Order.objects.filter(user = self.user) + for o in orders: + response = self.client.get(f'/order/{o.id}/') + self.assertEqual(response.status_code, status.HTTP_200_OK)