import pytest from app import create_app, db from app.models.user import User from app.models.role import Role from app.models.academic_term import AcademicTerm from app.models.classroom import Classroom from app.models.building import Building from app.models.subject import Subject, Commission from app.models.reservation import Reservation from app.services.jwt_service import JWTService from datetime import datetime, timedelta @pytest.fixture def app(): app = create_app() app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:' app.config['TESTING'] = True with app.app_context(): db.create_all() admin_role = Role.query.filter_by(name='ADMIN').first() if not admin_role: admin_role = Role(name='ADMIN', description='Administrator') db.session.add(admin_role) db.session.commit() user = User( email='admin_abm@unicaba.edu.ar', name='Admin ABM', first_name='Admin', last_name='ABM', role='ADMIN', role_id=admin_role.id, is_active=True ) user.set_password('Admin1234!') db.session.add(user) db.session.commit() yield app db.session.remove() db.drop_all() @pytest.fixture def client(app): return app.test_client() @pytest.fixture def auth_headers(app): with app.app_context(): user = User.query.filter_by(email='admin_abm@unicaba.edu.ar').first() token = JWTService.generate_tokens(user)['access_token'] return { 'Authorization': f'Bearer {token}', 'Content-Type': 'application/json' } def test_academic_term_abm(client, auth_headers): # 1. Crear término res = client.post('/api/v1/admin/academic-terms', headers=auth_headers, json={ 'name': '2026-Segundo Cuatrimestre Test', 'code': '2026-2C-TEST', 'year': 2026, 'period_type': 'Segundo Cuatrimestre', 'is_active': True, 'is_current': False }) assert res.status_code == 201 data = res.get_json() term_id = data['term']['id'] # 2. Toggle active res_toggle = client.post(f'/api/v1/admin/academic-terms/{term_id}/toggle', headers=auth_headers) assert res_toggle.status_code == 200 assert res_toggle.get_json()['is_active'] is False # 3. Delete término res_del = client.delete(f'/api/v1/admin/academic-terms/{term_id}', headers=auth_headers) assert res_del.status_code == 200 assert 'eliminado' in res_del.get_json()['message'] def test_classroom_toggle(client, auth_headers): # Crear edificio y aula building = Building(name='Sede Central Test', code='SC-TEST', address='Av Test 123') db.session.add(building) db.session.commit() classroom = Classroom( building=building.name, code='A-101-TEST', capacity=50, floor='1', building_id=building.id, is_active=True ) db.session.add(classroom) db.session.commit() # Toggle aula res = client.post(f'/api/v1/classrooms/{classroom.id}/toggle', headers=auth_headers) assert res.status_code == 200 assert res.get_json()['is_active'] is False def test_reservation_hard_delete(client, auth_headers): # Crear edificio, aula, materia, comisión y reserva building = Building(name='Sede Norte Test', code='SN-TEST', address='Av Norte 456') db.session.add(building) db.session.commit() classroom = Classroom( building=building.name, code='LAB-1-TEST', capacity=30, floor='PB', building_id=building.id, is_active=True ) db.session.add(classroom) subject = Subject(name='Base de Datos Test', code='BD-TEST', is_active=True) db.session.add(subject) db.session.commit() user = User.query.filter_by(email='admin_abm@unicaba.edu.ar').first() commission = Commission( subject_id=subject.id, code='COM-101', semester='2C', year=2026, teacher_id=user.id, max_students=30, active=True ) db.session.add(commission) db.session.commit() now = datetime.now() reservation = Reservation( classroom_id=classroom.id, commission_id=commission.id, user_id=user.id, purpose='Clase Regular de BD', expected_attendees=25, start_time=now, end_time=now + timedelta(hours=2), status='CONFIRMED' ) db.session.add(reservation) db.session.commit() res_id = reservation.id # Hard delete res_del = client.delete(f'/api/v1/reservations/{res_id}?hard=true', headers=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