Skip to content

Runtime

La validación runtime confirma si las decisiones de dominio y API se comportan como se espera bajo el uso real de consultas. Es la capa donde tu modelo pasa del diseño a la ejecución — y donde detecta los problemas antes que tus consumidores.

Propósito del runtime

El runtime responde a preguntas prácticas tempranamente en tu proceso de desarrollo:

  • ¿Las estructuras de campos son predecibles y consistentes?
  • ¿Las resoluciones de relaciones son coherentes y correctamente anidadas?
  • ¿Las suposiciones de paginación y ordenamiento se sostienen con datos reales?
  • ¿Las expresiones de filtro coinciden con el subconjunto correcto de registros?
  • ¿Los valores null se tratan como tus consumidores esperan?

Al validar estos comportamientos durante el modelado — no después de la implementación — elimina toda una categoría de errores de integración.

Screenshot rt-01-query-playgroundScreenshot rt-01-query-playground
rt-01-query-playgroundMissing

Panel de consulta runtime para pruebas de comportamiento en vivo.

Cómo funciona el mock runtime

El motor de mock runtime es el núcleo de Mockomat. Acepta consultas GraphQL y las traduce en operaciones MongoDB mediante una pipeline de cuatro etapas:

1. GraphQL Request Parser

La cadena de consulta entrante se parsea en un árbol de sintaxis abstracta (AST). Esta etapa valida la sintaxis de la consulta y extrae los campos solicitados, argumentos y selecciones anidadas.

2. Query Planner

El AST se analiza conjuntamente con los metadatos de tu modelo (definiciones de entidades, flags de atributos, configuraciones de relaciones) para crear un plan de ejecución. El planificador determina:

  • Qué colecciones MongoDB consultar
  • Qué campos proyectar
  • Qué operaciones de filtrado y ordenamiento aplicar
  • Qué relaciones necesitan resolverse

3. MongoDB Query Builder

El plan de ejecución se traduce en una pipeline de agregación MongoDB. Como MongoDB almacena los datos en colecciones planas (desnormalizadas), el query builder simula las estructuras relacionales:

  • Etapas de lookup — ensamblan datos relacionados entre colecciones
  • Etapas de match — aplican las expresiones de filtro
  • Etapas de sort — ordenan los resultados según los campos solicitados
  • Etapas de skip y limit — gestionan la paginación

4. Result Assembler

Los resultados brutos de MongoDB se reestructuran para coincidir con la estructura de respuesta GraphQL esperada. Las relaciones anidadas se ensamblan en la jerarquía padre-hijo correcta, y los nombres de campos se asocian a sus equivalentes GraphQL.

Esta pipeline se ejecuta en cada consulta. Lo que ves en la previsualización es exactamente lo que los consumidores externos recibirán del mismo endpoint.

Screenshot rt-01b-runtime-pipelineScreenshot rt-01b-runtime-pipeline
rt-01b-runtime-pipelineMissing

Pipeline runtime de cuatro etapas: Parse → Plan → Build → Assemble.

Ejemplos de consultas

Todas las consultas usan el mismo endpoint:

text
POST /mock/{slug}/graphql

Consulta de lista

Obtener una colección paginada de registros:

graphql
query {
  products(offset: 0, limit: 20) {
    id
    name
    price
    category {
      id
      name
    }
  }
}

Consulta de detalle

Obtener un solo registro por su identificador:

graphql
query {
  product(id: "abc-123") {
    id
    name
    price
    description
    category {
      id
      name
    }
  }
}

Consulta con filtrado

Aplicar expresiones de filtro para refinar los resultados:

graphql
query {
  products(
    filter: {
      filterGroup: {
        operator: AND
        items: [
          { attribute: "price", operator: GE, value: "10" }
          { attribute: "price", operator: LE, value: "50" }
        ]
      }
    }
    limit: 10
  ) {
    id
    name
    price
  }
}

Consulta con ordenamiento

Ordenar resultados por un campo ordenable:

graphql
query {
  products(
    sort: { field: "price", direction: DESC }
    limit: 10
  ) {
    id
    name
    price
  }
}

Consulta con relaciones anidadas

Recorrer relaciones para incluir datos relacionados:

graphql
query {
  customers(limit: 5) {
    id
    firstName
    lastName
    orders {
      id
      totalAmount
      createdAt
      items {
        id
        productName
        quantity
      }
    }
  }
}

