feat: Initial commit - Task Reporter incident response system
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>
This commit is contained in:
169
test_chat_room.py
Normal file
169
test_chat_room.py
Normal file
@@ -0,0 +1,169 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user