From eadb8d1cd1f75bcc981365a7a3c540e1cfd60fd3 Mon Sep 17 00:00:00 2001 From: RafaUC Date: Mon, 22 Jul 2024 12:19:58 -0600 Subject: [PATCH 1/2] implementado validacion de archivado y modalidades a mostrar --- cosiap_api/modalidades/tests.py | 53 ++++++++++++++++++++++++++++++--- cosiap_api/modalidades/views.py | 14 ++++++--- 2 files changed, 59 insertions(+), 8 deletions(-) diff --git a/cosiap_api/modalidades/tests.py b/cosiap_api/modalidades/tests.py index ec62749..ead8a7b 100644 --- a/cosiap_api/modalidades/tests.py +++ b/cosiap_api/modalidades/tests.py @@ -12,8 +12,10 @@ class ModalidadTests(BasePerUserTestCase): def setUp(self): super().setUp() # Llama al setup del padre para inicializar usuarios y tokens - Modalidad.objects.create(nombre='Modalidad Prueba 1', descripcion='Descripción 1', mostrar=True, archivado=False) - Modalidad.objects.create(nombre='Modalidad PRUEBA 2', descripcion='Descripción 2', mostrar=False, archivado=False) + self.modalidad0 = Modalidad.objects.create(nombre='Modalidad Prueba 0', descripcion='Descripción 0', mostrar=True, archivado=False) + self.modalidad1 = Modalidad.objects.create(nombre='Modalidad Prueba 1', descripcion='Descripción 1', mostrar=True, archivado=False) + self.modalidad2 = Modalidad.objects.create(nombre='Modalidad Prueba 2', descripcion='Descripción 2', mostrar=False, archivado=False) + self.modalidad_archivada = Modalidad.objects.create(nombre='Modalidad Archivada', descripcion='Descripción Archivada', mostrar=True, archivado=True) # Crear una imagen en memoria image = Image.new('RGB', (100, 100), color=(73, 109, 137)) @@ -61,6 +63,49 @@ class ModalidadTests(BasePerUserTestCase): print(response.data) self.assertEqual(response.status_code, status.HTTP_200_OK) + def test_get_modalidades_archivadas_no_included(self): + print("\nRunning test: test_get_modalidades_archivadas_no_included") + response = self.perform_request('get', url_name='modalidades:modalidades', token=self.user_token, user=self.user) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertNotIn('Modalidad Archivada', [modalidad['nombre'] for modalidad in response.data['data']]) + self.assertEqual(len(response.data['data']), 2) + + def test_get_modalidades_as_admin(self): + print("\nRunning test: test_get_modalidades_as_admin") + response = self.perform_request('get', url_name='modalidades:modalidades', token=self.admin_token, user=self.admin_user) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertIn('Modalidad Prueba 1', [modalidad['nombre'] for modalidad in response.data['data']]) + self.assertIn('Modalidad Prueba 2', [modalidad['nombre'] for modalidad in response.data['data']]) + self.assertNotIn('Modalidad Archivada', [modalidad['nombre'] for modalidad in response.data['data']]) + self.assertEqual(len(response.data['data']), 3) + + def test_get_modalidades_as_solicitante(self): + print("\nRunning test: test_get_modalidades_as_solicitante") + response = self.perform_request('get', url_name='modalidades:modalidades', token=self.solicitante_token, user=self.solicitante_user) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertIn('Modalidad Prueba 1', [modalidad['nombre'] for modalidad in response.data['data']]) + self.assertNotIn('Modalidad Prueba 2', [modalidad['nombre'] for modalidad in response.data['data']]) + self.assertNotIn('Modalidad Archivada', [modalidad['nombre'] for modalidad in response.data['data']]) + self.assertEqual(len(response.data['data']), 2) + + def test_get_single_modalidad_valid_id(self): + print("\nRunning test: test_get_single_modalidad_valid_id") + response = self.perform_request('get', url_name='modalidades:modalidades_pk', url_kwargs={'pk': self.modalidad1.pk}, token=self.user_token, user=self.user) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['data']['nombre'], self.modalidad1.nombre) + self.assertEqual(response.data['data']['descripcion'], self.modalidad1.descripcion) + + def test_get_single_modalidad_invalid_id(self): + print("\nRunning test: test_get_single_modalidad_invalid_id") + invalid_id = 99999 # ID que no existe + response = self.perform_request('get', url_name='modalidades:modalidades_pk', url_kwargs={'pk': invalid_id}, token=self.user_token, user=self.user) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + def test_post_modalidad_as_admin(self): print("\nRunning test: test_post_modalidad_as_admin") data = { @@ -72,7 +117,7 @@ class ModalidadTests(BasePerUserTestCase): response = self.perform_request('post', url_name='modalidades:modalidades', token=self.admin_token, user=self.admin_user, data=data, is_multipart=True) print(response.data) self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertEqual(Modalidad.objects.count(), 3) + self.assertEqual(Modalidad.objects.count(), 5) modalidad = Modalidad.objects.get(pk=response.data['data']['id']) self.assertEqual(modalidad.nombre, data['nombre']) self.assertEqual(modalidad.descripcion, data['descripcion']) @@ -92,7 +137,7 @@ class ModalidadTests(BasePerUserTestCase): response = self.perform_request('post', url_name='modalidades:modalidades', token=self.solicitante_token, user=self.solicitante_user, data=data, is_multipart=True) print(response.data) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - self.assertEqual(Modalidad.objects.count(), 2) + self.assertEqual(Modalidad.objects.count(), 4) def test_put_modalidad_as_admin(self): print("\nRunning test: test_put_modalidad_as_admin") diff --git a/cosiap_api/modalidades/views.py b/cosiap_api/modalidades/views.py index 85a830a..f9a9a55 100644 --- a/cosiap_api/modalidades/views.py +++ b/cosiap_api/modalidades/views.py @@ -8,6 +8,7 @@ from rest_framework.response import Response from modalidades.models import Modalidad, MontoModalidad from modalidades.serializers import ModalidadSerializer, MontoModalidadSerializer from notificaciones.mensajes import Mensaje +from django.shortcuts import get_object_or_404 class ModalidadAPIView(BasePermissionAPIView): @@ -27,11 +28,16 @@ class ModalidadAPIView(BasePermissionAPIView): permission_classes_list = [AllowAny] def get(self, request, pk=None): + #si hay existe el argumento pk en el request, enviamos solo un objeto if pk: - modalidad = Modalidad.objects.get(pk=pk) + modalidad = get_object_or_404(Modalidad,pk=pk) serializer = ModalidadSerializer(modalidad) else: - modalidades = Modalidad.objects.all() + #excluimos las modalidades archivadas + modalidades = Modalidad.objects.filter(archivado=False) + #Si el usuario no es administrador, enviamos solo las modalidades que se pueden mostrar + if request.user.is_staff == False: + modalidades = modalidades.filter(mostrar=True) serializer = ModalidadSerializer(modalidades, many=True) response_data = {'data': serializer.data} return Response(response_data, status=status.HTTP_200_OK) @@ -51,7 +57,7 @@ class ModalidadAPIView(BasePermissionAPIView): return Response(response_data, status=status.HTTP_400_BAD_REQUEST) def put(self, request, pk): - modalidad = Modalidad.objects.get(pk=pk) + modalidad = get_object_or_404(Modalidad,pk=pk) serializer = ModalidadSerializer(modalidad, data=request.data, partial=True) if serializer.is_valid(): serializer.save() @@ -65,7 +71,7 @@ class ModalidadAPIView(BasePermissionAPIView): return Response(response_data, status=status.HTTP_400_BAD_REQUEST) def delete(self, request, pk): - modalidad = Modalidad.objects.get(pk=pk) + modalidad = get_object_or_404(Modalidad,pk=pk) modalidad.archivado = True modalidad.save() response_data = {} -- GitLab From 5082e4da46a8b375e13d108588d9d7254b6f9bb6 Mon Sep 17 00:00:00 2001 From: RafaUC Date: Tue, 23 Jul 2024 13:48:13 -0600 Subject: [PATCH 2/2] opcimisacion tests --- cosiap_api/common/custom_tests.py | 239 +++++++++ cosiap_api/common/tests.py | 109 +--- cosiap_api/modalidades/tests.py | 468 ++++++++++-------- cosiap_api/solicitudes/tests.py | 28 +- ....timestamp-1721420514839-ede7b6b829d93.mjs | 20 + 5 files changed, 548 insertions(+), 316 deletions(-) create mode 100644 cosiap_api/common/custom_tests.py create mode 100644 cosiap_frontend/vite.config.js.timestamp-1721420514839-ede7b6b829d93.mjs diff --git a/cosiap_api/common/custom_tests.py b/cosiap_api/common/custom_tests.py new file mode 100644 index 0000000..b1b5029 --- /dev/null +++ b/cosiap_api/common/custom_tests.py @@ -0,0 +1,239 @@ +from rest_framework.test import APITestCase, APIRequestFactory, force_authenticate, APIClient +from rest_framework_simplejwt.tokens import RefreshToken +from users.models import Usuario, Solicitante +from rest_framework_simplejwt.tokens import RefreshToken +from rest_framework import status +from common.views import BasePermissionAPIView +from rest_framework.response import Response +from django.urls import reverse +from django.test import tag + +from users.permisos import es_admin, primer_login +from rest_framework.permissions import AllowAny, IsAuthenticated + +class BasePerUserTestCase(APITestCase): + ''' + Clase de APITestCase con configuracion por defecto para hacer tests con los + distintos tipos de Usuario en el sistema + + Atributos: + + - self.user (Usuario comun, sin permisos de administrador) + - self.solicitante_user (Usuario inicializado como Solicitante) + - self.admin_user (Usuario Administrador) + + - self.user_token + - self.admin_token + - self.solicitante_token + + metodos nuevos: + - perform_request() (Funcion de atajo para ejecutar una request y obtener una response) + + ''' + + #metodo para resetear atributos para uso en subTests + def reset(self): + pass + + def setUp(self): + self.reset() + self.factory = APIRequestFactory() + + self.user = Usuario.objects.create_user( + curp='testuser', + password='testpassword', + email='usuario1@gmail.com', + nombre='usuario' + ) + + self.admin_user = Usuario.objects.create_superuser( + curp='adminuser', + password='adminpassword', + email='usuarioAdmin@gmail.com', + nombre='Administrador' + ) + + self.solicitante_user = Solicitante.objects.create( + curp='solicitanteuser', + password='solicitantepassword', + email='solicitante@gmail.com', + nombre='Solicitante', + ap_paterno='Marquez', + telefono='0000000001', + RFC='1234567890123', # Ajustar tipo de dato + direccion='Calle sin Nombre', + codigo_postal='89890', # Ajustar tipo de dato + municipio_id=1, + poblacion=5, + INE='awdawd' + ) + + self.user_token = self.get_tokens_for_user(self.user) + self.admin_token = self.get_tokens_for_user(self.admin_user) + self.solicitante_token = self.get_tokens_for_user(self.solicitante_user) + + def get_tokens_for_user(self, user): + refresh = RefreshToken.for_user(user) + return { + 'refresh': str(refresh), + 'access': str(refresh.access_token), + } + + def perform_request(self, method, url_name, url_kwargs=None, token=None, user=None, data=None, is_multipart=False): + """ + Realiza una solicitud a la vista especificada utilizando el método HTTP indicado. + + Parameters: + - method (HTTP method ('get', 'post', 'put', 'patch', 'delete').) + - url_name (Name of the URL to perform the request.) + - url_kwargs (Dictionary of URL keyword arguments.) + - token (Authentication token.) + - user (User making the request.) + - data (Data to be sent with the request (default is None).) + - is_multipart (Boolean indicating if the request is multipart (default is False).) + + Returns: + - response: The response from the request. + """ + client = APIClient() + if token: + client.force_authenticate(user=user, token=token['access']) + + url = reverse(url_name, kwargs=url_kwargs) + method = method.lower() + + if is_multipart: + format_type = 'multipart' + else: + format_type = 'json' + + if method == 'get': + response = client.get(url, data, format=format_type) + elif method == 'post': + response = client.post(url, data, format=format_type) + elif method == 'put': + response = client.put(url, data, format=format_type) + elif method == 'patch': + response = client.patch(url, data, format=format_type) + elif method == 'delete': + response = client.delete(url, data, format=format_type) + else: + raise ValueError(f"Unsupported HTTP method: {method}") + + return response + + +class PermissionTestCase(BasePerUserTestCase): + """ + Clase base para tests de permisos en vistas de Django Rest Framework. + + Esta clase permite definir y ejecutar tests de permisos para diferentes tipos de usuarios + (común, solicitante, administrador y anónimo) en diversas vistas y métodos HTTP. + + Atributos de clase: + - url_name: El nombre de la URL que se testeará. + - methods_responses: Un diccionario que define los códigos de respuesta esperados para + cada tipo de usuario y método HTTP. La estructura es la siguiente: + { + 'get': { + 'user': status.HTTP_200_OK, + 'admin': status.HTTP_200_OK, + 'solicitante': status.HTTP_200_OK, + 'anonymous': status.HTTP_403_FORBIDDEN + }, + 'post': { + 'user': status.HTTP_403_FORBIDDEN, + 'admin': status.HTTP_400_BAD_REQUEST, + 'solicitante': status.HTTP_403_FORBIDDEN, + 'anonymous': status.HTTP_403_FORBIDDEN + }, + 'put': { + 'user': status.HTTP_403_FORBIDDEN, + 'admin': status.HTTP_200_OK, + 'solicitante': status.HTTP_403_FORBIDDEN, + 'anonymous': status.HTTP_403_FORBIDDEN + }, + 'delete': { + 'user': status.HTTP_403_FORBIDDEN, + 'admin': status.HTTP_204_NO_CONTENT, + 'solicitante': status.HTTP_403_FORBIDDEN, + 'anonymous': status.HTTP_403_FORBIDDEN + } + } + + Métodos: + - get_url_kwargs(self): Devuelve los argumentos de la URL necesarios para las solicitudes. + Este método debe ser sobrescrito si la URL requiere argumentos adicionales. + - test_permissions(self): Ejecuta los tests de permisos para todos los métodos HTTP + definidos en methods_responses. + """ + + url_name = None + methods_responses = { + 'get': { + 'user': status.HTTP_200_OK, + 'admin': status.HTTP_200_OK, + 'solicitante': status.HTTP_200_OK, + 'anonymous': status.HTTP_403_FORBIDDEN + }, + 'post': { + 'user': status.HTTP_403_FORBIDDEN, + 'admin': status.HTTP_400_BAD_REQUEST, + 'solicitante': status.HTTP_403_FORBIDDEN, + 'anonymous': status.HTTP_403_FORBIDDEN + }, + 'put': { + 'user': status.HTTP_403_FORBIDDEN, + 'admin': status.HTTP_200_OK, + 'solicitante': status.HTTP_403_FORBIDDEN, + 'anonymous': status.HTTP_403_FORBIDDEN + }, + 'delete': { + 'user': status.HTTP_403_FORBIDDEN, + 'admin': status.HTTP_204_NO_CONTENT, + 'solicitante': status.HTTP_403_FORBIDDEN, + 'anonymous': status.HTTP_403_FORBIDDEN + } + } + + def get_url_kwargs(self): + """ + Devuelve los argumentos de la URL necesarios para las solicitudes. + Este método debe ser sobrescrito si la URL requiere argumentos adicionales. + """ + return {} + + @tag('permisos') + def test_permissions(self): + print(f'CLASSNAME {self.__class__}') + if self.url_name == None: + return + """ + Ejecuta los tests de permisos para todos los métodos HTTP definidos en methods_responses. + + Para cada método HTTP, realiza una solicitud como usuario común, administrador, solicitante + y usuario anónimo, y verifica que el código de respuesta sea el esperado. + """ + print(f'EJECUTANDO TESTS DE PERMISOS: {self.url_name}') + url_kwargs = self.get_url_kwargs() + for method, responses in self.methods_responses.items(): + with self.subTest(method=method): + response = self.perform_request(method, self.url_name, url_kwargs=url_kwargs, token=self.user_token, user=self.user) + self.assertEqual(response.status_code, responses.get('user', None), f"Fallo user con metodo {method}") + if response.status_code == responses.get('user', None): + print(f"Exito para user con metodo {method}") + + response = self.perform_request(method, self.url_name, url_kwargs=url_kwargs, token=self.admin_token, user=self.admin_user) + self.assertEqual(response.status_code, responses.get('admin', None), f"Fallo admin con metodo {method}") + if response.status_code == responses.get('admin', None): + print(f"Exito para admin con metodo {method}") + + response = self.perform_request(method, self.url_name, url_kwargs=url_kwargs, token=self.solicitante_token, user=self.solicitante_user) + self.assertEqual(response.status_code, responses.get('solicitante', None), f"Fallo solicitante con metodo {method}") + if response.status_code == responses.get('solicitante', None): + print(f"Exito para solicitante con metodo {method}") + + response = self.perform_request(method, self.url_name, url_kwargs=url_kwargs) + self.assertEqual(response.status_code, responses.get('anonymous', None), f"Fallo anonymous con metodo {method}") + if response.status_code == responses.get('anonymous', None): + print(f"Exito para anonymous con metodo {method}") \ No newline at end of file diff --git a/cosiap_api/common/tests.py b/cosiap_api/common/tests.py index bc31319..23fdb9a 100644 --- a/cosiap_api/common/tests.py +++ b/cosiap_api/common/tests.py @@ -6,116 +6,11 @@ from rest_framework import status from common.views import BasePermissionAPIView from rest_framework.response import Response from django.urls import reverse +from django.test import tag from users.permisos import es_admin, primer_login from rest_framework.permissions import AllowAny, IsAuthenticated -class BasePerUserTestCase(APITestCase): - ''' - Clase de APITestCase con configuracion por defecto para hacer tests con los - distintos tipos de Usuario en el sistema - - Atributos: - - - self.user (Usuario comun, sin permisos de administrador) - - self.solicitante_user (Usuario inicializado como Solicitante) - - self.admin_user (Usuario Administrador) - - - self.user_token - - self.admin_token - - self.solicitante_token - - metodos nuevos: - - perform_request() (Funcion de atajo para ejecutar una request y obtener una response) - - ''' - def setUp(self): - self.factory = APIRequestFactory() - - self.user = Usuario.objects.create_user( - curp='testuser', - password='testpassword', - email='usuario1@gmail.com', - nombre='usuario' - ) - - self.admin_user = Usuario.objects.create_superuser( - curp='adminuser', - password='adminpassword', - email='usuarioAdmin@gmail.com', - nombre='Administrador' - ) - - self.solicitante_user = Solicitante.objects.create( - curp='solicitanteuser', - password='solicitantepassword', - email='solicitante@gmail.com', - nombre='Solicitante', - ap_paterno='Marquez', - telefono='0000000001', - RFC='1234567890123', # Ajustar tipo de dato - direccion='Calle sin Nombre', - codigo_postal='89890', # Ajustar tipo de dato - municipio_id=1, - poblacion=5, - INE='awdawd' - ) - - self.user_token = self.get_tokens_for_user(self.user) - self.admin_token = self.get_tokens_for_user(self.admin_user) - self.solicitante_token = self.get_tokens_for_user(self.solicitante_user) - - def get_tokens_for_user(self, user): - refresh = RefreshToken.for_user(user) - return { - 'refresh': str(refresh), - 'access': str(refresh.access_token), - } - - def perform_request(self, method, url_name, url_kwargs=None, token=None, user=None, data=None, is_multipart=False): - """ - Realiza una solicitud a la vista especificada utilizando el método HTTP indicado. - - Parameters: - - method (HTTP method ('get', 'post', 'put', 'patch', 'delete').) - - url_name (Name of the URL to perform the request.) - - url_kwargs (Dictionary of URL keyword arguments.) - - token (Authentication token.) - - user (User making the request.) - - data (Data to be sent with the request (default is None).) - - is_multipart (Boolean indicating if the request is multipart (default is False).) - - Returns: - - response: The response from the request. - """ - client = APIClient() - if token: - client.force_authenticate(user=user, token=token['access']) - - url = reverse(url_name, kwargs=url_kwargs) - method = method.lower() - - if is_multipart: - format_type = 'multipart' - else: - format_type = 'json' - - if method == 'get': - response = client.get(url, data, format=format_type) - elif method == 'post': - response = client.post(url, data, format=format_type) - elif method == 'put': - response = client.put(url, data, format=format_type) - elif method == 'patch': - response = client.patch(url, data, format=format_type) - elif method == 'delete': - response = client.delete(url, data, format=format_type) - else: - raise ValueError(f"Unsupported HTTP method: {method}") - - return response - - class TestBasePermissionAPIView(BasePermissionAPIView): permission_classes_create = [AllowAny] @@ -174,7 +69,7 @@ class TestAllowAnyPermissionsAPIView(BasePermissionAPIView): -class PermissionTestCase(APITestCase): +class PermissionAPIViewTestCase(APITestCase): def setUp(self): self.factory = APIRequestFactory() diff --git a/cosiap_api/modalidades/tests.py b/cosiap_api/modalidades/tests.py index ead8a7b..a390d2e 100644 --- a/cosiap_api/modalidades/tests.py +++ b/cosiap_api/modalidades/tests.py @@ -2,15 +2,58 @@ from rest_framework import status from rest_framework.test import APITestCase from modalidades.models import Modalidad, MontoModalidad from modalidades.views import ModalidadAPIView -from common.tests import BasePerUserTestCase +from common.custom_tests import BasePerUserTestCase +from common import custom_tests as c_tests from django.core.files.uploadedfile import SimpleUploadedFile from PIL import Image import io import os -class ModalidadTests(BasePerUserTestCase): - def setUp(self): - super().setUp() # Llama al setup del padre para inicializar usuarios y tokens +class PermisosModalidadesTests(c_tests.PermissionTestCase): + url_name = 'modalidades:modalidades' + + methods_responses = { + 'get': { + 'user': status.HTTP_200_OK, + 'admin': status.HTTP_200_OK, + 'solicitante': status.HTTP_200_OK, + 'anonymous': status.HTTP_200_OK + }, + 'post': { + 'user': status.HTTP_403_FORBIDDEN, + 'admin': status.HTTP_400_BAD_REQUEST, + 'solicitante': status.HTTP_403_FORBIDDEN, + 'anonymous': status.HTTP_401_UNAUTHORIZED + } + } + +class PermisosPKModalidadesTests(c_tests.PermissionTestCase): + url_name = 'modalidades:modalidades_pk' + + def get_url_kwargs(self): + self.modalidad = Modalidad.objects.create(nombre='Modalidad Prueba 0', descripcion='Descripción 0', mostrar=True, archivado=False) + return {'pk': self.modalidad.pk} + + methods_responses = { + 'put': { + 'user': status.HTTP_403_FORBIDDEN, + 'admin': status.HTTP_200_OK, + 'solicitante': status.HTTP_403_FORBIDDEN, + 'anonymous': status.HTTP_401_UNAUTHORIZED + }, + 'delete': { + 'user': status.HTTP_403_FORBIDDEN, + 'admin': status.HTTP_204_NO_CONTENT, + 'solicitante': status.HTTP_403_FORBIDDEN, + 'anonymous': status.HTTP_401_UNAUTHORIZED + } + } + + +class ModalidadTests(BasePerUserTestCase): + def reset(self): + MontoModalidad.objects.all().delete() + Modalidad.objects.all().delete() self.modalidad0 = Modalidad.objects.create(nombre='Modalidad Prueba 0', descripcion='Descripción 0', mostrar=True, archivado=False) self.modalidad1 = Modalidad.objects.create(nombre='Modalidad Prueba 1', descripcion='Descripción 1', mostrar=True, archivado=False) @@ -39,202 +82,223 @@ class ModalidadTests(BasePerUserTestCase): content=byte_array.read(), content_type='image/jpeg' ) - def test_get_modalidades_as_anonymous(self): - print("\nRunning test: test_get_modalidades_as_anonymous") - response = self.perform_request('get', url_name='modalidades:modalidades') - print(response.data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_get_modalidades_as_user(self): - print("\nRunning test: test_get_modalidades_as_user") - response = self.perform_request('get', url_name='modalidades:modalidades', token=self.user_token, user=self.user) - print(response.data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_get_modalidades_as_admin(self): - print("\nRunning test: test_get_modalidades_as_admin") - response = self.perform_request('get', url_name='modalidades:modalidades', token=self.admin_token, user=self.admin_user) - print(response.data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_get_modalidades_as_solicitante(self): - print("\nRunning test: test_get_modalidades_as_solicitante") - response = self.perform_request('get', url_name='modalidades:modalidades', token=self.solicitante_token, user=self.solicitante_user) - print(response.data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_get_modalidades_archivadas_no_included(self): - print("\nRunning test: test_get_modalidades_archivadas_no_included") - response = self.perform_request('get', url_name='modalidades:modalidades', token=self.user_token, user=self.user) - print(response.data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertNotIn('Modalidad Archivada', [modalidad['nombre'] for modalidad in response.data['data']]) - self.assertEqual(len(response.data['data']), 2) - - def test_get_modalidades_as_admin(self): - print("\nRunning test: test_get_modalidades_as_admin") - response = self.perform_request('get', url_name='modalidades:modalidades', token=self.admin_token, user=self.admin_user) - print(response.data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertIn('Modalidad Prueba 1', [modalidad['nombre'] for modalidad in response.data['data']]) - self.assertIn('Modalidad Prueba 2', [modalidad['nombre'] for modalidad in response.data['data']]) - self.assertNotIn('Modalidad Archivada', [modalidad['nombre'] for modalidad in response.data['data']]) - self.assertEqual(len(response.data['data']), 3) - - def test_get_modalidades_as_solicitante(self): - print("\nRunning test: test_get_modalidades_as_solicitante") - response = self.perform_request('get', url_name='modalidades:modalidades', token=self.solicitante_token, user=self.solicitante_user) - print(response.data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertIn('Modalidad Prueba 1', [modalidad['nombre'] for modalidad in response.data['data']]) - self.assertNotIn('Modalidad Prueba 2', [modalidad['nombre'] for modalidad in response.data['data']]) - self.assertNotIn('Modalidad Archivada', [modalidad['nombre'] for modalidad in response.data['data']]) - self.assertEqual(len(response.data['data']), 2) - - def test_get_single_modalidad_valid_id(self): - print("\nRunning test: test_get_single_modalidad_valid_id") - response = self.perform_request('get', url_name='modalidades:modalidades_pk', url_kwargs={'pk': self.modalidad1.pk}, token=self.user_token, user=self.user) - print(response.data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['data']['nombre'], self.modalidad1.nombre) - self.assertEqual(response.data['data']['descripcion'], self.modalidad1.descripcion) - - def test_get_single_modalidad_invalid_id(self): - print("\nRunning test: test_get_single_modalidad_invalid_id") - invalid_id = 99999 # ID que no existe - response = self.perform_request('get', url_name='modalidades:modalidades_pk', url_kwargs={'pk': invalid_id}, token=self.user_token, user=self.user) - print(response.data) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_post_modalidad_as_admin(self): - print("\nRunning test: test_post_modalidad_as_admin") - data = { - 'nombre': 'Nueva Modalidad', - 'imagen': self.test_image, - 'descripcion': 'Descripción de la nueva modalidad', - 'monto': 100.0 - } - response = self.perform_request('post', url_name='modalidades:modalidades', token=self.admin_token, user=self.admin_user, data=data, is_multipart=True) - print(response.data) - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertEqual(Modalidad.objects.count(), 5) - modalidad = Modalidad.objects.get(pk=response.data['data']['id']) - self.assertEqual(modalidad.nombre, data['nombre']) - self.assertEqual(modalidad.descripcion, data['descripcion']) - montoModalidad = MontoModalidad.objects.get(modalidad=modalidad, fecha_fin=None) - print(f'MontoModalidad: {montoModalidad.__dict__}') - self.assertEqual(montoModalidad.monto, data['monto']) - os.remove(modalidad.imagen.path) - - def test_post_modalidad_as_solicitante(self): - print("\nRunning test: test_post_modalidad_as_solicitante") - data = { - 'nombre': 'Nueva Modalidad', - 'imagen': self.test_image, - 'descripcion': 'Descripción de la nueva modalidad', - 'monto': 100.0 - } - response = self.perform_request('post', url_name='modalidades:modalidades', token=self.solicitante_token, user=self.solicitante_user, data=data, is_multipart=True) - print(response.data) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - self.assertEqual(Modalidad.objects.count(), 4) - - def test_put_modalidad_as_admin(self): - print("\nRunning test: test_put_modalidad_as_admin") - modalidad = Modalidad.objects.create(nombre='Modalidad Existente', imagen=self.test_image_original, descripcion='Descripción', mostrar=True, archivado=False) - MontoModalidad.objects.create(modalidad=modalidad, monto=0.5) - montoModalidad = MontoModalidad.objects.get(modalidad = modalidad, fecha_fin=None) - print(f'MontoModalidad: {montoModalidad.__dict__}') - self.assertEqual(montoModalidad.monto, 0.5) - # Verifica que la imagen original existe - original_image_path = modalidad.imagen.path - self.assertTrue(os.path.isfile(original_image_path)) - data = { - 'nombre': 'Modalidad Actualizada', - 'imagen': self.test_image, - 'descripcion': 'Descripción actualizada', - 'monto': 200.0 - } - response = self.perform_request('put', url_name='modalidades:modalidades_pk', url_kwargs={'pk':modalidad.pk}, token=self.admin_token, user=self.admin_user, data=data, is_multipart=True) - print(response.data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - modalidad.refresh_from_db() - self.assertEqual(modalidad.nombre, data['nombre']) - self.assertEqual(modalidad.descripcion, data['descripcion']) - montoModalidad = MontoModalidad.objects.get(modalidad = modalidad, fecha_fin=None) - print(f'MontoModalidad: {montoModalidad.__dict__}') - self.assertEqual(montoModalidad.monto, data['monto']) - self.assertEqual(MontoModalidad.objects.count(), 2) - # Verifica que la imagen original ha sido eliminada - self.assertFalse(os.path.isfile(original_image_path)) - # Verifica que la nueva imagen existe - new_image_path = modalidad.imagen.path - self.assertTrue(os.path.isfile(new_image_path)) - os.remove(new_image_path) - - def test_put_modalidad_as_admin_no_image(self): - print("\nRunning test: test_put_modalidad_as_admin") - modalidad = Modalidad.objects.create(nombre='Modalidad Existente', imagen=self.test_image_original, descripcion='Descripción', mostrar=True, archivado=False) - MontoModalidad.objects.create(modalidad=modalidad, monto=0.5) - montoModalidad = MontoModalidad.objects.get(modalidad = modalidad, fecha_fin=None) - print(f'MontoModalidad: {montoModalidad.__dict__}') - print(f'Modalidad: {modalidad.__dict__}') - self.assertEqual(montoModalidad.monto, 0.5) - # Verifica que la imagen original existe - original_image_path = modalidad.imagen.path - self.assertTrue(os.path.isfile(original_image_path)) - data = { - 'nombre': 'Modalidad Actualizada', - 'descripcion': 'Descripción actualizada', - 'monto': 200.0 - } - response = self.perform_request('put', url_name='modalidades:modalidades_pk', url_kwargs={'pk':modalidad.pk}, token=self.admin_token, user=self.admin_user, data=data, is_multipart=True) - print(response.data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - modalidad.refresh_from_db() - self.assertEqual(modalidad.nombre, data['nombre']) - self.assertEqual(modalidad.descripcion, data['descripcion']) - montoModalidad = MontoModalidad.objects.get(modalidad = modalidad, fecha_fin=None) - print(f'MontoModalidad: {montoModalidad.__dict__}') - self.assertEqual(montoModalidad.monto, data['monto']) - self.assertEqual(MontoModalidad.objects.count(), 2) - # Verifica que la imagen original ha sido eliminada - self.assertTrue(os.path.isfile(original_image_path)) - # Verifica que la nueva imagen existe - new_image_path = modalidad.imagen.path - self.assertTrue(os.path.isfile(new_image_path)) - os.remove(new_image_path) - - def test_put_modalidad_as_solicitante(self): - print("\nRunning test: test_put_modalidad_as_solicitante") - modalidad = Modalidad.objects.create(nombre='Modalidad Existente', descripcion='Descripción', mostrar=True, archivado=False) - data = { - 'nombre': 'Modalidad Actualizada', - 'imagen': self.test_image, - 'descripcion': 'Descripción actualizada', - 'monto': 200.0 - } - response = self.perform_request('put', url_name='modalidades:modalidades_pk', url_kwargs={'pk':modalidad.pk}, token=self.solicitante_token, user=self.solicitante_user, data=data, is_multipart=True) - print(response.data) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - modalidad.refresh_from_db() - self.assertEqual(modalidad.nombre, 'Modalidad Existente') - - def test_delete_modalidad_as_admin(self): - print("\nRunning test: test_delete_modalidad_as_admin") - modalidad = Modalidad.objects.create(nombre='Modalidad Existente', descripcion='Descripción', mostrar=True, archivado=False) - response = self.perform_request('delete', url_name='modalidades:modalidades_pk', url_kwargs={'pk':modalidad.pk}, token=self.admin_token, user=self.admin_user) - print(response.data) - self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - modalidad.refresh_from_db() - self.assertTrue(modalidad.archivado) - - def test_delete_modalidad_as_solicitante(self): - print("\nRunning test: test_delete_modalidad_as_solicitante") - modalidad = Modalidad.objects.create(nombre='Modalidad Existente', descripcion='Descripción', mostrar=True, archivado=False) - response = self.perform_request('delete', url_name='modalidades:modalidades_pk', url_kwargs={'pk':modalidad.pk}, token=self.solicitante_token, user=self.solicitante_user) - print(response.data) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - modalidad.refresh_from_db() - self.assertFalse(modalidad.archivado) + + + def test(self): + with self.subTest("test_get_modalidades_as_anonymous"): + self.reset() + print("\nRunning test: test_get_modalidades_as_anonymous") + response = self.perform_request('get', url_name='modalidades:modalidades') + print(response.data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + with self.subTest("test_get_modalidades_as_user"): + self.reset() + print("\nRunning test: test_get_modalidades_as_user") + response = self.perform_request('get', url_name='modalidades:modalidades', token=self.user_token, user=self.user) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + with self.subTest("test_get_modalidades_as_admin"): + self.reset() + print("\nRunning test: test_get_modalidades_as_admin") + response = self.perform_request('get', url_name='modalidades:modalidades', token=self.admin_token, user=self.admin_user) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + with self.subTest("test_get_modalidades_as_solicitante"): + self.reset() + print("\nRunning test: test_get_modalidades_as_solicitante") + response = self.perform_request('get', url_name='modalidades:modalidades', token=self.solicitante_token, user=self.solicitante_user) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + with self.subTest("test_get_modalidades_archivadas_no_included"): + self.reset() + print("\nRunning test: test_get_modalidades_archivadas_no_included") + response = self.perform_request('get', url_name='modalidades:modalidades', token=self.user_token, user=self.user) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertNotIn('Modalidad Archivada', [modalidad['nombre'] for modalidad in response.data['data']]) + self.assertEqual(len(response.data['data']), 2) + + with self.subTest("test_get_modalidades_as_admin"): + self.reset() + print("\nRunning test: test_get_modalidades_as_admin") + response = self.perform_request('get', url_name='modalidades:modalidades', token=self.admin_token, user=self.admin_user) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertIn('Modalidad Prueba 1', [modalidad['nombre'] for modalidad in response.data['data']]) + self.assertIn('Modalidad Prueba 2', [modalidad['nombre'] for modalidad in response.data['data']]) + self.assertNotIn('Modalidad Archivada', [modalidad['nombre'] for modalidad in response.data['data']]) + self.assertEqual(len(response.data['data']), 3) + + with self.subTest("test_get_modalidades_as_solicitante"): + self.reset() + print("\nRunning test: test_get_modalidades_as_solicitante") + response = self.perform_request('get', url_name='modalidades:modalidades', token=self.solicitante_token, user=self.solicitante_user) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertIn('Modalidad Prueba 1', [modalidad['nombre'] for modalidad in response.data['data']]) + self.assertNotIn('Modalidad Prueba 2', [modalidad['nombre'] for modalidad in response.data['data']]) + self.assertNotIn('Modalidad Archivada', [modalidad['nombre'] for modalidad in response.data['data']]) + self.assertEqual(len(response.data['data']), 2) + + with self.subTest("test_get_single_modalidad_valid_id"): + self.reset() + print("\nRunning test: test_get_single_modalidad_valid_id") + response = self.perform_request('get', url_name='modalidades:modalidades_pk', url_kwargs={'pk': self.modalidad1.pk}, token=self.user_token, user=self.user) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['data']['nombre'], self.modalidad1.nombre) + self.assertEqual(response.data['data']['descripcion'], self.modalidad1.descripcion) + + with self.subTest("test_get_single_modalidad_invalid_id"): + self.reset() + print("\nRunning test: test_get_single_modalidad_invalid_id") + invalid_id = 99999 # ID que no existe + response = self.perform_request('get', url_name='modalidades:modalidades_pk', url_kwargs={'pk': invalid_id}, token=self.user_token, user=self.user) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + + with self.subTest("test_post_modalidad_as_admin"): + self.reset() + print("\nRunning test: test_post_modalidad_as_admin") + data = { + 'nombre': 'Nueva Modalidad', + 'imagen': self.test_image, + 'descripcion': 'Descripción de la nueva modalidad', + 'monto': 100.0 + } + response = self.perform_request('post', url_name='modalidades:modalidades', token=self.admin_token, user=self.admin_user, data=data, is_multipart=True) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(Modalidad.objects.count(), 5) + modalidad = Modalidad.objects.get(pk=response.data['data']['id']) + self.assertEqual(modalidad.nombre, data['nombre']) + self.assertEqual(modalidad.descripcion, data['descripcion']) + montoModalidad = MontoModalidad.objects.get(modalidad=modalidad, fecha_fin=None) + print(f'MontoModalidad: {montoModalidad.__dict__}') + self.assertEqual(montoModalidad.monto, data['monto']) + os.remove(modalidad.imagen.path) + + with self.subTest("test_post_modalidad_as_solicitante"): + self.reset() + print("\nRunning test: test_post_modalidad_as_solicitante") + data = { + 'nombre': 'Nueva Modalidad', + 'imagen': self.test_image, + 'descripcion': 'Descripción de la nueva modalidad', + 'monto': 100.0 + } + response = self.perform_request('post', url_name='modalidades:modalidades', token=self.solicitante_token, user=self.solicitante_user, data=data, is_multipart=True) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + self.assertEqual(Modalidad.objects.count(), 4) + + with self.subTest("test_put_modalidad_as_admin"): + self.reset() + print("\nRunning test: test_put_modalidad_as_admin") + modalidad = Modalidad.objects.create(nombre='Modalidad Existente', imagen=self.test_image_original, descripcion='Descripción', mostrar=True, archivado=False) + MontoModalidad.objects.create(modalidad=modalidad, monto=0.5) + montoModalidad = MontoModalidad.objects.get(modalidad = modalidad, fecha_fin=None) + print(f'MontoModalidad: {montoModalidad.__dict__}') + self.assertEqual(montoModalidad.monto, 0.5) + # Verifica que la imagen original existe + original_image_path = modalidad.imagen.path + self.assertTrue(os.path.isfile(original_image_path)) + data = { + 'nombre': 'Modalidad Actualizada', + 'imagen': self.test_image, + 'descripcion': 'Descripción actualizada', + 'monto': 200.0 + } + response = self.perform_request('put', url_name='modalidades:modalidades_pk', url_kwargs={'pk':modalidad.pk}, token=self.admin_token, user=self.admin_user, data=data, is_multipart=True) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + modalidad.refresh_from_db() + self.assertEqual(modalidad.nombre, data['nombre']) + self.assertEqual(modalidad.descripcion, data['descripcion']) + montoModalidad = MontoModalidad.objects.get(modalidad = modalidad, fecha_fin=None) + print(f'MontoModalidad: {montoModalidad.__dict__}') + self.assertEqual(montoModalidad.monto, data['monto']) + self.assertEqual(MontoModalidad.objects.count(), 2) + # Verifica que la imagen original ha sido eliminada + self.assertFalse(os.path.isfile(original_image_path)) + # Verifica que la nueva imagen existe + new_image_path = modalidad.imagen.path + self.assertTrue(os.path.isfile(new_image_path)) + os.remove(new_image_path) + + with self.subTest("test_put_modalidad_as_admin_no_image"): + self.reset() + print("\nRunning test: test_put_modalidad_as_admin") + modalidad = Modalidad.objects.create(nombre='Modalidad Existente', imagen=self.test_image_original, descripcion='Descripción', mostrar=True, archivado=False) + MontoModalidad.objects.create(modalidad=modalidad, monto=0.5) + montoModalidad = MontoModalidad.objects.get(modalidad = modalidad, fecha_fin=None) + print(f'MontoModalidad: {montoModalidad.__dict__}') + print(f'Modalidad: {modalidad.__dict__}') + self.assertEqual(montoModalidad.monto, 0.5) + # Verifica que la imagen original existe + original_image_path = modalidad.imagen.path + self.assertTrue(os.path.isfile(original_image_path)) + data = { + 'nombre': 'Modalidad Actualizada', + 'descripcion': 'Descripción actualizada', + 'monto': 200.0 + } + response = self.perform_request('put', url_name='modalidades:modalidades_pk', url_kwargs={'pk':modalidad.pk}, token=self.admin_token, user=self.admin_user, data=data, is_multipart=True) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + modalidad.refresh_from_db() + self.assertEqual(modalidad.nombre, data['nombre']) + self.assertEqual(modalidad.descripcion, data['descripcion']) + montoModalidad = MontoModalidad.objects.get(modalidad = modalidad, fecha_fin=None) + print(f'MontoModalidad: {montoModalidad.__dict__}') + self.assertEqual(montoModalidad.monto, data['monto']) + self.assertEqual(MontoModalidad.objects.count(), 2) + # Verifica que la imagen original ha sido eliminada + self.assertTrue(os.path.isfile(original_image_path)) + # Verifica que la nueva imagen existe + new_image_path = modalidad.imagen.path + self.assertTrue(os.path.isfile(new_image_path)) + os.remove(new_image_path) + + with self.subTest("test_put_modalidad_as_solicitante"): + self.reset() + print("\nRunning test: test_put_modalidad_as_solicitante") + modalidad = Modalidad.objects.create(nombre='Modalidad Existente', descripcion='Descripción', mostrar=True, archivado=False) + data = { + 'nombre': 'Modalidad Actualizada', + 'imagen': self.test_image, + 'descripcion': 'Descripción actualizada', + 'monto': 200.0 + } + response = self.perform_request('put', url_name='modalidades:modalidades_pk', url_kwargs={'pk':modalidad.pk}, token=self.solicitante_token, user=self.solicitante_user, data=data, is_multipart=True) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + modalidad.refresh_from_db() + self.assertEqual(modalidad.nombre, 'Modalidad Existente') + + with self.subTest("test_delete_modalidad_as_admin"): + self.reset() + print("\nRunning test: test_delete_modalidad_as_admin") + modalidad = Modalidad.objects.create(nombre='Modalidad Existente', descripcion='Descripción', mostrar=True, archivado=False) + response = self.perform_request('delete', url_name='modalidades:modalidades_pk', url_kwargs={'pk':modalidad.pk}, token=self.admin_token, user=self.admin_user) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + modalidad.refresh_from_db() + self.assertTrue(modalidad.archivado) + + with self.subTest("test_delete_modalidad_as_solicitante"): + self.reset() + print("\nRunning test: test_delete_modalidad_as_solicitante") + modalidad = Modalidad.objects.create(nombre='Modalidad Existente', descripcion='Descripción', mostrar=True, archivado=False) + response = self.perform_request('delete', url_name='modalidades:modalidades_pk', url_kwargs={'pk':modalidad.pk}, token=self.solicitante_token, user=self.solicitante_user) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + modalidad.refresh_from_db() + self.assertFalse(modalidad.archivado) + + print("\nTODOS LOS TESTS EJECUTADOS") diff --git a/cosiap_api/solicitudes/tests.py b/cosiap_api/solicitudes/tests.py index 5cf35fe..afcaf94 100644 --- a/cosiap_api/solicitudes/tests.py +++ b/cosiap_api/solicitudes/tests.py @@ -6,8 +6,27 @@ from rest_framework import status from users.models import Usuario, Solicitante, Municipio, Estado from .models import Solicitud from django.utils import timezone +from common import custom_tests as c_tests +class PermisosSolicitudTests(c_tests.PermissionTestCase): + url_name = 'solicitudes:solicitud-list' + methods_responses = { + 'get': { + 'user': status.HTTP_403_FORBIDDEN, + 'admin': status.HTTP_200_OK, + 'solicitante': status.HTTP_200_OK, + 'anonymous': status.HTTP_401_UNAUTHORIZED + }, + 'post': { + 'user': status.HTTP_403_FORBIDDEN, + 'admin': status.HTTP_403_FORBIDDEN, + 'solicitante': status.HTTP_201_CREATED, + 'anonymous': status.HTTP_401_UNAUTHORIZED + } + } + + class SolicitudTests(TestCase): ''' Clase de prueba de la lista de solicitudes usando DynamicTable @@ -45,12 +64,7 @@ class SolicitudTests(TestCase): # Crear una instancia de Estado self.estado = Estado.objects.create(nombre="Test Estado") - # Crear una instancia de Municipio - self.municipio = Municipio.objects.create( - estado=self.estado, - cve_mun=1, - nombre="Test Municipio" - ) + # Crear una instancia de Solicitante self.solicitante = Solicitante.objects.create( @@ -63,7 +77,7 @@ class SolicitudTests(TestCase): RFC="CEVA0204237E4", direccion="Calle Falsa 123", codigo_postal="12345", - municipio= self.municipio, + municipio_id= 2, poblacion="Test Poblacion", datos_bancarios=None, # Asignar datos bancarios si es necesario INE=None # Asignar archivo de INE si es necesario diff --git a/cosiap_frontend/vite.config.js.timestamp-1721420514839-ede7b6b829d93.mjs b/cosiap_frontend/vite.config.js.timestamp-1721420514839-ede7b6b829d93.mjs new file mode 100644 index 0000000..a6bbd4a --- /dev/null +++ b/cosiap_frontend/vite.config.js.timestamp-1721420514839-ede7b6b829d93.mjs @@ -0,0 +1,20 @@ +// vite.config.js +import { defineConfig } from "file:///app/node_modules/vite/dist/node/index.js"; +import react from "file:///app/node_modules/@vitejs/plugin-react-swc/index.mjs"; +import path from "path"; +var __vite_injected_original_dirname = "/app"; +var vite_config_default = defineConfig({ + plugins: [react()], + server: { + host: "0.0.0.0" + }, + resolve: { + alias: { + "@": path.resolve(__vite_injected_original_dirname, "./src") + } + } +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvYXBwXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvYXBwL3ZpdGUuY29uZmlnLmpzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9hcHAvdml0ZS5jb25maWcuanNcIjtpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tICd2aXRlJztcclxuaW1wb3J0IHJlYWN0IGZyb20gJ0B2aXRlanMvcGx1Z2luLXJlYWN0LXN3Yyc7XHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5cclxuLy8gaHR0cHM6Ly92aXRlanMuZGV2L2NvbmZpZy9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcclxuICBwbHVnaW5zOiBbcmVhY3QoKV0sXHJcbiAgc2VydmVyOiB7XHJcbiAgICBob3N0OiAnMC4wLjAuMCdcclxuICB9LFxyXG4gIHJlc29sdmU6IHtcclxuICAgICAgYWxpYXM6IHtcclxuICAgICAgXCJAXCI6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsIFwiLi9zcmNcIiksXHJcbiAgICB9LFxyXG4gIH0sXHJcbn0pXHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBOEwsU0FBUyxvQkFBb0I7QUFDM04sT0FBTyxXQUFXO0FBQ2xCLE9BQU8sVUFBVTtBQUZqQixJQUFNLG1DQUFtQztBQUt6QyxJQUFPLHNCQUFRLGFBQWE7QUFBQSxFQUMxQixTQUFTLENBQUMsTUFBTSxDQUFDO0FBQUEsRUFDakIsUUFBUTtBQUFBLElBQ04sTUFBTTtBQUFBLEVBQ1I7QUFBQSxFQUNBLFNBQVM7QUFBQSxJQUNMLE9BQU87QUFBQSxNQUNQLEtBQUssS0FBSyxRQUFRLGtDQUFXLE9BQU87QUFBQSxJQUN0QztBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo= -- GitLab