5.8 KiB
| description | argument-hint | allowed-tools |
|---|---|---|
| Sinh smoke test checklist (Happy / Empty / Error / Responsive / Data Edge) từ PR/commit Gitea | <gitea-pr-or-commit-url> | Bash, Read, Grep, Glob |
/smoke-test-checklist
Đầu vào ($ARGUMENTS) là một link Gitea:
- Pull request:
https://<gitea-host>/<owner>/<repo>/pulls/<index>(chấp nhận cả/pull/<index>). - Commit:
https://<gitea-host>/<owner>/<repo>/commit/<sha>(chấp nhận cả/commits/<sha>).
Nếu thiếu link, dừng và yêu cầu cung cấp.
Credentials Gitea (Basic Auth)
- Username:
andrew.ng@apactech.io - Password:
andrew.ng@123
Gọi API bằng curl -s -u "andrew.ng@apactech.io:andrew.ng@123" -H "Accept: application/json" --fail-with-body "<url>". 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 (chopr) hoặc SHA (chocommit).
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 <sha> / git diff <base>..<head> 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.tshoặc handler trongFRONTEND/src/App.tsx's biguseEffect/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 Redissocket_statehoặcstation:{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 /
setTimeoutConnectchạ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).
Mobile / Responsive
Chỉ thêm nếu diff đụng FE UI; nếu thuần BE thì ghi N/A — thay đổi không ảnh hưởng UI.
- Viewport ≤ 768px (mobile), 1024px (tablet), ≥ 1440px (desktop).
- Layout không bị tràn, không che button.
- Modal stacking (terminal modal, nested modal) vẫn đúng.
- Drag tabs (
DragTabs.tsx) còn dùng được trên touch. - Terminal xterm fit lại khi resize.
Data Edge Case
- Chuỗi rất dài (output line, log, scenario name → buffer truncate ở
saveState5000 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 (
keepConnectAPC40s /keepConnectStation120s) đú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 — <KIND> #<REF>
## Happy Path
- [ ] <bước 1 + kỳ vọng>
- [ ] <bước 2 + kỳ vọng>
...
## Empty State
- [ ] <case 1>
...
## Error Case
- [ ] <case 1>
...
## Data Edge Case
- [ ] <case 1>
...
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 — <lý do>, 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
/runhoặc/verifyriêng). - Không comment lên Gitea / Jira.
- Không sửa code.
- Không in password.