Skip to content

US-S02: Chuẩn bị điều kiện và dọn dữ liệu sau test ​

Thuộc FS: 00-overview.md — SAPP-26297 Chuyển nhượng học viên (tool sapp.011) Phần chung (tổng quan, roles, flow tổng, related features, NFR, Open Questions, References) xem ở Overview. File này chỉ chứa nội dung riêng của US.

Cơ chế chạy bước (fixture, bước SQL, xác nhận câu GHI, ghi ngược fixture) → US-S01. Cơ chế SQL runner → US-P09.

FieldValue
US IDUS-S02
Role thực hiệnR1 - Người dùng tool — Assumption (OQ về G-01 → OQ-S-01)
PhaseAs-built (đã triển khai @ e77c47a)
PriorityN/A — as-built
StatusDraft
NFR liên quanNFR-S-02, NFR-S-05 — xem Overview §5
OQ liên quanOQ-S-01, OQ-S-09, OQ-S-14 — xem Overview §6

1. US Statement ​

text
As a Người dùng tool  [Assumption — OQ-S-01]
I want kiểm tra tiền điều kiện dữ liệu trên DB Ops trước khi chạy các luồng, và dọn dữ liệu test sau khi chạy xong
So that [Assumption — OQ-S-18] các luồng 1–3 chạy trên dữ liệu đúng giả định của guide QA
        (tool ghi: "Chạy trước mọi luồng: migration, dữ liệu 2 lớp cùng môn + 2 học viên 0%. Chạy phần dọn sau khi test xong.")

2. Dependencies & Definition Of Ready ​

N/A — đã triển khai. Dependency runtime:

#Cần sẵn sàngAi cung cấpTrạng thái
D1Fixture có class_id_l1, class_id_l2, user_a, user_b (0.1); thêm user_c, foundation_class_id (0.2)Tester—
D2SQL runner kết nối được DB Ops dev/staging (US-P09)BE / Admin CMS—

3. Business Rules ​

IDRuleÁp dụng ởĐã cover bởi (AC)Nguồn code (Mode B/C)
BR-01Case 0.1 gồm 5 câu chỉ đọc: (1) migration đã thêm 3 cột subject_id, cancelled_by, cancelled_at vào bảng lịch sử chuyển nhượng; (2) L1 và L2 là lớp LESSON cùng môn; (3) A, B đang NORMAL với tiến độ 0 hoặc trống; (4) B chưa nhận chuyển nhượng môn này (0 dòng, hoặc mọi dòng REVERTED); (5) lớp Foundation đi kèm L1M1 - case 0.1AC-M1.1fe/src/ui/components/works/sapp/sapp-26297-flows.ts:544-573 · be/libs/constants/src/lib/sapp/sapp-26297-sql.constants.ts:22-61
BR-02Tool không tự ghi subject_id / foundation_class_id từ kết quả 0.1 — ghi chú yêu cầu tester chép tay vào fixtureM1 - case 0.1AC-M1.2sapp-26297-flows.ts:559-571
BR-03Case 0.2 gồm 3 câu GHI + 1 hướng dẫn: trả type NORMAL cho A, B, C tại L1, L2, F1; đưa tiến độ đã học về 0 cho A tại L1 và B tại L2; xoá bản ghi lịch sử A→B và C→B; hướng dẫn khôi phục học viên bị xoá mềm ở nhóm 3B bằng câu #3 của panel nhóm BM1 - case 0.2AC-M1.3sapp-26297-flows.ts:574-590 · sapp-26297-sql.constants.ts:230-249
BR-04Mọi câu chỉ chạy trên DB Ops dev/staging theo môi trường đang chọn (NFR-S-02)M1AC-M1.1, AC-M1.3be/libs/constants/src/lib/sapp/sapp-ops-sql.constants.ts:29-32
BR-05Catalogue s26297.* có 39 entry (20 đọc, 19 GHI); id = prefix của panel + số thứ tự bắt đầu từ 1; một prefix = một panel trên màn; bản FE phải khớp bản BE (NFR-S-05)Toàn toolAC-M1.4sapp-26297-sql.constants.ts:1-20 · sapp-26297-flows.ts:321-349 · fe/src/ui/components/works/sapp/sapp-26297-sql.ts:9-270

4. Design ​

a. Mối liên hệ giữa các màn & User Flow ​

