Mock Rules

Motor de Templates: Respostas Dinâmicas com Expressões e Lógica

Use aritmética, condicionais, datas, JWT e Faker avançado diretamente no body das suas Mock Rules — sem escrever código.

Por que templates em vez de respostas fixas?

Uma Mock Rule com body estático retorna sempre o mesmo JSON. Isso funciona para casos simples, mas não consegue simular a lógica real de um backend: calcular totais, aplicar descontos diferentes por plano, retornar dados do próprio request ou validar regras de negócio.

O motor de templates do httpdrop é baseado em Handlebars.js e resolve esse problema sem exigir código. Você escreve expressões diretamente no campo Response Body da Mock Rule — o servidor as avalia em tempo de execução e retorna o resultado.

🔒
Segurança por padrão: O motor roda em sandbox — sem acesso a process.env, sem prototipagem de objetos do sistema (allowProtoPropertiesByDefault: false). Timeout automático de 100ms e output limitado a 64KB por resposta.

Sintaxe em três linhas

Chamada simples — um helper com argumentos
{{helper arg1 arg2}}
Composição — helper aninhado como argumento
{{helper (subHelper arg)}}
Condicional com else
{{#if (operador A B)}}valor verdadeiro{{else}}valor falso{{/if}}

Aritmética

Calcule totais, impostos, descontos e conversões em tempo real. Os operadores aceitam números literais ou subexpressões como argumentos.

OperadorExemploResultado
add{{add 10 5}}15
subtract{{subtract 10 3}}7
multiply{{multiply 4 2.5}}10
divide{{divide 10 4}}2.5
modulo{{modulo 10 3}}1
floor / ceil / round{{floor 4.9}}4
toFixed{{toFixed 9.999 2}}"10.00"
Mock Rule — POST /checkout — cálculo em tempo real
{
  "qty":      "{{body 'qty'}}",
  "price":    "{{body 'price'}}",
  "subtotal": "{{toFixed (multiply (body 'qty') (body 'price')) 2}}",
  "tax":      "{{toFixed (multiply (multiply (body 'qty') (body 'price')) 0.15) 2}}",
  "total":    "{{toFixed (multiply (multiply (body 'qty') (body 'price')) 1.15) 2}}"
}

Manipulação de Strings

Transforme, normalize e codifique strings com operadores encadeáveis. Útil para gerar slugs, emails derivados de nomes, e-mails normalizados e tokens de URL.

OperadorExemploResultado
uppercase / lowercase{{uppercase 'hello'}}HELLO
concat{{concat 'foo' 'bar'}}foobar
replace{{replace 'hi world' 'world' 'you'}}hi you
trim{{trim ' hello '}}hello
padStart{{padStart '7' 3 '0'}}007
slugify{{slugify 'João Silva'}}joao-silva
urlEncode{{urlEncode 'a b'}}a%20b
len / substr{{substr 'hello' 0 3}}hel
Mock Rule — POST /profile — geração de slug e email
{
  "original": "{{body 'name'}}",
  "slug":     "{{slugify (body 'name')}}",
  "upper":    "{{uppercase (body 'name')}}",
  "email":    "{{concat (lowercase (slugify (body 'name'))) '@example.com'}}",
  "initials": "{{uppercase (substr (body 'name') 0 2)}}"
}

Datas e Expiração

O helper {{now}} aceita um formato e um offset relativo ao momento da requisição. Ideal para simular tokens JWT com iat/exp, logs de criação e datas de vencimento.

SintaxeSaída
{{now 'iso'}}2026-05-23T14:30:00.000Z
{{now 'sql'}}2026-05-23 14:30:00
{{now 'unix'}}1748008200000
{{now 'br'}}23/05/2026 14:30
{{now '{days:30}' 'iso'}}30 dias no futuro
{{now '{days:-7}' 'sql'}}7 dias atrás
{{now '{months:3}' 'iso'}}3 meses no futuro
Mock Rule — POST /auth/token — token com expiração
{
  "tokenId":    "{{uuid}}",
  "issuedAt":   "{{now 'iso'}}",
  "expiresAt":  "{{now '{days:30}' 'iso'}}",
  "expiresIn":  2592000,
  "sqlCreated": "{{now 'sql'}}",
  "unix":       "{{now 'unix'}}"
}

Seleção Aleatória

{{oneOf}} retorna um valor diferente a cada requisição — perfeito para simular sistemas com estados variáveis como status de pedido, disponibilidade de estoque ou resultados de análise de risco.

Mock Rule — GET /order/{id} — status aleatório
{
  "orderId":       "{{param 'id'}}",
  "status":        "{{oneOf 'pending' 'processing' 'shipped' 'delivered' 'cancelled'}}",
  "carrier":       "{{oneOf 'Correios' 'Fedex' 'DHL' 'Jadlog'}}",
  "estimatedDays": {{oneOf '1' '2' '3' '5' '7'}}
}

Condicionais por dados da requisição

Use {{#if (operador A B)}} para construir respostas que dependem de qualquer campo da requisição. Os operadores de comparação disponíveis são: eq, gt, lt, gte, lte, isNumber, isInteger, isDate.

Mock Rule — POST /credit-check — tier baseado em score
{
  "score":       "{{body 'score'}}",
  "approved":    "{{#if (gte (body 'score') 600)}}true{{else}}false{{/if}}",
  "tier":        "{{#if (gte (body 'score') 800)}}platinum{{else}}{{#if (gte (body 'score') 700)}}gold{{else}}standard{{/if}}{{/if}}",
  "creditLimit": "{{#if (gte (body 'score') 800)}}50000{{else}}{{#if (gte (body 'score') 700)}}20000{{else}}5000{{/if}}{{/if}}"
}
Mock Rule — GET /pricing — preço por plano via query (?tier=pro)
{
  "plan":         "{{query 'tier'}}",
  "monthlyPrice": "{{#if (eq (query 'tier') 'pro')}}99{{else}}{{#if (eq (query 'tier') 'business')}}299{{else}}0{{/if}}{{/if}}",
  "users":        "{{#if (eq (query 'tier') 'business')}}unlimited{{else}}5{{/if}}"
}

Dados do Request

Qualquer dado da requisição de entrada pode ser usado como variável na resposta — body JSON, query params, headers, path params, método HTTP e o path completo.

HelperExemploUso
body 'campo'{{body 'user.name'}}Campo do body JSON (aceita dot notation)
query 'param'{{query 'page'}}Query string (?page=2)
header 'nome'{{header 'x-tenant'}}Header HTTP (lowercase)
param 'id'{{param 'id'}}Path param (/users/{id})
method{{method}}Método HTTP da requisição
reqPath{{reqPath}}Path completo da requisição
Mock Rule — POST /echo — espelha tudo da requisição
{
  "method":      "{{method}}",
  "path":        "{{reqPath}}",
  "queryPage":   "{{query 'page'}}",
  "contentType": "{{header 'content-type'}}",
  "bodyName":    "{{body 'name'}}",
  "requestId":   "{{uuid}}"
}

JWT — Decodificando o Token da Requisição

Use {{jwtPayload}} e {{jwtHeader}} para extrair campos do token Bearer enviado na requisição. Ideal para simular endpoints autenticados que retornam dados do próprio usuário.

Mock Rule — GET /me — perfil do usuário via JWT
{
  "userId":    "{{jwtPayload (header 'authorization') 'sub'}}",
  "email":     "{{jwtPayload (header 'authorization') 'email'}}",
  "role":      "{{jwtPayload (header 'authorization') 'role'}}",
  "algorithm": "{{jwtHeader (header 'authorization') 'alg'}}"
}
🔑
Token de teste: Use Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyXzEyMyIsImVtYWlsIjoidGVzdGVAZXhhbXBsZS5jb20iLCJyb2xlIjoiYWRtaW4ifQ.sig como header Authorization — o motor decodifica o payload e retorna {"userId":"user_123","email":"teste@example.com","role":"admin","algorithm":"HS256"}. A assinatura não é validada.

Store — Contadores Persistentes

O K-V Store persiste valores por chave, por endpoint, enquanto o servidor estiver rodando. Ideal para simular rate limiting, sequências de estado e contadores de chamadas.

Mock Rule — GET /api/dados — rate limiting de 3 chamadas
{
  "callCount": {{storeIncr 'hits'}},
  "allowed":   "{{#if (lte (storeGet 'hits') 3)}}true{{else}}false{{/if}}",
  "message":   "{{#if (lte (storeGet 'hits') 3)}}OK ({{storeGet 'hits'}}/3){{else}}Rate limit exceeded{{/if}}"
}

Faça 5 chamadas seguidas para o endpoint — as 3 primeiras retornam allowed: "true"; as seguintes retornam false. Use {{storeReset 'hits'}} em outra rule para zerar o contador.

Faker Avançado

A nova sintaxe {{faker 'categoria.gerador' 'opções'}} desbloqueia generators com parâmetros — ranges numéricos, formatos de data, precisão de float. Totalmente compatível com a sintaxe legada {{faker.campo}}.

Sintaxe novaSintaxe legadaSaída
{{faker 'name'}}{{faker.name}}Ana Ribeiro
{{faker 'cpf'}}{{faker.cpf}}123.456.789-09
{{faker 'number.int' '{min:300,max:850}'}}647 (inteiro no range)
{{faker 'number.float' '{precision:0.01}'}}3.14
{{faker 'date.past' 'iso'}}2023-07-12T...
{{faker 'date.future' 'iso'}}2027-02-18T...
Mock Rule — GET /fake-user — cadastro completo
{
  "id":         "{{faker 'uuid'}}",
  "name":       "{{faker 'name'}}",
  "email":      "{{faker 'email'}}",
  "cpf":        "{{faker 'cpf'}}",
  "phone":      "{{faker 'phone'}}",
  "score":      {{faker 'number.int' '{min:300,max:850}'}},
  "birthDate":  "{{faker 'date.past' 'iso'}}",
  "nextReview": "{{faker 'date.future' 'iso'}}",
  "address":    "{{faker 'address'}}",
  "zip":        "{{faker 'cep'}}"
}

Compatibilidade com a sintaxe antiga

Toda sintaxe legada é convertida automaticamente para a nova antes da renderização — suas Mock Rules existentes continuam funcionando sem alteração.

Sintaxe antigaEquivalente novo
{{faker.cpf}}{{faker 'cpf'}}
{{req.body.campo}}{{body 'campo'}}
{{req.query.x}}{{query 'x'}}
{{req.headers.x}}{{header 'x'}}
{{req.params.id}}{{param 'id'}}
{{env.KEY}}{{env 'KEY'}}
{{base64.x,y}}{{base64Combine x y}}
{{uuid}} / {{timestamp}}mantidos (sem conversão)

Use cases reais

🏦
Fintech / KYC — Simule análise de crédito com score dinâmico, tier calculado (platinum/gold/standard) e limite de crédito condicional. O front recebe respostas diferentes conforme o score enviado no body.
🛍️
E-commerce — Calcule subtotal, imposto e total em tempo real no mock de checkout. Use {{oneOf}} para simular status de pedido variável e {{faker 'date.future'}} para datas de entrega realistas.
🔐
Auth / SSO — Decodifique o Bearer token da requisição com {{jwtPayload}} e retorne os dados do próprio usuário no endpoint /me — sem precisar de banco de dados real.
📊
Dashboards & Analytics — Use {{storeIncr}} para acumular contadores entre chamadas e simular paginação real, contagem de visualizações e rate limiting por endpoint.
Dicas de produção: Output truncado em 64KB. Timeout de renderização: 100ms. {{env 'KEY'}} acessa somente variáveis do Workspace — nunca process.env. {{storeIncr}} reseta ao reiniciar o servidor.
Pronto para implementar? Consulte a documentação técnica completa com referência de API, exemplos de código e parâmetros detalhados.
Ver documentação →