admin-panel.feature
Feature: 管理員儀表板
管理員儀表板提供授權管理員管理認證考試平台題庫、使用者帳號、安全性設定與系統設定的工具。
Background:
Given 我以「admin」管理員身分登入
And 我導覽至「管理員儀表板」
Scenario Outline: 管理員建立新題目
When 我點擊「新增題目」
And 我選擇「」作為題目類型
And 我將「題目標題」填寫為「範例 題目」
And 我提供有效的選項與正確答案
And 我將其分配至「領域 1」
And 我點擊「儲存題目」
Then 該新的「」題目應儲存至資料庫
And 應顯示成功通知
Examples:
| QuestionType |
| 單選題 |
| 多選題 |
| 拖曳題 |
| 模擬題 |
Scenario: 管理員編輯現有題目
Given 存在一個 ID 為「Q-100」的現有題目
When 我搜尋題目「Q-100」
And 我在題目列上點擊「編輯」
And 我將「題目標題」更新為「更新後的標題」
And 我點擊「儲存變更」
Then 題目「Q-100」應在資料庫中更新
And 應顯示成功通知
Scenario: 管理員刪除題目
Given 存在一個 ID 為「Q-101」的現有題目
When 我搜尋題目「Q-101」
And 我在題目列上點擊「刪除」
And 我確認刪除提示
Then 題目「Q-101」應從資料庫中移除
Scenario Outline: 管理員分配領域/主題分類 (1-6)
Given 存在一個 ID 為「Q-102」的現有題目
When 我編輯題目「Q-102」
And 我將領域分類設定為「」
And 我點擊「儲存變更」
Then 該題目應歸類在「」下
Examples:
| Domain |
| 領域 1 |
| 領域 2 |
| 領域 3 |
| 領域 4 |
| 領域 5 |
| 領域 6 |
Scenario: 管理員觸發題目 AI 自動翻譯
Given 存在一個 ID 為「Q-103」的現有英文題目
When 我編輯題目「Q-103」
And 我點擊「透過 AI 自動翻譯」按鈕
And 我選擇「zh-TW」作為目標語言
Then AI 服務應翻譯題目標題、選項與解析
And 翻譯後的文字應填入「zh-TW」本地化欄位
Scenario: 管理員批次核准題目
Given 狀態為「待批核」的題目有 5 題
When 我導覽至「審批佇列」
And 我選取全部 5 個題目
And 我點擊「核准選取項目」
Then 所有 5 個題目的「isApproved」狀態皆應設為 true
Scenario Outline: 管理員管理使用者角色
Given 存在一位電子郵件為「user@example.com」且角色為「」的使用者
When 我導覽至「使用者管理」
And 我搜尋「user@example.com」
And 我將其角色變更為「」
And 我點擊「更新使用者」
Then 該使用者的角色應更新為「」
Examples:
| InitialRole | NewRole |
| pending | viewer |
| viewer | admin |
Scenario: 管理員重設使用者裝置綁定
Given 存在一位電子郵件為「user@example.com」且活躍裝置 ID 為「DEV-123」的使用者
When 我導覽至「使用者管理」
And 我搜尋「user@example.com」
And 我點擊「重設裝置綁定」
Then 該使用者的「activeDeviceId」應在資料庫中清除
And 應顯示成功通知
Scenario: 管理員延長使用者到期日
Given 存在一位電子郵件為「user@example.com」且到期日為「2026-12-01」的使用者
When 我導覽至「使用者管理」
And 我搜尋「user@example.com」
And 我將到期日延長「30」天
Then 該使用者的到期日應更新為「2026-12-31」
Scenario: 管理員設定使用者允許的平台
Given 存在一位電子郵件為「user@example.com」的使用者
When 我導覽至「使用者管理」
And 我搜尋「user@example.com」
And 我選取「Android」與「Web」作為允許的平台
And 我取消選取「iOS」與「Windows」
And 我點擊「更新平台」
Then 該使用者應僅能從「Android」與「Web」平台登入
Scenario Outline: 管理員依角色設定浮水印不透明度
When 我導覽至「安全性設定」
And 我將「」角色的浮水印不透明度設定為「」
And 我點擊「儲存設定」
Then 「」的浮水印不透明度應更新為「」
Examples:
| Role | Opacity |
| viewer | 0.5 |
| publicTester | 0.3 |
| guest | 0.8 |
Scenario: 管理員設定預設資料庫提供者
When 我導覽至「系統設定」
And 我選擇「PowerSync (SQLite)」作為預設資料庫提供者
And 我點擊「套用設定」
Then 系統預設應將新使用者的資料庫連線路由至 PowerSync
ai-tutor.feature
Feature: AI 家教智能助手
身為一名考生,
我希望有 AI 家教能解釋困難的概念並回答我的問題,
這樣當我在題目上卡住時,就能獲得個人化的協助。
Background:
Given 使用者已登入
And 使用者位於題目檢視畫面
Scenario: 從考試畫面開啟 AI 家教面板
When 使用者點擊 AI 家教按鈕
Then 底部表單或側邊面板開啟聊天介面
And AI 家教向使用者打招呼
Scenario: 在自動模式下詢問問題 - 雲端 API 回應
Given AI 引擎設定為「自動」
And 裝置具備有效的網際網路連線
When 使用者詢問「你能解釋這個概念嗎?」
Then 請求發送至雲端 API (Gemini)
And 聊天室中顯示雲端回應
Scenario: 在自動模式下詢問問題 - 雲端失敗,回退至本地模型
Given AI 引擎設定為「自動」
And 無法連線至雲端 API
When 使用者詢問問題
Then 系統自動回退至裝置端模型 (Gemma)
And 本地模型產生回應
Scenario: 強制使用雲端模式 - API 回應
Given AI 引擎設定為「僅限雲端」
When 使用者詢問問題
Then 請求嚴格路由至雲端 API
And 顯示回應
Scenario: 強制使用本地模式 - 裝置端模型回應
Given AI 引擎設定為「僅限本地」
When 使用者詢問問題
Then 請求嚴格路由至裝置端模型
And 在無網路存取下顯示回應
Scenario: 未下載本地模型 - 提示下載並顯示進度
Given 使用者選擇「僅限本地」模式
But 裝置端模型尚未下載
When 使用者嘗試詢問問題
Then 出現下載提示
And 進度條顯示模型權重的下載狀態
Scenario: 維持多輪對話 (保留上下文)
Given 使用者已詢問問題並收到回應
When 使用者詢問後續問題「為什麼?」
Then AI 家教考量先前的訊息
And 提供與正在進行的對話上下文相關的答案
Scenario: 具有語法高亮顯示的 Markdown 回應
Given AI 提供包含程式碼片段與格式設定的回應
When 訊息在聊天 UI 中渲染
Then 文字使用豐富的 Markdown 格式設定
And 程式碼區塊套用語法高亮顯示
Scenario: 根據應用程式地區設定切換回應語言
Given 應用程式語言設定為「ja」(日文)
When 使用者以英文詢問問題
Then AI 家教以日文回覆
Scenario: 台灣 zh-TW 使用正確的網路術語
Given 應用程式語言設定為「zh-TW」
When AI 產生關於網路的解析
Then 它嚴格使用台灣繁體中文術語,如「路由器」、「交換器」、「封包」
Scenario: 將聊天紀錄匯出為 Markdown 檔案
Given 聊天對話包含多則訊息
When 使用者點擊「匯出聊天」
Then 包含聊天紀錄的 Markdown 檔案儲存至裝置
Scenario: TTS 語音朗讀 AI 回應
Given AI 家教已產生回應
When 使用者點擊文字轉語音 (TTS) 按鈕
Then 裝置使用系統 TTS 引擎大聲朗讀 AI 的回應
Scenario: 上下文包含題目標題、選項、正確答案
When 為特定題目開啟 AI 家教面板
Then AI 的系統提示會秘密注入題目標題、選項與正確答案
And AI 可以參考這些細節,而無需使用者輸入
Scenario: 本地模型上下文視窗管理 (4 則訊息,每則 150 字元)
Given 使用者正在與本地模型聊天
When 對話超過 4 則訊息
Then 刪剪最舊的訊息以符合上下文視窗限制
Scenario: AI 產生英文學習分析
Given 使用者點擊 AI 面板上的「學習英文」按鈕
When 處理請求
Then AI 提供該題目英文文法、單字與速讀技巧的分析
auth.feature
Feature: 驗證與授權
身為認證考試練習應用程式的使用者,
我希望能安全地進行驗證,並根據我的角色存取功能,
以便安全追蹤我的進度,且僅存取授權內容。
Background:
Given 應用程式正在執行
And 後端服務可連線
Scenario: Google 登入成功
When 使用者啟動 Google 登入
And Google 驗證成功
Then 使用者登入應用程式
And 顯示使用者儀表板
Scenario: 電子郵件/密碼登入成功
Given 註冊使用者具有電子郵件「test@example.com」與密碼「password123」
When 使用者在登入畫面輸入「test@example.com」與「password123」
And 點擊登入按鈕
Then 使用者登入應用程式
And 顯示使用者儀表板
Scenario: 匿名訪客登入
When 使用者選擇訪客登入
Then 使用者以訪客身分登入
And 使用者被指派「guest」角色
And 顯示受限的訪客儀表板
Scenario Outline: 憑證無效登入失敗
When 使用者在登入畫面輸入 與
And 點擊登入按鈕
Then 顯示錯誤訊息「憑證無效」
And 使用者停留在登入畫面
Examples:
| email | password |
| "test@example.com" | "wrongpass" |
| "wrong@example.com"| "password123" |
| "" | "" |
Scenario: 強制單一裝置登入 (現有裝置已綁定)
Given 使用者「user1」已綁定至裝置「device-A」
When 使用者「user1」嘗試從裝置「device-B」登入
Then 登入被拒絕
And 顯示錯誤訊息「帳號已綁定至其他裝置」
Scenario: 裝置 ID 不符阻擋存取
Given 存在「user1」的使用者會話
But 目前裝置 ID 與綁定的裝置 ID 不符
When 使用者開啟應用程式
Then 會話失效
And 使用者被重新導向至登入畫面
Scenario: 管理員可重設使用者的裝置綁定
Given 管理員使用者已登入
When 管理員搜尋使用者「user1」
And 管理員點擊「重設裝置綁定」
Then 針對「user1」的裝置綁定被清除
And 「user1」現在可以從新裝置登入
Scenario: 新使用者預設獲得 'pending' 角色
When 新使用者透過電子郵件與密碼註冊
Then 在資料庫中建立新使用者
And 使用者的角色設定為「pending」
Scenario: 偵測帳號到期與自動降級 (viewer → pending)
Given 使用者「user1」具有「viewer」角色
And 訂閱到期日已過
When 使用者「user1」登入
Then 使用者的角色自動降級為「pending」
And 撤銷對高級功能的存取權
Scenario: 執行平台限制 (不在 allowedPlatforms 中)
Given 使用者「user1」的「allowedPlatforms」設定為「android,ios」
When 使用者「user1」嘗試從「web」平台登入
Then 登入被拒絕
And 顯示錯誤訊息「不允許的平台」
Scenario Outline: 基於角色的儀表板存取權
Given 使用者以 登入
When 使用者導覽至儀表板
Then 儀表板顯示允許 使用的功能
Examples:
| role |
| "admin" |
| "viewer" |
| "pending" |
| "internalTester" |
| "publicTester" |
| "guest" |
Scenario: 登出清除會話
Given 使用者登入應用程式
When 使用者點擊登出按鈕
Then 本地與遠端的使用者會話皆被清除
And 使用者被重新導向至登入畫面
Scenario: Google 使用者綁定至現有帳號
Given 電子郵件為「user@example.com」的現有使用者帳號
When 使用者以「user@example.com」啟動 Google 登入
Then Google 身分連結至現有帳號
And 使用者登入成功
Scenario: 審閱者/考官特殊登入流程
Given 使用者擁有考官邀請碼
When 使用者導覽至考官登入入口
And 驗證成功
Then 載入考官專用介面
Scenario: 審閱者帳號的啟動碼對話方塊
Given 使用者已登入
When 使用者點擊「兌換啟動碼」
And 輸入有效的啟動碼「ACT-1234-5678」
Then 使用者的角色升級為「reviewer」
And 顯示啟動成功訊息
exam-practice.feature
Feature: 考試練習模式
身為準備認證考試的學生,
我想練習不同類型的題目,
以便測試我的知識並檢閱解析。
Background:
Given 使用者已登入
And 使用者位於考試練習畫面
Scenario: 從預設資料庫載入題庫
When 使用者選擇一個考試主題
Then 從預設資料庫載入題目
And 顯示第一題
Scenario: 顯示包含選項的單選題
Given 目前題目為「單選題」類型
Then 顯示題目標題
And 顯示單選按鈕選項清單
And 僅能選取一個選項
Scenario: 顯示多選題 (選取多個)
Given 目前題目為「多選題」類型
Then 顯示題目標題
And 顯示核取方塊選項清單
And 可選取多個選項
Scenario: 顯示拖曳題
Given 目前題目為「拖曳題」類型
Then 顯示來源項目與目標放置區
And 項目可拖曳至目標區域
Scenario: 顯示附帶 CLI 解答的模擬題
Given 目前題目為「模擬題」類型
Then 顯示模擬情境
And 提供命令列介面輸入區
Scenario: 提交單選題答案 - 正確
Given 顯示單選題
When 使用者選取正確選項
And 點擊提交
Then 答案標記為正確
And 顯示正確指示
Scenario: 提交單選題答案 - 不正確 (加入錯題本)
Given 顯示單選題
When 使用者選取不正確選項
And 點擊提交
Then 答案標記為不正確
And 題目加入使用者的錯題本清單
Scenario: 提交多選題答案 - 部分正確
Given 具有 3 個正確選項的多選題
When 使用者選取其中 2 個正確選項並點擊提交
Then 答案標記為部分正確
And 顯示部分給分回饋
Scenario: 導覽至下一題/上一題
Given 顯示一道題目
When 使用者點擊「下一題」按鈕
Then 顯示序列中的下一題
When 使用者點擊「上一題」按鈕
Then 再次顯示上一題
Scenario: 答題後檢視解析
Given 使用者已提交一題的答案
When 使用者點擊「檢視解析」
Then 顯示正確答案的詳細解析
Scenario: 檢視多國語言解析 (切換語言)
Given 解析為可見狀態
When 使用者從語言切換器選擇「zh-TW」
Then 解析被翻譯並以繁體中文顯示
Scenario: 檢視題目圖片 (Base64 解碼)
Given 目前題目包含 base64 編碼的圖片
Then 圖片被解碼並在題目檢視中正確渲染
Scenario Outline: 切換資料庫來源
When 使用者選擇 作為資料來源
Then 應用程式連線至
And 從 重新載入題庫
Examples:
| database |
| "Firebase" |
| "Supabase" |
| "MongoDB" |
| "PowerSync" |
Scenario: 訪客角色限制為 10 題已核准題目
Given 使用者具有「guest」角色
When 使用者開始練習會話
Then 僅載入 10 題已核准題目
And 在第 10 題後顯示升級提示
Scenario: 待處理角色僅看見已核准題目
Given 使用者具有「pending」角色
When 使用者載入題庫
Then 僅顯示「isApproved」設為 true 的題目
Scenario: 管理員看見所有題目 (含未核准)
Given 使用者具有「admin」角色
When 使用者載入題庫
Then 顯示所有題目,包含未核准的
And 未核准題目具有特殊指示器
Scenario: 對題目進行社群投票
Given 顯示一道題目
When 使用者點擊向上投票按鈕
Then 該題的投票數增加 1
Scenario: 顯示計時器而不重建整個頁面 (ValueListenableBuilder)
Given 有時間限制的練習會話處於活動狀態
When 計時器每秒倒數
Then 計時器小工具更新
And 頁面的其餘部分不重建
Scenario: 獎勵廣告為免費用戶解鎖解析
Given 使用者為免費用戶
And 解析被鎖定
When 使用者完整觀看一部獎勵廣告
Then 目前題目的解析被解鎖
Scenario: 匯出題目至 Markdown
Given 顯示一道題目
When 使用者點擊「匯出至 Markdown」
Then 產生包含題目、選項與解析的 markdown 檔案
localization.feature
Feature: 多語言支援
應用程式支援多語言,為國際使用者提供本地化體驗,
使用 easy_localization 處理 UI 字串,並維持嚴格的術語標準。
Background:
Given 我啟動應用程式
And 我導覽至「設定」畫面
Scenario Outline: 應用程式以支援語言顯示
When 裝置系統語言設定為「」
Then 應用程式 UI 應以「」顯示
And 所有 easy_localization tr() 鍵應正確解析
Examples:
| LocaleCode | LanguageName |
| en | English |
| ja | Japanese |
| zh-TW | 繁體中文 |
| zh-CN | 簡體中文 |
Scenario: 從設定選單切換語言
Given 應用程式目前以英文顯示
When 我從語言下拉選單選取「日本語」(日文)
And 我確認語言變更
Then 應用程式 UI 應立即更新為日文,無須重新啟動
Scenario: 所有 UI 字串使用 easy_localization tr() - 無寫死文字
Given 應用程式 UI 程式碼被分析
Then 所有面向使用者的字串皆應包裝在 tr() 本地化函數中
And 呈現層中不應有寫死的英文字串
Scenario Outline: zh-TW 使用台灣網路術語
Given 我將應用程式語言設定為「zh-TW」(繁體中文)
When 我檢視考試內容與 UI
Then 術語應使用「」而非「」
Examples:
| TaiwanTerm | MainlandTerm |
| 路由器 | 路由器 |
| 交換器 | 交換機 |
| 封包 | 數據包 |
| 預設閘道 | 默認網關 |
| IP 位址 | IP 地址 |
Scenario: 動態 AI 回應語言符合應用程式地區設定
Given 我將應用程式語言設定為「ja」(日文)
When 我要求 AI 家教解釋問題
Then 傳送至 AI 雲端 API 的請求應包含地區設定上下文「ja」
And AI 解析回應應以日文回傳