graphql-api-testing
Test GraphQL APIs with repeatable, file-based operations and variables under <project>/setup/graphql, with per-project endpoint presets in setup/graphql/endpoints.env, using the bundled gql.sh (xh/httpie/curl + jq). Use when the user asks to manually call GraphQL queries/mutations, fetch JWTs, replay requests reliably, and record API test reports.
Installation
Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.
View source ↗GuidesSkill instructions
GraphQL API Testing
Contract
Prereqs:
-
bashandjqavailable onPATH. - HTTP client:
xhorhttporcurl. -
setup/graphql/exists (or bootstrap from template) with operations, vars, and optional endpoint/jwt presets.
Inputs:
- Operation + variables:
setup/graphql/operations/<op>.graphqlandsetup/graphql/operations/<vars>.json. - Optional flags/env:
--env,--url,--jwt,--config-dir,--no-history(plusGQL_URL,ACCESS_TOKEN).
Outputs:
- Response JSON printed to stdout; errors printed to stderr.
- Optional history file under
setup/graphql/.gql_history(gitignored; disabled via--no-history). - Optional markdown report via
$CODEX_HOME/skills/tools/testing/graphql-api-testing/scripts/gql-report.sh.
Exit codes:
-
0: request completed successfully - non-zero: invalid inputs/missing files/http error/client error
Failure modes:
- Missing supported HTTP client (
xh/http/curl). - Invalid GraphQL/variables JSON, or missing config files.
- Auth missing/invalid (JWT) or network/timeout/connection failures.
Goal
Make GraphQL API calls reproducible via:
-
setup/graphql/operations/*.graphql+*.json(operations + variables) -
setup/graphql/endpoints.env(+ optionalendpoints.local.env) -
setup/graphql/jwts.env(+ optionaljwts.local.env) -
setup/graphql/schema.env(+ committed schema SDL, e.g.schema.gql) -
setup/graphql/prompt.md(optional, committed; project context for LLMs: what to test, DB tooling, other test utilities)
TL;DR (fast paths)
Call an existing operation:
$CODEX_HOME/skills/tools/testing/graphql-api-testing/scripts/gql.sh \
--env local \
--jwt default \
setup/graphql/operations/<operation>.graphql \
setup/graphql/operations/<variables>.json \
| jq .
Generate a report (includes a replayable ## Command by default):
$CODEX_HOME/skills/tools/testing/graphql-api-testing/scripts/gql-report.sh \
--case "<test case name>" \
--op setup/graphql/operations/<operation>.graphql \
--vars setup/graphql/operations/<variables>.json \
--env local \
--jwt default \
--run
Generate a report from a copied gql.sh command snippet (no manual rewriting):
$CODEX_HOME/commands/api-report-from-cmd '<paste a gql.sh command snippet>'
If your repo bootstrapped setup/graphql/ from the template, you can also use:
-
setup/graphql/api-report-from-cmd.sh '<paste a gql.sh command snippet>'
Replay the last run (history):
$CODEX_HOME/skills/tools/testing/graphql-api-testing/scripts/gql-history.sh --command-only
Resolve committed schema SDL (for LLMs to author new operations):
$CODEX_HOME/skills/tools/testing/graphql-api-testing/scripts/gql-schema.sh --config-dir setup/graphql
Flow (decision tree)
- If
setup/graphql/prompt.mdexists → read it first for project-specific context. - No
setup/graphql/yet → bootstrap from template: -
cp -R "$CODEX_HOME/skills/tools/testing/graphql-api-testing/assets/scaffold/setup/graphql" setup/ - Have schema but no operation yet → resolve schema (
gql-schema.sh) then addsetup/graphql/operations/<name>.graphql+ variables json. - Have operation → run with
gql.sh. - Need a markdown report → use
gql-report.sh --run(or--response).
Notes (defaults)
- History is on by default:
setup/graphql/.gql_history(gitignored); one-off disable with--no-history(orGQL_HISTORY_ENABLED=false). - Reports include
## Commandby default; disable with--no-command(orGQL_REPORT_INCLUDE_COMMAND_ENABLED=false). - Variables: any numeric
limitfields (including nested pagination inputs) are normalized to at leastGQL_VARS_MIN_LIMIT(default: 5; setGQL_VARS_MIN_LIMIT=0to disable). - Prefer
--config-dir setup/graphqlin automation for deterministic discovery.
CI / E2E (optional)
In CI, use gql.sh as the runner and jq -e as assertions (exit code is the contract):
set -euo pipefail
$CODEX_HOME/skills/tools/testing/graphql-api-testing/scripts/gql.sh \
--config-dir setup/graphql \
--env staging \
--jwt ci \
setup/graphql/operations/<operation>.graphql \
setup/graphql/operations/<variables>.json \
| jq -e '(.errors? | length // 0) == 0 and .data != null' >/dev/null
Notes:
- Many GraphQL servers return HTTP 200 even when
.errorsis present, so assert it explicitly. - If you don’t want CI jobs to write history, add
--no-history(or setGQL_HISTORY_ENABLED=false).
References
- Full guide (project template):
skills/tools/testing/graphql-api-testing/references/GRAPHQL_API_TESTING_GUIDE.md - Report contract:
skills/tools/testing/graphql-api-testing/references/GRAPHQL_API_TEST_REPORT_CONTRACT.md - Report template:
skills/tools/testing/graphql-api-testing/references/GRAPHQL_API_TEST_REPORT_TEMPLATE.md
Examples
Read the usage examples in the source repository.
View source ↗Source history
- Indexed on
- 2026-01-20
- Index updated
- 2026-02-02
- Branch
- main
Index and sync dates describe this directory. View the source repository for code history.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!