#!/usr/bin/env bash # Smoke test CRUD via RPC-backed API set -euo pipefail BASE="http://127.0.0.1:8000" JAR="/tmp/panels-cookies.txt" PASS="${SEED_PASSWORD:-TestAdmin123!}" SUFFIX=$((RANDOM % 90000 + 10000)) WORKER_TAG=$(printf '%02d' $((10 + SUFFIX % 80))) pass() { echo "✓ $1"; } fail() { echo "✗ $1"; exit 1; } check_status() { local name="$1" expected="$2" actual="$3" body="$4" if [[ "$actual" != "$expected" ]]; then echo "FAIL $name: expected HTTP $expected, got $actual" echo "$body" | head -c 800 exit 1 fi pass "$name (HTTP $actual)" } echo "=== Health ===" H=$(curl -s -w "\n%{http_code}" "$BASE/v1/health") BODY=$(echo "$H" | head -n -1) CODE=$(echo "$H" | tail -1) check_status "health" "200" "$CODE" "$BODY" echo "$BODY" | grep -q '"ok":true' || fail "health body not ok" echo "=== Login ===" LOGIN=$(curl -s -w "\n%{http_code}" -c "$JAR" -X POST "$BASE/v1/auth/login" \ -H "Content-Type: application/json" \ -d "{\"username\":\"arct2608\",\"password\":\"$PASS\"}") BODY=$(echo "$LOGIN" | head -n -1) CODE=$(echo "$LOGIN" | tail -1) check_status "login" "200" "$CODE" "$BODY" echo "=== Companies LIST ===" R=$(curl -s -w "\n%{http_code}" -b "$JAR" "$BASE/v1/companies") BODY=$(echo "$R" | head -n -1); CODE=$(echo "$R" | tail -1) check_status "companies list" "200" "$CODE" "$BODY" echo "$BODY" | grep -q '"ok":true' || fail "companies list envelope" echo "$BODY" | grep -q 'ARCT2608' || fail "seed company missing" echo "=== Companies CREATE ===" R=$(curl -s -w "\n%{http_code}" -b "$JAR" -X POST "$BASE/v1/companies" \ -H "Content-Type: application/json" \ -d '{ "name": "Subempresa Prueba RPC", "code": "SUBRPC'"$SUFFIX"'", "razon_social": "Subempresa Prueba SA de CV", "rfc": "SPR010101ABC", "regimen_fiscal": "601", "registro_patronal": "A1234567890", "domicilio_fiscal": "Calle Test 123", "codigo_postal": "01000", "ciudad": "Ciudad de México", "estado": "CDMX" }') BODY=$(echo "$R" | head -n -1); CODE=$(echo "$R" | tail -1) check_status "company create" "201" "$CODE" "$BODY" COMPANY_ID=$(echo "$BODY" | grep -o '"id":[0-9]*' | head -1 | cut -d: -f2) [[ -n "$COMPANY_ID" ]] || fail "no company id in create response" echo "=== Companies GET ===" R=$(curl -s -w "\n%{http_code}" -b "$JAR" "$BASE/v1/companies/$COMPANY_ID") BODY=$(echo "$R" | head -n -1); CODE=$(echo "$R" | tail -1) check_status "company get" "200" "$CODE" "$BODY" echo "$BODY" | grep -qi "SUBRPC$SUFFIX" || fail "company code mismatch" echo "=== Companies PATCH ===" R=$(curl -s -w "\n%{http_code}" -b "$JAR" -X PATCH "$BASE/v1/companies/$COMPANY_ID" \ -H "Content-Type: application/json" \ -d '{"nombre_comercial":"Sub RPC Editada","telefono":"5551234567"}') BODY=$(echo "$R" | head -n -1); CODE=$(echo "$R" | tail -1) check_status "company patch" "200" "$CODE" "$BODY" echo "$BODY" | grep -q 'Sub RPC Editada' || fail "company patch not applied" echo "=== Projects LIST ===" R=$(curl -s -w "\n%{http_code}" -b "$JAR" "$BASE/v1/projects") BODY=$(echo "$R" | head -n -1); CODE=$(echo "$R" | tail -1) check_status "projects list" "200" "$CODE" "$BODY" echo "=== Projects CREATE ===" R=$(curl -s -w "\n%{http_code}" -b "$JAR" -X POST "$BASE/v1/projects" \ -H "Content-Type: application/json" \ -d '{ "name": "Obra Prueba RPC", "company_id": 1, "address": "Av. Reforma 100", "contract_amount": 1500000, "start_date": "2026-01-01" }') BODY=$(echo "$R" | head -n -1); CODE=$(echo "$R" | tail -1) check_status "project create" "201" "$CODE" "$BODY" PROJECT_ID=$(echo "$BODY" | grep -o '"id":[0-9]*' | head -1 | cut -d: -f2) [[ -n "$PROJECT_ID" ]] || fail "no project id" echo "=== Projects GET ===" R=$(curl -s -w "\n%{http_code}" -b "$JAR" "$BASE/v1/projects/$PROJECT_ID") BODY=$(echo "$R" | head -n -1); CODE=$(echo "$R" | tail -1) check_status "project get" "200" "$CODE" "$BODY" echo "=== Projects PATCH ===" R=$(curl -s -w "\n%{http_code}" -b "$JAR" -X PATCH "$BASE/v1/projects/$PROJECT_ID" \ -H "Content-Type: application/json" \ -d '{"name":"Obra Prueba RPC Editada","resident_name":"Ing. Test"}') BODY=$(echo "$R" | head -n -1); CODE=$(echo "$R" | tail -1) check_status "project patch" "200" "$CODE" "$BODY" R=$(curl -s -w "\n%{http_code}" -b "$JAR" "$BASE/v1/projects/$PROJECT_ID") BODY=$(echo "$R" | head -n -1); CODE=$(echo "$R" | tail -1) check_status "project get after patch" "200" "$CODE" "$BODY" echo "$BODY" | grep -qi 'Obra Prueba RPC Editada' || fail "project patch not applied" echo "=== Workers CREATE ===" WORKER_JSON=$(cat <