test: cleanup follow-up из ревью #124 — симметрия PoolSlotCapacity теста + устранить brittle version-string test #125

Closed
opened 2026-06-08 19:05:01 +03:00 by Toutsu · 1 comment
Owner

Замечания из ревью PR #124

В code-review PR #124 subagent нашёл два не-блокирующих замечания, которые стоит поправить follow-up'ом:

1. Асимметрия теста DiscordWizardStepCapacityRenderTests

Сейчас в tests/GmRelay.Bot.Tests/Discord/Wizard/DiscordWizardStepCapacityRenderTests.cs есть customId assertion для Capacity:

[Fact]
public void RenderCapacity_NoLimitButton_HasChoiceCustomIdForNoLimit()
{
    var draft = new WizardDraft { Step = WizardStepNames.Capacity };
    var render = DiscordWizardStep.Render(draft, new WizardPayload());
    var buttons = ExtractButtons(render);
    var noLimit = buttons.SingleOrDefault(b => b.Label?.Contains("Без лимита", StringComparison.Ordinal) == true);
    Assert.NotNull(noLimit);
    Assert.StartsWith("wizard:btn:choice:Capacity:no_limit", noLimit!.CustomId);
}

…но симметричного теста для PoolSlotCapacity нет — есть только RenderPoolSlotCapacity_ContainsNoLimitButton (проверяет label, не custom-id). Если в будущем DiscordWizardStep.ChoiceButtonCustomId поменяет wire-format для PoolSlotCapacity, баг не поймается.

2. Brittle version-string test (pre-existing)

tests/GmRelay.Bot.Tests/Web/CampaignTemplatesNavigationTests.cs:15-19:

[Fact]
public async Task NavMenu_ShouldExposeCurrentProjectVersion()
{
    var navMenu = await File.ReadAllTextAsync(FindRepositoryFile("src/GmRelay.Web/Components/Layout/NavMenu.razor"));
    Assert.Contains("v3.9.3", navMenu, StringComparison.Ordinal);
}

