From 842ca897d5f3e09a2c6095ebf1b31b5ddf90ce27 Mon Sep 17 00:00:00 2001 From: Adrian Flores Cortes Date: Wed, 4 Feb 2026 00:13:19 -0600 Subject: [PATCH] [EPIC-001-T1.5] test: Add FK constraints validation script Script validates all 19 conditional FK constraints and 6 additional indexes. Co-Authored-By: Claude Opus 4.5 --- tests/validate-fk-constraints.sql | 295 ++++++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 tests/validate-fk-constraints.sql diff --git a/tests/validate-fk-constraints.sql b/tests/validate-fk-constraints.sql new file mode 100644 index 0000000..120ff28 --- /dev/null +++ b/tests/validate-fk-constraints.sql @@ -0,0 +1,295 @@ +-- ============================================================================ +-- TEST: Validar FK Constraints - EPIC-001 FK Débiles +-- Verifica que los FK constraints condicionales fueron creados correctamente +-- ============================================================================ +-- Uso: +-- PGPASSWORD=erp_dev_2026 psql -h localhost -U erp_admin -d erp_construccion_db -f validate-fk-constraints.sql +-- ============================================================================ + +\echo '============================================' +\echo 'TEST: Validación de FK Constraints' +\echo '============================================' +\echo '' + +-- Crear tabla temporal para resultados +DROP TABLE IF EXISTS _fk_test_results; +CREATE TEMP TABLE _fk_test_results ( + id SERIAL PRIMARY KEY, + test_name VARCHAR(100), + expected_constraint VARCHAR(100), + status VARCHAR(20), + details TEXT +); + +-- ============================================================================ +-- INVENTORY SCHEMA - FK Constraints +-- ============================================================================ +\echo 'Verificando schema INVENTORY...' + +-- Test 1: fk_almacenes_proyecto_warehouse +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'Almacenes Proyecto → Warehouses', + 'fk_almacenes_proyecto_warehouse', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_almacenes_proyecto_warehouse') + THEN 'PASS' ELSE 'FAIL' END, + CASE WHEN EXISTS (SELECT 1 FROM pg_tables WHERE schemaname = 'inventory' AND tablename = 'warehouses') + THEN 'Tabla warehouses existe - FK esperado' + ELSE 'Tabla warehouses NO existe - FK no aplicable' + END; + +-- Test 2: fk_requisicion_lineas_product +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'Requisicion Lineas → Products', + 'fk_requisicion_lineas_product', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_requisicion_lineas_product') + THEN 'PASS' ELSE 'FAIL' END, + CASE WHEN EXISTS (SELECT 1 FROM pg_tables WHERE schemaname = 'products' AND tablename = 'products') + THEN 'Tabla products existe - FK esperado' + ELSE 'Tabla products NO existe - FK no aplicable' + END; + +-- Test 3: fk_requisicion_lineas_unit +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'Requisicion Lineas → UOM', + 'fk_requisicion_lineas_unit', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_requisicion_lineas_unit') + THEN 'PASS' ELSE 'FAIL' END, + CASE WHEN EXISTS (SELECT 1 FROM pg_tables WHERE schemaname = 'core' AND tablename = 'uom') + THEN 'Tabla uom existe - FK esperado' + ELSE 'Tabla uom NO existe - FK no aplicable' + END; + +-- Test 4: fk_requisiciones_obra_dest_warehouse +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'Requisiciones Obra → Dest Warehouse', + 'fk_requisiciones_obra_dest_warehouse', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_requisiciones_obra_dest_warehouse') + THEN 'PASS' ELSE 'FAIL' END, + 'FK para destination_warehouse_id'; + +-- Test 5: fk_requisiciones_obra_purchase_order +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'Requisiciones Obra → Purchase Orders', + 'fk_requisiciones_obra_purchase_order', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_requisiciones_obra_purchase_order') + THEN 'PASS' ELSE 'FAIL' END, + CASE WHEN EXISTS (SELECT 1 FROM pg_tables WHERE schemaname = 'purchases' AND tablename = 'purchase_orders') + THEN 'Tabla purchase_orders existe - FK esperado' + ELSE 'Tabla purchase_orders NO existe - FK no aplicable' + END; + +-- Test 6: fk_consumos_obra_product +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'Consumos Obra → Products', + 'fk_consumos_obra_product', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_consumos_obra_product') + THEN 'PASS' ELSE 'FAIL' END, + 'FK para product_id en consumos'; + +-- Test 7: fk_consumos_obra_stock_move +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'Consumos Obra → Stock Moves', + 'fk_consumos_obra_stock_move', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_consumos_obra_stock_move') + THEN 'PASS' ELSE 'FAIL' END, + CASE WHEN EXISTS (SELECT 1 FROM pg_tables WHERE schemaname = 'inventory' AND tablename = 'stock_moves') + THEN 'Tabla stock_moves existe - FK esperado' + ELSE 'Tabla stock_moves NO existe - FK no aplicable' + END; + +-- ============================================================================ +-- PURCHASE SCHEMA - FK Constraints +-- ============================================================================ +\echo 'Verificando schema PURCHASE...' + +-- Test 8: fk_po_construction_purchase_order +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'PO Construction → Purchase Orders', + 'fk_po_construction_purchase_order', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_po_construction_purchase_order') + THEN 'PASS' ELSE 'FAIL' END, + CASE WHEN EXISTS (SELECT 1 FROM pg_tables WHERE schemaname = 'purchases' AND tablename = 'purchase_orders') + THEN 'Tabla purchase_orders existe - FK esperado' + ELSE 'Tabla purchase_orders NO existe - FK no aplicable' + END; + +-- Test 9: fk_supplier_construction_partner +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'Supplier Construction → Partners', + 'fk_supplier_construction_partner', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_supplier_construction_partner') + THEN 'PASS' ELSE 'FAIL' END, + CASE WHEN EXISTS (SELECT 1 FROM pg_tables WHERE schemaname = 'partners' AND tablename = 'partners') + THEN 'Tabla partners existe - FK esperado' + ELSE 'Tabla partners NO existe - FK no aplicable' + END; + +-- Test 10: fk_comparativo_winner_supplier +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'Comparativo → Winner Supplier', + 'fk_comparativo_winner_supplier', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_comparativo_winner_supplier') + THEN 'PASS' ELSE 'FAIL' END, + 'FK para winner_supplier_id'; + +-- Test 11: fk_comparativo_prov_supplier +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'Comparativo Prov → Supplier', + 'fk_comparativo_prov_supplier', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_comparativo_prov_supplier') + THEN 'PASS' ELSE 'FAIL' END, + 'FK para supplier_id en comparativo_proveedores'; + +-- Test 12: fk_comparativo_prod_product +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'Comparativo Prod → Product', + 'fk_comparativo_prod_product', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_comparativo_prod_product') + THEN 'PASS' ELSE 'FAIL' END, + 'FK para product_id en comparativo_productos'; + +-- ============================================================================ +-- HSE SCHEMA - FK Constraints +-- ============================================================================ +\echo 'Verificando schema HSE...' + +-- Test 13: fk_epp_inventario_almacen +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'EPP Inventario → Almacen Temporal', + 'fk_epp_inventario_almacen', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_epp_inventario_almacen') + THEN 'PASS' ELSE 'FAIL' END, + 'FK para almacen_id en epp_inventario'; + +-- Test 14: fk_epp_movimientos_almacen_origen +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'EPP Movimientos → Almacen Origen', + 'fk_epp_movimientos_almacen_origen', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_epp_movimientos_almacen_origen') + THEN 'PASS' ELSE 'FAIL' END, + 'FK para almacen_origen_id'; + +-- Test 15: fk_epp_movimientos_almacen_destino +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'EPP Movimientos → Almacen Destino', + 'fk_epp_movimientos_almacen_destino', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_epp_movimientos_almacen_destino') + THEN 'PASS' ELSE 'FAIL' END, + 'FK para almacen_destino_id'; + +-- ============================================================================ +-- DOCUMENTS SCHEMA - FK Constraints +-- ============================================================================ +\echo 'Verificando schema DOCUMENTS...' + +-- Test 16: fk_documents_parent +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'Documents → Parent Document', + 'fk_documents_parent', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_documents_parent') + THEN 'PASS' ELSE 'FAIL' END, + 'FK para parent_document_id'; + +-- Test 17: fk_access_logs_document +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'Access Logs → Document', + 'fk_access_logs_document', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_access_logs_document') + THEN 'PASS' ELSE 'FAIL' END, + 'FK para document_id'; + +-- Test 18: fk_access_logs_user +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'Access Logs → User', + 'fk_access_logs_user', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_access_logs_user') + THEN 'PASS' ELSE 'FAIL' END, + CASE WHEN EXISTS (SELECT 1 FROM pg_tables WHERE schemaname = 'auth' AND tablename = 'users') + THEN 'Tabla users existe - FK esperado' + ELSE 'Tabla users NO existe - FK no aplicable' + END; + +-- Test 19: fk_document_shares_shared_by +INSERT INTO _fk_test_results (test_name, expected_constraint, status, details) +SELECT + 'Document Shares → Shared By', + 'fk_document_shares_shared_by', + CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_document_shares_shared_by') + THEN 'PASS' ELSE 'FAIL' END, + 'FK para shared_by_id'; + +-- ============================================================================ +-- RESULTADOS +-- ============================================================================ +\echo '' +\echo '============================================' +\echo 'RESULTADOS DE TESTS FK CONSTRAINTS' +\echo '============================================' + +SELECT + id, + test_name, + status, + details +FROM _fk_test_results +ORDER BY id; + +\echo '' +\echo '============================================' +\echo 'RESUMEN' +\echo '============================================' + +SELECT + status, + COUNT(*) as total, + ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM _fk_test_results), 1) as porcentaje +FROM _fk_test_results +GROUP BY status +ORDER BY status; + +\echo '' +\echo 'NOTA: Los tests con FAIL donde la tabla referenciada NO existe son esperados.' +\echo ' Los FK constraints son condicionales - solo se crean si la tabla destino existe.' +\echo '' + +-- ============================================================================ +-- INDICES ADICIONALES +-- ============================================================================ +\echo '============================================' +\echo 'VERIFICACION DE INDICES ADICIONALES' +\echo '============================================' + +SELECT + indexname, + CASE WHEN EXISTS (SELECT 1 FROM pg_indexes WHERE indexname = t.indexname) + THEN 'EXISTE' ELSE 'NO EXISTE' END as status +FROM ( + VALUES + ('idx_comparativo_prod_product_id'), + ('idx_epp_inventario_almacen_id'), + ('idx_epp_movimientos_almacen_origen'), + ('idx_epp_movimientos_almacen_destino'), + ('idx_documents_parent'), + ('idx_document_shares_shared_by') +) AS t(indexname); + +\echo '' +\echo 'Test completado.'