Structure: - control-plane/: Registries, SIMCO directives, CI/CD templates - projects/: Gamilit, ERP-Suite, Trading-Platform, Betting-Analytics - shared/: Libs catalog, knowledge-base Key features: - Centralized port, domain, database, and service registries - 23 SIMCO directives + 6 fundamental principles - NEXUS agent profiles with delegation rules - Validation scripts for workspace integrity - Dockerfiles for all services - Path aliases for quick reference 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
374 lines
11 KiB
SQL
374 lines
11 KiB
SQL
-- =============================================================================
|
|
-- Test Script: update_missions_on_perfect_scores
|
|
-- Descripción: Pruebas de validación para la función y trigger de scores perfectos
|
|
-- Fecha: 2025-11-28
|
|
-- =============================================================================
|
|
|
|
-- =============================================================================
|
|
-- SETUP: Preparar datos de prueba
|
|
-- =============================================================================
|
|
|
|
-- Limpiar datos de prueba anteriores
|
|
DO $$
|
|
BEGIN
|
|
DELETE FROM progress_tracking.exercise_attempts
|
|
WHERE user_id IN (
|
|
SELECT id FROM auth_management.profiles WHERE email LIKE 'test_perfect_%@test.com'
|
|
);
|
|
|
|
DELETE FROM gamification_system.missions
|
|
WHERE user_id IN (
|
|
SELECT id FROM auth_management.profiles WHERE email LIKE 'test_perfect_%@test.com'
|
|
);
|
|
|
|
DELETE FROM auth_management.profiles WHERE email LIKE 'test_perfect_%@test.com';
|
|
END $$;
|
|
|
|
-- Crear usuario de prueba
|
|
INSERT INTO auth_management.profiles (id, email, first_name, last_name)
|
|
VALUES (
|
|
'11111111-1111-1111-1111-111111111111',
|
|
'test_perfect_user@test.com',
|
|
'Test',
|
|
'Perfect'
|
|
) ON CONFLICT (id) DO UPDATE
|
|
SET email = EXCLUDED.email;
|
|
|
|
-- Crear ejercicio de prueba
|
|
INSERT INTO educational_content.exercises (id, title, mechanic_type, difficulty_level)
|
|
VALUES (
|
|
'22222222-2222-2222-2222-222222222222',
|
|
'Test Exercise for Perfect Scores',
|
|
'fill_in_blank',
|
|
'intermediate'
|
|
) ON CONFLICT (id) DO UPDATE
|
|
SET title = EXCLUDED.title;
|
|
|
|
-- =============================================================================
|
|
-- TEST 1: Usuario con misión de scores perfectos
|
|
-- =============================================================================
|
|
|
|
\echo '==================================================================='
|
|
\echo 'TEST 1: Crear misión de scores perfectos'
|
|
\echo '==================================================================='
|
|
|
|
-- Crear misión de prueba
|
|
INSERT INTO gamification_system.missions (
|
|
id,
|
|
user_id,
|
|
template_id,
|
|
title,
|
|
description,
|
|
mission_type,
|
|
objectives,
|
|
rewards,
|
|
status,
|
|
progress,
|
|
start_date,
|
|
end_date
|
|
) VALUES (
|
|
'33333333-3333-3333-3333-333333333333',
|
|
'11111111-1111-1111-1111-111111111111',
|
|
'daily_perfect_scores',
|
|
'Obtén 5 scores perfectos',
|
|
'Completa 5 ejercicios con puntaje perfecto (100/100)',
|
|
'daily',
|
|
'[{"type": "perfect_scores", "target": 5, "current": 0, "description": "Consigue 5 puntajes perfectos"}]'::jsonb,
|
|
'{"xp": 100, "ml_coins": 50}'::jsonb,
|
|
'active',
|
|
0,
|
|
NOW(),
|
|
NOW() + INTERVAL '1 day'
|
|
) ON CONFLICT (id) DO UPDATE
|
|
SET objectives = EXCLUDED.objectives,
|
|
progress = EXCLUDED.progress,
|
|
status = EXCLUDED.status;
|
|
|
|
-- Verificar estado inicial
|
|
SELECT
|
|
id,
|
|
title,
|
|
status,
|
|
progress,
|
|
objectives->0->>'current' as current_value,
|
|
objectives->0->>'target' as target_value
|
|
FROM gamification_system.missions
|
|
WHERE id = '33333333-3333-3333-3333-333333333333';
|
|
|
|
-- =============================================================================
|
|
-- TEST 2: Insertar ejercicio con score perfecto (100)
|
|
-- =============================================================================
|
|
|
|
\echo ''
|
|
\echo '==================================================================='
|
|
\echo 'TEST 2: Insertar ejercicio con score perfecto (100)'
|
|
\echo '==================================================================='
|
|
|
|
-- Insertar ejercicio con score perfecto
|
|
INSERT INTO progress_tracking.exercise_attempts (
|
|
user_id,
|
|
exercise_id,
|
|
submitted_answers,
|
|
is_correct,
|
|
score,
|
|
time_spent_seconds
|
|
) VALUES (
|
|
'11111111-1111-1111-1111-111111111111',
|
|
'22222222-2222-2222-2222-222222222222',
|
|
'{"answer": "correct"}'::jsonb,
|
|
true,
|
|
100,
|
|
120
|
|
);
|
|
|
|
-- Verificar que la misión se actualizó
|
|
SELECT
|
|
id,
|
|
title,
|
|
status,
|
|
progress,
|
|
objectives->0->>'current' as current_value,
|
|
objectives->0->>'target' as target_value
|
|
FROM gamification_system.missions
|
|
WHERE id = '33333333-3333-3333-3333-333333333333';
|
|
|
|
-- Resultado esperado: current = 1, progress = 20%
|
|
|
|
-- =============================================================================
|
|
-- TEST 3: Insertar más ejercicios con score perfecto
|
|
-- =============================================================================
|
|
|
|
\echo ''
|
|
\echo '==================================================================='
|
|
\echo 'TEST 3: Insertar 4 ejercicios más con score perfecto'
|
|
\echo '==================================================================='
|
|
|
|
-- Insertar 4 ejercicios más
|
|
INSERT INTO progress_tracking.exercise_attempts (
|
|
user_id,
|
|
exercise_id,
|
|
submitted_answers,
|
|
is_correct,
|
|
score,
|
|
time_spent_seconds
|
|
)
|
|
SELECT
|
|
'11111111-1111-1111-1111-111111111111',
|
|
'22222222-2222-2222-2222-222222222222',
|
|
'{"answer": "correct"}'::jsonb,
|
|
true,
|
|
100,
|
|
120
|
|
FROM generate_series(1, 4);
|
|
|
|
-- Verificar que la misión se completó
|
|
SELECT
|
|
id,
|
|
title,
|
|
status,
|
|
progress,
|
|
completed_at IS NOT NULL as is_completed,
|
|
objectives->0->>'current' as current_value,
|
|
objectives->0->>'target' as target_value
|
|
FROM gamification_system.missions
|
|
WHERE id = '33333333-3333-3333-3333-333333333333';
|
|
|
|
-- Resultado esperado: current = 5, progress = 100%, status = 'completed', completed_at NOT NULL
|
|
|
|
-- =============================================================================
|
|
-- TEST 4: Score no perfecto no afecta la misión
|
|
-- =============================================================================
|
|
|
|
\echo ''
|
|
\echo '==================================================================='
|
|
\echo 'TEST 4: Score 85 no debe actualizar misión de scores perfectos'
|
|
\echo '==================================================================='
|
|
|
|
-- Crear nueva misión
|
|
INSERT INTO gamification_system.missions (
|
|
id,
|
|
user_id,
|
|
template_id,
|
|
title,
|
|
mission_type,
|
|
objectives,
|
|
rewards,
|
|
end_date
|
|
) VALUES (
|
|
'44444444-4444-4444-4444-444444444444',
|
|
'11111111-1111-1111-1111-111111111111',
|
|
'daily_perfect_scores_2',
|
|
'Test score no perfecto',
|
|
'daily',
|
|
'[{"type": "perfect_scores", "target": 3, "current": 0}]'::jsonb,
|
|
'{"xp": 50}'::jsonb,
|
|
NOW() + INTERVAL '1 day'
|
|
) ON CONFLICT (id) DO UPDATE
|
|
SET objectives = EXCLUDED.objectives,
|
|
progress = 0,
|
|
status = 'active';
|
|
|
|
-- Insertar ejercicio con score 85
|
|
INSERT INTO progress_tracking.exercise_attempts (
|
|
user_id,
|
|
exercise_id,
|
|
submitted_answers,
|
|
is_correct,
|
|
score
|
|
) VALUES (
|
|
'11111111-1111-1111-1111-111111111111',
|
|
'22222222-2222-2222-2222-222222222222',
|
|
'{"answer": "partial"}'::jsonb,
|
|
true,
|
|
85
|
|
);
|
|
|
|
-- Verificar que NO se actualizó
|
|
SELECT
|
|
id,
|
|
title,
|
|
status,
|
|
progress,
|
|
objectives->0->>'current' as current_value
|
|
FROM gamification_system.missions
|
|
WHERE id = '44444444-4444-4444-4444-444444444444';
|
|
|
|
-- Resultado esperado: current = 0, progress = 0%
|
|
|
|
-- =============================================================================
|
|
-- TEST 5: Ejercicio incorrecto no afecta la misión
|
|
-- =============================================================================
|
|
|
|
\echo ''
|
|
\echo '==================================================================='
|
|
\echo 'TEST 5: Ejercicio incorrecto no debe actualizar misión'
|
|
\echo '==================================================================='
|
|
|
|
-- Insertar ejercicio incorrecto (aunque tenga score 100)
|
|
INSERT INTO progress_tracking.exercise_attempts (
|
|
user_id,
|
|
exercise_id,
|
|
submitted_answers,
|
|
is_correct,
|
|
score
|
|
) VALUES (
|
|
'11111111-1111-1111-1111-111111111111',
|
|
'22222222-2222-2222-2222-222222222222',
|
|
'{"answer": "wrong"}'::jsonb,
|
|
false,
|
|
100
|
|
);
|
|
|
|
-- Verificar que NO se actualizó
|
|
SELECT
|
|
id,
|
|
title,
|
|
status,
|
|
progress,
|
|
objectives->0->>'current' as current_value
|
|
FROM gamification_system.missions
|
|
WHERE id = '44444444-4444-4444-4444-444444444444';
|
|
|
|
-- Resultado esperado: current = 0, progress = 0%
|
|
|
|
-- =============================================================================
|
|
-- TEST 6: Misión con múltiples objetivos
|
|
-- =============================================================================
|
|
|
|
\echo ''
|
|
\echo '==================================================================='
|
|
\echo 'TEST 6: Misión con múltiples objetivos (uno de perfect_scores)'
|
|
\echo '==================================================================='
|
|
|
|
-- Crear misión con múltiples objetivos
|
|
INSERT INTO gamification_system.missions (
|
|
id,
|
|
user_id,
|
|
template_id,
|
|
title,
|
|
mission_type,
|
|
objectives,
|
|
rewards,
|
|
end_date
|
|
) VALUES (
|
|
'55555555-5555-5555-5555-555555555555',
|
|
'11111111-1111-1111-1111-111111111111',
|
|
'mixed_objectives',
|
|
'Misión combinada',
|
|
'weekly',
|
|
'[
|
|
{"type": "complete_exercises", "target": 10, "current": 0},
|
|
{"type": "perfect_scores", "target": 3, "current": 0},
|
|
{"type": "earn_xp", "target": 500, "current": 0}
|
|
]'::jsonb,
|
|
'{"xp": 200, "ml_coins": 100}'::jsonb,
|
|
NOW() + INTERVAL '7 days'
|
|
) ON CONFLICT (id) DO UPDATE
|
|
SET objectives = EXCLUDED.objectives,
|
|
progress = 0,
|
|
status = 'active';
|
|
|
|
-- Insertar ejercicio perfecto
|
|
INSERT INTO progress_tracking.exercise_attempts (
|
|
user_id,
|
|
exercise_id,
|
|
submitted_answers,
|
|
is_correct,
|
|
score
|
|
) VALUES (
|
|
'11111111-1111-1111-1111-111111111111',
|
|
'22222222-2222-2222-2222-222222222222',
|
|
'{"answer": "correct"}'::jsonb,
|
|
true,
|
|
100
|
|
);
|
|
|
|
-- Verificar que solo el objetivo perfect_scores se actualizó
|
|
SELECT
|
|
id,
|
|
title,
|
|
status,
|
|
progress,
|
|
objectives->0->>'current' as complete_exercises_current,
|
|
objectives->1->>'current' as perfect_scores_current,
|
|
objectives->2->>'current' as earn_xp_current
|
|
FROM gamification_system.missions
|
|
WHERE id = '55555555-5555-5555-5555-555555555555';
|
|
|
|
-- Resultado esperado:
|
|
-- complete_exercises_current = 0 (no se actualiza por este trigger)
|
|
-- perfect_scores_current = 1 (SE actualiza)
|
|
-- earn_xp_current = 0 (no se actualiza por este trigger)
|
|
-- progress debería reflejar 1/3 del segundo objetivo completado
|
|
|
|
-- =============================================================================
|
|
-- CLEANUP: Limpiar datos de prueba
|
|
-- =============================================================================
|
|
|
|
\echo ''
|
|
\echo '==================================================================='
|
|
\echo 'CLEANUP: Limpiando datos de prueba'
|
|
\echo '==================================================================='
|
|
|
|
DO $$
|
|
BEGIN
|
|
DELETE FROM progress_tracking.exercise_attempts
|
|
WHERE user_id = '11111111-1111-1111-1111-111111111111';
|
|
|
|
DELETE FROM gamification_system.missions
|
|
WHERE user_id = '11111111-1111-1111-1111-111111111111';
|
|
|
|
DELETE FROM educational_content.exercises
|
|
WHERE id = '22222222-2222-2222-2222-222222222222';
|
|
|
|
DELETE FROM auth_management.profiles
|
|
WHERE id = '11111111-1111-1111-1111-111111111111';
|
|
|
|
RAISE NOTICE 'Datos de prueba eliminados exitosamente';
|
|
END $$;
|
|
|
|
\echo ''
|
|
\echo '==================================================================='
|
|
\echo 'TESTS COMPLETADOS'
|
|
\echo '==================================================================='
|