A5 Manual Smoke Checklist

適用範圍:A5 Session C T14 FE manual smoke。BE + FE shipped 後 user 自跑驗收。 前置:BE branch feature/ssp-import-export-phase2 跑起來 + FE npm run dev 起來。 2026-05-21


§1

啟動環境

# BE
cd ~/Projects/Billows/Audit-Manager/compliance-manager-be
set -a; source .env; set +a
python main_app.py            # localhost:8000
# 看 log: tail -f log/app.log

# FE
cd ~/Projects/Billows/Audit-Manager/compliance-manager-fe
npm run dev                   # localhost:5180

登入:blsadmin / Billows@123!


§2

A. 路由 + 上傳頁

A.1 Create mode 路由

  1. 瀏覽器開 http://localhost:5180/module-frame/import-excel
  2. ✅ 預期:頁面標題「從 Excel 建立合規資源庫」+ framework + version 兩個 Dropdown + file upload
  3. ✅ 選 framework「CMMC 2.0」→ version dropdown 載入 published 版本清單

A.2 Update mode 路由

  1. 從 MF 詳細頁推導 MF uid(如 123e4567-...
  2. 開 http://localhost:5180/module-frame/{uid}/import-excel
  3. ✅ 預期:頁面標題「從 Excel 匯入合規資源庫內容」+ 只顯示 file upload(無 framework picker)

A.3 解析錯誤路徑

  1. 上傳非 .xlsx 檔(如 .pdf / .docx)
  2. ✅ 預期:FileUpload 元件拒絕 + 不允許點「解析」按鈕
  3. 上傳結構錯誤 .xlsx(缺 sheet)
  4. ✅ 預期:toast 顯示「解析失敗」+ error_message

§3

B. 預覽頁 5 sheet TabView

B.1 載入 + tab badge

  1. 上傳合法 Excel → 解析成功 → 自動 redirect /module-frame/import-excel/preview/:parseUid
  2. ✅ 預期:5 個 tab:Devices / Information systems / Leveraged services / Parties / Controls
  3. ✅ 預期:tab 右上角 badge 顯示 unmatched 數量(紅)或 fuzzy 數量(橘)

B.2 Devices sheet

  1. 切到 Devices tab
  2. ✅ 預期:DataTable 顯示 name / IP / OS / device_type / status / match_status / 操作
  3. ✅ 預期:每行 match_status 顯示「已配對」/「模糊匹配 (XX%)」/「未配對」其一

B.3 InfoSystems sheet

  1. 切到 Information systems tab
  2. ✅ 預期:DataTable 顯示 name / abbreviation / system_status / description / match_status / 操作

B.4 Controls sheet (row expansion)

  1. 切到 Controls tab
  2. 點任一行的 expansion arrow
  3. ✅ 預期:展開後顯示 control statement 全文 + objectives DataTable(objective_key / statement)

§4

C. RowActionMenu — unmatched 三路徑

C.1 選現有 (use_existing)

  1. Devices tab → 找一個 unmatched row
  2. 點操作欄三點 icon → 選「選現有」
  3. ✅ 預期:EntityPickerDialog 開啟 + 載入 tenant.devices Dropdown(含 filter 搜尋)
  4. 選一個 device → 點確定
  5. ✅ 預期:該行 match_status 變「已改選」(藍 Tag)+ localStorage 自動 save

C.2 新建 (use_inline_new)

  1. Devices tab → 找一個 unmatched row
  2. 點操作 → 選「新建」
  3. ✅ 預期:InlineCreateDialog 開啟 + 預填 row.name + name/ip required field
  4. 填完 → 點確定
  5. ✅ 預期:該行 match_status 變「新建」(藍 Tag)+ localStorage save

C.3 純文字保留 (skip_as_text)

  1. 任一 sheet → 任一 row
  2. 點操作 → 選「純文字保留」
  3. ✅ 預期:match_status 變「純文字保留」(灰 Tag)

C.4 重置 (reset)

  1. 對已套用 decision 的行
  2. 點操作 → 選「重置為自動配對」
  3. ✅ 預期:match_status 回到原始 BE reconciler 配對結果

§5

D. localStorage 持久化

D.1 重新整理頁面恢復

  1. 對 Devices 第 1 行設「新建」+ 第 2 行設「選現有」
  2. 切到 InfoSystems tab → 設一個「純文字保留」
  3. 重新整理頁面(F5)
  4. ✅ 預期:3 個 decision 全部恢復 + match_status 顯示正確

D.2 跨 tab 切換不丟 state

  1. 對 Devices tab 設 decision
  2. 切 Controls tab → 切回 Devices
  3. ✅ 預期:decision 還在

§6

E. Confirm flow

E.1 確認 Dialog

  1. 設好若干 decisions 後點「確認匯入」
  2. ✅ 預期:PrimeVue Dialog 開啟 + 顯示 4 個計數(自動配對 / 已改選 / 新建 / 純文字保留)
  3. ✅ 預期:若有 inline create → 底部 hint「將同步新建 N 筆基礎資料」

E.2 確認成功流程

  1. 點 Dialog「確認匯入」
  2. ✅ 預期:按鈕轉 loading + Cancel 按鈕 disabled
  3. ✅ 預期:成功 → toast「匯入成功」+ localStorage 清空 + redirect MF 詳細頁

E.3 確認失敗 rollback

  1. 故意製造失敗(如 inline create device.name 撞 duplicate)
  2. 點「確認匯入」
  3. ✅ 預期:toast「匯入失敗」+ Dialog 關閉但 store state 保留 + user 可修正後重試
  4. ✅ 預期 BE:tenant 表無髒資料(@transaction rollback 完整)

§7

F. Discard flow

  1. 上傳 + 進預覽 → 點「捨棄」按鈕
  2. ✅ 預期:DELETE /ssp-excel-import/:uid 呼叫成功
  3. ✅ 預期:toast「已捨棄」+ redirect /module-frame
  4. ✅ 預期:再開同 parseUid 的 preview URL → 顯示「找不到此解析資料」

§8

G. i18n 切換

  1. 在預覽頁切到 English
  2. ✅ 預期:所有 label / Tag / Dialog 文字翻譯到 English
  3. ✅ 預期:sheet tab header / match_status / RowActionMenu 都 i18n 過

§9

H. 已知限制(user-facing 影響待評估)

H.1 Decisions 對 write-time FK 不直接 propagate(design §10.2.1)

  • ⚠ user 選的 matched_id_override / inline_create_row_idx 套用到 parsed_result,但實際寫 DB 的 FK 仍由 A4 orchestrator 決定
  • smoke 觀察點:confirm 後到 MF 詳細頁看 device / info_system FK 是否真的對到 user 選的那筆
  • 若 user 選 device A,但 BE 寫進去的是 device B → 確認此為已知限制,follow-up F-A5-decision-write-propagation

H.2 Leveraged sheet action column 為空

  • 設計偏差:BE InlineCreateSchema 不支援 leveraged inline;FE 也無 party menu API → 無從 picker
  • smoke 觀察:leveraged sheet 操作欄為「-」placeholder
  • 未來 polish 進 F-A5-leveraged-action

H.3 Parties sheet decisions 被 BE skip

  • BE A3/A4 reconciler 處理 parties;A5 decisions 對 parties 一律忽略
  • smoke 觀察:parties sheet 操作欄為「由 BE reconciler 自動配對」

H.4 Inline-created user 不發邀請信

  • BE add_user(entity, is_admin=False) 無 send_invite 機制
  • smoke 觀察:新建 user 後該 user 不會收到邀請信 → admin 後續手動處理

H.5 SheetPreviewBasic + SheetPreviewRefDocs 未實作

  • 01_基本資料 + 08_程序書 走 content_overrides;T14 未做 polish UI
  • smoke 觀察:5 tab 只看到 5 個 decision sheet,沒有 basic / refdocs tab

§10

完成後

跑完所有 ✅ 後告知,會接著進 T15 task arc 收口 SUMMARY。 若任何項目踩雷 → 記錄到 design-A5.md §10.3 偏差段 + 視 priority 補 hotfix 或 follow-up。