import datetime as dt

from fastapi.testclient import TestClient

from flyway.api.main import create_app
from flyway.models import PackingSlip


def test_unique_violation_becomes_business_error(factory):
    """并发下“先查后写”会漏过重复；数据库唯一索引兜底时应返回 400 业务错误而不是 500。"""
    app = create_app()

    @app.post("/test-duplicate")
    def duplicate():
        with factory() as s, s.begin():
            for _ in range(2):
                s.add(PackingSlip(reference="PS-1", date=dt.datetime.now(dt.UTC), from_location="F",
                                  from_rmp="S", to_location="T", to_rmp="R"))
                s.flush()

    with TestClient(app, raise_server_exceptions=False) as c:
        r = c.post("/test-duplicate")
    assert r.status_code == 400
    assert r.json()["field"] == "reference"
