Communitygithub.com

Pruebas de Contrato GraphQL

Úselo al escribir una consulta/mutación GraphQL que la interfaz de usuario y una prueba compartirán, o al construir pruebas de contrato de rutas/esquemas o pruebas de humo. Síntomas: copiar una consulta en una prueba, una prueba que afirma sobre el texto de la consulta, un cambio de esquema que no rompió la compilación de la UI, o desviación de RLS/permisos. Palabras clave: graphql-codegen, typed document, contract test, route smoke test.

¿Qué es Pruebas de Contrato GraphQL?

Este skill establece un enfoque disciplinado para las pruebas de contrato GraphQL que garantiza que tanto la interfaz de usuario como las pruebas consuman el mismo artefacto de consulta con tipo, eliminando la duplicación y detectando desviaciones en ambos sentidos: de base de datos a interfaz (en tiempo de compilación) y de interfaz a base de datos o permisos (en tiempo de ejecución). Es útil porque previene silenciosamente errores como la eliminación de un campo en el esquema o la fuga de datos a roles no autorizados, al enlazar la forma de los datos y las semánticas de acceso directamente al proceso de compilación y a las pruebas contra una base de datos sembrada. Funciona en cualquier plataforma que utilice GraphQL y codegen, como entornos con PostGraphile, y se basa en herramientas como graphql-codegen y tsc para la verificación en tiempo de compilación, más pruebas de contrato en tiempo de ejecución contra una base de datos de prueba real con diferentes roles. Este skill está diseñado para desarrolladores que mantienen sistemas basados en GraphQL y necesitan una estrategia de prueba robusta que evite los antipatrones de pruebas frágiles.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/lguidolin/agent-skills/tree/main/skills/graphql-contract-testing

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

¿Qué hace Pruebas de Contrato GraphQL?

Descripción general

Pruebas que se sitúan en la costura entre capas y se rompen cuando un lado se mueve sin el consentimiento del otro — tests-as-a-control aplicado a los límites. La regla cardinal: afirmar sobre el contrato — la forma de los datos y las semánticas de acceso que el consumidor depende — nunca sobre la cadena de consulta en sí misma. Una prueba que se rompe por una edición cosmética de consulta es un antipatrón de detector de cambios; una prueba que se rompe cuando la forma garantizada o el permiso se mueve es un control.

§1 — El Contrato de Consulta GraphQL

  • Cada operación se escribe una vez como un documento con tipo en una ubicación conocida, exportada para ser importada. La interfaz de usuario la importa; la prueba importa el mismo artefacto — nunca una copia reescrita. Copiar una consulta en una prueba mata silenciosamente el contrato (editar la consulta de la UI ya no rompe la prueba). DRY se vuelve crítico.
  • Se rompe en ambas direcciones, por construcción:
    • Deriva DB → UI, en tiempo de compilación. graphql-codegen genera tipos TypeScript a partir del esquema en vivo. Renombrar o eliminar un campo usado y tsc falla en cada uso y en el documento compartido — la compilación se rompe antes de que un usuario vea un panel en blanco. Esta es la razón por la que el codegen contra el esquema en vivo es obligatorio.
    • Deriva UI → DB / permisos, en tiempo de ejecución. El documento compartido se ejecuta contra una base de datos de prueba sembrada a través de la ruta de llamada real, bajo contexto de rol, afirmando sobre la forma devuelta y el resultado del acceso — no el texto de la consulta.
  • Las pruebas de contrato y la matriz de roles RLS son el mismo arnés. Ejecute el mismo documento a través de PostGraphile como rol A (espere datos) y rol B (espere denegado/vacío). Un mecanismo prueba tres cosas: la consulta aún coincide con el esquema, las suposiciones de la UI aún se mantienen, RLS aún aplica el límite.

Ejemplo práctico — cómo se detecta un error real

  • DB→UI: una migración elimina equipment.is_active. Codegen regenera desde el nuevo esquema; el tipo generado pierde el campo; tsc falla en el documento compartido y en cada componente que lo usa — detectado en la compilación, antes del merge. Ninguna prueba afirma "texto de consulta == X".
  • UI→DB: un desarrollador amplía la consulta de la UI para obtener cancellation_reason (RLS lo expone solo a roles elevados). La prueba de tiempo de ejecución que se ejecuta como un miembro común afirma la forma visible para el miembro, ahora recibe null/denegado, y falla — forzando "¿queríamos exponer esto?"

§2 — Pruebas de Contrato de Rutas y Pruebas de Humo

  • Rutas enumeradas desde una sola fuente. Cada ruta tiene una prueba de humo: se renderiza sin error + muestra un conjunto mínimo de elementos requeridos (un encabezado, un punto de referencia, un control clave — no interacción detallada).
  • Agregar/eliminar una ruta fuerza un cambio de prueba correspondiente — una nueva URL está incompleta sin su prueba de humo; una URL eliminada elimina su prueba. Las URLs nunca aparecen o desaparecen silenciosamente.
  • Explícitamente NO es pruebas detalladas de UI/interacción — deliberado, de alcance limitado. La pregunta es "¿esta URL funciona y renderiza lo esencial?", nada más.

Aplicación: graphql-codegen + tsc en CI (bloqueante) para la parte de tiempo de compilación; pruebas de contrato de tiempo de ejecución + pruebas de humo de rutas en CI contra una base de datos sembrada.