Filtrado en detalle

El sistema de filtrado soporta expresiones tipadas y combinables que pueden combinarse con lógica booleana.

Operadores disponibles

OperadorDescripciónFunciona con
EQIgualTodos los tipos
NENo igualTodos los tipos
LTMenor queNúmeros, fechas
GTMayor queNúmeros, fechas
LEMenor o igualNúmeros, fechas
GEMayor o igualNúmeros, fechas
LIKEContiene subcadenaCadenas
IS_NULLEl campo es nullTodos los tipos
IS_NOT_NULLEl campo no es nullTodos los tipos

Combinar filtros

Los filtros usan álgebra booleana con los operadores AND y OR. Los grupos de filtros pueden anidarse para expresiones complejas:

graphql
filter: {
  filterGroup: {
    operator: OR
    groups: [
      {
        operator: AND
        items: [
          { attribute: "status", operator: EQ, value: "active" }
          { attribute: "price", operator: GT, value: "100" }
        ]
      }
      {
        operator: AND
        items: [
          { attribute: "status", operator: EQ, value: "featured" }
        ]
      }
    ]
  }
}

Este ejemplo devuelve los productos que son (activos Y caros) O destacados.

Campos filtrables

Solo los atributos marcados como filterable: true en el modelo pueden usarse en expresiones de filtro. Intentar filtrar por un campo no filtrable no tiene efecto. Configura los flags de filtrable en el editor de tablas del workspace.

Paginación

Mockomat usa paginación basada en offset:

ParámetroDescripciónPredeterminado
offsetNúmero de elementos a saltar0
limitNúmero de elementos a devolver20

Una consulta paginada típica:

graphql
query {
  products(offset: 40, limit: 20) {
    id
    name
    price
  }
}

Esto devuelve los elementos 41 a 60. Para obtener la página siguiente, aumenta el offset en el valor del limit.

Ordenamiento

Los campos marcados como sortable: true en el modelo pueden usarse para ordenar los resultados.

DirecciónSignificado
ASCAscendente (A→Z, 0→9, más antiguo→más reciente)
DESCDescendente (Z→A, 9→0, más reciente→más antiguo)

Un solo campo de ordenamiento puede aplicarse por consulta. Si no se especifica ordenamiento, los resultados se devuelven en su orden natural de almacenamiento.

Recorrido de relaciones

Una de las funcionalidades más poderosas del runtime es su capacidad de simular datos relacionales a partir de colecciones MongoDB planas.

Cómo funciona

MongoDB almacena datos en colecciones desnormalizadas — cada registro es un documento plano sin uniones de clave foránea. El runtime simula las estructuras relacionales mediante:

  1. Lectura de la definición de relación desde tu modelo (entidad origen, entidad destino, cardinalidad).
  2. Construcción de etapas de lookup en la pipeline de agregación MongoDB que unen las colecciones relacionadas.
  3. Ensamblaje de resultados anidados que coinciden con la estructura de respuesta GraphQL.

Esto significa que tus consultas GraphQL se comportan como si se ejecutaran contra una base de datos completamente relacional, aunque el almacenamiento subyacente sea basado en documentos.

Qué validar

Al verificar el recorrido de relaciones:

  • Relaciones 1:1 deben devolver un solo objeto anidado (o null si no hay coincidencia).
  • Relaciones 1:n deben devolver un arreglo de objetos anidados.
  • Relaciones vacías deben devolver un arreglo vacío [], no null.
  • Relaciones profundamente anidadas (ej. Customer → Order → OrderItem) deben resolverse correctamente en cada nivel.

Lista de verificación del comportamiento de consultas

Para cada entidad clave de tu modelo, valida:

  • Estabilidad de consultas de lista — ¿la misma consulta devuelve una estructura consistente en llamadas repetidas?
  • Consistencia de elementos individuales — ¿una consulta de detalle devuelve todos los campos esperados?
  • Comportamiento de campos null y faltantes — ¿los campos opcionales están correctamente representados como null?
  • Recorrido de relaciones — ¿los objetos anidados se resuelven con la cardinalidad correcta?
  • Precisión de filtros — ¿las expresiones de filtro coinciden con el subconjunto esperado?
  • Exactitud del ordenamiento — ¿el ordenamiento produce un orden predecible y estable?
  • Límites de paginación — ¿offset y limit producen porciones de página limpias sin duplicados?
