#[non_exhaustive]pub enum Scenario {
Show 24 variants
ValidStructured,
MalformedJson,
UnknownField,
MissingField,
MultipleActs,
ToolCallIds,
StreamingReconstruction,
CachedUsage,
EmptyOutput,
Refusal,
SlowResponse,
RateLimited,
Authentication,
ContextOverflow,
SecretInBody,
Authorization,
ModelNotFound,
RequestTimeout,
InvalidRequest,
ServerError,
ServiceUnavailable,
ContentFilter,
ExpiredCredential,
QuotaExhausted,
}Expand description
One provider behaviour the suite needs a mock for.
A fixture translates a scenario into vendor framing: the endpoint, the body
shape, the status code. What the body says comes from payloads.
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
ValidStructured
A schema-conformant one-act plan: payloads::valid_plan.
MalformedJson
A body that is not JSON: payloads::MALFORMED_JSON.
UnknownField
A two-act plan whose second act carries a forbidden field:
payloads::plan_with_unknown_field.
MissingField
A two-act plan whose second act lacks a required field:
payloads::plan_with_missing_field.
MultipleActs
A well-formed two-act plan: payloads::two_act_plan.
ToolCallIds
A single tool call named payloads::TOOL_NAME with id
payloads::EXPECTED_CALL_ID.
StreamingReconstruction
The same answer available both whole and streamed, so the suite can compare them. Mount both: the fixture distinguishes them by the streaming flag the adapter puts on the wire.
Three rows read this scenario, and each asks something of the streamed half:
- it must reassemble into the whole answer, content and finish reason alike;
- it must deliver the prose in at least two wire events, or
Check::StreamingIncrementalcannot tell an adapter that streams from one that buffers the body and emits a single delta at the end; - it must report the same token usage as the whole half — which means both halves report usage at all, usually on a final frame.
CachedUsage
A successful answer whose reported usage carries a cache figure:
payloads::USAGE_INPUT_TOKENS prompt tokens of which
payloads::USAGE_CACHED_TOKENS came from the provider’s cache, and
payloads::USAGE_OUTPUT_TOKENS generated.
Mount the vendor’s own cache fields — prompt_tokens_details,
cache_read_input_tokens, cacheReadInputTokens,
cachedContentTokenCount — rather than inventing a shape, because the
row is about reading them correctly. The answer itself is prose; only
the counts matter.
EmptyOutput
A successful status with no usable content.
Refusal
The vendor’s refusal shape, carrying payloads::REFUSAL_TEXT.
SlowResponse
A successful answer delayed by payloads::SLOW_RESPONSE_DELAY, used
by both the timeout and the cancellation checks.
RateLimited
HTTP 429 with Retry-After: {} seconds
(payloads::RETRY_AFTER_SECONDS).
Authentication
HTTP 401 with the vendor’s authentication error body.
ContextOverflow
The vendor’s context-length error body.
SecretInBody
A body with payloads::DUMMY_API_KEY planted inside it, so the
redaction check has something specific to hunt for.
Authorization
HTTP 403: the credential is valid and not entitled to this model.
ModelNotFound
HTTP 404: the configured model does not exist at this provider.
RequestTimeout
HTTP 408: the provider gave up waiting on its own side.
InvalidRequest
HTTP 400 that is genuinely a bad request — not a context-length problem. Mount a body no reasonable adapter could mistake for one: these two rows exist to be told apart.
ServerError
HTTP 500.
HTTP 503.
ContentFilter
The vendor’s safety-filter shape, whether that is a failure body or a successful answer whose finish reason says the content was filtered.
ExpiredCredential
The vendor’s expired credential shape, whatever status carries it.
Mount the body a short-lived token produces once it lapses — usually a
401 with a code such as token_expired, distinguishable from the 401
Authentication mounts only by what the body
says.
QuotaExhausted
The vendor’s quota or billing shape, whatever status carries it.
Mount the body an exhausted quota or an empty credit balance produces.
If the vendor uses 429 for it — several do — mount the 429 with its real
body: telling it apart from RateLimited is the
point of the row.
Implementations§
Source§impl Scenario
impl Scenario
Sourcepub const ALL: [Scenario; 14]
pub const ALL: [Scenario; 14]
The scenarios behind the feature rows of Check::ALL.
A full run also mounts SecretInBody and every
scenario in STATUS.
Sourcepub const STATUS: [Scenario; 9]
pub const STATUS: [Scenario; 9]
The scenarios behind the per-status rows a fixture must also mount.
Authentication, RateLimited
and ContextOverflow already cover three of
the thirteen StatusRows, and StatusRow::ConnectionReset needs no
mock at all, so only these nine are new.
Trait Implementations§
impl Copy for Scenario
impl Eq for Scenario
Source§impl Ord for Scenario
impl Ord for Scenario
1.21.0 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
1.21.0 (const: unstable) · Source§fn min(self, other: Self) -> Selfwhere
Self: Sized,
fn min(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl PartialOrd for Scenario
impl PartialOrd for Scenario
impl StructuralPartialEq for Scenario
Auto Trait Implementations§
impl Freeze for Scenario
impl RefUnwindSafe for Scenario
impl Send for Scenario
impl Sync for Scenario
impl Unpin for Scenario
impl UnsafeUnpin for Scenario
impl UnwindSafe for Scenario
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.