This commit is contained in:
2026-07-16 09:53:14 +07:00
parent 0fc112a2e8
commit 29cec708a3
1236 changed files with 212848 additions and 0 deletions

453
plans/system-test-flow.md Normal file
View File

@@ -0,0 +1,453 @@
# Training System Test Flow
เอกสารนี้ใช้สำหรับทดสอบระบบตามโครงสร้างล่าสุดของโปรเจ็กต์:
- `Super Admin` จัดการ `Organizers`
- `Admin` จัดการ `Users`, `Courses`, `Training Records`, `Training Matrix`, `Reports`
- `User` เห็นเฉพาะ `Dashboard`, `Training Records`, `Reports`
- ใช้ `users` เป็น person entity เดียวของระบบแล้ว ไม่ใช้ `employees` เป็น runtime module
## 1. Scope
ครอบคลุม flow หลักดังนี้:
- Authentication และ organizer access
- Organizer management
- User management
- Course management
- Training record CRUD
- Certificate upload
- Approval workflow
- Training matrix
- Dashboard
- Reports และ CSV export
- RBAC และ data scoping
## 2. Test Prerequisites
ก่อนเริ่มทดสอบ ให้ตรวจสอบว่า:
- ตั้งค่า `.env.local` แล้ว
- PostgreSQL ทำงานได้
- migrations ถูก apply แล้ว
- dev server รันได้ด้วย `npm run dev`
- มีข้อมูล master ของ `departments` และ `positions`
บัญชีทดสอบที่แนะนำ:
- `super_admin` 1 คน
- `admin` 1 คน
- `user` 1 คน
ข้อมูลทดสอบขั้นต่ำ:
- 1 organizer
- 2 departments
- 2 positions
- 3 users
- 3 courses
## 3. Recommended Test Order
1. Auth and access
2. Organizer management
3. User management
4. Courses
5. Training records
6. Certificates
7. Approval workflow
8. Training matrix
9. Dashboard
10. Reports
11. RBAC regression
## 4. Auth And Access
### 4.1 Sign In
ทดสอบ:
- เปิด `/auth/sign-in`
- login ด้วย `super_admin`
- login ด้วย `admin`
- login ด้วย `user`
ผลที่คาดหวัง:
- `super_admin` เข้า organizer flow ได้
- `admin` เข้า `/dashboard/overview` ได้
- `user` เข้า `/dashboard/overview` ได้
### 4.2 Sign Up Disabled
ทดสอบ:
- เปิด `/auth/sign-up`
- เรียก `POST /api/auth/register`
ผลที่คาดหวัง:
- ผู้ใช้สมัครเองไม่ได้
- ระบบแจ้งชัดว่าต้องให้ admin สร้างบัญชีให้
### 4.3 Protected Routes
ทดสอบ:
- logout
- เปิด `/dashboard/overview`
- เรียก `/api/users`
ผลที่คาดหวัง:
- หน้า dashboard redirect ไป sign-in
- protected API ตอบ `401`
## 5. Organizer Flow
ใช้ `super_admin`
### 5.1 Organizer List
ทดสอบ:
- เปิด `/dashboard/organizers`
ผลที่คาดหวัง:
- เห็นรายการ organizer ทั้งหมด
### 5.2 Create Organizer
ทดสอบ:
- สร้าง organizer ใหม่
ผลที่คาดหวัง:
- สร้าง organizer สำเร็จ
- master data ของ organizer ใหม่ถูก seed ให้
## 6. User Flow
ใช้ `admin` หรือ `super_admin`
### 6.1 User List
ทดสอบ:
- เปิด `/dashboard/users`
- search
- filter status
- sort
- pagination
ผลที่คาดหวัง:
- ตารางโหลดข้อมูลได้
- filter และ sort ทำงานถูกต้อง
### 6.2 Create User
ทดสอบ:
- กดเพิ่ม user
- กรอก `full name`, `email`, `phone`, `employee code`
- เลือก `department` จาก dropdown
- เลือก `position` จาก dropdown
- ระบุ `hired date`
- สำหรับ `super_admin` ให้เลือก organizer ได้
- สำหรับ `admin` organizer ต้อง default จาก active organizer
ผลที่คาดหวัง:
- สร้าง user สำเร็จ
- user ใหม่มี membership ใน organizer ที่เลือก
### 6.3 Edit User
ทดสอบ:
- แก้ไข department, position, role, status
ผลที่คาดหวัง:
- ข้อมูลอัปเดตสำเร็จ
## 7. Sidebar Visibility
### 7.1 Super Admin
ผลที่คาดหวัง:
- เห็น `Dashboard`, `Organizers`, `Users`, `Courses`, `Training Records`, `Training Matrix`, `Reports`
### 7.2 Admin
ผลที่คาดหวัง:
- เห็น `Dashboard`, `Users`, `Courses`, `Training Records`, `Training Matrix`, `Reports`
- ไม่เห็น `Organizers`
### 7.3 User
ผลที่คาดหวัง:
- เห็นเฉพาะ `Dashboard`, `Training Records`, `Reports`
## 8. Course Flow
ใช้ `admin`
### 8.1 Course List And Filters
ทดสอบ:
- เปิด `/dashboard/courses`
- search
- filter category
- filter status
ผลที่คาดหวัง:
- ตารางแสดงผลถูกต้อง
### 8.2 Create And Edit Course
ทดสอบ:
- สร้าง course ใหม่
- แก้ไขข้อมูล course
ผลที่คาดหวัง:
- create/update สำเร็จ
## 9. Training Record Flow
### 9.1 Admin Creates Training Record
ใช้ `admin`
ทดสอบ:
- เปิด `/dashboard/training-records`
- สร้าง record ใหม่
- เลือก `user`
- เลือก `course`
- กรอก date, type, hours, organizer, note
ผลที่คาดหวัง:
- สร้าง record สำเร็จ
- status เริ่มที่ `pending`
### 9.2 User Creates Own Training Record
ใช้ `user`
ทดสอบ:
- เปิด `/dashboard/training-records`
- สร้าง record ใหม่
ผลที่คาดหวัง:
- dropdown `user` ต้องมองเห็นได้เฉพาะตัวเอง
- สร้าง record ของคนอื่นไม่ได้
### 9.3 List And Edit
ทดสอบ:
- list records
- filter by status
- filter by type
- เปิดหน้า detail/edit
ผลที่คาดหวัง:
- `admin` เห็นทุก record ใน organizer
- `user` เห็นเฉพาะ record ของตัวเอง
## 10. Certificate Flow
### 10.1 Upload Certificate
ทดสอบ:
- เปิดหน้า edit training record
- อัปโหลด `pdf`, `jpg`, `jpeg`, `png`
ผลที่คาดหวัง:
- upload สำเร็จ
- metadata ถูกบันทึก
### 10.2 View And Delete
ทดสอบ:
- เปิดดูไฟล์ย้อนหลัง
- ลบ certificate
ผลที่คาดหวัง:
- เปิดไฟล์ได้
- ลบแล้วรายการหาย
## 11. Approval Workflow
### 11.1 Admin Review
ใช้ `admin`
ทดสอบ:
- เปิด `/dashboard/training-records?status=pending`
- `Approve`
- `Reject`
- `Request Changes`
- ใส่ reviewer note
ผลที่คาดหวัง:
- เปลี่ยน status ได้
- reviewer note ถูกบันทึก
### 11.2 User Restrictions
ใช้ `user`
ทดสอบ:
- พยายาม review record
- พยายามแก้ approved record
ผลที่คาดหวัง:
- review ไม่ได้
- approved record แก้ไม่ได้ตาม policy
## 12. Training Matrix
ใช้ `admin`
### 12.1 Create Rules
ทดสอบ:
- เปิด `/dashboard/training-matrix`
- เพิ่ม rule แบบ department -> course
- เพิ่ม rule แบบ position -> course
- กำหนด renewal period
ผลที่คาดหวัง:
- สร้าง rules สำเร็จ
### 12.2 Compliance
ทดสอบ:
- user ที่มี approved records ครบ
- user ที่ยังขาด course
- user ที่มี course หมดอายุ
ผลที่คาดหวัง:
- compliance คำนวณถูกต้อง
- missing courses แสดงถูกต้อง
## 13. Dashboard
### 13.1 Admin Dashboard
ใช้ `admin`
ผลที่คาดหวัง:
- เห็นภาพรวมระดับ organizer
- summary cards, charts, recent activity ใช้ข้อมูลจริง
### 13.2 User Dashboard
ใช้ `user`
ผลที่คาดหวัง:
- เห็นเฉพาะข้อมูลของตัวเอง
- ไม่เห็น organizer-wide management views
## 14. Reports
### 14.1 Admin Reports
ใช้ `admin`
ทดสอบ:
- เปิด `/dashboard/reports`
- filter ตาม user
- filter ตาม department
- filter ตาม expiring days
ผลที่คาดหวัง:
- ตารางรายงานอัปเดตตาม filter
- export CSV ได้
### 14.2 User Reports
ใช้ `user`
ทดสอบ:
- เปิด `/dashboard/reports`
- ทดลองแก้ query string เอง
ผลที่คาดหวัง:
- เห็นเฉพาะข้อมูลของตัวเอง
- server บังคับ self-scope แม้ปรับ URL เอง
- export CSV ได้เฉพาะข้อมูลของตัวเอง
## 15. RBAC Regression
### 15.1 Cross-Organizer Isolation
ทดสอบ:
- login ด้วย user ของ organizer A
- พยายามเปิดข้อมูลของ organizer B
ผลที่คาดหวัง:
- มองไม่เห็นข้อมูลข้าม organizer
### 15.2 Legacy Employee Routes
ทดสอบ:
- เปิด `/dashboard/employees`
- เปิด `/dashboard/employees/new`
ผลที่คาดหวัง:
- ระบบพาไปหน้า `/dashboard/users`
## 16. Final Regression Checklist
- sign-in / sign-out ทำงาน
- sign-up ถูกปิด
- sidebar แยกตาม role ถูกต้อง
- organizer flow ใช้งานได้
- users ใช้งานได้
- courses ใช้งานได้
- training-records ใช้งานได้
- certificate upload ใช้งานได้
- approval workflow ใช้งานได้
- training matrix ใช้งานได้
- dashboard ใช้งานได้
- reports และ CSV export ใช้งานได้
- `npm run build` ผ่าน