| from sqlalchemy import create_engine |
| from sqlalchemy.orm import sessionmaker |
| from sqlalchemy.pool import StaticPool |
|
|
| from app.core.database import Base |
| from app.models.department import Department |
| from app.models.user import User |
| from app.schemas.admin import AdminDepartmentUpdate, AdminUserUpdate |
| from app.schemas.auth import SignupRequest |
| from app.services.admin_service import ( |
| create_department, |
| deactivate_department, |
| deactivate_user, |
| list_departments, |
| list_users, |
| update_department, |
| update_user, |
| ) |
| from app.services.auth_service import create_user |
|
|
|
|
| def _make_session(): |
| engine = create_engine( |
| "sqlite+pysqlite:///:memory:", |
| connect_args={"check_same_thread": False}, |
| poolclass=StaticPool, |
| ) |
| TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) |
| Base.metadata.create_all(bind=engine) |
| return engine, TestingSessionLocal() |
|
|
|
|
| def test_admin_can_create_update_and_deactivate_department(): |
| engine, db = _make_session() |
| try: |
| created = create_department( |
| db, |
| name="Library", |
| code="LIB", |
| description="Library department", |
| keywords="books,study", |
| ) |
|
|
| assert created.name == "Library" |
| assert created.is_active is True |
|
|
| updated = update_department( |
| db, |
| department_id=created.id, |
| payload=AdminDepartmentUpdate( |
| name="Library Services", |
| code="LIB-S", |
| description="Updated library department", |
| keywords="books, study, catalog", |
| is_active=True, |
| ), |
| ) |
|
|
| assert updated.name == "Library Services" |
| assert updated.code == "LIB-S" |
| assert updated.keywords == "books, study, catalog" |
|
|
| deactivated = deactivate_department(db, department_id=created.id) |
| assert deactivated.is_active is False |
|
|
| departments = list_departments(db) |
| assert departments == [] |
| finally: |
| db.close() |
| Base.metadata.drop_all(bind=engine) |
|
|
|
|
| def test_admin_can_list_and_update_user_department(): |
| engine, db = _make_session() |
| try: |
| finance = Department( |
| name="Finance Department", |
| code="FIN", |
| description="Finance work", |
| keywords="finance, budget", |
| ) |
| exam = Department( |
| name="Examination Department", |
| code="EXAM", |
| description="Exam work", |
| keywords="exam, timetable", |
| ) |
| db.add_all([finance, exam]) |
| db.commit() |
| db.refresh(finance) |
| db.refresh(exam) |
|
|
| user = create_user( |
| db, |
| SignupRequest( |
| email="staff@example.com", |
| password="password123", |
| full_name="Finance Staff", |
| department_name="Finance Department", |
| ), |
| ) |
|
|
| users = list_users(db) |
| assert len(users) == 1 |
| assert users[0].department_name == "Finance Department" |
|
|
| updated = update_user( |
| db, |
| user_id=user.id, |
| payload=AdminUserUpdate( |
| full_name="Exam Staff", |
| department_name="Examination Department", |
| is_active=False, |
| ), |
| ) |
|
|
| assert updated.full_name == "Exam Staff" |
| assert updated.role == "Examination Department" |
| assert updated.department_id == exam.id |
| assert updated.is_active is False |
|
|
| deactivated = deactivate_user(db, user_id=user.id) |
| assert deactivated.is_active is False |
| finally: |
| db.close() |
| Base.metadata.drop_all(bind=engine) |
|
|