From c760dbb673e9f5e021e0f2afab5d70be1c64b90b Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Tue, 4 Jun 2024 23:17:39 -0300 Subject: [PATCH 01/13] Agregue un nuevo host para que funcione de manera local. --- vetsoft/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vetsoft/settings.py b/vetsoft/settings.py index 12eb93e2..fb2b8784 100644 --- a/vetsoft/settings.py +++ b/vetsoft/settings.py @@ -25,7 +25,7 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = ['vet-soft-1-4.onrender.com','100.20.92.101','44.225.181.72','44.227.217.144'] +ALLOWED_HOSTS = ['vet-soft-1-4.onrender.com','100.20.92.101','44.225.181.72','44.227.217.144','127.0.0.1'] CSRF_TRUSTED_ORIGINGS = ['https://vet-soft-1-4.onrender.com'] # Application definition From 1deb07f44ba59a853bd865e6e1176d7726249a4e Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Tue, 4 Jun 2024 23:18:18 -0300 Subject: [PATCH 02/13] Realice correcciones para el test e2e. --- functional_tests/tests.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/functional_tests/tests.py b/functional_tests/tests.py index 4dbce8ad..e0b86f25 100644 --- a/functional_tests/tests.py +++ b/functional_tests/tests.py @@ -73,7 +73,7 @@ def test_should_show_message_if_table_is_empty(self): def test_should_show_clients_data(self): Client.objects.create( - name="Juan Sebastián Veron", + name="Juan Sebastian Veron", address="13 y 44", phone="221555232", email="brujita75@hotmail.com", @@ -90,7 +90,7 @@ def test_should_show_clients_data(self): expect(self.page.get_by_text("No existen clientes")).not_to_be_visible() - expect(self.page.get_by_text("Juan Sebastián Veron")).to_be_visible() + expect(self.page.get_by_text("Juan Sebastian Veron")).to_be_visible() expect(self.page.get_by_text("13 y 44")).to_be_visible() expect(self.page.get_by_text("221555232")).to_be_visible() expect(self.page.get_by_text("brujita75@hotmail.com")).to_be_visible() @@ -110,7 +110,7 @@ def test_should_show_add_client_action(self): def test_should_show_client_edit_action(self): client = Client.objects.create( - name="Juan Sebastián Veron", + name="Juan Sebastian Veron", address="13 y 44", phone="221555232", email="brujita75@hotmail.com", @@ -125,7 +125,7 @@ def test_should_show_client_edit_action(self): def test_should_show_client_delete_action(self): client = Client.objects.create( - name="Juan Sebastián Veron", + name="Juan Sebastian Veron", address="13 y 44", phone="221555232", email="brujita75@hotmail.com", @@ -146,7 +146,7 @@ def test_should_show_client_delete_action(self): def test_should_can_be_able_to_delete_a_client(self): Client.objects.create( - name="Juan Sebastián Veron", + name="Juan Sebastian Veron", address="13 y 44", phone="221555232", email="brujita75@hotmail.com", @@ -154,7 +154,7 @@ def test_should_can_be_able_to_delete_a_client(self): self.page.goto(f"{self.live_server_url}{reverse('clients_repo')}") - expect(self.page.get_by_text("Juan Sebastián Veron")).to_be_visible() + expect(self.page.get_by_text("Juan Sebastian Veron")).to_be_visible() def is_delete_response(response): return response.url.find(reverse("clients_delete")) @@ -166,7 +166,7 @@ def is_delete_response(response): response = response_info.value self.assertTrue(response.status < 400) - expect(self.page.get_by_text("Juan Sebastián Veron")).not_to_be_visible() + expect(self.page.get_by_text("Juan Sebastian Veron")).not_to_be_visible() class ClientCreateEditTestCase(PlaywrightTestCase): @@ -175,14 +175,14 @@ def test_should_be_able_to_create_a_new_client(self): expect(self.page.get_by_role("form")).to_be_visible() - self.page.get_by_label("Nombre").fill("Juan Sebastián Veron") + self.page.get_by_label("Nombre").fill("Juan Sebastian Veron") self.page.get_by_label("Teléfono").fill("221555232") self.page.get_by_label("Email").fill("brujita75@hotmail.com") self.page.get_by_label("Dirección").fill("13 y 44") self.page.get_by_role("button", name="Guardar").click() - expect(self.page.get_by_text("Juan Sebastián Veron")).to_be_visible() + expect(self.page.get_by_text("Juan Sebastian Veron")).to_be_visible() expect(self.page.get_by_text("221555232")).to_be_visible() expect(self.page.get_by_text("brujita75@hotmail.com")).to_be_visible() expect(self.page.get_by_text("13 y 44")).to_be_visible() @@ -198,7 +198,7 @@ def test_should_view_errors_if_form_is_invalid(self): expect(self.page.get_by_text("Por favor ingrese un teléfono")).to_be_visible() expect(self.page.get_by_text("Por favor ingrese un email")).to_be_visible() - self.page.get_by_label("Nombre").fill("Juan Sebastián Veron") + self.page.get_by_label("Nombre").fill("Juan Sebastian Veron") self.page.get_by_label("Teléfono").fill("221555232") self.page.get_by_label("Email").fill("brujita75") self.page.get_by_label("Dirección").fill("13 y 44") @@ -216,7 +216,7 @@ def test_should_view_errors_if_form_is_invalid(self): def test_should_be_able_to_edit_a_client(self): client = Client.objects.create( - name="Juan Sebastián Veron", + name="Juan Sebastian Veron", address="13 y 44", phone="221555232", email="brujita75@hotmail.com", @@ -232,7 +232,7 @@ def test_should_be_able_to_edit_a_client(self): self.page.get_by_role("button", name="Guardar").click() - expect(self.page.get_by_text("Juan Sebastián Veron")).not_to_be_visible() + expect(self.page.get_by_text("Juan Sebastian Veron")).not_to_be_visible() expect(self.page.get_by_text("13 y 44")).not_to_be_visible() expect(self.page.get_by_text("221555232")).not_to_be_visible() expect(self.page.get_by_text("brujita75@hotmail.com")).not_to_be_visible() From 295618d50b4d4971697420f5de94a4a740e25b31 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Tue, 4 Jun 2024 23:19:12 -0300 Subject: [PATCH 03/13] Arreglue los datos erroneos para que funcione correctamente. --- app/models.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/app/models.py b/app/models.py index 6877fdd3..15344dbb 100644 --- a/app/models.py +++ b/app/models.py @@ -1,6 +1,8 @@ from django.db import models +import re # Importa el módulo de expresiones regulares from datetime import datetime - +from django.db import IntegrityError +from django.core.exceptions import ValidationError def validate_client(data): @@ -12,6 +14,8 @@ def validate_client(data): if name == "": errors["name"] = "Por favor ingrese un nombre" + elif not re.match(r'^[a-zA-ZáéíóúÁÉÍÓÚñÑ\s]+$', name): + errors["name"] = "El nombre debe contener solo letras y espacios" if phone == "": errors["phone"] = "Por favor ingrese un teléfono" @@ -50,12 +54,21 @@ def save_client(cls, client_data): return True, None def update_client(self, client_data): + errors = validate_client(client_data) + + if len(errors) > 0: + return False, errors + self.name = client_data.get("name", "") or self.name self.email = client_data.get("email", "") or self.email self.phone = client_data.get("phone", "") or self.phone self.address = client_data.get("address", "") or self.address - self.save() + try: + self.save() + return True, None + except (IntegrityError, ValidationError) as e: + return False, {"error": str(e)} def validate_provider(data): errors = {} From fab43d6611df4f41030fe5e0ea72ed3a9ad840e0 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Tue, 4 Jun 2024 23:20:33 -0300 Subject: [PATCH 04/13] Arreglue los errores de algunos datos y agregue algunos test. --- app/tests_integration.py | 69 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/app/tests_integration.py b/app/tests_integration.py index a15ce08b..1a3a3fee 100644 --- a/app/tests_integration.py +++ b/app/tests_integration.py @@ -78,7 +78,7 @@ def test_edit_user_with_valid_data(self): name="Juan Sebastián Veron", address="13 y 44", phone="221555232", - email="brujita75@hotmail.com", + email="brujita75@vetsoft.com", ) response = self.client.post( @@ -86,6 +86,9 @@ def test_edit_user_with_valid_data(self): data={ "id": client.id, "name": "Guido Carrillo", + "address": "13 y 44", + "phone":"221555232", + "email": "brujita75@vetsoft.com" }, ) @@ -98,6 +101,70 @@ def test_edit_user_with_valid_data(self): self.assertEqual(editedClient.address, client.address) self.assertEqual(editedClient.email, client.email) + def test_validation_invalid_name_client(self): + """ + Prueba si se muestra un error de validación cuando se ingresa un nombre inválido. + """ + response = self.client.post( + reverse("clients_form"), + data={ + "name": "Juan Sebastian Veron 11", + "phone": "221555232", + "address": "13 y 44", + "email": "brujita75@hotmail.com", + }, + ) + + self.assertContains(response, "El nombre debe contener solo letras y espacios") + + def test_user_cant_edit_client_with_empty_name(self): + """ + Prueba que un usuario no pueda editar un cliente con un nombre vacío. + """ + client=Client.objects.create( + name="Juan Sebastian Veron", + phone="221555232", + address="13 y 44", + email="brujita75@hotmail.com", + ) + + response = self.client.post( + reverse("clients_form"), + data={ + "id":client.id, + "name":"", + "phone":client.phone, + "address":client.address, + "email":client.email, + }, + ) + + self.assertContains(response, "Por favor ingrese un nombre") + + def test_user_cant_edit_client_with_incorrect_name(self): + """ + Prueba que un usuario no pueda editar un cliente con un nombre incorrecto. + """ + client=Client.objects.create( + name="Juan Sebastian Veron", + phone="221555232", + address="13 y 44", + email="brujita75@hotmail.com", + ) + + response = self.client.post( + reverse("clients_form"), + data={ + "id":client.id, + "name":"Juan Sebastian Veron 11", + "phone":client.phone, + "address":client.address, + "email":client.email, + }, + ) + + self.assertContains(response, "El nombre debe contener solo letras y espacios") + class MedicineIntegrationTest(TestCase): def test_can_create_medicine(self): response = self.client.post( From c69b483b8356e05849fa240205146d7b851f59c2 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Tue, 4 Jun 2024 23:21:45 -0300 Subject: [PATCH 05/13] Agregue mas tests para el cliente y arregle unos errores. --- app/tests_unit.py | 85 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 2 deletions(-) diff --git a/app/tests_unit.py b/app/tests_unit.py index b8a32327..128f7fce 100644 --- a/app/tests_unit.py +++ b/app/tests_unit.py @@ -1,5 +1,5 @@ from django.test import TestCase -from app.models import Client,Pet,validate_pet,Provider, Product,Medicine +from app.models import Client,Pet,validate_pet,Provider, Product,Medicine,validate_client from django.utils import timezone class ClientModelTest(TestCase): @@ -33,7 +33,11 @@ def test_can_update_client(self): self.assertEqual(client.phone, "221555232") - client.update_client({"phone": "221555233"}) + client.update_client({ + "name": "Juan Sebastian Veron", + "phone": "221555233", + "address": "13 y 44", + "email": "brujita75@hotmail.com",}) client_updated = Client.objects.get(pk=1) @@ -58,6 +62,83 @@ def test_update_client_with_error(self): self.assertEqual(client_updated.phone, "221555232") + def test_validate_client_incorrect_name(self): + """ + Prueba que verifica que si un nombre es ingresado con algún caracter que no sean letras minúsculas, mayúsculas o espacios devuelva el error + """ + + data = { + "name": "Juan Sebastian Veron 11", + "phone": "221555232", + "address": "13 y 44", + "email": "brujita75@hotmail.com", + } + + result = validate_client(data) + + self.assertIn("El nombre debe contener solo letras y espacios", result.values()) + + def test_validate_client_with_empty_name(self): + """ + Prueba que verifica que no se pueda crear un cliente con el campo nombre vacío + """ + data = { + "name": "", + "phone": "221555232", + "address": "13 y 44", + "email": "brujita75@hotmail.com", + } + + errors = validate_client(data) + + self.assertIn("Por favor ingrese un nombre", errors.values()) + + def test_update_client_with_empty_name(self): + """ + Prueba que verifica si se produce un error al intentar actualizar un cliente con un campo de nombre vacío. + """ + Client.save_client( + { + "name": "Juan Sebastian Veron", + "phone": "221555232", + "address": "13 y 44", + "email": "brujita75@hotmail.com", + }, + ) + client = Client.objects.get(pk=1) + + self.assertEqual(client.name, "Juan Sebastian Veron") + + client.update_client({"name": ""}) + client_updated = Client.objects.get(pk=1) + + self.assertEqual(client_updated.name, "Juan Sebastian Veron") + + def test_update_client_with_incorrect_name(self): + """ + Prueba que verifica si se produce un error al intentar actualizar un cliente con un campo de nombre incorrecto. + """ + Client.save_client( + { + "name": "Juan Sebastian Veron", + "phone": "221555232", + "address": "13 y 44", + "email": "brujita75@hotmail.com", + }, + ) + client = Client.objects.get(pk=1) + + self.assertEqual(client.name, "Juan Sebastian Veron") + + client.update_client({ + "name": "Juan Sebastian Veron 11", + "phone": "221555232", + "address": "13 y 44", + "email": "brujita75@hotmail.com",}) + client_updated = Client.objects.get(pk=1) + + self.assertEqual(client_updated.name, "Juan Sebastian Veron") + class MedicineModelTest(TestCase): def test_can_create_medicine_with_valid_dose(self): From 3f1bd595405c61c2b008015233c3ae92c1ece54d Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Tue, 4 Jun 2024 23:22:25 -0300 Subject: [PATCH 06/13] Arregle errores de la vista. --- app/views.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/views.py b/app/views.py index 1e70d420..71aa2e94 100644 --- a/app/views.py +++ b/app/views.py @@ -14,13 +14,17 @@ def clients_form(request, id=None): if request.method == "POST": client_id = request.POST.get("id", "") errors = {} - saved = True + saved = False if client_id == "": saved, errors = Client.save_client(request.POST) else: client = get_object_or_404(Client, pk=client_id) - client.update_client(request.POST) + update_result = client.update_client(request.POST) + if update_result is not None: + saved, errors = update_result + else: + saved = True if saved: return redirect(reverse("clients_repo")) From 19562e89a0e8b85e12abced4a08868962939005e Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Tue, 4 Jun 2024 23:23:23 -0300 Subject: [PATCH 07/13] Agregue un dato para la validacion del nombre. --- app/templates/clients/form.html | 1 + 1 file changed, 1 insertion(+) diff --git a/app/templates/clients/form.html b/app/templates/clients/form.html index 875cb79f..0650a9c1 100644 --- a/app/templates/clients/form.html +++ b/app/templates/clients/form.html @@ -25,6 +25,7 @@

