Complete implementation of the production line incident response system (生產線異常即時反應系統) including: Backend (FastAPI): - User authentication with AD integration and session management - Chat room management (create, list, update, members, roles) - Real-time messaging via WebSocket (typing indicators, reactions) - File storage with MinIO (upload, download, image preview) Frontend (React + Vite): - Authentication flow with token management - Room list with filtering, search, and pagination - Real-time chat interface with WebSocket - File upload with drag-and-drop and image preview - Member management and room settings - Breadcrumb navigation - 53 unit tests (Vitest) Specifications: - authentication: AD auth, sessions, JWT tokens - chat-room: rooms, members, templates - realtime-messaging: WebSocket, messages, reactions - file-storage: MinIO integration, file management - frontend-core: React SPA structure 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
169 lines
6.9 KiB
Python
169 lines
6.9 KiB
Python
#!/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() |