Cecilia

Implementar tests

from .settings import *
SECRET_KEY = 'CHANGEME!!!'
DEBUG = False
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory:',
}
}
... ...
from django.contrib.auth.models import User, Permission
from django.contrib.contenttypes.models import ContentType
def create_user(username, first_name='Admin', last_name='Root', email=None, is_superuser=False, is_staff=False):
user, created = User.objects.get_or_create(
username=username,
email='{}@root.com'.format(username) if email is None else email,
defaults=dict(
first_name=first_name,
last_name=last_name,
is_superuser=is_superuser,
is_staff=is_staff,
)
)
user.set_password('password')
user.save()
return user
def crear_permiso_usuario(codename, name, app_name, model_name):
model_ct = ContentType.objects.get(app_label=app_name, model=model_name)
permission, _ = Permission.objects.get_or_create(codename=codename,
content_type=model_ct,
defaults={'name': name})
return permission
... ...
... ... @@ -3,17 +3,27 @@
Lista de Personas
{% endblock %}
{% block extra_head %}
<style>
table, th, td {
border: 1px solid black;
}
</style>
{% endblock %}
{% block contenido %}
<h1>Lista de Personas</h1>
<table>
<tr>
<th>Nombre</th>
<th>Documento</th>
<th>Edad</th>
</tr>
{% for persona in personas %}
<tr>
<td>{{persona}}</td>
<td>{{persona.documento_identidad}}</td>
<td>{{persona.edad}}</td>
</tr>
{% endfor %}
</table>
... ...
import pytest
from persona.models import Persona
@pytest.fixture
def crear_personas():
cecilia, _ = Persona.objects.get_or_create(
documento_identidad='27351172',
defaults={
'nombre': 'Cecilia',
'apellido': 'Gallardo',
'fecha_nacimiento': '1979-06-13',
}
)
david, _ = Persona.objects.get_or_create(
documento_identidad='39935311',
defaults={
'nombre': 'David',
'apellido': 'Sanchez',
'fecha_nacimiento': '1996-09-30',
}
)
santiago, _ = Persona.objects.get_or_create(
documento_identidad='56586746',
defaults={
'nombre': 'Santiago',
'apellido': 'Quinteros',
'fecha_nacimiento': '2017-10-18',
}
)
return cecilia, david, santiago
... ...
import pytest
from rest_framework.test import APIClient
from core.tests.fixtures_usuario import create_user, crear_permiso_usuario
from persona.models import Persona
from persona.tests.fixtures import crear_personas
@pytest.mark.django_db
def test_vista_lista_personas(crear_personas):
client = APIClient()
response = client.get('/persona/lista/')
assert response.status_code == 200
queryset_personas = response.context['personas']
assert queryset_personas.count() == 3
assert queryset_personas[0].nombre == 'Cecilia'
assert queryset_personas[1].nombre == 'David'
assert queryset_personas[2].nombre == 'Santiago'
@pytest.mark.django_db
def test_vista_lista_personas_por_edad(crear_personas):
client = APIClient()
response = client.get(f'/persona/lista/?edad=25')
assert response.status_code == 200
queryset_personas = response.context['personas']
assert queryset_personas.count() == 1
assert queryset_personas[0].nombre == 'David'
@pytest.mark.django_db
def test_vista_creacion_persona_autorizado():
usuario = create_user(username='Cecilia', is_staff=True)
permiso_crear_personas = crear_permiso_usuario(
codename='add_persona',
name='Puede agregar una persona',
app_name='persona',
model_name='persona')
usuario.user_permissions.add(permiso_crear_personas,)
client = APIClient()
client.login(username='Cecilia', password='password')
data = {
'nombre': 'Ruben',
'apellido': 'Lopez',
'documento_identidad': '23789475',
}
response = client.post(f'/persona/creacion/', data=data)
assert response.status_code == 302
assert Persona.objects.filter(documento_identidad='23789475').exists()
@pytest.mark.django_db
def test_vista_creacion_persona_no_autorizado():
usuario = create_user(username='Cecilia', is_staff=True)
client = APIClient()
client.login(username='Cecilia', password='password')
data = {
'nombre': 'Ruben',
'apellido': 'Lopez',
'documento_identidad': '23789475',
}
response = client.post(f'/persona/creacion/', data=data)
assert response.status_code == 403
assert not Persona.objects.filter(documento_identidad='23789475').exists()
... ...
... ... @@ -3,7 +3,7 @@ from django.urls import path
from persona.views import persona_lista, persona_detalle, PersonaCreateView
urlpatterns = [
path('lista', persona_lista, name='persona-lista'),
path('detalle/<int:pk>', persona_detalle, name='persona-detalle'),
path('creacion', PersonaCreateView.as_view(), name='persona-creacion')
path('lista/', persona_lista, name='persona-lista'),
path('detalle/<int:pk>/', persona_detalle, name='persona-detalle'),
path('creacion/', PersonaCreateView.as_view(), name='persona-creacion')
]
... ...
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.db.models.expressions import RawSQL
from django.shortcuts import render, get_object_or_404
# Create your views here.
... ... @@ -10,7 +11,14 @@ from persona.models import Persona
def persona_lista(request):
personas = Persona.objects.all()
personas = Persona.objects.annotate(
edad=RawSQL("date('now')-fecha_nacimiento", params="")
).order_by('documento_identidad')
edad = request.GET.get('edad', None)
if edad:
personas = personas.filter(edad=int(edad))
return render(request, 'persona/lista_personas.html', {'personas': personas})
... ... @@ -19,9 +27,10 @@ def persona_detalle(request, pk):
return render(request, 'persona/detalle_persona.html', {'persona': persona})
class PersonaCreateView(LoginRequiredMixin, CreateView):
class PersonaCreateView(PermissionRequiredMixin, CreateView):
model = Persona
form_class = PersonaForm
template_name = 'persona/crear.html'
success_url = reverse_lazy('persona-lista')
permission_required = ('persona.add_persona',)
... ...
[pytest]
DJANGO_SETTINGS_MODULE=capacitacion.settings_testing
norecursedirs = requirements deployment
testpaths = tests
addopts = --capture=fd --nomigrations
... ...
-r development.txt
pytest==6.2.5
pytest-django==4.4.0
... ...
... ... @@ -2,6 +2,7 @@
<html>
<head>
<title>{% block titulo %}{% endblock %}</title>
{% block extra_head %}{% endblock %}
</head>
<body>
{% block contenido %}{% endblock %}
... ...