Install
openclaw skills install openapi-parserParses complex OpenAPI specs and generates Drift test cases from them. Use whenever the user wants to generate, write, or scaffold Drift tests from an OpenAPI spec — especially when the spec contains complex schemas: anyOf/oneOf/allOf, discriminators, polymorphism, inheritance, $ref chains, regex patterns, enums, or optional fields. Use when the user asks to "create tests for an endpoint", "cover all response variants", "generate test cases from the spec", or says anything like "each viable combination of responses". Use when the user is trying to understand what values are valid for a complex schema field, or when they paste a spec path and ask what tests to write.
openclaw skills install openapi-parserreferences/schema-patterns.md — how to interpret and enumerate every complex pattern
(anyOf / oneOf / allOf / discriminator / $ref / enum / pattern / nullable / optional),
with real examples from snyk, digitalocean, posthog, and front/core specsreferences/drift-mapping.md — how to map enumerated schema variants to Drift YAML,
including datasets, expressions, lifecycle hooks for stateful cases, and expected
response matchers for each pattern typeOpenAPI version: This skill targets OpenAPI 3.x. Swagger 2.0 specs use the same structural patterns (
$ref,allOf,oneOf) but different envelope syntax — you may need to adapt field names manually. If working from thekonfig-sdks/openapi-examplescollection, seereferences/example-repos.mdfor navigation commands.
Extract only what's needed:
# Find the line number of the endpoint (macOS/Linux/Git Bash/WSL)
grep -n "^ /path/to/endpoint" spec.yaml
# Read just that block (adjust line range as needed)
# Then follow each $ref to components/schemas
grep -n "SchemaName:" spec.yaml
# PowerShell equivalents (Windows)
Select-String -Path spec.yaml -Pattern "^ /path/to/endpoint" | Select-Object LineNumber, Line
Select-String -Path spec.yaml -Pattern "SchemaName:" | Select-Object LineNumber, Line
Extract: path/query/header parameters, request body schema, and each response status code's schema.
Foo: in the spec to find its definition blockstring, integer, boolean, array, object)allOf: [$ref: Base, properties: {...}] is inheritance — merge Base fields with local
properties to get the full schema. See references/schema-patterns.md for all patterns.
For each response status code, enumerate structurally distinct schema variants. Aim for minimum tests that maximise schema coverage — not a combinatorial explosion of optional field permutations.
| Pattern | Tests to generate |
|---|---|
oneOf / anyOf with N branches | N tests — one per branch |
discriminator with N mapping values | N tests — one per discriminator value |
allOf (composition / inheritance) | 1 test — merge all schemas into one payload |
enum | 1 test covers it; add boundary variants only if the value drives behaviour |
| Optional field cluster | 2 tests: one with all optional fields, one without |
nullable field | Covered by happy path; add null variant only if it changes behaviour |
pattern (regex) | 1 valid example matching the pattern; 1 invalid for negative testing |
For each combination produce a Drift operation block. See references/drift-mapping.md
for full patterns. Key conventions:
{operationId}_{variant} — e.g. getImage_byId, getImage_bySluganyOf path parameters, write one test per type variantdataset for test data; use inline parameters only for static, non-variant values (e.g. a fixed enum query param like type: user)exclude: [auth] and pass an invalid bearer token explicitlyignore: { schema: true } to any operation that sends an intentionally invalid request bodybody from expected lets Drift validate the response against the OpenAPI schema automatically; add explicit body matchers only when asserting a specific field value (e.g. the discriminator property came back correctly)Always produce:
operations: block, ready to pastedatasets: block for any referenced test dataGiven GET /v2/images/{image_id} where image_id: anyOf: [integer, string]:
operations:
getImage_byId:
target: source-oas:getImage
tags: [images, param-integer]
parameters:
path:
image_id: ${image-data:images.existing.id}
expected:
response:
statusCode: 200
getImage_bySlug:
target: source-oas:getImage
tags: [images, param-string]
parameters:
path:
image_id: ${image-data:images.existing.slug}
expected:
response:
statusCode: 200
getImage_notFound:
target: source-oas:getImage
parameters:
path:
image_id: ${image-data:notIn(images.*.id)}
expected:
response:
statusCode: 404