Files
specs/openspec/changes/account-top-positions/analysis/test-cases/conc.md
T
codex-bot c66a5cd962
Specs security / security (push) Successful in 7s
Specs verify / verify (push) Successful in 9s
spec: record account-top-positions planning and implementation (WealthLedger/main#48) (#69)
2026-11-01 19:29:11 +03:00

136 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Test Cases — conc (вкладка «Концентрация», разрезы, доли)
Cases пишутся только там, где нужны данные, шаги или oracle сверх Scenario;
остальные строки Coverage Matrix в `../qa-analysis.md` ссылаются на Scenarios
Delta Specs `portfolio-concentration` (PC) и `portfolio-view` (PVΔ).
### TC-CONC-002 Вкладка в состояниях страницы
- **Verifies:** `portfolio-concentration` — `Вкладка в состояниях страницы` / все 3 Scenario
- **Risk / Priority:** средний / high — вкладка не должна появляться при загрузке, ошибке и пустом Portfolio, но должна при Cash Balance
- **Preconditions:** тестовый пользователь с тремя счетами (см. данные); frontend с управляемым API-моком
- **Test Data:** счёт A — Portfolio пуст (нет позиций и остатков); счёт B — только Cash Balance 1 000 RUB; счёт C — одна акция; мок: GET `/portfolio/{C}` сначала pending, потом 500
- **Steps:**
1. Открыть счёт A → проверить набор вкладок.
2. Открыть счёт B → открыть вкладку «Концентрация».
3. Открыть счёт C при pending GET и при ответе 500.
- **Expected Results:** A — вкладки «Концентрация» нет. B — вкладка есть, разрез «Акции» в пустом состоянии («Акции», RUB не показан — валют нет). C — в обоих случаях вкладки нет.
- **Automation Candidate:** yes (component)
### TC-CONC-005 Сброс состояния при новом заходе и смене счёта
- **Verifies:** `portfolio-concentration` — `Начальное состояние вкладки` (норма + Scenario «Новый заход»)
- **Risk / Priority:** средний / high — ошибочный persist состояния между заходами даёт чужой разрез/валюту
- **Preconditions:** счёт с позициями в RUB и USD (доступные валюты: RUB, USD — первая RUB)
- **Test Data:** портфель из TC-CONC-007; на вкладке выбраны «Секторы» и USD
- **Steps:**
1. Открыть счёт, вкладку «Концентрация», выбрать «Секторы», валюту USD.
2. Перезагрузить страницу → открыть вкладку.
3. Уйти со страницы счёта (список счетов) и вернуться → открыть вкладку.
4. Переключить счёт на счёт C (одна акция) → открыть вкладку.
- **Expected Results:** после шагов 2–4: разрез «Акции», выбрана первая валюта списка (RUB для этого счёта; для счёта C — валюта его акции).
- **Automation Candidate:** yes (e2e)
### TC-CONC-006 Сохранение состояния при переключении вкладок страницы
- **Verifies:** `portfolio-concentration` — `Начальное состояние вкладки` («Пока User остаётся на странице… разрез и валюта SHALL сохраняться»)
- **Risk / Priority:** низкий / medium — поведение внутри одной сессии страницы
- **Preconditions:** как TC-CONC-005
- **Steps:**
1. Вкладка «Концентрация»: выбрать «Облигации», USD.
2. Переключиться на вкладку страницы «Позиции».
3. Вернуться на «Концентрацию».
- **Expected Results:** открыт «Облигации» в USD.
- **Automation Candidate:** yes (e2e; объединяется с TC-CONC-005 в один прогон)
### TC-CONC-007 Состав разрезов по таблице типов
- **Verifies:** `portfolio-concentration` — `Состав разрезов` (все ветви таблицы) + `Расчёт долей`
- **Risk / Priority:** высокий / high — фильтр типов и агрегация определяют все цифры вкладки
- **Preconditions:** вкладка открыта, валюта RUB
- **Test Data (RUB, один счёт):** S1 `STOCK` 400, sector `energy`, issuer `b1` «Сбер»; S2 `STOCK` 100, sector `energy`, issuer `b1` «Сбербанк»; B1 `BOND` 100, sector `energy`, issuer `b1` «Сбер»; F1 `FUND` 300, sector `financial`, issuer `b1`; C1 `CURRENCY` 50; O1 `OTHER` 10
- **Steps:**
1. Разрез «Акции» → суммы и доли.
2. Разрез «Облигации».
3. Разрез «Секторы».
4. Разрез «Эмитенты».
- **Expected Results (расчёт):**
- Акции: S1 400 ₽ «80 %», S2 100 ₽ «20 %» (база 500 = 400+100; 400/500 = 80 %, 100/500 = 20 %).
- Облигации: B1 100 ₽ «100 %».
- Секторы: «Энергетика» 600 ₽ (400+100+100) «66,7 %», «Финансы» 300 ₽ «33,3 %» (база 900; 600/900 = 66,666… % → «66,7 %», 300/900 = 33,333… % → «33,3 %»); C1 и O1 не входят.
- Эмитенты: «Сбер» 600 ₽ «100 %» (400+100+100; фонд F1 исключён; имя — по наибольшей позиции S1 400 > B1 100 → «Сбер»).
- **Automation Candidate:** yes (component, вычислитель разреза)
### TC-CONC-008 Цепочка названия элемента name → ticker → FIGI
- **Verifies:** `portfolio-concentration` — `Названия элементов` + `portfolio-view` — `Нормализованный состав Portfolio` (отображаемый идентификатор)
- **Risk / Priority:** средний / medium — пустое название ломает список
- **Test Data:** акция A с name «Газпром»; акция B без name, ticker `SBER`; акция C без name и ticker, FIGI `BBG000123456`; позиция без issuer в «Эмитентах»
- **Steps:**
1. Разрез «Акции»: прочитать названия трёх строк.
2. Разрез «Эмитенты» для позиции без issuer.
- **Expected Results:** строки названы «Газпром», `SBER`, `BBG000123456`; в «Эмитентах» — «Эмитент не указан».
- **Automation Candidate:** yes (component)
### TC-CONC-015 Независимость выбора валюты и fallback при исчезновении
- **Verifies:** `portfolio-concentration` — `Независимый выбор валюты вкладки` (2 Scenario)
- **Risk / Priority:** средний / high — общий Select протекает между виджетами; пропавшая валюта оставляет битое состояние
- **Preconditions:** позиции в RUB и USD; «Структура портфеля» на той же странице
- **Steps:**
1. В «Структуре портфеля» выбрать USD; на вкладке «Концентрация» выбрать RUB.
2. В «Структуре портфеля» сменить USD → RUB → USD.
3. Обновить Portfolio моком так, чтобы позиций в RUB не осталось (только USD-акции).
- **Expected Results:** после шага 2 на вкладке по-прежнему RUB. После шага 3 выбрана первая валюта нового списка — USD (единственная), разрез пересчитан по USD-позициям.
- **Automation Candidate:** yes (component + e2e)
### TC-CONC-016 Границы 5/6/7 элементов и счётчик «Прочее»
- **Verifies:** `portfolio-concentration` — `Топ-5 и строка «Прочее»`, `Суммарная доля топ-5`
- **Risk / Priority:** высокий / high — граничные значения и формулировка числа элементов
- **Preconditions:** возможность подмены портфеля (мок/API-фикстура)
- **Test Data (RUB, суммы):** набор-1: 400, 250, 150, 100, 50, 30, 20; набор-2: 300, 250, 200, 150, 60, 40; набор-3: 300, 250, 200, 150, 100; набор-4: одна акция 100; набор-5: 12 акций, из них 7 в «Прочее»
- **Steps:** для каждого набора открыть разрез «Акции», прочитать строки, счётчик «Прочее» и центр диаграммы.
- **Expected Results (расчёт):**
- Набор-1 (сумма 1 000): 5 строк + «Прочее» 50 ₽ (2 элемента) «5 %»; доли строк «40 %», «25 %», «15 %», «10 %», «5 %»; центр «Топ-5 · 95 %» и «1 000 ₽».
- Набор-2 (сумма 1 000): 6 строк без «Прочее», доли «30 %», «25 %», «20 %», «15 %», «6 %», «4 %»; центр «Топ-5 · 96 %».
- Набор-3 (сумма 1 000): 5 строк, доли «30 %», «25 %», «20 %», «15 %», «10 %», «Прочее» нет; центр без «Топ-5».
- Набор-4: одна строка «100 %», центр только сумма.
- Набор-5: счётчик «Прочее» — «7 элементов»; доли по фактическим суммам.
- **Automation Candidate:** yes (component)
### TC-CONC-020 Формат и округление показанных долей
- **Verifies:** `portfolio-concentration` — `Показ долей` (все ветви нормы)
- **Risk / Priority:** средний / high — владелец сверяет доли с суммами; неверный формат подрывает доверие
- **Preconditions:** разрез «Акции», RUB; управляемый портфель (мок/API-фикстура)
- **Test Data (RUB, суммы):** набор-A: 1 и 15; набор-B: 100 000 000 и 1; набор-C: 100, 100, 100
- **Steps:** для каждого набора прочитать показанные доли строк и их сумму.
- **Expected Results (расчёт):**
- Набор-A (база 16): точные доли 1/16 = 6,25 % и 15/16 = 93,75 %. Округление до десятых, середина вверх: «6,3 %» и «93,8 %». Сумма показанных 6,3 + 93,8 = 100,1 % ≠ 100 % — допустимо (компенсации нет).
- Набор-B (база 100 000 001): 100 000 000/100 000 001 = 99,999999 % → «100 %» (без «,0»); 1/100 000 001 = 0,000001 % < 0,1 % → «< 0,1 %».
- Набор-C: 100/300 = 33,333… % → у всех трёх «33,3 %» (сумма показанных 99,9 % — допустимо).
- **Automation Candidate:** yes (component)
### TC-CONC-024 Полный проход таблицы подписей секторов
- **Verifies:** `portfolio-concentration` — `Русские подписи известных секторов` (все 11 строк таблицы)
- **Risk / Priority:** низкий / medium — таблица — эталон, одна ошибка портит разрез
- **Test Data:** 11 позиций (BOND/STOCK/FUND) секторов `consumer`, `energy`, `financial`, `health_care`, `industrials`, `it`, `materials`, `real_estate`, `telecom`, `utilities`, `government` по 1 ₽ каждая — доли не важны, важны названия
- **Steps:** открыть «Секторы», сверить каждую строку с таблицей PC:374.
- **Expected Results:** подписи точно по таблице: Потребительский сектор, Энергетика, Финансы, Здравоохранение, Промышленность, Информационные технологии, Материалы, Недвижимость, Телекоммуникации, Коммунальные услуги, Государственный сектор.
- **Automation Candidate:** yes (component, table-driven)
### TC-CONC-027 Доступность диаграммы скринридером и без цвета
- **Verifies:** `portfolio-concentration` — `Доступность диаграммы без цвета`
- **Risk / Priority:** средний / high (a11y) — информация только цветом недопустима
- **Preconditions:** набор-2 из TC-CONC-016; VoiceOver (или NVDA); тема светлая и тёмная
- **Steps:**
1. Прочитать диаграмму скринридером в свёрнутом состоянии.
2. Раскрыть «Прочее» (набор-1) и прочитать снова.
3. Клавиатурой: Tab к переключателям разрезов и строкам, Enter на «Прочее».
4. Сравнить контраст сегментов и подписей в обеих темах с макетами ux-design v2.
- **Expected Results:** скринридер читает для каждого сегмента название, сумму и долю в порядке списка (для набор-2: шесть пар «название — N ₽ — N %»); раскрытие не меняет прочитанный состав (6 сегментов); Enter/Space раскрывают «Прочее», focus видим; контраст соответствует макетам.
- **Automation Candidate:** no (ручная/visual; текстовый эквивалент — component)