#!/usr/bin/env bash # # test_endpoints.sh — Testa todos os endpoints da API nettown_backend. # # Faz login (POST /v1/login), obtém o JWT e reutiliza nas rotas protegidas. # # Uso: # ./test_endpoints.sh # BASE_URL=http://localhost:8080 EMAIL=admin@empresa.com PASSWORD=12345678 ./test_endpoints.sh # RUN_WRITE=1 ./test_endpoints.sh # inclui endpoints que ESCREVEM no banco # # Variáveis de ambiente: # BASE_URL Host da API (default: http://localhost:8080) # API_PREFIX Prefixo das rotas (default: /v1) # EMAIL E-mail de login (default: admin@empresa.com) # PASSWORD Senha de login (default: 12345678) # RUN_WRITE "1" para rodar também os endpoints de escrita (register, # change-password, agents, sla/configs). Default: 0 (somente leitura). # # Saída: 0 se nenhum teste falhou, 1 caso contrário. set -uo pipefail BASE_URL="${BASE_URL:-http://localhost:8080}" API_PREFIX="${API_PREFIX:-/v1}" EMAIL="${EMAIL:-admin@empresa.com}" PASSWORD="${PASSWORD:-12345678}" RUN_WRITE="${RUN_WRITE:-0}" BASE="${BASE_URL}${API_PREFIX}" TOKEN="" # Cores (desativadas se a saída não for um terminal). if [[ -t 1 ]]; then C_GREEN=$'\033[32m'; C_RED=$'\033[31m'; C_YELLOW=$'\033[33m' C_BLUE=$'\033[34m'; C_DIM=$'\033[2m'; C_RESET=$'\033[0m' else C_GREEN=""; C_RED=""; C_YELLOW=""; C_BLUE=""; C_DIM=""; C_RESET="" fi PASS=0; FAIL=0; SKIP=0 have_jq() { command -v jq >/dev/null 2>&1; } # json_get — extrai um valor do JSON (usa jq; senão, grep básico). json_get() { local json="$1" path="$2" if have_jq; then printf '%s' "$json" | jq -r "$path // empty" 2>/dev/null return fi # Fallback simples: pega o último campo com o nome final do path (ex.: .data.token -> token). local key="${path##*.}" printf '%s' "$json" | grep -o "\"${key}\"[[:space:]]*:[[:space:]]*\"[^\"]*\"" \ | head -n1 | sed -E "s/.*:[[:space:]]*\"([^\"]*)\"/\1/" } # Imprime um trecho curto do corpo da resposta. preview_body() { local body="$1" if have_jq; then printf '%s' "$body" | jq -c '{status, code, message}' 2>/dev/null || printf '%s' "$body" | head -c 200 else printf '%s' "$body" | head -c 200 fi } LAST_BODY="" LAST_CODE="" # call [json_data] — executa a requisição e popula LAST_BODY/LAST_CODE. call() { local method="$1" path="$2" data="${3:-}" local args=(-sS -X "$method" -H "Accept: application/json" -w $'\n%{http_code}' --max-time 30) if [[ -n "$TOKEN" ]]; then args+=(-H "Authorization: Bearer ${TOKEN}") fi if [[ -n "$data" ]]; then args+=(-H "Content-Type: application/json" -d "$data") fi local resp resp=$(curl "${args[@]}" "${BASE}${path}" 2>/dev/null) LAST_CODE=$(printf '%s' "$resp" | tail -n1) LAST_BODY=$(printf '%s' "$resp" | sed '$d') } # check