Que Es GraphQL?

GraphQL es un lenguaje de consulta para APIs desarrollado por Facebook (Meta) en 2012. A diferencia de REST donde el servidor define que datos retorna cada endpoint, GraphQL permite al cliente especificar exactamente que campos necesita.

GraphQL vs. REST

CaracteristicaRESTGraphQL
EndpointsMultiples (/users, /posts)Uno solo (/graphql)
Obtencion de datosServidor decide la formaCliente especifica campos
Over-fetchingComunEliminado
Under-fetchingRequiere multiples requestsResuelto con queries anidados
VersionadoURL/headerEvolucion de schema
CachingHTTP cache integradoMas complejo

Conceptos Fundamentales

Queries — leer datos (equivalente a GET):

query {
  user(id: 42) {
    name
    email
    posts {
      title
      createdAt
    }
  }
}

Mutations — escribir datos (equivalente a POST/PUT/DELETE):

mutation {
  createUser(input: { name: "Alice", email: "alice@example.com" }) {
    id
    name
  }
}

Subscriptions — actualizaciones en tiempo real via WebSocket:

subscription {
  newMessage(chatId: "123") {
    content
    sender { name }
  }
}

Schema de GraphQL

El schema define todos los tipos, queries y mutations disponibles:

type User {
  id: ID!
  name: String!
  email: String!
  role: Role!
  posts: [Post!]!
}

enum Role { ADMIN USER VIEWER }

type Query {
  user(id: ID!): User
  users(limit: Int, offset: Int): [User!]!
}

type Mutation {
  createUser(input: CreateUserInput!): User!
  deleteUser(id: ID!): Boolean!
}

El ! significa que el campo no es nullable. Usa introspeccion para explorar la API:

{
  __schema {
    types { name fields { name type { name } } }
  }
}

Testing de Queries GraphQL

Tests de Validacion de Query

TestInputEsperado
Query valido{ user(id: 42) { name } }200 con campos solicitados
Campo inexistente{ user(id: 42) { phone } }Error: campo no encontrado
Argumento requerido faltante{ user { name } }Error: id requerido
Tipo de argumento incorrecto{ user(id: "abc") { name } }Error: tipo incorrecto
Query vacio{}Error de sintaxis

Validacion de Response

  • Solo campos solicitados retornados
  • Campos non-nullable nunca son null
  • Tipos array retornan arrays (incluso vacios)
  • Valores enum coinciden con el schema

Testing de Mutations

mutation {
  createUser(input: { name: "Alice", email: "alice@example.com", role: USER }) {
    id name email
  }
}

Escenarios de Test de Mutations

EscenarioEsperado
Input validoExito con recurso creado
Campo requerido faltanteError de validacion
Valor enum invalidoError: Role invalido
Campo unico duplicadoError de conflicto
Mutation no autorizadaError de auth

Testing de Seguridad Especifica de GraphQL

Ataque de Profundidad de Query

{ user(id: 1) { posts { author { posts { author { posts { author { name } } } } } } } }

Test: Envia queries con profundidad creciente. Verifica que el servidor rechace queries que excedan el limite.

Ataque de Complejidad de Query

{ users(limit: 10000) { posts(limit: 1000) { comments(limit: 1000) { author { name } } } } }

Test: Verifica limites de complejidad de query.

Introspeccion Deshabilitada en Produccion

{ __schema { types { name } } }

Test: Verifica que queries de introspeccion fallen en produccion.

Ataque de Batch Query

Test: Verifica limites de batch y que rate limiting aplique a operaciones en lote.

Herramientas de Testing para GraphQL

HerramientaProposito
GraphiQL / PlaygroundExplorador interactivo
PostmanSoporta queries GraphQL
Altair GraphQL ClientCliente GraphQL completo
graphql-inspectorDiff y validacion de schema

Ejercicio Practico

  1. Explora una API GraphQL: Usa la Star Wars API GraphQL para enviar queries y explorar el schema.
  2. Testea mutations: Con una API GraphQL escribible, testea operaciones CRUD.
  3. Testing de seguridad: Envia queries profundos y de introspeccion.
  4. Compara REST vs GraphQL: Obtene los mismos datos con ambos enfoques.

Puntos Clave

  • GraphQL permite a los clientes solicitar exactamente los datos que necesitan
  • El testing requiere validar queries, mutations, schema y seguridad especifica de GraphQL
  • Limites de profundidad, complejidad e introspeccion deshabilitada son medidas criticas
  • El problema N+1 es comun en performance — monitorea queries de resolvers
  • La introspeccion es poderosa para diseno de tests pero debe deshabilitarse en produccion