Problem
The existing ~400 integration tests cover happy-path scenarios well, but several error paths and edge cases are not exercised. These are the categories most likely to produce 500s or incorrect behavior in production.
Gaps to address
Query option error handling (should return 400, not 500)
ETag edge cases
Expand depth
Pagination interaction
Auth failure scenarios
Concurrency
$search
Acceptance criteria
Problem
The existing ~400 integration tests cover happy-path scenarios well, but several error paths and edge cases are not exercised. These are the categories most likely to produce 500s or incorrect behavior in production.
Gaps to address
Query option error handling (should return 400, not 500)
$topwith a non-integer value (?$top=abc)$skipwith a negative value (?$skip=-1)$topexceedingMaxTopconfiguration$filterreferencing a property that doesn't exist on the model$orderbywith an invalid direction keywordETag edge cases
If-Match: *wildcard — must match any existing ETag (OData spec §8.2.5)If-None-Match: *— must fail if entity exists (use with DELETE)If-Matchheader (If-Match: "a", "b")If-None-Matchon GET returns 304 when ETag matchesExpand depth
$expandon a property that isn't registered as a navigation route returns 400$expand(e.g.,$expand=Orders($expand=Items)) doesn't stack overflowPagination interaction
$count=truecombined with$top/$skip— count reflects the unfiltered total, not the page sizePrefer: maxpagesize=NwithGetQueryablepathnextLinkin response is a valid, followable URLAuth failure scenarios
RequireAuthorization()entity set returns 401Concurrency
$searchSearchhandler configured — returns filtered resultsSearchhandler not configured — returns 501Acceptance criteria