Тест хардкодит строковый литерал версии. На каждом bump (мы уже обновили его в PR #124: 3.9.2 → 3.9.3) нужно помнить обновить ещё и этот тест. Это pre-existing — уязвимость была до PR #124, но PR #124 сделал её острее (показал, что bump без обновления теста ломает CI).

Решение: прочитать версию из Directory.Build.props во время теста. Этот файл уже есть в репо, и <Version>3.9.3</Version> — единственный источник правды. Тест должен резолвить версию из Directory.Build.props тем же путём, что и продакшн-код.

Решение

Оба замечания — мелкие улучшения тестов, не требуют изменений production-кода. Версия issue: 3.9.3 → 3.9.4 (patch, потому что это изменения тестов, не bugfix в проду).

План реализации

  1. Симметрия PoolSlotCapacity: добавить RenderPoolSlotCapacity_NoLimitButton_HasChoiceCustomIdForNoLimit в DiscordWizardStepCapacityRenderTests, аналогичный Capacity-тесту, с ожидаемым префиксом wizard:btn:choice:PoolSlotCapacity:no_limit.

  2. Brittle version-string test:

    • В FindRepositoryFile (или новой утилите) добавить способ прочитать <Version>...</Version> из Directory.Build.props.
    • Тест NavMenu_ShouldExposeCurrentProjectVersion парсит версию из props и проверяет, что в NavMenu.razor есть v{resolvedVersion}.
    • Это устраняет ручное обновление строки на каждом bump — CI будет валиться только если в NavMenu.razor реально неправильная версия (рассинхрон с Directory.Build.props), а не из-за забытого обновления хардкода.
  3. Локально прогнать dotnet test, убедиться что 603/603 (включая обновлённый тест).

  4. Создать branch fix/issue-N-test-cleanup, коммит, PR, CI, review, merge, deploy, release v3.9.4.

Аудит

Этот issue не имеет корреляций с другими открытыми issue. Создаётся как follow-up к issue #123 и PR #124.

## Замечания из ревью PR #124 В code-review [PR #124](https://git.codeanddice.ru/Toutsu/GmRelayBot/pulls/124) subagent нашёл два не-блокирующих замечания, которые стоит поправить follow-up'ом: ### 1. Асимметрия теста `DiscordWizardStepCapacityRenderTests` Сейчас в `tests/GmRelay.Bot.Tests/Discord/Wizard/DiscordWizardStepCapacityRenderTests.cs` есть customId assertion для `Capacity`: ```csharp [Fact] public void RenderCapacity_NoLimitButton_HasChoiceCustomIdForNoLimit() { var draft = new WizardDraft { Step = WizardStepNames.Capacity }; var render = DiscordWizardStep.Render(draft, new WizardPayload()); var buttons = ExtractButtons(render); var noLimit = buttons.SingleOrDefault(b => b.Label?.Contains("Без лимита", StringComparison.Ordinal) == true); Assert.NotNull(noLimit); Assert.StartsWith("wizard:btn:choice:Capacity:no_limit", noLimit!.CustomId); } ``` …но **симметричного теста для `PoolSlotCapacity` нет** — есть только `RenderPoolSlotCapacity_ContainsNoLimitButton` (проверяет label, не custom-id). Если в будущем `DiscordWizardStep.ChoiceButtonCustomId` поменяет wire-format для PoolSlotCapacity, баг не поймается. ### 2. Brittle version-string test (pre-existing) `tests/GmRelay.Bot.Tests/Web/CampaignTemplatesNavigationTests.cs:15-19`: ```csharp [Fact] public async Task NavMenu_ShouldExposeCurrentProjectVersion() { var navMenu = await File.ReadAllTextAsync(FindRepositoryFile("src/GmRelay.Web/Components/Layout/NavMenu.razor")); Assert.Contains("v3.9.3", navMenu, StringComparison.Ordinal); } ``` Тест **хардкодит строковый литерал версии**. На каждом bump (мы уже обновили его в PR #124: 3.9.2 → 3.9.3) нужно помнить обновить ещё и этот тест. Это **pre-existing** — уязвимость была до PR #124, но PR #124 сделал её острее (показал, что bump без обновления теста ломает CI). **Решение**: прочитать версию из `Directory.Build.props` во время теста. Этот файл уже есть в репо, и `<Version>3.9.3</Version>` — единственный источник правды. Тест должен резолвить версию из `Directory.Build.props` тем же путём, что и продакшн-код. ## Решение Оба замечания — мелкие улучшения тестов, не требуют изменений production-кода. Версия issue: 3.9.3 → **3.9.4** (patch, потому что это изменения тестов, не bugfix в проду). ## План реализации 1. **Симметрия `PoolSlotCapacity`**: добавить `RenderPoolSlotCapacity_NoLimitButton_HasChoiceCustomIdForNoLimit` в `DiscordWizardStepCapacityRenderTests`, аналогичный Capacity-тесту, с ожидаемым префиксом `wizard:btn:choice:PoolSlotCapacity:no_limit`. 2. **Brittle version-string test**: - В `FindRepositoryFile` (или новой утилите) добавить способ прочитать `<Version>...</Version>` из `Directory.Build.props`. - Тест `NavMenu_ShouldExposeCurrentProjectVersion` парсит версию из props и проверяет, что в `NavMenu.razor` есть `v{resolvedVersion}`. - Это устраняет ручное обновление строки на каждом bump — CI будет валиться только если в `NavMenu.razor` реально неправильная версия (рассинхрон с `Directory.Build.props`), а не из-за забытого обновления хардкода. 3. Локально прогнать `dotnet test`, убедиться что 603/603 (включая обновлённый тест). 4. Создать branch `fix/issue-N-test-cleanup`, коммит, PR, CI, review, merge, deploy, release **v3.9.4**. ## Аудит Этот issue не имеет корреляций с другими открытыми issue. Создаётся как follow-up к [issue #123](https://git.codeanddice.ru/Toutsu/GmRelayBot/issues/123) и [PR #124](https://git.codeanddice.ru/Toutsu/GmRelayBot/pulls/124).
Toutsu added the type:testarea:infrapriority:p2 labels 2026-06-08 19:05:01 +03:00
Author
Owner

Реализовано в PR #126 и выпущено в v3.9.4.

Оба замечания закрыты:

  1. Render_NoLimitButton_HasChoiceCustomIdForNoLimit — Theory с двумя кейсами (Capacity + PoolSlotCapacity).
  2. NavMenu_ShouldExposeCurrentProjectVersion — читает версию из Directory.Build.props через XDocument. На следующем bump тест менять не придётся.
Реализовано в [PR #126](https://git.codeanddice.ru/Toutsu/GmRelayBot/pulls/126) и выпущено в [v3.9.4](https://git.codeanddice.ru/Toutsu/GmRelayBot/releases/tag/v3.9.4). Оба замечания закрыты: 1. `Render_NoLimitButton_HasChoiceCustomIdForNoLimit` — Theory с двумя кейсами (Capacity + PoolSlotCapacity). 2. `NavMenu_ShouldExposeCurrentProjectVersion` — читает версию из `Directory.Build.props` через `XDocument`. На следующем bump тест менять не придётся.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Toutsu/GmRelayBot#125