Refactor test setup to utilize ephemeral tenant IDs

- Introduced a new fixture, `test_tenant`, to allocate ephemeral tenant and company IDs for tests, reducing conflicts with real data.
- Updated various test functions to use the new `test_tenant` fixture, ensuring consistent tenant ID usage across tests.
- Enhanced the `ensure_tenant_company` function to accept dynamic tenant and company IDs, improving flexibility in test scenarios.
- Adjusted database interaction in tests to utilize the ephemeral IDs, streamlining the setup process and enhancing isolation.
This commit is contained in:
2026-03-24 17:24:01 -05:00
parent 1150b59dcf
commit 06b3b20fd8
8 changed files with 136 additions and 56 deletions

View File

@@ -7,11 +7,11 @@ from api.v1.modules.a76.invoices.exports.process import main_process as export_m
from api.v1.modules.a76.invoices.imports.process import main_process as import_main
from core.exceptions import ValidationException
from tests.fixtures.builders import (
EphemeralOrgIds,
create_business_catalogs,
create_export_invoice_with_line,
create_import_invoice_with_line,
ensure_reference_data,
ensure_tenant_company,
)
@@ -44,27 +44,30 @@ def _patch_export_pipeline(monkeypatch, export_line):
monkeypatch.setattr(export_main, "review_qty_series", lambda *args, **kwargs: None)
def _prepare_inventory(client, db_session, monkeypatch):
def _prepare_inventory(client, db_session, monkeypatch, test_tenant: EphemeralOrgIds):
tid, cid = test_tenant.tenant_id, test_tenant.company_id
ensure_reference_data(db_session)
ensure_tenant_company(db_session, tenant_id=1, company_id=1)
catalogs = create_business_catalogs(db_session, tenant_id=1, company_id=1)
catalogs = create_business_catalogs(db_session, tenant_id=tid, company_id=cid)
import_invoice, import_line = create_import_invoice_with_line(
db_session, 1, 1, catalogs, invoice_type="TEM", invoice_number="IMP-EXP-01", qty=Decimal("10")
db_session, tid, cid, catalogs, invoice_type="TEM", invoice_number="IMP-EXP-01", qty=Decimal("10")
)
_patch_import_pipeline(monkeypatch, import_line)
resp = client.post(f"/api/v1/a76/invoices/{import_invoice.id}/process?company_id=1")
resp = client.post(f"/api/v1/a76/invoices/{import_invoice.id}/process?company_id={cid}")
assert resp.status_code == 200
return catalogs, import_invoice, import_line
def test_process_export_endpoint_consumes_existing_balances(client, db_session, monkeypatch):
catalogs, import_invoice, import_line = _prepare_inventory(client, db_session, monkeypatch)
def test_process_export_endpoint_consumes_existing_balances(client, db_session, monkeypatch, test_tenant):
catalogs, import_invoice, import_line = _prepare_inventory(
client, db_session, monkeypatch, test_tenant
)
tid, cid = test_tenant.tenant_id, test_tenant.company_id
export_invoice, export_line = create_export_invoice_with_line(
db_session, 1, 1, catalogs, import_invoice, import_line, qty=Decimal("3")
db_session, tid, cid, catalogs, import_invoice, import_line, qty=Decimal("3")
)
_patch_export_pipeline(monkeypatch, export_line)
resp = client.post(f"/api/v1/a76/invoices/{export_invoice.id}/process?company_id=1")
resp = client.post(f"/api/v1/a76/invoices/{export_invoice.id}/process?company_id={cid}")
assert resp.status_code == 200
consumptions = (
@@ -78,15 +81,18 @@ def test_process_export_endpoint_consumes_existing_balances(client, db_session,
assert consumptions
def test_process_export_prevents_negative_balance(client, db_session, monkeypatch):
catalogs, import_invoice, import_line = _prepare_inventory(client, db_session, monkeypatch)
def test_process_export_prevents_negative_balance(client, db_session, monkeypatch, test_tenant):
catalogs, import_invoice, import_line = _prepare_inventory(
client, db_session, monkeypatch, test_tenant
)
tid, cid = test_tenant.tenant_id, test_tenant.company_id
export_invoice, export_line = create_export_invoice_with_line(
db_session, 1, 1, catalogs, import_invoice, import_line, qty=Decimal("99")
db_session, tid, cid, catalogs, import_invoice, import_line, qty=Decimal("99")
)
_patch_export_pipeline(monkeypatch, export_line)
with pytest.raises(ValidationException):
client.post(f"/api/v1/a76/invoices/{export_invoice.id}/process?company_id=1")
client.post(f"/api/v1/a76/invoices/{export_invoice.id}/process?company_id={cid}")
# Debe no crear consumos al existir insuficiencia de saldo.
consumptions = (
@@ -100,19 +106,19 @@ def test_process_export_prevents_negative_balance(client, db_session, monkeypatc
assert consumptions == []
def test_process_endpoint_prevents_double_processing_import(client, db_session, monkeypatch):
def test_process_endpoint_prevents_double_processing_import(client, db_session, monkeypatch, test_tenant):
tid, cid = test_tenant.tenant_id, test_tenant.company_id
ensure_reference_data(db_session)
ensure_tenant_company(db_session, tenant_id=1, company_id=1)
catalogs = create_business_catalogs(db_session, tenant_id=1, company_id=1)
catalogs = create_business_catalogs(db_session, tenant_id=tid, company_id=cid)
invoice, line = create_import_invoice_with_line(
db_session, 1, 1, catalogs, invoice_type="TEM", invoice_number="IMP-DOUBLE-01", qty=Decimal("5")
db_session, tid, cid, catalogs, invoice_type="TEM", invoice_number="IMP-DOUBLE-01", qty=Decimal("5")
)
_patch_import_pipeline_without_prevalidators(monkeypatch)
first = client.post(f"/api/v1/a76/invoices/{invoice.id}/process?company_id=1")
first = client.post(f"/api/v1/a76/invoices/{invoice.id}/process?company_id={cid}")
assert first.status_code == 200
with pytest.raises(ValidationException):
client.post(f"/api/v1/a76/invoices/{invoice.id}/process?company_id=1")
client.post(f"/api/v1/a76/invoices/{invoice.id}/process?company_id={cid}")
# No debe duplicar entradas para la misma factura/línea procesada.
entries = (