[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 <noreply@anthropic.com>
This commit is contained in:
Adrian Flores Cortes 2026-02-04 00:13:19 -06:00
parent 2b69098fd4
commit 842ca897d5

View File

@ -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.'