#!/bin/bash # validate_demo_seeding.sh # Comprehensive smoke test for demo seeding validation # Tests both Professional and Enterprise demo templates set -e # Exit on error # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Counters TESTS_PASSED=0 TESTS_FAILED=0 TESTS_TOTAL=0 # Fixed Demo Tenant IDs DEMO_TENANT_PROFESSIONAL="a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6" DEMO_TENANT_ENTERPRISE_PARENT="c3d4e5f6-a7b8-49c0-d1e2-f3a4b5c6d7e8" DEMO_TENANT_CHILD_1="d4e5f6a7-b8c9-40d1-e2f3-a4b5c6d7e8f9" DEMO_TENANT_CHILD_2="e5f6a7b8-c9d0-41e2-f3a4-b5c6d7e8f9a0" DEMO_TENANT_CHILD_3="f6a7b8c9-d0e1-42f3-a4b5-c6d7e8f9a0b1" # Database connection strings (from Kubernetes secrets) get_db_url() { local service=$1 kubectl get secret database-secrets -n bakery-ia -o jsonpath="{.data.${service}_DATABASE_URL}" | base64 -d } # Test helper functions test_start() { TESTS_TOTAL=$((TESTS_TOTAL + 1)) echo -e "${BLUE}[TEST $TESTS_TOTAL]${NC} $1" } test_pass() { TESTS_PASSED=$((TESTS_PASSED + 1)) echo -e " ${GREEN}βœ“ PASS${NC}: $1" } test_fail() { TESTS_FAILED=$((TESTS_FAILED + 1)) echo -e " ${RED}βœ— FAIL${NC}: $1" } test_warn() { echo -e " ${YELLOW}⚠ WARN${NC}: $1" } # SQL query helper query_db() { local db_url=$1 local query=$2 kubectl run psql-temp-$RANDOM --rm -i --restart=Never --image=postgres:17-alpine -- \ psql "$db_url" -t -c "$query" 2>/dev/null | xargs } echo "========================================" echo "πŸ§ͺ Demo Seeding Validation Test Suite" echo "========================================" echo "" echo "Testing Professional and Enterprise demo templates..." echo "" # ============================================================================= # PHASE 1: PROFESSIONAL TIER VALIDATION # ============================================================================= echo "========================================" echo "πŸ“¦ Phase 1: Professional Tier (Single Bakery)" echo "========================================" echo "" # Test 1: Tenant Service - Professional tenant exists test_start "Professional tenant exists in tenant service" TENANT_DB=$(get_db_url "TENANT") TENANT_COUNT=$(query_db "$TENANT_DB" "SELECT COUNT(*) FROM tenants WHERE id='$DEMO_TENANT_PROFESSIONAL' AND business_model='individual_bakery'") if [ "$TENANT_COUNT" -eq 1 ]; then test_pass "Professional tenant found (PanaderΓ­a Artesana Madrid)" else test_fail "Professional tenant not found or incorrect count: $TENANT_COUNT" fi # Test 2: Inventory - Professional has raw ingredients test_start "Professional tenant has raw ingredients" INVENTORY_DB=$(get_db_url "INVENTORY") INGREDIENT_COUNT=$(query_db "$INVENTORY_DB" "SELECT COUNT(*) FROM ingredients WHERE tenant_id='$DEMO_TENANT_PROFESSIONAL' AND product_type='INGREDIENT'") if [ "$INGREDIENT_COUNT" -ge 20 ]; then test_pass "Found $INGREDIENT_COUNT raw ingredients (expected ~24)" else test_fail "Insufficient raw ingredients: $INGREDIENT_COUNT (expected >=20)" fi # Test 3: Inventory - Professional has finished products test_start "Professional tenant has finished products" PRODUCT_COUNT=$(query_db "$INVENTORY_DB" "SELECT COUNT(*) FROM ingredients WHERE tenant_id='$DEMO_TENANT_PROFESSIONAL' AND product_type='FINISHED_PRODUCT'") if [ "$PRODUCT_COUNT" -ge 4 ]; then test_pass "Found $PRODUCT_COUNT finished products (expected ~4)" else test_fail "Insufficient finished products: $PRODUCT_COUNT (expected >=4)" fi # Test 4: Recipes - Professional has recipes test_start "Professional tenant has recipes" RECIPES_DB=$(get_db_url "RECIPES") RECIPE_COUNT=$(query_db "$RECIPES_DB" "SELECT COUNT(*) FROM recipes WHERE tenant_id='$DEMO_TENANT_PROFESSIONAL'") if [ "$RECIPE_COUNT" -ge 4 ]; then test_pass "Found $RECIPE_COUNT recipes (expected ~4-20)" else test_fail "Insufficient recipes: $RECIPE_COUNT (expected >=4)" fi # Test 5: Sales - Professional has sales history test_start "Professional tenant has sales history" SALES_DB=$(get_db_url "SALES") SALES_COUNT=$(query_db "$SALES_DB" "SELECT COUNT(*) FROM sales_data WHERE tenant_id='$DEMO_TENANT_PROFESSIONAL'") if [ "$SALES_COUNT" -ge 100 ]; then test_pass "Found $SALES_COUNT sales records (expected ~360 for 90 days)" else test_warn "Lower than expected sales records: $SALES_COUNT (expected >=100)" fi # ============================================================================= # PHASE 2: ENTERPRISE PARENT VALIDATION # ============================================================================= echo "" echo "========================================" echo "🏭 Phase 2: Enterprise Parent (Obrador)" echo "========================================" echo "" # Test 6: Tenant Service - Enterprise parent exists test_start "Enterprise parent tenant exists" PARENT_COUNT=$(query_db "$TENANT_DB" "SELECT COUNT(*) FROM tenants WHERE id='$DEMO_TENANT_ENTERPRISE_PARENT' AND business_model='enterprise_chain'") if [ "$PARENT_COUNT" -eq 1 ]; then test_pass "Enterprise parent found (Obrador Madrid)" else test_fail "Enterprise parent not found or incorrect count: $PARENT_COUNT" fi # Test 7: Inventory - Parent has raw ingredients (scaled 10x) test_start "Enterprise parent has raw ingredients" PARENT_INGREDIENT_COUNT=$(query_db "$INVENTORY_DB" "SELECT COUNT(*) FROM ingredients WHERE tenant_id='$DEMO_TENANT_ENTERPRISE_PARENT' AND product_type='INGREDIENT'") if [ "$PARENT_INGREDIENT_COUNT" -ge 20 ]; then test_pass "Found $PARENT_INGREDIENT_COUNT raw ingredients (expected ~24)" else test_fail "Insufficient parent raw ingredients: $PARENT_INGREDIENT_COUNT (expected >=20)" fi # Test 8: Recipes - Parent has recipes test_start "Enterprise parent has recipes" PARENT_RECIPE_COUNT=$(query_db "$RECIPES_DB" "SELECT COUNT(*) FROM recipes WHERE tenant_id='$DEMO_TENANT_ENTERPRISE_PARENT'") if [ "$PARENT_RECIPE_COUNT" -ge 4 ]; then test_pass "Found $PARENT_RECIPE_COUNT recipes (expected ~4-20)" else test_fail "Insufficient parent recipes: $PARENT_RECIPE_COUNT (expected >=4)" fi # Test 9: Production - Parent has production batches test_start "Enterprise parent has production batches" PRODUCTION_DB=$(get_db_url "PRODUCTION") BATCH_COUNT=$(query_db "$PRODUCTION_DB" "SELECT COUNT(*) FROM production_batches WHERE tenant_id='$DEMO_TENANT_ENTERPRISE_PARENT'") if [ "$BATCH_COUNT" -ge 50 ]; then test_pass "Found $BATCH_COUNT production batches (expected ~120)" elif [ "$BATCH_COUNT" -ge 20 ]; then test_warn "Lower production batches: $BATCH_COUNT (expected ~120)" else test_fail "Insufficient production batches: $BATCH_COUNT (expected >=50)" fi # ============================================================================= # PHASE 3: CHILD RETAIL OUTLETS VALIDATION # ============================================================================= echo "" echo "========================================" echo "πŸͺ Phase 3: Child Retail Outlets" echo "========================================" echo "" # Test each child tenant for CHILD_ID in "$DEMO_TENANT_CHILD_1" "$DEMO_TENANT_CHILD_2" "$DEMO_TENANT_CHILD_3"; do case "$CHILD_ID" in "$DEMO_TENANT_CHILD_1") CHILD_NAME="Madrid Centro" ;; "$DEMO_TENANT_CHILD_2") CHILD_NAME="Barcelona GrΓ cia" ;; "$DEMO_TENANT_CHILD_3") CHILD_NAME="Valencia Ruzafa" ;; esac echo "" echo "Testing: $CHILD_NAME" echo "----------------------------------------" # Test 10a: Child has finished products ONLY (no raw ingredients) test_start "[$CHILD_NAME] Has finished products ONLY" CHILD_PRODUCTS=$(query_db "$INVENTORY_DB" "SELECT COUNT(*) FROM ingredients WHERE tenant_id='$CHILD_ID' AND product_type='FINISHED_PRODUCT'") CHILD_RAW=$(query_db "$INVENTORY_DB" "SELECT COUNT(*) FROM ingredients WHERE tenant_id='$CHILD_ID' AND product_type='INGREDIENT'") if [ "$CHILD_PRODUCTS" -eq 4 ] && [ "$CHILD_RAW" -eq 0 ]; then test_pass "Found $CHILD_PRODUCTS finished products, 0 raw ingredients (correct retail model)" elif [ "$CHILD_RAW" -gt 0 ]; then test_fail "Child has raw ingredients ($CHILD_RAW) - should only have finished products" else test_warn "Product count mismatch: $CHILD_PRODUCTS (expected 4)" fi # Test 10b: Child has stock batches test_start "[$CHILD_NAME] Has stock batches" CHILD_STOCK=$(query_db "$INVENTORY_DB" "SELECT COUNT(*) FROM stock WHERE tenant_id='$CHILD_ID'") if [ "$CHILD_STOCK" -ge 10 ]; then test_pass "Found $CHILD_STOCK stock batches (expected ~16)" else test_warn "Lower stock batches: $CHILD_STOCK (expected ~16)" fi # Test 10c: Child has sales history test_start "[$CHILD_NAME] Has sales history" CHILD_SALES=$(query_db "$SALES_DB" "SELECT COUNT(*) FROM sales_data WHERE tenant_id='$CHILD_ID'") if [ "$CHILD_SALES" -ge 80 ]; then test_pass "Found $CHILD_SALES sales records (expected ~120 for 30 days)" else test_warn "Lower sales records: $CHILD_SALES (expected ~120)" fi # Test 10d: Child has customers test_start "[$CHILD_NAME] Has walk-in customers" ORDERS_DB=$(get_db_url "ORDERS") CHILD_CUSTOMERS=$(query_db "$ORDERS_DB" "SELECT COUNT(*) FROM customers WHERE tenant_id='$CHILD_ID'") if [ "$CHILD_CUSTOMERS" -ge 40 ]; then test_pass "Found $CHILD_CUSTOMERS customers (expected 60-100)" else test_warn "Lower customer count: $CHILD_CUSTOMERS (expected 60-100)" fi done # ============================================================================= # PHASE 4: DISTRIBUTION VALIDATION # ============================================================================= echo "" echo "========================================" echo "🚚 Phase 4: Distribution & Logistics" echo "========================================" echo "" # Test 11: Distribution routes exist test_start "Distribution routes created (Mon/Wed/Fri pattern)" DISTRIBUTION_DB=$(get_db_url "DISTRIBUTION") ROUTE_COUNT=$(query_db "$DISTRIBUTION_DB" "SELECT COUNT(*) FROM delivery_routes WHERE tenant_id='$DEMO_TENANT_ENTERPRISE_PARENT'") if [ "$ROUTE_COUNT" -ge 10 ]; then test_pass "Found $ROUTE_COUNT delivery routes (expected ~13 for 30 days, Mon/Wed/Fri)" else test_warn "Lower route count: $ROUTE_COUNT (expected ~13)" fi # Test 12: Shipments exist for all children test_start "Shipments created for all retail outlets" SHIPMENT_COUNT=$(query_db "$DISTRIBUTION_DB" "SELECT COUNT(*) FROM shipments WHERE parent_tenant_id='$DEMO_TENANT_ENTERPRISE_PARENT'") if [ "$SHIPMENT_COUNT" -ge 30 ]; then test_pass "Found $SHIPMENT_COUNT shipments (expected ~39: 13 routes Γ— 3 children)" else test_warn "Lower shipment count: $SHIPMENT_COUNT (expected ~39)" fi # ============================================================================= # SUMMARY # ============================================================================= echo "" echo "========================================" echo "πŸ“Š Test Summary" echo "========================================" echo "" echo "Total Tests: $TESTS_TOTAL" echo -e "${GREEN}Passed: $TESTS_PASSED${NC}" echo -e "${RED}Failed: $TESTS_FAILED${NC}" echo "" if [ $TESTS_FAILED -eq 0 ]; then echo -e "${GREEN}βœ… ALL TESTS PASSED!${NC}" echo "" echo "Demo templates are ready for cloning:" echo " βœ“ Professional tier (single bakery): ~3,500 records" echo " βœ“ Enterprise parent (Obrador): ~3,000 records" echo " βœ“ 3 Child retail outlets: ~700 records" echo " βœ“ Distribution history: ~52 records" echo " βœ“ Total template data: ~4,200-4,800 records" echo "" exit 0 else echo -e "${RED}❌ SOME TESTS FAILED${NC}" echo "" echo "Please review the failed tests above and:" echo " 1. Check that all seed jobs completed successfully" echo " 2. Verify database connections" echo " 3. Check seed script logs for errors" echo "" exit 1 fi