← the record

Audit 74a0eb67f3d2

pdbethke/starlette, scoped to starlette, at 1a3a401c0d: the project's own tests caught 33 of 40 planted faults, 7 got through, and corral proved 7 of those missing tests by writing a test and running it.

repo
https://github.com/pdbethke/starlette
scope
starlette (--path: only files under it were considered)
commit
1a3a401c0d33920b7c8b1541fb89784976a41a96
corral
v1.0.0-rc.27
substrate
jail · container
image
corral-campaign/starlette:1@sha256:11855f76ec8cdffdbe9fb1fec9ff6b2ce3361ccea993bbe75e5c138065a955e7
seats
critic: claude-code:claude-sonnet-5-5 [2.1.306 (Claude Code)]
mutant-generator: claude-code:claude-opus-5-5 [2.1.306 (Claude Code)]
test-writer: codex [codex-cli 0.163.0]
test-writer-shadow: claude-code:claude-opus-5-5 [2.1.306 (Claude Code)]
tokens
501.7k in, 17.0k out, 24 calls
started
2026-10-21 17:36 UTC
not audited
28 ungoaled · 5 ambiguous-test · 1 imported at load time — no test exercises it directly · 1 no-language · 1 uncovered — no test executes this file

starlette/datastructures.py

0.82kill rate, 95% interval 0.68–0.91 (n=40 distinct)
33 of 40caught by the project's tests
7got through
7proven missing tests
language
python
status
certified
the tests corral wrote
from __future__ import annotations
import pytest
from starlette.datastructures import MultiDict
from starlette.datastructures import MutableHeaders

def test_corral_multidict_deletion_preserves_unrelated_entries() -> None:
    data = MultiDict(
        [
            ("keep", "first"),
            ("remove", "one"),
            ("keep", "second"),
            ("remove", "two"),
            ("other", "last"),
        ]
    )

    del data["remove"]

    assert data.multi_items() == [
        ("keep", "first"),
        ("keep", "second"),
        ("other", "last"),
    ]
    assert data.getlist("keep") == ["first", "second"]
    assert data["keep"] == "second"
    assert data["other"] == "last"
    assert data.getlist("remove") == []
    assert "remove" not in data
    with pytest.raises(KeyError):
        data["remove"]

def test_corral_update_replaces_duplicate_headers_in_first_position() -> None:
    headers = MutableHeaders(
        raw=[
            (b"x-before", b"before"),
            (b"x-token", b"stale-first"),
            (b"x-between", b"between"),
            (b"x-token", b"stale-second"),
            (b"x-after", b"after"),
        ]
    )

    headers.update({"X-ToKeN": "replacement", "X-New": "new"})

    assert headers["X-TOKEN"] == "replacement"
    assert headers.getlist("x-token") == ["replacement"]
    assert headers.raw == [
        (b"x-before", b"before"),
        (b"x-token", b"replacement"),
        (b"x-between", b"between"),
        (b"x-after", b"after"),
        (b"x-new", b"new"),
    ]
    with pytest.raises(KeyError):
        headers["x-missing"]

def test_corral_delete_header_removes_all_interleaved_duplicates() -> None:
    headers = MutableHeaders(
        raw=[
            (b"x-keep", b"first"),
            (b"authorization", b"Bearer first"),
            (b"x-middle", b"middle"),
            (b"authorization", b"Bearer second"),
            (b"authorization", b"Bearer third"),
            (b"x-last", b"last"),
        ]
    )

    del headers["AuThOrIzAtIoN"]

    assert headers.getlist("AUTHORIZATION") == []
    assert "authorization" not in headers
    with pytest.raises(KeyError):
        headers["Authorization"]
    assert headers.raw == [
        (b"x-keep", b"first"),
        (b"x-middle", b"middle"),
        (b"x-last", b"last"),
    ]

def test_corral_setlist_indexes_last_replacement_value() -> None:
    values = MultiDict([("role", "old"), ("other", "preserved"), ("role", "stale")])

    values.setlist("role", ["reader", "editor", "admin"])

    assert values["role"] == "admin"
    assert values.getlist("role") == ["reader", "editor", "admin"]
    assert values["other"] == "preserved"
    assert values.poplist("role") == ["reader", "editor", "admin"]
    assert values.getlist("role") == []
    with pytest.raises(KeyError):
        values["role"]

def test_corral_ior_rejects_nonmapping_list_with_items() -> None:
    class CorralListWithItems(list):
        def items(self) -> list[tuple[str, str]]:
            return [("X-Security", "overwritten")]

    headers = MutableHeaders({"X-Security": "original"})
    original = headers.raw[:]
    original_headers = headers
    operand = CorralListWithItems([("X-Security", "overwritten")])

    with pytest.raises(TypeError):
        headers |= operand

    assert headers is original_headers
    assert headers.raw == original

def test_corral_setdefault_returns_existing_header_value() -> None:
    headers = MutableHeaders(raw=[(b"x-token", b"original"), (b"x-token", b"duplicate")])
    before = list(headers.raw)

    assert headers.setdefault("X-ToKeN", "replacement") == "original"
    assert headers.raw == before
    assert headers.getlist("X-TOKEN") == ["original", "duplicate"]
    assert headers.setdefault("X-New", "created") == "created"
    assert headers["x-new"] == "created"

def test_corral_header_union_rejects_non_mapping_sequences() -> None:
    headers = MutableHeaders({"X-Original": "preserved"})
    original_raw = headers.raw[:]

    merged = headers | {"X-Added": "new"}
    assert isinstance(merged, MutableHeaders)
    assert merged is not headers
    assert merged["x-added"] == "new"
    assert headers.raw == original_raw

    for non_mapping in ([], (), [("X-Added", "new")], (("X-Added", "new"),)):
        with pytest.raises(TypeError):
            headers | non_mapping
        assert headers.raw == original_raw

The faults that got through

A proven fault was caught by a test corral wrote and ran; an unproven one was not, so it may be a missing test or a fault no test can see.

s0/m5 · line 342 proven

- self._list = [(k, v) for k, v in self._list if k != key]
+ self._list = [(k, v) for k, v in self._list if k != key][1:] if any(k == key for k, _ in self._list) else self._list

s5/m4 · line 376 proven

- self._dict[key] = values[-1]
+ self._dict[key] = values[0]

s5/m1 · line 623 proven

+ break

s6/m2 · line 629 proven

- if not isinstance(other, Mapping):
+ if not isinstance(other, (Mapping, list, tuple)):

s7/m4 · line 636 proven

- if not isinstance(other, Mapping):
+ if not isinstance(other, (Mapping, list, tuple)):

s7/m3 · line 655 proven

- return item_value.decode("latin-1")
+ return value

s3/m5 · line 660 proven

- self[key] = val
+ self.append(key, val)