text
[Tab "Chuẩn bị · Dọn"]
  ├─ case 0.1 Kiểm tiền điều kiện  → 5 câu đọc → tester chép subject_id, foundation_class_id vào fixture
  │     ↓
  │   [chạy luồng 1 → 6]
  │     ↓
  └─ case 0.2 Dọn dữ liệu sau test → 3 câu GHI → (khôi phục nhóm 3B ở panel 3B)

b. Chi tiết từng màn ​

Màn M1 - Tab "Chuẩn bị · Dọn" ​

FieldValue
Figma frameN/A
Trigger vào mànTab mặc định khi mở màn tool; hoặc bấm tab "Chuẩn bị · Dọn"
Mô tả ngắnTóm tắt: "Chạy trước mọi luồng … Chỉ trên DB dev/staging." 2 case: 0.1, 0.2. Mọi ô fixture đều hiện ở tab này (US-S01 BR-05)
UI States ​
StateKhi nàoHiển thịFigma frame
DefaultVào tabTóm tắt + 2 case đóngN/A
LoadingĐang chạy câu SQLTheo US-S01 M3 / US-P09N/A
Has dataChạy xong câuKết quả dưới từng câuN/A
EmptyCâu đọc trả 0 dòngTheo US-P09 (với câu (4) của 0.1: 0 dòng là đạt)N/A
ErrorRunner lỗiTheo US-P09N/A
DisabledN/A—N/A
Fields ​
FieldRequiredTypeDefaultFormatValidationError MessageVisibilityDepends On
Fixture class_id_l1, class_id_l2, user_a, user_b, subject_idYes cho 0.1Text—id OpsUS-S01 BR-06—Always ở tab này—
Fixture user_c, foundation_class_idYes cho 0.2Text—id OpsUS-S01 BR-06—Always ở tab nàyfoundation_class_id chép từ câu (5) của 0.1
Actions ​
A1 - Chạy panel SQL chuẩn bị (s26297.pre) ​
ItemDescription
TriggerMở case 0.1, chạy từng câu
Behavior5 câu đọc (BR-01). Không ghi
Success ResultTester đối chiếu kết quả với ghi chú từng câu, chép subject_id / foundation_class_id vào fixture (BR-02)

Error cases:

CaseExpected Handling
Câu (1) trả < 3 dòngGhi chú: "Thiếu thì luồng 1–3 fail toàn bộ" — tool không chặn luồng khác
A2 - Chạy panel SQL dọn (s26297.clean) &ZeroWidthSpace;
ItemDescription
TriggerMở case 0.2, chạy từng câu (mỗi câu hỏi xác nhận GHI)
Behavior3 câu GHI (BR-03). Ghi vào: DB Ops dev/staging — bảng trạng thái học viên trong lớp (type, tiến độ) và bảng lịch sử chuyển nhượng (xoá dòng)
Success ResultDữ liệu A, B, C trở về trạng thái sẵn sàng test lại

Error cases:

CaseExpected Handling
Tester huỷ xác nhậnKhông chạy câu đó

Catalogue s26297.* theo panel (39 entry):

PrefixDùng ở caseĐọcGHIViệc làm
pre.1-50.150Kiểm migration, lớp, trạng thái A/B, lịch sử của B, lớp Foundation đi kèm
f1v.1-31.A, 2.B30Verify sau chuyển nhượng: trạng thái hai phía, bản ghi lịch sử mới nhất, đúng 1 bản ghi A→B
f2v.1-22.A, 2.6, 2.7, 4.D20Verify sau hủy: trạng thái + tiến độ hai phía, bản ghi REVERTED không bị xoá
c12.11.201A tại L1: tiến độ 3/10
c24.1-22.402Xoá mềm L2 / khôi phục L2
c25.1-22.502Xoá mềm B khỏi L2 / khôi phục
c26.12.601B tại L2: tiến độ 1/10
c31.13.110Tìm lớp Lesson khác môn
c32.13.210Tìm lớp Revision
c33.11.3, 3.301B tại L2: tiến độ 3/10
c34.11.4, 3.401B tại L2 → RESERVED
c35.13.510Bản ghi TRANSFERRED của B trong môn
c36.1-21.5, 2.7, 3.611Lớp Foundation đi kèm L1 / A tại F1 → RESERVED
int.11.2–1.5, 3.1–3.6 (bước "3.7")10Trạng thái A/B + số bản ghi A→B không đổi sau từ chối
grpb.1-33B12Trạng thái user_x/user_y / dựng target_type cho user_x / khôi phục xoá mềm
clean.1-30.203Trả NORMAL / tiến độ về 0 / xoá lịch sử A→B, C→B
lms.1-34.1–4.812Lớp của học viên test / dựng target_type / trả NORMAL
hs5.1-35 (A.1, B, 5.1–5.8)30Dòng đồng bộ enrollment của ticket (ghi ngược hs_user_id) / trạng thái học viên mọi lớp / lớp đã khai giảng chưa
hs5s.1-35.3 (dùng cho 5.4, 5.6)03Tiến độ 2/10 tại lớp mới 2 / lớp cũ → MOVED_OUT / lớp mới 1 → TRANSFERED_TO
Tổng2019

