litellm/tests/unit/AGENTS.md
Mateo Wang 08f04fbc97
test(interactions): read the spec from a vendored snapshot and canary the live one daily (#48002)
* test(interactions): assert the live status enum is parsable instead of pinning it

* test(interactions): read the spec from a vendored snapshot and canary the live one daily

* test(interactions): run the canary on PRs touching its inputs, file an issue on a red run, pin the regenerate command

* test(interactions): take the live spec URL as a pytest option, assert its source, split the canary's tracking-issue job

* test(interactions): file the canary issue whenever its compliance step did not pass, match the issue title exactly, cover UrlContextResult
2026-10-23 17:20:40 +00:00

1.8 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

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