--- description: Sinh smoke test checklist (Happy / Empty / Error / Responsive / Data Edge) từ PR/commit Gitea argument-hint: allowed-tools: Bash, Read, Grep, Glob --- # /smoke-test-checklist Đầu vào (`$ARGUMENTS`) là **một link Gitea**: - Pull request: `https://///pulls/` (chấp nhận cả `/pull/`). - Commit: `https://///commit/` (chấp nhận cả `/commits/`). Nếu thiếu link, **dừng** và yêu cầu cung cấp. Gọi API bằng `curl -s -u "andrew.ng@apactech.io:andrew.ng@123" -H "Accept: application/json" --fail-with-body ""`. **Không** in lệnh kèm password ra response. Nếu 401/403, báo lỗi auth, không in credentials. ## Các bước phải làm ### 1. Parse link - `GITEA_HOST` = scheme + host. `OWNER`, `REPO`. - `KIND` = `pr` (path chứa `/pulls/` hoặc `/pull/`) | `commit` (path chứa `/commit/` hoặc `/commits/`). - `REF` = số PR (cho `pr`) hoặc SHA (cho `commit`). Nếu không khớp pattern → hỏi lại thay vì đoán. ### 2. Lấy diff để hiểu phạm vi thay đổi Base API: `${GITEA_HOST}/api/v1/repos/${OWNER}/${REPO}` #### KIND = pr - `GET /pulls/${REF}` → `title`, `body`, `base.ref`, `head.ref`, `head.sha`, `state`, `merged`. - `GET /pulls/${REF}/files` → list file thay đổi. - Raw diff: `GET ${GITEA_HOST}/${OWNER}/${REPO}/pulls/${REF}.diff` → lưu `/tmp/smoke-${REF}.diff`. #### KIND = commit - `GET /git/commits/${REF}` → `message`, `files`. - Raw diff: `GET ${GITEA_HOST}/${OWNER}/${REPO}/commit/${REF}.diff` → lưu `/tmp/smoke-${REF}.diff`. **Ưu tiên git local** nếu `git remote -v` trỏ về cùng `GITEA_HOST/${OWNER}/${REPO}`: dùng `git show ` / `git diff ..` thay vì hit Gitea. ### 3. Phân loại thay đổi Đọc diff + (nếu cần) mở file gốc bằng `Read` để xác định **bề mặt cần test**: - **UI / FE**: file dưới `FRONTEND/src/` (components, modals, pages, routing, `App.tsx`, terminal). - **API / BE**: file dưới `BACKEND/app/controllers/`, routes (`start/routes.ts`), models, migrations. - **Socket event**: handler mới/sửa trong `BACKEND/providers/socket_io_provider.ts` hoặc handler trong `FRONTEND/src/App.tsx`'s big `useEffect` / `SocketContext`. - **Device interaction**: thay đổi trong `BACKEND/app/services/{line,station,apc,switch}_connection.ts` (gửi command xuống thiết bị, scenario, DPELP, physical test, IOS/license load). - **Persisted state**: thay đổi `saveState`/`restoreState`, key Redis `socket_state` hoặc `station:{id}:line:{id}:history`, migration MySQL. Ghi nhớ phân loại để generate checklist phù hợp (vd. không thêm "Mobile / Responsive" cho thay đổi thuần BE). ### 4. Sinh checklist **5 nhóm bắt buộc** (đúng thứ tự, đúng tên): #### Happy Path Kịch bản chính của tính năng vừa thêm/sửa, đi từ A→Z với input hợp lệ. Mỗi mục mô tả **hành động cụ thể + kỳ vọng quan sát được**. #### Empty State - Danh sách rỗng, chưa có dữ liệu. - User chưa chọn line/station nào. - Modal mở khi không có context (chưa connect, chưa run scenario, v.v.). - Trang load lần đầu chưa có `localStorage.user`. #### Error Case - API trả 4xx/5xx. - Socket disconnect giữa chừng (mất line/station session → cần auto-reconnect theo `handleLineOperation`). - TCP session timeout / `setTimeoutConnect` chạm 8h. - Device không phản hồi command (vd. APC, switch). - Input invalid (tên rỗng, ký tự đặc biệt, số âm). - Lỗi từ Lucid model (unique constraint, FK). #### Data Edge Case - Chuỗi rất dài (output line, log, scenario name → buffer truncate ở `saveState` 5000 chars). - Ký tự Unicode / emoji / VN dấu trong tên station, scenario, comment. - Số rất lớn / âm / 0 cho port number, line number, timeout. - Concurrent: 2 user thao tác cùng 1 line/station (CLI ownership trong `userConnecting`). - Race với keep-alive (`keepConnectAPC` 40s / `keepConnectStation` 120s) đúng lúc user gửi command. - Restart backend → state restore đúng từ Redis (`restoreState`). ### 5. Trả về kết quả Format markdown (Vietnamese), checkbox GitHub-style `- [ ]`: ``` # Smoke Test Checklist — # 1. Happy Path - [ ] - [ ] ... 2. Empty State - [ ] ... 3. Error Case - [ ] ... 4. Data Edge Case - [ ] ... ``` ### 6. Nguyên tắc viết checklist - Mỗi item bắt đầu bằng **động từ hành động** (Mở, Nhấn, Gửi, Disconnect…) + **kỳ vọng quan sát được**, không viết chung chung "test feature X". - Bám sát diff: chỉ liệt kê case **liên quan trực tiếp** thay đổi này. Không generate checklist generic cho cả app. - Đặt item theo thứ tự dễ thực hiện (UI flow trước, edge sau). - Nếu một nhóm không có case nào áp dụng → ghi rõ `N/A — `, không tự bịa. - Tổng số item khuyến nghị: 3–8 / nhóm. Nếu nhiều hơn, gom case tương đương. ### 7. Không tự ý - **Không** tự chạy test, không khởi động app (nếu user muốn, họ chạy `/run` hoặc `/verify` riêng). - **Không** comment lên Gitea / Jira. - **Không** sửa code. - **Không** in password.