workspace-v1/projects/gamilit/database/tests/test-perfect-scores-mission.sql
Adrian Flores Cortes 967ab360bb Initial commit: Workspace v1 with 3-layer architecture
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>
2025-12-23 00:35:19 -06:00

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 '==================================================================='