Nguồn: sapp-26297-sql.constants.ts:20-316; bảng Ops chạm tới: trạng thái học viên trong lớp (type, tiến độ, deleted_at), classes.deleted_at, lịch sử chuyển nhượng, liên kết Foundation, dòng đồng bộ enrollment HubSpot (inventory §4.4).

Acceptance Criteria của màn M1 &ZeroWidthSpace;
AC-M1.1 - Kiểm tiền điều kiện &ZeroWidthSpace;
gherkin
Given môi trường "dev" và fixture có class_id_l1, class_id_l2, user_a, user_b, subject_id
When người dùng chạy 5 câu của case 0.1
Then câu (1) trả đúng 3 dòng subject_id, cancelled_by, cancelled_at
And câu (2) trả 2 dòng type LESSON có subject_id giống nhau
And câu (3) cho A, B type NORMAL và completed = 0 hoặc NULL
And câu (4) trả 0 dòng hoặc mọi dòng status REVERTED
And không câu nào ghi dữ liệu

Maps to:

  • Business Rule: BR-01, BR-04
AC-M1.2 - Chép id vào fixture bằng tay &ZeroWidthSpace;
gherkin
Given câu (2) và câu (5) của case 0.1 đã chạy xong
Then fixture subject_id và foundation_class_id KHÔNG tự thay đổi
And ghi chú câu hướng dẫn tester chép giá trị vào fixture

Maps to:

  • Business Rule: BR-02
AC-M1.3 - Dọn dữ liệu &ZeroWidthSpace;
gherkin
Given A→B và C→B đã có bản ghi lịch sử, A/B/C đang ở type khác NORMAL tại L1/L2/F1
When người dùng chạy 3 câu của case 0.2 và xác nhận từng câu
Then A, B, C có type NORMAL tại L1, L2, F1
And tiến độ đã học của A tại L1 và B tại L2 = 0
And bảng lịch sử không còn dòng nào có người cho A hoặc C và người nhận B

Maps to:

  • Business Rule: BR-03, BR-04
AC-M1.4 - Catalogue nhất quán &ZeroWidthSpace;
gherkin
Given một case tham chiếu id "s26297.<prefix>.<n>"
Then id đó có trong cả bản FE và bản BE của catalogue
And nếu thiếu trong bản FE thì màn lỗi khi tải (NFR-S-05)

Maps to:

  • Business Rule: BR-05
Negative AC / Edge Cases của màn M1 &ZeroWidthSpace;
IDTình huốngHành vi mong đợi
EC-M1.1⚠️ Observed — phạm vi xoá của câu dọn lịch sửHành vi hiện tại: câu (3) của 0.2 xoá cứng mọi bản ghi lịch sử có người cho A / C và người nhận B — không lọc ngày, không lọc bản ghi đã xoá mềm (sapp-26297-sql.constants.ts:245-249) — OQ-S-09
EC-M1.2⚠️ Observed — ép NORMAL bất kể trạng thái gốcHành vi hiện tại: câu (1) của 0.2 đặt NORMAL cho A, B, C ở cả 3 lớp, kể cả khi trạng thái gốc trước test không phải NORMAL (sapp-26297-sql.constants.ts:231-236) — OQ-S-09
EC-M1.3Chưa chép foundation_class_id trước khi dọnCâu có token {foundation_class_id} chưa thay — hành vi theo US-P09 (thiếu param)
EC-M1.4Quên khôi phục học viên bị xoá mềm ở 3B0.2 không tự khôi phục — chỉ có dòng hướng dẫn dùng câu #3 panel nhóm B

5. Cross-feature AC &ZeroWidthSpace;

AC-X.1 - Phụ thuộc SQL runner &ZeroWidthSpace;

gherkin
Given SQL runner dùng chung không có kết nối DB Ops của môi trường đang chọn
When người dùng chạy câu của case 0.1 hoặc 0.2
Then lỗi hiển thị theo US-P09

Maps to:

  • REL-04 (Affects - Ops SQL runner)