fix(audit): corrige errores criticos y mayores, mejora UX/accesibilidad y optimiza rendimiento
- Arregla @require_auth, permisos, race conditions, locks de caja/stock - Elimina N+1 en layaway, flotilla, dashboard y global_invoice - Asegura folios atomicos para CFDI, ordenes de servicio y polizas - Protege client_secret de MercadoLibre en backend - Conecta botones/filtros de config, customers, accounting e invoicing - Mejora accesibilidad (labels/aria-label) y estados de carga/vacio - Limpia accounting.js obsoleto y consolida accounting.v9.js - Actualiza cache busting a v32 y Service Worker a v32 - Documenta todo en docs/AUDIT_Y_MEJORAS_2026-06-15.md Tests: 35 passed
This commit is contained in:
@@ -64,17 +64,20 @@ def conn():
|
||||
return MockConn(MockCursor())
|
||||
|
||||
|
||||
def test_generate_order_number_first_of_year(conn):
|
||||
def test_generate_order_number_first_of_day(conn):
|
||||
conn._cursor.responses = [(None,)]
|
||||
number = engine._generate_order_number(conn)
|
||||
assert number.startswith("SO-")
|
||||
assert number.endswith("-0001")
|
||||
# Format DDMMYYYY-N
|
||||
assert len(number.split("-")) == 2
|
||||
assert number.split("-")[1] == "1"
|
||||
|
||||
|
||||
def test_generate_order_number_increments(conn):
|
||||
conn._cursor.responses = [("SO-2026-0042",)]
|
||||
from datetime import datetime
|
||||
today = datetime.utcnow().strftime('%d%m%Y')
|
||||
conn._cursor.responses = [(f"{today}-42",)]
|
||||
number = engine._generate_order_number(conn)
|
||||
assert number.endswith("-0043")
|
||||
assert number == f"{today}-43"
|
||||
|
||||
|
||||
@mock.patch("services.inventory_engine.get_stock", return_value=10)
|
||||
@@ -82,11 +85,11 @@ def test_generate_order_number_increments(conn):
|
||||
def test_reserve_item_inserts_so_reserve_and_updates_quantity(mock_record, mock_stock, conn):
|
||||
|
||||
conn._cursor.responses = [
|
||||
(1, 5, 3, "pending", "SO-2026-0001"), # item lookup
|
||||
(1, 5, 3, "pending", "SO-2026-0001", 2), # item lookup (branch_id=2)
|
||||
None, # update
|
||||
]
|
||||
|
||||
result = engine.reserve_item(conn, 7, branch_id=2, employee_id=9)
|
||||
result = engine.reserve_item(conn, 7, branch_id=99, employee_id=9)
|
||||
|
||||
assert result["reserved"] == 3
|
||||
mock_stock.assert_called_once_with(conn, 5, 2)
|
||||
@@ -99,11 +102,11 @@ def test_reserve_item_inserts_so_reserve_and_updates_quantity(mock_record, mock_
|
||||
@mock.patch("services.inventory_engine.get_stock", return_value=1)
|
||||
def test_reserve_item_raises_when_insufficient_stock(mock_stock, conn):
|
||||
conn._cursor.responses = [
|
||||
(1, 5, 3, "pending", "SO-2026-0001"),
|
||||
(1, 5, 3, "pending", "SO-2026-0001", 2),
|
||||
]
|
||||
|
||||
with pytest.raises(ValueError, match="Insufficient stock"):
|
||||
engine.reserve_item(conn, 7, branch_id=2)
|
||||
engine.reserve_item(conn, 7, branch_id=99)
|
||||
|
||||
|
||||
@mock.patch("services.inventory_engine.record_operation", return_value=124)
|
||||
|
||||
Reference in New Issue
Block a user