fix(classrooms): blindar vistas presenciales y virtuales sin aulas + feat(admin): reinicializacion de sistema con clave de admin
This commit is contained in:
@@ -154,3 +154,77 @@ def test_reservation_hard_delete(client, auth_headers):
|
||||
assert res_del.status_code == 200
|
||||
assert 'eliminada' in res_del.get_json()['message']
|
||||
assert db.session.get(Reservation, res_id) is None
|
||||
|
||||
|
||||
def test_system_reset_validation(client, auth_headers):
|
||||
# 1. Sin contraseña -> 400
|
||||
res_no_pass = client.post('/api/v1/admin/system/reset', headers=auth_headers, json={})
|
||||
assert res_no_pass.status_code == 400
|
||||
assert 'contraseña' in res_no_pass.get_json()['message'].lower()
|
||||
|
||||
# 2. Con contraseña errónea -> 401
|
||||
res_bad_pass = client.post('/api/v1/admin/system/reset', headers=auth_headers, json={'password': 'PasswordIncorrecto123'})
|
||||
assert res_bad_pass.status_code == 401
|
||||
assert 'incorrecta' in res_bad_pass.get_json()['message'].lower()
|
||||
|
||||
|
||||
def test_system_reset_success_preserves_users(client, auth_headers):
|
||||
from app.models.career import Career
|
||||
from app.models.audit_log import AuditLog
|
||||
|
||||
# Crear datos operativos
|
||||
career = Career(name='Ingenieria en Software', code='ING-SOFT')
|
||||
db.session.add(career)
|
||||
building = Building(name='Pabellón Norte', code='PNORTE', is_active=True)
|
||||
db.session.add(building)
|
||||
db.session.flush()
|
||||
|
||||
classroom = Classroom(code='Aula 501', floor='5', capacity=40, building_id=building.id, building=building.name, is_active=True)
|
||||
subject = Subject(name='Sistemas Operativos', code='SO-101', is_active=True, career_id=career.id)
|
||||
term = AcademicTerm(name='2026-1C', code='2026-1C', start_date=datetime.now().date(), end_date=(datetime.now() + timedelta(days=120)).date(), is_active=True)
|
||||
db.session.add_all([classroom, subject, term])
|
||||
db.session.commit()
|
||||
|
||||
user = User.query.filter_by(email='admin_abm@unicaba.edu.ar').first()
|
||||
comm = Commission(code='COM-SO-1', subject_id=subject.id, semester=1, year=2026, max_students=35, is_active=True)
|
||||
db.session.add(comm)
|
||||
db.session.commit()
|
||||
|
||||
resv = Reservation(classroom_id=classroom.id, commission_id=comm.id, user_id=user.id, purpose='Clase', expected_attendees=25, start_time=datetime.now(), end_time=datetime.now() + timedelta(hours=2))
|
||||
db.session.add(resv)
|
||||
db.session.commit()
|
||||
|
||||
# Verificar que los datos existen antes del reset
|
||||
assert Classroom.query.count() >= 1
|
||||
assert Building.query.count() >= 1
|
||||
assert Subject.query.count() >= 1
|
||||
assert Career.query.count() >= 1
|
||||
assert Commission.query.count() >= 1
|
||||
assert Reservation.query.count() >= 1
|
||||
assert AcademicTerm.query.count() >= 1
|
||||
|
||||
# Ejecutar reset del sistema con la contraseña correcta del admin
|
||||
res_reset = client.post('/api/v1/admin/system/reset', headers=auth_headers, json={'password': 'Admin1234!'})
|
||||
assert res_reset.status_code == 200
|
||||
data = res_reset.get_json()
|
||||
assert data['status'] == 'success'
|
||||
assert 'reinicializado' in data['message'].lower()
|
||||
|
||||
# Comprobar que los datos operativos fueron purgados
|
||||
assert Classroom.query.count() == 0
|
||||
assert Building.query.count() == 0
|
||||
assert Subject.query.count() == 0
|
||||
assert Career.query.count() == 0
|
||||
assert Commission.query.count() == 0
|
||||
assert Reservation.query.count() == 0
|
||||
assert AcademicTerm.query.count() == 0
|
||||
|
||||
# Comprobar que los usuarios y roles se PRESERVAN
|
||||
assert User.query.filter_by(email='admin_abm@unicaba.edu.ar').first() is not None
|
||||
assert Role.query.count() >= 1
|
||||
|
||||
# Comprobar que se generó un nuevo registro de auditoría del evento SYSTEM_RESET
|
||||
reset_logs = AuditLog.query.filter_by(action='SYSTEM_RESET').all()
|
||||
assert len(reset_logs) == 1
|
||||
assert reset_logs[0].user_email == 'admin_abm@unicaba.edu.ar'
|
||||
|
||||
|
||||
Reference in New Issue
Block a user