Ir al contenido

Colecciones y Lógica

Las funciones de colecciones y lógica permiten consultar, inspeccionar y validar listas y mapas en Testform.


Función Firma Descripción
contains contains(list_or_string, val) Verifica si una lista o texto contiene un elemento.
coalesce coalesce(...args) Retorna el primer valor no nulo ni vacío.
lookup lookup(map, key, [default]) Obtiene el valor de una clave en un mapa de forma segura.
length length(value) Retorna la cantidad de elementos, caracteres o claves.
element element(list, index) Accede al elemento en un índice (con envoltura circular segura).
slice slice(list, start, [end]) Retorna una porción de una lista.
merge merge(...maps) Combina múltiples mapas en uno solo.

Evalúa si una lista contiene el valor buscado o si una subcadena forma parte de una cadena. Es la función estándar por excelencia para validar enums en variables.yml.

variables.yml
variable:
environment:
type: string
validation:
condition: "${contains(['dev', 'staging', 'production'], var.environment)}"
error_message: "El ambiente debe ser 'dev', 'staging' o 'production'."

Uso interactivo:

Ventana de terminal
testform functions --eval "contains(['chrome', 'firefox', 'edge'], 'safari')"
# => false

Toma un número arbitrario de argumentos y retorna el primer valor que no sea null, undefined ni cadena vacía "".

locals.yml
locals:
# Usa la variable explícita, si no existe toma el entorno, y si tampoco, usa el valor por defecto
active_host: "${coalesce(var.custom_host, env('HOST_NAME'), '127.0.0.1')}"
Ventana de terminal
testform functions --eval "coalesce(null, '', 'fallback', 'otro')"
# => "fallback"

Recupera el valor de una clave dentro de un mapa u objeto. Si la clave no existe, retorna el valor por defecto provisto (o genera un error si no se especificó un valor por defecto).

locals.yml
locals:
ports_by_env:
dev: 3000
staging: 8080
production: 443
active_port: "${lookup(local.ports_by_env, var.environment, 8080)}"

Determina el tamaño o longitud según el tipo de dato:

  • En una lista: número de elementos.
  • En una cadena: número de caracteres.
  • En un mapa/objeto: número de propiedades.
variables.yml
variable:
password:
type: string
sensitive: true
validation:
condition: "${length(var.password) >= 8}"
error_message: "La contraseña debe contener al menos 8 caracteres."
target_browsers:
type: list(string)
validation:
condition: "${length(var.target_browsers) > 0}"
error_message: "Debe especificar al menos un navegador de destino."

Retorna el elemento en la posición index de una lista. Si el índice sobrepasa la longitud de la lista, aplica una operación de módulo circular (index % length), evitando excepciones por desbordamiento.

Ventana de terminal
testform functions --eval "element(['a', 'b', 'c'], 1)"
# => "b"
testform functions --eval "element(['a', 'b', 'c'], 3)"
# => "a" (recorrido circular)

Extrae un subconjunto de elementos de una lista entre las posiciones start y end (no inclusivo).

Ventana de terminal
testform functions --eval "slice(['smoke', 'auth', 'checkout', 'reports'], 1, 3)"
# => ["auth", "checkout"]

Fusiona múltiples mapas u objetos en uno solo. En caso de colisión de claves, los argumentos situados más a la derecha tienen prioridad y sobrescriben a los anteriores.

locals.yml
locals:
default_headers:
Content-Type: "application/json"
Accept: "application/json"
auth_headers:
Authorization: "Bearer ${var.api_token}"
all_headers: "${merge(local.default_headers, local.auth_headers)}"