Justificación completa: Artículo XV de la constitución, empaquetado en engineering-constitution/references/engineering-constitution.md.

Individual skills in this repo

This repo contains 18 individual skills — each has its own dedicated page.

lguidolin/change-hygiene-and-code-craft

Use when writing or refactoring code, structuring a commit or PR, or deciding whether to abstract duplication. Symptoms — mixing reorg with logic changes, a PR doing several things at once, a file growing large, the second copy of similar code, or unsure whether to DRY something up.

lguidolin/cloud-delivery-aks

Use when deploying to Kubernetes or Azure Kubernetes Service (AKS), configuring cloud secrets, setting up progressive rollout/canary, per-PR ephemeral environments, or k8s health probes. Keywords — Kubernetes, AKS, Key Vault, Argo Rollouts, Flagger, canary, blue-green, liveness, readiness, PodDisruptionBudget, HPA, rollback, GHCR.

lguidolin/commit-history-rewrite

Use when an existing repository has messy commit history that needs to conform to conventional commits before adopting release-please, or when intermediate WIP/fixup/merge commits need to be cleaned up.

lguidolin/conventional-commits-and-releases

Use when committing, writing a commit message, opening a PR that will be squash-merged, or configuring automated versioning/changelogs. Keywords — conventional commits, release-please, semver, feat/fix/chore, breaking change, changelog.

lguidolin/defense-in-depth-security

Use when handling untrusted input, secrets, authentication/authorization, or dependencies — or threat-modeling a new surface. Keywords — STRIDE, threat model, least privilege, secrets management, supply chain, dependency scanning, input validation, audit log, defense in depth.

lguidolin/designing-before-building

Use when starting a feature, fixing a non-trivial bug, or about to write implementation code — before any code exists. Symptoms you need this: "this is simple, I'll just code it", reaching for the editor before a design is approved, or an idea that hasn't been turned into a spec and plan.

lguidolin/engineering-constitution

Use when starting work in a project that follows the engineering constitution, orienting to its rules, or deciding which engineering practice applies to a task — spec writing, commits, testing, security, deploys, database, or UI work.

lguidolin/init-repo-CI

Use when setting up a new repository with conventional commits, release-please, and CI automation, or when retrofitting an existing repository that lacks automated versioning and PR validation workflows.

lguidolin/interface-craft-and-accessibility

Use when building or styling UI — components, layouts, forms, design tokens — or making accessibility decisions. Keywords — a11y, WCAG, keyboard navigation, focus state, contrast, design system, minimalist UI, component reuse, ARIA, semantic HTML.

lguidolin/merge-gates-and-automation

Use when setting up or changing CI, pre-push hooks, or a task runner, or deciding what must pass before merge. Symptoms — tempted to put authoritative checks only in a local hook, skip CI, bypass with --no-verify, or unsure what gates a merge vs. runs locally.

lguidolin/observability-and-slos

Use when adding logging, metrics, tracing, health checks, SLOs, or alerting — or when building a service surface that needs to be operable and debuggable. Keywords — structured logs, OpenTelemetry, correlation id, RED metrics, liveness, readiness, SLI, SLO, error budget, alerting.

lguidolin/performance-and-scale

Use when working on hot paths, list endpoints, pagination, data-access in loops, or public interfaces/schemas. Symptoms — unbounded queries, N+1 access, no latency budget, optimizing without measuring, or changing an interface many consumers depend on. Keywords — pagination, N+1, Hyrum's Law, performance budget, bundle size.

lguidolin/postgres-postgraphile-rls-and-sql

Use when writing PostgreSQL, PostGraphile config, Row-Level Security policies, SQL schema files, or working on the Browser→App→PostGraphile→Postgres data path. Keywords — RLS, SECURITY DEFINER, search_path, pgSettings, grants, roles, GraphQL depth limit, query cost, statement_timeout, SQL file organization.

lguidolin/recording-decisions

Use when a design or architecture decision has been made and needs to be captured — writing a decision record or ADR, updating a decision index, noting a deferred idea, or superseding a past decision. Keywords — ADR, decision record, rationale, rejected alternatives, dependency index.

lguidolin/resilience-and-deploy-safety

Use when planning a deploy, designing a rollback, or responding to an incident or writing a postmortem. Keywords — deploy safety, rollback, immutable artifact, progressive delivery, canary, blast radius, incident response, blameless postmortem, error budget.

lguidolin/ship-it

Use when the user wants to ship work — push, PR, archive decision records, merge, and clean up. Handles the full lifecycle from committing final changes through post-merge cleanup including converting specs/plans to compact decision records.

lguidolin/tests-as-a-control

Use when writing or modifying tests, when a test breaks during a refactor, or when testing permission/role rules. Symptoms — tempted to edit a test to make it pass, testing only the happy path, a deny-test that started passing, flaky tests, or unsure what to assert.

lguidolin/zero-downtime-migrations

Use when changing a database schema where data must survive the change — adding/removing/renaming columns, constraints, indexes, or backfilling. Symptoms — a destructive migration bundled with a code deploy, a NOT NULL column with a backfill, a table-locking UPDATE, or a rename. Keywords — expand/contract, parallel change, backfill, NOT VALID, CREATE INDEX CONCURRENTLY, graphile-migrate.

Skills relacionados