litellm/tests/unit/AGENTS.md
devin-ai-integration[bot] a2ef18b257
test(unit): keep unix socket paths in unit tests under the macOS AF_UNIX limit (#45040)
* test(proxy): keep the spend sidecar socket path under the macOS AF_UNIX limit

* test(unit): share the short socket fixtures across unit tests

Move socket_dir and socket_path to tests/unit/conftest.py so the datadog
redis test's absent socket fails for the right reason on a Mac, rename
the pgbouncer helper's directory argument, and record the rule in
tests/unit/AGENTS.md

* test(unit): fall back to /tmp when TMPDIR leaves no room for a socket path

socket_dir now uses /tmp when TMPDIR plus the longest socket suffix
would pass macOS's sun_path limit, and its teardown ignores errors so a
failed test reports only its own failure

* test(unit): keep socket fixtures inside tmp_path behind a short link

socket_dir now links a short temp directory to tmp_path, so artifacts keep
pytest's retention and a killed run leaks only an empty link. The fallback
to /tmp counts the temp directory in bytes, and socket_tempdir points
tempfile at it for the pooler tests whose socket directory production picks

---------

Co-authored-by: mateo-berri <277851410+mateo-berri@users.noreply.github.com>
2026-10-28 20:23:22 -07:00

2.1 KiB

tests/unit

In-process. No network or subprocess. interactions/test_openapi_compliance.py reads the spec snapshot beside it, and only the interactions-spec-canary workflow passes --interactions-spec-url (registered in interactions/conftest.py, so name that file or directory on the command line) with ai.google.dev allowed, to run the same tests against Google's live spec

Unit tests must not depend on the current time or execution speed. Use fixed timestamps for fixtures and controlled clocks for time-dependent behavior. Incidental clock reads inside production code are allowed

A unix socket goes under the socket_dir or socket_path fixture, never tmp_path, whose paths run past macOS's 104-byte AF_UNIX limit and fail only on a Mac. Code that opens a socket in its own tempfile directory runs under socket_tempdir

What good looks like

def test_send_result_same_version_is_identity_passthrough():
    rpc = _rpc(V03_MESSAGE)
    out = normalize_jsonrpc_response(rpc, "0.3", method="message/send")
    assert out is rpc

is, because == passes on a copy. Many inputs: parametrize (test_an_incomplete_reservation_accrues_nothing, fifteen cases, fifteen results)

No doubles on our own code

with patch.object(streamer, "_group_by_date") as mock_group, patch.object(streamer, "_send_daily_batch") as mock_send:
    mock_group.return_value = {"2025-01-19": pl.DataFrame({"test": ["data1"]}), "2025-01-20": pl.DataFrame({"test": ["data2"]})}
    streamer.send_batched(pl.DataFrame({"test": ["data"]}), "replace_hourly")
    assert mock_send.call_count == 2

Green if send_batched drops every row. pydantic doubles in 12 of 203 files, fastapi 11 of 594. tests/test_litellm 59 percent. Exception: the count is the behaviour (test_dual_cache_async_batch_get_cache_coalesces_concurrent_redis_reads, fifty readers, call_count == 1)

Where it goes

tests/unit/<path> mirrors litellm/<path>, so a changed file selects its tests by path, not a mapping file. New unit tests go here

Writing it so a human can read it

A class only when tests share an arrange