Screenshot rt-02-filter-sort-paginationScreenshot rt-02-filter-sort-pagination
rt-02-filter-sort-paginationMissing

Validación del comportamiento de filtrado, ordenamiento y paginación.

Inspección y depuración runtime

Cuando el comportamiento parece incorrecto, inspecciona en este orden:

1. Verificar definiciones de tablas y atributos

La causa más común de comportamiento inesperado es un atributo mal configurado:

  • ¿El tipo de campo es correcto? (Un precio almacenado como string no se ordenará numéricamente.)
  • ¿El campo está marcado como ordenable/filtrable/buscable?
  • ¿El campo tiene una asociación configurada?

2. Verificar metadatos de endpoint y consulta

Comprueba que la consulta está correctamente configurada en la vista de diseño API:

  • ¿La consulta está activada?
  • ¿El nombre y los parámetros de la consulta son correctos?
  • ¿La configuración de paginación es apropiada?

3. Verificar el estado de la asociación de la fuente

Si los campos devuelven null o valores inesperados:

  • ¿El tipo de asociación es correcto (OFF_FIELD, FAKE, CONST)?
  • Para las asociaciones OFF_FIELD, ¿el registro fuente contiene los datos esperados?
  • Para las asociaciones FAKE, ¿el generador Faker está configurado para el tipo de datos correcto?

4. Verificar las políticas de relaciones

Si los datos anidados faltan o son incorrectos:

  • ¿La dirección de la relación es correcta (origen → destino)?
  • ¿La cardinalidad coincide (1:1 vs 1:n)?
  • ¿La entidad destino existe y tiene datos asociados?
  • ¿Las columnas de unión están correctamente especificadas?

Problemas comunes y soluciones

SíntomaCausa probableSolución
Respuesta vacíaNo hay datos importados para esa colecciónVerificar que la importación de datos esté completa
Campos que devuelven nullNinguna asociación configuradaAgregar una asociación OFF_FIELD, FAKE o CONST
Relación anidada vacíaRelación mal configuradaVerificar la dirección, entidad destino y columnas de unión
El ordenamiento no funcionaCampo no marcado como ordenableActivar el flag de ordenable en el editor de tabla
El filtro devuelve todoCampo no marcado como filtrableActivar el flag de filtrable en el editor de tabla
Tipos de datos incorrectosIncompatibilidad de tipo de asociaciónVerificar que la asociación produce el tipo esperado
La paginación salta elementosError de cálculo de offsetVerificar que los incrementos de offset coincidan con el valor del limit
Screenshot rt-03-runtime-inspectionScreenshot rt-03-runtime-inspection
rt-03-runtime-inspectionMissing

Flujo de inspección runtime y puntos de control de depuración.

Validación antes de la exportación

El runtime debe confirmar la disponibilidad antes de pasar a la generación de código backend. Un modelo que pasa la validación runtime tiene significativamente más probabilidades de producir un backend generado limpio y funcional.

Criterios de disponibilidad

Antes de la exportación, confirma que:

  • Los campos obligatorios son estables — todos los atributos obligatorios tienen valores consistentes y no-null.
  • La superficie de operaciones es intencional — solo las consultas que deseas exponer están activadas.
  • El comportamiento de las relaciones es explicable — cada consulta anidada se resuelve correctamente y la cardinalidad coincide con tus reglas de negocio.
  • El comportamiento de filtros y ordenamiento es predecible — los consumidores pueden confiar en el funcionamiento documentado de estas operaciones.
  • No hay indicaciones sin resolver — la previsualización no muestra advertencias sobre atributos no asociados o configuración faltante.

Flujo de validación pre-exportación

  1. Ejecutar consultas de lista para cada entidad — verificar la estructura y calidad de datos.
  2. Ejecutar consultas de detalle para las entidades clave — verificar la completitud de campos.
  3. Probar todos los filtros configurados — verificar el subconjunto correcto.
  4. Probar el ordenamiento en cada campo ordenable — verificar el orden.
  5. Probar los límites de paginación — verificar transiciones de página limpias.
  6. Probar consultas de relaciones anidadas — verificar el ensamblaje correcto en cada nivel.
Screenshot rt-04-runtime-validationScreenshot rt-04-runtime-validation
rt-04-runtime-validationMissing

Resumen de validación runtime pre-exportación.