Nuevo Cliente

From 9dfd4927f1fb8ea7da54d428b30a1ad56d032552 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Tue, 4 Jun 2024 23:23:45 -0300 Subject: [PATCH 08/13] Realice una migracion necesaria. --- app/migrations/0015_merge_20240604_2040.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 app/migrations/0015_merge_20240604_2040.py diff --git a/app/migrations/0015_merge_20240604_2040.py b/app/migrations/0015_merge_20240604_2040.py new file mode 100644 index 00000000..ad8714b9 --- /dev/null +++ b/app/migrations/0015_merge_20240604_2040.py @@ -0,0 +1,14 @@ +# Generated by Django 5.0.4 on 2024-06-04 23:40 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0012_alter_product_price'), + ('app', '0014_merge_20240603_0914'), + ] + + operations = [ + ] From 747fab8753824adaa72be3e391dc2427efb5173c Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Wed, 5 Jun 2024 10:17:54 -0300 Subject: [PATCH 09/13] Arreglo de error en test unitario --- app/tests_unit.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/app/tests_unit.py b/app/tests_unit.py index a44af9dc..a7d14ce8 100644 --- a/app/tests_unit.py +++ b/app/tests_unit.py @@ -1,8 +1,15 @@ from django.test import TestCase - from django.utils import timezone -from app.models import Client, Medicine, Pet, Product, Provider, validate_client, validate_pet +from app.models import ( + Client, + Medicine, + Pet, + Product, + Provider, + validate_client, + validate_pet, +) class ClientModelTest(TestCase): @@ -118,6 +125,16 @@ def test_update_client_with_email_null(self): #nuevo test verificando que no pue """ Esta funcion testea el cliente acutalizado con un email nulo """ + Client.save_client( + { + "name": "Juan Sebastian Veron", + "phone": "221555232", + "city": "La Plata", + "email": "brujita75@vetsoft.com", + }, + ) + client = Client.objects.get(pk=1) + self.assertEqual(client.phone, "221555232") client.update_client({"email": ""}) From 78b3762351e88d47a973bfc579e04c73c09aa937 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Wed, 5 Jun 2024 10:18:27 -0300 Subject: [PATCH 10/13] Arreglo de import en models --- app/models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models.py b/app/models.py index 4c1e11ab..7f46de5f 100644 --- a/app/models.py +++ b/app/models.py @@ -1,9 +1,10 @@ +import re # Importa el módulo de expresiones regulares from datetime import datetime -import re # Importa el módulo de expresiones regulares from django.core.exceptions import ValidationError from django.db import IntegrityError, models + class CityEnum(models.TextChoices): LA_PLATA = 'La Plata', BERISSO = 'Berisso', From fb18f4873facbc7fe67087ed84267bf1dfcf7f90 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Wed, 5 Jun 2024 10:19:14 -0300 Subject: [PATCH 11/13] =?UTF-8?q?Agrego=20migraci=C3=B3n=20necesaria.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/migrations/0020_merge_20240605_1018.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 app/migrations/0020_merge_20240605_1018.py diff --git a/app/migrations/0020_merge_20240605_1018.py b/app/migrations/0020_merge_20240605_1018.py new file mode 100644 index 00000000..836a0515 --- /dev/null +++ b/app/migrations/0020_merge_20240605_1018.py @@ -0,0 +1,14 @@ +# Generated by Django 5.0.4 on 2024-06-05 13:18 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0015_merge_20240604_2040'), + ('app', '0019_merge_20240605_0942'), + ] + + operations = [ + ] From 646ace279475762aa1f4b88e76087827660d84a5 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Wed, 5 Jun 2024 10:31:11 -0300 Subject: [PATCH 12/13] =?UTF-8?q?Arreglo=20en=20datos=20erroneos=20en=20el?= =?UTF-8?q?=20test=20de=20integraci=C3=B3n.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/tests_integration.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/tests_integration.py b/app/tests_integration.py index 8b47ac32..53f2c653 100644 --- a/app/tests_integration.py +++ b/app/tests_integration.py @@ -183,7 +183,7 @@ def test_user_cant_edit_client_with_empty_name(self): client=Client.objects.create( name="Juan Sebastian Veron", phone="221555232", - address="13 y 44", + city="La Plata", email="brujita75@hotmail.com", ) @@ -193,7 +193,7 @@ def test_user_cant_edit_client_with_empty_name(self): "id":client.id, "name":"", "phone":client.phone, - "address":client.address, + "city":client.city, "email":client.email, }, ) @@ -207,7 +207,7 @@ def test_user_cant_edit_client_with_incorrect_name(self): client=Client.objects.create( name="Juan Sebastian Veron", phone="221555232", - address="13 y 44", + city="La Plata", email="brujita75@hotmail.com", ) @@ -217,7 +217,7 @@ def test_user_cant_edit_client_with_incorrect_name(self): "id":client.id, "name":"Juan Sebastian Veron 11", "phone":client.phone, - "address":client.address, + "city":client.city, "email":client.email, }, ) From fb76c266ba98906d983e471d7c1bc75fa2c42ca3 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Wed, 5 Jun 2024 10:31:39 -0300 Subject: [PATCH 13/13] Arreglo de error en el test e2e. --- functional_tests/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functional_tests/tests.py b/functional_tests/tests.py index 59b4e73e..f0460cb4 100644 --- a/functional_tests/tests.py +++ b/functional_tests/tests.py @@ -182,7 +182,7 @@ def test_should_can_be_able_to_delete_a_client(self): Esta función verifica que un cliente pueda ser eliminado correctamente a través de una solicitud POST al servidor. """ Client.objects.create( - name="Juan Sebastián Veron", + name="Juan Sebastian Veron", city="La Plata", phone="221555232", email="brujita75@vetsoft.com",