#!/usr/bin/env python3 """Test script for chat room management API""" import json import uuid from datetime import datetime from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from app.core.database import Base from app.modules.auth.models import UserSession from app.modules.chat_room.models import IncidentRoom, RoomMember, RoomTemplate, RoomStatus, MemberRole from app.modules.chat_room.services.room_service import room_service from app.modules.chat_room.services.membership_service import membership_service from app.modules.chat_room.services.template_service import template_service from app.modules.chat_room.schemas import CreateRoomRequest, IncidentType, SeverityLevel # Setup test database engine = create_engine("sqlite:///./test_chat_room.db") Base.metadata.create_all(bind=engine) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) def test_room_management(): """Test the core room management functionality""" db = SessionLocal() print("=" * 60) print("Testing Chat Room Management System") print("=" * 60) try: # Test users admin_email = "ymirliu@panjit.com.tw" user1_email = "john.doe@panjit.com.tw" user2_email = "jane.smith@panjit.com.tw" # 1. Test admin check print("\n1. Testing admin identification:") is_admin = membership_service.is_system_admin(admin_email) print(f" - Is {admin_email} admin? {is_admin}") is_admin = membership_service.is_system_admin(user1_email) print(f" - Is {user1_email} admin? {is_admin}") # 2. Create a room print("\n2. Creating a new incident room:") room_data = CreateRoomRequest( title="Equipment Failure in Line A", incident_type=IncidentType.EQUIPMENT_FAILURE, severity=SeverityLevel.HIGH, location="Production Floor A", description="Main conveyor belt stopped working" ) room = room_service.create_room(db, user1_email, room_data) print(f" - Room created: {room.title}") print(f" - Room ID: {room.room_id}") print(f" - Created by: {room.created_by}") print(f" - Status: {room.status}") # 3. Check initial membership print("\n3. Checking initial membership:") role = membership_service.get_user_role_in_room(db, room.room_id, user1_email) print(f" - {user1_email} role: {role}") # 4. Add members print("\n4. Adding members to the room:") member2 = membership_service.add_member( db, room.room_id, user2_email, MemberRole.EDITOR, user1_email ) print(f" - Added {user2_email} as {member2.role}") member3 = membership_service.add_member( db, room.room_id, admin_email, MemberRole.VIEWER, user1_email ) print(f" - Added {admin_email} as {member3.role}") # 5. List room members print("\n5. Listing all room members:") members = membership_service.get_room_members(db, room.room_id) for member in members: print(f" - {member.user_id}: {member.role}") # 6. Test ownership transfer print("\n6. Testing ownership transfer:") print(f" - Current owner: {user1_email}") print(f" - Transferring to: {user2_email}") success = membership_service.transfer_ownership( db, room.room_id, user1_email, user2_email ) if success: print(" - Transfer successful!") # Check new roles role1 = membership_service.get_user_role_in_room(db, room.room_id, user1_email) role2 = membership_service.get_user_role_in_room(db, room.room_id, user2_email) print(f" - {user1_email} new role: {role1}") print(f" - {user2_email} new role: {role2}") # Check audit fields (refetch room) db.refresh(room) print(f" - Transfer recorded at: {room.ownership_transferred_at}") print(f" - Transfer by: {room.ownership_transferred_by}") # 7. Test admin override print("\n7. Testing admin override capabilities:") # Admin can update room even if only a viewer from app.modules.chat_room.schemas import UpdateRoomRequest update_data = UpdateRoomRequest( severity=SeverityLevel.CRITICAL, status=RoomStatus.RESOLVED, resolution_notes="Admin resolved the issue" ) # Simulate admin update (in real API, this would be checked in dependencies) is_admin = membership_service.is_system_admin(admin_email) if is_admin: print(f" - Admin {admin_email} updating room (has override)") room = room_service.update_room(db, room.room_id, update_data) print(f" - New severity: {room.severity}") print(f" - New status: {room.status}") print(f" - Resolution notes: {room.resolution_notes}") # 8. Test room templates print("\n8. Testing room templates:") templates = template_service.get_templates(db) print(f" - Found {len(templates)} templates") for template in templates: print(f" * {template.name}: {template.incident_type}") if templates: # Create room from template print("\n9. Creating room from template:") template = templates[0] room2 = template_service.create_room_from_template( db, template.template_id, user1_email, title="New Equipment Issue", location="Line B", description="Using template for quick setup" ) print(f" - Room created from template: {room2.title}") print(f" - Incident type: {room2.incident_type}") print(f" - Severity: {room2.severity}") # Check default members members = membership_service.get_room_members(db, room2.room_id) print(f" - Auto-added {len(members)} members from template") # 10. Test user's room listing print("\n10. Testing user's room listing:") from app.modules.chat_room.schemas import RoomFilterParams filters = RoomFilterParams(limit=10, offset=0) # User1's rooms rooms, total = room_service.list_user_rooms(db, user1_email, filters, False) print(f" - {user1_email} has access to {total} room(s)") # Admin's rooms (with admin flag) rooms, total = room_service.list_user_rooms(db, admin_email, filters, True) print(f" - Admin {admin_email} can see {total} room(s)") print("\n" + "=" * 60) print("All tests completed successfully!") print("=" * 60) except Exception as e: print(f"\nError during testing: {e}") import traceback traceback.print_exc() finally: db.close() if __name__ == "__main__": test_room_management()