fix: unify history and upcoming events labels (#161) (#163)
Frontend verify / commits (push) Skipped
Frontend verify / security (push) Successful in 12s
Frontend verify / verify (push) Failing after 7m18s

This commit was merged in pull request #163.
This commit is contained in:
2026-11-07 10:50:51 +03:00
parent 134c951178
commit ed0b5388ab
9 changed files with 58 additions and 58 deletions
@@ -227,9 +227,9 @@ beforeEach(() => {
describe("All accounts routes", () => { describe("All accounts routes", () => {
it.each([ it.each([
["/accounts/all", "Все счета"], ["/accounts/all", "Все счета"],
["/accounts/all/operations", "Журнал операций"], ["/accounts/all/operations", "История операций"],
["/accounts/all/income?from=2026-08-01&to=2026-08-31", "Пассивный доход"], ["/accounts/all/income?from=2026-08-01&to=2026-08-31", "Пассивный доход"],
["/accounts/all/events", "Будущие события"], ["/accounts/all/events", "Предстоящие события"],
])("opens %s directly", async (path, title) => { ])("opens %s directly", async (path, title) => {
renderPage(path); renderPage(path);
expect( expect(
@@ -311,9 +311,9 @@ describe("All accounts routes", () => {
); );
for (const [suffix, tab] of [ for (const [suffix, tab] of [
["operations", "Операции"], ["operations", "История операций"],
["income", "Доход"], ["income", "Доход"],
["events", "События"], ["events", "Предстоящие события"],
]) { ]) {
fireEvent.click(screen.getByRole("tab", { name: tab })); fireEvent.click(screen.getByRole("tab", { name: tab }));
expect(screen.getByRole("link", { name: "Подробнее" })) expect(screen.getByRole("link", { name: "Подробнее" }))
@@ -55,9 +55,9 @@ describe("AppBreadcrumbs", () => {
}); });
it.each([ it.each([
["operations", "Операции"], ["operations", "История операций"],
["OPERATIONS", "Операции"], ["OPERATIONS", "История операций"],
["events", "Будущие события"], ["events", "Предстоящие события"],
["income", "Пассивный доход"], ["income", "Пассивный доход"],
])("links to the account hierarchy from %s", (section, title) => { ])("links to the account hierarchy from %s", (section, title) => {
renderBreadcrumbs(`/accounts/account-1/${section}`, [ renderBreadcrumbs(`/accounts/account-1/${section}`, [
@@ -330,7 +330,7 @@ describe("Upcoming event date filters", () => {
expect(screen.getByLabelText("URL")).toBeEmptyDOMElement(); expect(screen.getByLabelText("URL")).toBeEmptyDOMElement();
expect(screen.getByRole("button", { name: "Применить" })).toBeDisabled(); expect(screen.getByRole("button", { name: "Применить" })).toBeDisabled();
expect( expect(
screen.getByText("За выбранный период событий не найдено"), screen.getByText("На выбранный период предстоящих событий не найдено"),
).toBeVisible(); ).toBeVisible();
}, },
); );
@@ -174,7 +174,7 @@ describe("AccountEventsPage", () => {
it("renders empty and error states with retry", async () => { it("renders empty and error states with retry", async () => {
const { rerender } = renderPage(); const { rerender } = renderPage();
expect( expect(
screen.getByText("За выбранный период событий не найдено"), screen.getByText("На выбранный период предстоящих событий не найдено"),
).toBeInTheDocument(); ).toBeInTheDocument();
query.mockReturnValue({ query.mockReturnValue({
data: undefined, data: undefined,
@@ -239,7 +239,7 @@ describe("AccountEventsPage", () => {
"true", "true",
); );
expect( expect(
screen.queryByText("За выбранный период событий не найдено"), screen.queryByText("На выбранный период предстоящих событий не найдено"),
).not.toBeInTheDocument(); ).not.toBeInTheDocument();
}); });
@@ -440,7 +440,7 @@ describe("AccountOperationsPage", () => {
renderPage(); renderPage();
expect( expect(
await screen.findByRole("heading", { name: "Журнал операций" }), await screen.findByRole("heading", { name: "История операций" }),
).toBeInTheDocument(); ).toBeInTheDocument();
expect( expect(
screen.queryByRole("link", { name: "К счету" }), screen.queryByRole("link", { name: "К счету" }),
@@ -482,7 +482,7 @@ describe("AccountOperationsPage", () => {
renderPage(); renderPage();
expect( expect(
await screen.findByRole("heading", { name: "Журнал операций" }), await screen.findByRole("heading", { name: "История операций" }),
).toBeInTheDocument(); ).toBeInTheDocument();
await waitFor(() => expect(searches.length).toBeGreaterThan(0)); await waitFor(() => expect(searches.length).toBeGreaterThan(0));
const countBefore = searches.length; const countBefore = searches.length;
@@ -521,7 +521,7 @@ describe("AccountOperationsPage", () => {
renderPage(); renderPage();
expect( expect(
await screen.findByRole("heading", { name: "Журнал операций" }), await screen.findByRole("heading", { name: "История операций" }),
).toBeInTheDocument(); ).toBeInTheDocument();
fireEvent.click(screen.getByRole("combobox", { name: "Категории" })); fireEvent.click(screen.getByRole("combobox", { name: "Категории" }));
fireEvent.click(await screen.findByText("Налог")); fireEvent.click(await screen.findByText("Налог"));
@@ -579,7 +579,7 @@ describe("AccountOperationsPage", () => {
); );
renderPage(); renderPage();
expect( expect(
await screen.findByText("Не удалось загрузить журнал", undefined, { await screen.findByText("Не удалось загрузить историю операций", undefined, {
timeout: RETRIES_EXHAUSTED_MS, timeout: RETRIES_EXHAUSTED_MS,
}), }),
).toBeInTheDocument(); ).toBeInTheDocument();
@@ -850,9 +850,9 @@ describe("AccountPage states", () => {
expect( expect(
screen.getByRole("heading", { name: "Портфель пока пуст" }), screen.getByRole("heading", { name: "Портфель пока пуст" }),
).toBeInTheDocument(); ).toBeInTheDocument();
expect(screen.getByRole("link", { name: "Открыть журнал" })) expect(screen.getByRole("link", { name: "Открыть историю операций" }))
.toBeInTheDocument(); .toBeInTheDocument();
expect(screen.getByRole("link", { name: "Открыть будущие события" })) expect(screen.getByRole("link", { name: "Открыть предстоящие события" }))
.toBeInTheDocument(); .toBeInTheDocument();
expect(screen.getByRole("link", { name: "Открыть пассивный доход" })) expect(screen.getByRole("link", { name: "Открыть пассивный доход" }))
.toBeInTheDocument(); .toBeInTheDocument();
@@ -893,10 +893,10 @@ describe("AccountPage states", () => {
}), }),
).toBeVisible(); ).toBeVisible();
expect( expect(
screen.getByRole("status", { name: "Загрузка будущих событий" }), screen.getByRole("status", { name: "Загрузка предстоящих событий" }),
).toBeVisible(); ).toBeVisible();
expect( expect(
screen.queryByText("На ближайшие 30 дней событий не найдено."), screen.queryByText("На ближайшие 30 дней предстоящих событий не найдено."),
).not.toBeInTheDocument(); ).not.toBeInTheDocument();
expect(screen.getByText("Загрузка дохода текущего месяца")).toBeVisible(); expect(screen.getByText("Загрузка дохода текущего месяца")).toBeVisible();
expect(screen.queryByText("Нет текущих сумм")).not.toBeInTheDocument(); expect(screen.queryByText("Нет текущих сумм")).not.toBeInTheDocument();
@@ -1076,7 +1076,7 @@ describe("AccountPage states", () => {
/>, />,
); );
fireEvent.click(screen.getByRole("tab", { name: "Операции" })); fireEvent.click(screen.getByRole("tab", { name: "История операций" }));
expect( expect(
screen.getByText("Пока недоступно"), screen.getByText("Пока недоступно"),
).toBeInTheDocument(); ).toBeInTheDocument();
@@ -1115,7 +1115,7 @@ describe("AccountPage states", () => {
/>, />,
); );
fireEvent.click(screen.getByRole("tab", { name: "Операции" })); fireEvent.click(screen.getByRole("tab", { name: "История операций" }));
expect(screen.getByText("Сделка")).toBeInTheDocument(); expect(screen.getByText("Сделка")).toBeInTheDocument();
expect(screen.getByText("−12 ₽")).toBeInTheDocument(); expect(screen.getByText("−12 ₽")).toBeInTheDocument();
}); });
@@ -1169,8 +1169,8 @@ describe("AccountPage states", () => {
/>, />,
); );
fireEvent.click(screen.getByRole("tab", { name: "События" })); fireEvent.click(screen.getByRole("tab", { name: "Предстоящие события" }));
const section = screen.getByRole("tabpanel", { name: "События" }); const section = screen.getByRole("tabpanel", { name: "Предстоящие события" });
const content = within(section); const content = within(section);
const text = section.textContent ?? ""; const text = section.textContent ?? "";
@@ -1211,15 +1211,15 @@ describe("AccountPage states", () => {
/>, />,
); );
fireEvent.click(screen.getByRole("tab", { name: "События" })); fireEvent.click(screen.getByRole("tab", { name: "Предстоящие события" }));
const content = within( const content = within(
screen.getByRole("tabpanel", { name: "События" }), screen.getByRole("tabpanel", { name: "Предстоящие события" }),
); );
if (state === "loading") { if (state === "loading") {
const skeleton = content.getByRole("status", { const skeleton = content.getByRole("status", {
name: "Загрузка будущих событий", name: "Загрузка предстоящих событий",
}); });
// eslint-disable-next-line vitest/no-conditional-expect -- The fixed table case selects the expected outcome; every case asserts its own branch. // eslint-disable-next-line vitest/no-conditional-expect -- The fixed table case selects the expected outcome; every case asserts its own branch.
@@ -1230,7 +1230,7 @@ describe("AccountPage states", () => {
else { else {
// eslint-disable-next-line vitest/no-conditional-expect -- The table case deterministically selects the empty state. // eslint-disable-next-line vitest/no-conditional-expect -- The table case deterministically selects the empty state.
expect( expect(
content.getByText("На ближайшие 30 дней событий не найдено."), content.getByText("На ближайшие 30 дней предстоящих событий не найдено."),
).toBeVisible(); ).toBeVisible();
} }
@@ -1251,7 +1251,7 @@ describe("AccountPage states", () => {
/>, />,
); );
fireEvent.click(screen.getByRole("tab", { name: "События" })); fireEvent.click(screen.getByRole("tab", { name: "Предстоящие события" }));
expect( expect(
screen.getByText("Данные появятся здесь, когда чтение восстановится."), screen.getByText("Данные появятся здесь, когда чтение восстановится."),
).toBeInTheDocument(); ).toBeInTheDocument();
@@ -1522,8 +1522,8 @@ describe("AccountPage states", () => {
.toBeVisible(); .toBeVisible();
expect(screen.queryByText("Вторая")).not.toBeInTheDocument(); expect(screen.queryByText("Вторая")).not.toBeInTheDocument();
fireEvent.click(screen.getByRole("tab", { name: "Операции" })); fireEvent.click(screen.getByRole("tab", { name: "История операций" }));
expect(screen.getByText("Последних событий пока нет.")).toBeVisible(); expect(screen.getByText("Последних операций пока нет.")).toBeVisible();
}); });
it("links operation, event and income previews to their detail pages", () => { it("links operation, event and income previews to their detail pages", () => {
@@ -1538,8 +1538,8 @@ describe("AccountPage states", () => {
); );
for (const [tab, href] of [ for (const [tab, href] of [
["Операции", "/accounts/account-1/operations"], ["История операций", "/accounts/account-1/operations"],
["События", "/accounts/account-1/events"], ["Предстоящие события", "/accounts/account-1/events"],
["Доход", "/accounts/account-1/income"], ["Доход", "/accounts/account-1/income"],
]) { ]) {
fireEvent.click(screen.getByRole("tab", { name: tab })); fireEvent.click(screen.getByRole("tab", { name: tab }));
+1 -1
View File
@@ -351,7 +351,7 @@ describe("bond page", () => {
screen.queryByRole("heading", { name: "Моя позиция" }), screen.queryByRole("heading", { name: "Моя позиция" }),
).not.toBeInTheDocument(); ).not.toBeInTheDocument();
expect( expect(
screen.getByRole("heading", { name: "Моя история событий" }), screen.getByRole("heading", { name: "История операций" }),
).toBeVisible(); ).toBeVisible();
}); });
it( it(
@@ -490,7 +490,7 @@ describe("stock page", () => {
fireEvent.click(screen.getByRole("button", { name: "Далее" })); fireEvent.click(screen.getByRole("button", { name: "Далее" }));
controls.recoverOperations(); controls.recoverOperations();
expect(screen.queryByRole("button", { name: "Повторить" })).not.toBeInTheDocument(); expect(screen.queryByRole("button", { name: "Повторить" })).not.toBeInTheDocument();
expect(screen.getByRole("heading", { name: "Моя история событий" })).toBeVisible(); expect(screen.getByRole("heading", { name: "История операций" })).toBeVisible();
}, },
); );
it("keeps the last quote without manual refresh", async () => { it("keeps the last quote without manual refresh", async () => {
+25 -25
View File
@@ -274,7 +274,7 @@ const ru = {
COUPON_TYPE_VARIABLE: "Переменный", COUPON_TYPE_VARIABLE: "Переменный",
}, },
couponWindow: couponWindow:
"Календарь выпуска с {{from}} по {{to}}. Личные зачисления показаны в истории событий.", "Календарь выпуска с {{from}} по {{to}}. Полученные выплаты показаны в истории операций.",
couponYield: "Текущая купонная доходность, годовых", couponYield: "Текущая купонная доходность, годовых",
couponYieldNote: couponYieldNote:
"Купонная доходность = ближайший купон × 365 / дней в купонном периоде / цена без НКД × 100 %. Это годовая оценка при сохранении размера купона и номинала, без налогов, комиссий и реинвестирования; для плавающего или переменного купона будущий доход изменится.", "Купонная доходность = ближайший купон × 365 / дней в купонном периоде / цена без НКД × 100 %. Это годовая оценка при сохранении размера купона и номинала, без налогов, комиссий и реинвестирования; для плавающего или переменного купона будущий доход изменится.",
@@ -343,10 +343,10 @@ const ru = {
breadcrumbs: { breadcrumbs: {
accountFallback: "Счет", accountFallback: "Счет",
accounts: "Брокерские счета", accounts: "Брокерские счета",
events: "Будущие события", events: "Предстоящие события",
income: "Пассивный доход", income: "Пассивный доход",
label: "Хлебные крошки", label: "Хлебные крошки",
operations: "Операции", operations: "История операций",
settings: "Настройки", settings: "Настройки",
}, },
entryGroup: { entryGroup: {
@@ -356,20 +356,20 @@ const ru = {
dateKind: { event: "Дата события", registry: "Дата реестра" }, dateKind: { event: "Дата события", registry: "Дата реестра" },
emptyText: emptyText:
"Доступные источники не сообщили о купонах, дивидендах, погашениях или офертах в этом периоде.", "Доступные источники не сообщили о купонах, дивидендах, погашениях или офертах в этом периоде.",
emptyTitle: "За выбранный период событий не найдено", emptyTitle: "На выбранный период предстоящих событий не найдено",
errorText: "Попробуйте запросить прогноз еще раз.", errorText: "Попробуйте загрузить предстоящие события ещё раз.",
errorTitle: "Не удалось загрузить будущие события", errorTitle: "Не удалось загрузить предстоящие события",
forecastWindow: "Прогноз от {{date}} на {{from}} – {{to}}", forecastWindow: "Прогноз от {{date}} на {{from}} – {{to}}",
hint: "Прогноз рассчитан по текущей позиции до налогов. Покрытие зависит от доступных данных MOEX.", hint: "Прогноз рассчитан по текущей позиции до налогов. Покрытие зависит от доступных данных MOEX.",
noAmount: "Сумма неизвестна", noAmount: "Сумма неизвестна",
open: "Открыть будущие события", open: "Открыть предстоящие события",
projectedAmount: "Ожидаемая сумма", projectedAmount: "Ожидаемая сумма",
recentEmpty: "На ближайшие 30 дней событий не найдено.", recentEmpty: "На ближайшие 30 дней предстоящих событий не найдено.",
recentError: "Не удалось загрузить будущие события.", recentError: "Не удалось загрузить предстоящие события.",
recentLoading: "Загрузка будущих событий", recentLoading: "Загрузка предстоящих событий",
recentTitle: "Будущие события", recentTitle: "Предстоящие события",
retry: "Повторить", retry: "Повторить",
title: "Будущие события", title: "Предстоящие события",
type: { type: {
coupon: "Купон", coupon: "Купон",
dividend: "Дивиденд", dividend: "Дивиденд",
@@ -451,14 +451,14 @@ const ru = {
dividend: "Дивиденд", dividend: "Дивиденд",
}, },
}, },
errorText: "Попробуйте запросить операции еще раз.", errorText: "Попробуйте загрузить историю операций ещё раз.",
errorTitle: "Не удалось загрузить журнал", errorTitle: "Не удалось загрузить историю операций",
from: "С", from: "С",
next: "Далее", next: "Далее",
noInstrument: "Без инструмента", noInstrument: "Без инструмента",
noMoney: "Без движения денег", noMoney: "Без движения денег",
occurredAt: "Исполнено {{date}}", occurredAt: "Исполнено {{date}}",
open: "Открыть журнал", open: "Открыть историю операций",
operationType: { operationType: {
buy: "Покупка", buy: "Покупка",
coupon: "Купон", coupon: "Купон",
@@ -475,13 +475,13 @@ const ru = {
previous: "Назад", previous: "Назад",
price: "Цена: {{value}}", price: "Цена: {{value}}",
quantity: "{{value}} шт.", quantity: "{{value}} шт.",
recentEmpty: "Последних событий пока нет.", recentEmpty: "Последних операций пока нет.",
recentError: "Не удалось загрузить последние события.", recentError: "Не удалось загрузить последние операции.",
recentLoading: "Загрузка последних событий", recentLoading: "Загрузка последних операций",
recentTitle: "Последние события", recentTitle: "Последние операции",
reset: "Сбросить", reset: "Сбросить",
retry: "Повторить", retry: "Повторить",
title: "Журнал операций", title: "История операций",
to: "По", to: "По",
}, },
navigation: { navigation: {
@@ -582,9 +582,9 @@ const ru = {
}, },
tabs: { tabs: {
cash: "Деньги", cash: "Деньги",
events: "События", events: "Предстоящие события",
income: "Доход", income: "Доход",
operations: "Операции", operations: "История операций",
positions: "Позиции", positions: "Позиции",
}, },
title: "Портфель", title: "Портфель",
@@ -637,10 +637,10 @@ const ru = {
dividendNote: dividendNote:
"Личная сумма — оценка по текущему количеству, не гарантия выплаты. Налоги не сопоставлены; дата выплаты компании может отличаться от дня зачисления на ваш счёт.", "Личная сумма — оценка по текущему количеству, не гарантия выплаты. Налоги не сопоставлены; дата выплаты компании может отличаться от дня зачисления на ваш счёт.",
dividendWindow: dividendWindow:
"События компании с {{from}} по {{to}}. Личные зачисления показаны отдельно в истории событий.", "События компании с {{from}} по {{to}}. Полученные выплаты показаны отдельно в истории операций.",
estimateUnavailable: estimateUnavailable:
"Данные позиции не удалось обновить. Личная оценка недоступна или рассчитана по сохранённой позиции.", "Данные позиции не удалось обновить. Личная оценка недоступна или рассчитана по сохранённой позиции.",
eventFilter: "Фильтр событий", eventFilter: "Фильтр операций",
eventPrice: "Цена: {{value}}", eventPrice: "Цена: {{value}}",
eventQuantity: "{{value}} шт.", eventQuantity: "{{value}} шт.",
exchanges: { exchanges: {
@@ -656,7 +656,7 @@ const ru = {
trades: "Сделки", trades: "Сделки",
}, },
forming: "Формируется", forming: "Формируется",
history: "Моя история событий", history: "История операций",
historyNote: historyNote:
"Операции по этой акции на доступных открытых счетах, включая периоды до текущего года. Дата сделки — дата операции брокера; количество — исполненная часть. История закрытых счетов не включена.", "Операции по этой акции на доступных открытых счетах, включая периоды до текущего года. Дата сделки — дата операции брокера; количество — исполненная часть. История закрытых счетов не включена.",
incomplete: "Последняя свеча ещё формируется: её цена может измениться.", incomplete: "Последняя свеча ещё формируется: её цена может измениться.",