creación de unit tests para ecommerce app (10)

This commit is contained in:
devfzn 2023-03-30 16:21:22 -03:00
parent 0cfc0e5991
commit 74220d57c8
Signed by: devfzn
GPG Key ID: E070ECF4A754FDB1
3 changed files with 205 additions and 44 deletions

125
README.md
View File

@ -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
```

View File

@ -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()

View File

@ -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)