feat: create/edit product views

This commit is contained in:
2026-07-23 16:19:19 +02:00
parent 2a9407e676
commit 1d11ea9b6e
16 changed files with 574 additions and 175 deletions
+9 -38
View File
@@ -17,53 +17,24 @@ class TestBackofficeHtmxContract(TestCase, CreateProductsMixin):
self.client.force_login(self.superuser)
self.product = self.create_product()
def test_htmx_get_create_form_returns_fragment_not_full_page(self):
def test_product_create_is_a_full_page_not_a_modal_fragment(self):
# ProductCreateView ya no es modal: navegar a la URL de creación siempre
# devuelve la página completa, incluso si la petición lleva HX-Request.
response = self.client.get(reverse('backoffice:product_create'), HTTP_HX_REQUEST='true')
assert response.status_code == 200
body = response.content.decode()
assert '<html' not in body
assert 'Añadir producto' in body
assert '<html' in body
assert 'Nuevo producto' in body
def test_htmx_create_success_returns_204_and_triggers_modal_close_and_refresh(self):
def test_product_create_redirects_to_detail_even_with_hx_request(self):
response = self.client.post(
reverse('backoffice:product_create'),
{
'sku': 'HTMX-1',
'name': 'Producto htmx',
'description': '',
'stock': '0',
'categories': [],
'tags': [],
},
{'sku': 'HTMX-1', 'name': 'Producto htmx', 'description': '', 'stock': '0'},
HTTP_HX_REQUEST='true',
)
assert response.status_code == 204
trigger = json.loads(response['HX-Trigger'])
assert trigger == {'backoffice:modal-close': True, 'backoffice:list-changed': True}
assert Product.objects.filter(sku='HTMX-1').exists()
def test_htmx_create_invalid_returns_200_with_errors_not_204(self):
response = self.client.post(
reverse('backoffice:product_create'),
{'sku': '', 'name': '', 'description': '', 'stock': '0', 'categories': [], 'tags': []},
HTTP_HX_REQUEST='true',
)
assert response.status_code == 200
assert 'HX-Trigger' not in response
def test_non_htmx_create_still_redirects(self):
response = self.client.post(
reverse('backoffice:product_create'),
{
'sku': 'PLAIN-1',
'name': 'Producto normal',
'description': '',
'stock': '0',
'categories': [],
'tags': [],
},
)
product = Product.objects.get(sku='HTMX-1')
assert response.status_code == 302
assert response.url == reverse('backoffice:product_detail', args=[product.pk])
assert 'HX-Trigger' not in response
def test_htmx_variant_create_triggers_refresh(self):