diff --git a/essenza/product/tests.py b/essenza/product/tests.py index 97c12b6..248dc3b 100644 --- a/essenza/product/tests.py +++ b/essenza/product/tests.py @@ -325,6 +325,53 @@ def test_admin_can_access_detail(self): self.assertEqual(resp.status_code, 200) self.assertContains(resp, self.product.name) + def test_admin_can_create_product(self): + """Prueba que un admin puede crear un nuevo producto (POST).""" + self.client.force_login(self.admin) + + initial_count = Product.objects.count() + + data = { + "name": "Nuevo Producto Creado", + "description": "Creado por el test de admin", + "category": "perfume", + "brand": "NewBrand", + "price": "99.99", + "stock": 100, + "is_active": True, + } + resp = self.client.post(self.create_url, data) + self.assertEqual(resp.status_code, 302) + self.assertEqual(Product.objects.count(), initial_count + 1) + self.assertTrue(Product.objects.filter(name="Nuevo Producto Creado").exists()) + + def test_admin_can_update_product(self): + """Prueba que un admin puede actualizar un producto existente (POST).""" + self.client.force_login(self.admin) + + updated_name = "Nombre Actualizado Admin" + updated_price = "15.50" + + data = { + "name": updated_name, + "description": "Descripción actualizada", + "category": "tratamiento", + "brand": self.product.brand, + "price": updated_price, + "stock": 50, + "is_active": False, + } + resp = self.client.post(self.update_url, data) + self.assertEqual(resp.status_code, 302) + + self.assertRedirects(resp, reverse("product_list")) + + self.product.refresh_from_db() + self.assertEqual(self.product.name, updated_name) + self.assertEqual(self.product.price, Decimal(updated_price)) + self.assertFalse(self.product.is_active) + self.assertEqual(self.product.stock, 50) + def test_admin_can_delete_product(self): self.client.force_login(self.admin) url = reverse("product_delete", args=[self.product.pk]) diff --git a/essenza/product/views.py b/essenza/product/views.py index 4948d7b..a06aa16 100644 --- a/essenza/product/views.py +++ b/essenza/product/views.py @@ -35,7 +35,6 @@ def get_top_selling_products(since): filtered_query = query_with_totals.filter(total_quantity__gt=0) # Paso 4: Ordenar (descendente). ordered_query = filtered_query.order_by("-total_quantity") - # Paso 5: Limitar. top_products = ordered_query[:10] return top_products diff --git a/essenza/templates/product/confirm_delete.html b/essenza/templates/product/confirm_delete.html index 826993a..eba4f9e 100644 --- a/essenza/templates/product/confirm_delete.html +++ b/essenza/templates/product/confirm_delete.html @@ -136,7 +136,7 @@ {% csrf_token %}
- ← No, cancelar + ← No, cancelar
diff --git a/essenza/templates/product/list.html b/essenza/templates/product/list.html index 38f4cb6..1e325c0 100644 --- a/essenza/templates/product/list.html +++ b/essenza/templates/product/list.html @@ -165,20 +165,16 @@ /* CLAVE: Aplica FLEX al header para separar los grupos */ display: flex; - justify-content: space-between; /* Separa left-group del profile-dropdown */ + justify-content: space-between; align-items: center; - /* CLAVE: Añade padding a los lados para crear el margen visible */ padding: 14px 20px; } - /* ELIMINAMOS .header-inner (ya no es necesario) */ - - /* NUEVO: Contenedor para agrupar (i + ESSENZA + Buscar) */ .left-group { display: flex; align-items: center; - gap: 15px; /* Espacio entre los elementos i, ESSENZA y Buscar... */ + gap: 15px; } .info-button {