#!/usr/bin/env bash # Teste de fumaça do servidor: rotas por idioma, redirects e regras do livro. # # scripts/smoke-imagem.sh http://127.0.0.1:3998 # # Cada falha é impressa e o script sai com 1 no fim, para mostrar tudo de uma vez. set -uo pipefail base=${1:?uso: smoke-imagem.sh } falhas=0 # status [cabeçalho] status() { local got got=$(curl -s -o /dev/null -w '%{http_code}' ${3:+-H "$3"} "$base$2") [ "$got" = "$1" ] || { echo "FALHOU $2 ${3:-}: esperado $1, veio $got"; falhas=$((falhas + 1)); } } # destino [cabeçalho] destino() { local out out=$(curl -s -o /dev/null -w '%{http_code} %{redirect_url}' ${4:+-H "$4"} "$base$2") [ "$out" = "$1 $base$3" ] || { echo "FALHOU $2 ${4:-}: esperado '$1 $3', veio '${out#* }'" ; falhas=$((falhas + 1)); } } # O servidor leva alguns segundos para subir. for _ in $(seq 1 30); do curl -fsS -o /dev/null "$base/pt" && break; sleep 2; done # Lista de idiomas ativos lida dinamicamente do módulo i18n/links.js ENABLED_LOCALES=${ENABLED_LOCALES:-$(node -e 'import("./i18n/links.js").then(m => console.log(m.ENABLED_LOCALES.join(" ")))' 2>/dev/null || echo "pt")} ALL_LOCALES="pt en es fr de zh-CN" # 1. Páginas que existem em todos os idiomas ATIVOS for l in $ENABLED_LOCALES; do status 200 "/$l" done for p in /series /sobre /livro; do status 200 "/pt$p" done # 2. Idiomas INATIVOS: redirecionam com 307 para /pt for l in $ALL_LOCALES; do if [[ ! " $ENABLED_LOCALES " =~ " $l " ]]; then destino 307 "/$l" /pt destino 307 "/$l/series" /pt/series destino 307 "/$l/livro" /pt/livro fi done # 3. Negociação de idioma na raiz (deve considerar apenas ativos) if [[ " $ENABLED_LOCALES " == " pt " ]]; then # Com só pt ativo, todo Accept-Language e cookie de idioma inativo cai em /pt destino 307 / /pt 'Accept-Language: pt-BR,pt;q=0.9' destino 307 / /pt 'Accept-Language: es-MX,es;q=0.9,en;q=0.5' destino 307 / /pt 'Accept-Language: fr-CA,fr;q=0.9' destino 307 / /pt 'Accept-Language: de-AT,de;q=0.8' destino 307 / /pt 'Accept-Language: zh-CN,zh;q=0.9' destino 307 / /pt 'Accept-Language: it-IT' destino 307 / /pt 'Accept-Language: en;q=0.5,pt;q=0.9' destino 307 / /pt 'Cookie: NEXT_LOCALE=es' else destino 307 / /pt 'Accept-Language: pt-BR,pt;q=0.9' [[ " $ENABLED_LOCALES " =~ " es " ]] && destino 307 / /es 'Accept-Language: es-MX,es;q=0.9,en;q=0.5' [[ " $ENABLED_LOCALES " =~ " fr " ]] && destino 307 / /fr 'Accept-Language: fr-CA,fr;q=0.9' [[ " $ENABLED_LOCALES " =~ " de " ]] && destino 307 / /de 'Accept-Language: de-AT,de;q=0.8' [[ " $ENABLED_LOCALES " =~ " zh-CN " ]] && destino 307 / /zh-CN 'Accept-Language: zh-CN,zh;q=0.9' [[ " $ENABLED_LOCALES " =~ " en " ]] && destino 307 / /en 'Accept-Language: it-IT' destino 307 / /pt 'Accept-Language: en;q=0.5,pt;q=0.9' [[ " $ENABLED_LOCALES " =~ " es " ]] && destino 307 / /es 'Cookie: NEXT_LOCALE=es' fi # 4. URLs antigas (sem prefixo) continuam 308 permanente para /pt/... destino 308 /series/ESP32-S3 /pt/series/ESP32-S3 'Accept-Language: en-US' destino 308 /livro /pt/livro 'Accept-Language: en-US' # 5. O livro dá 404 apenas em idiomas ATIVOS que não sejam pt for l in $ENABLED_LOCALES; do if [ "$l" != "pt" ]; then status 404 "/$l/livro" fi done # 6. Metadata no inicial (title, canonical), para qualquer cliente html=$(curl -s -A 'Mozilla/5.0 Chrome/130' "$base/pt/sobre") head=${html%%*} for marca in '' 'rel="canonical"'; do case "$head" in *"$marca"*) ;; *) echo "FALHOU /pt/sobre: $marca fora do <head>"; falhas=$((falhas + 1));; esac done exit $((falhas > 0))