Two non-blocking suggestions from the PR #124 code review:
1. Symmetric coverage for the Discord PoolSlotCapacity no-limit button.
The Capacity step already had a customId-shape assertion for the
'♾ Без лимита' button; PoolSlotCapacity only had a label-presence
assertion. If ChoiceButtonCustomId's wire format ever diverged between
the two steps, only Capacity would catch it. Convert the single Fact
to a Theory with two InlineData rows so a regression in either step
produces a targeted test failure.
2. Brittle hard-coded version literal in NavMenu_ShouldExposeCurrent
ProjectVersion. The test had to be hand-edited on every version bump
(we hit this in PR #124 — bumping 3.9.2 -> 3.9.3 broke CI). Read the
version from Directory.Build.props via XDocument instead so the test
only fails when the rendered NavMenu actually disagrees with the
canonical version, not when someone forgot to update a literal.
Tolerant of whitespace, comments and attribute order; the <Version>
element is a plain string body in the MSBuild schema.
No production code changes; production version is bumped in a
follow-up commit.
Closes#125
In the session creation wizard (Telegram + Discord), the Capacity step
only exposed waitlist on/off buttons. The 'no waitlist' button silently
advanced to the next step without setting MaxPlayers, so users who tried
to create a session with no player cap were blocked with
'Не заполнены поля: лимит мест'.
The DB contract and CreateSessionCommand already supported null
MaxPlayers (int?, ck_sessions_max_players check in V006), and the web
form already exposes 'Без лимита' as an empty InputNumber — only the
wizard flow was broken.
Changes:
- Add '♾ Без лимита' choice button to Capacity in shared
WizardStepViewBuilder.BuildCapacity (Telegram) and to
RenderCapacity / RenderPoolSlotCapacity in DiscordWizardStep (Discord).
- Add 'no_limit' branch to GameCreationWizard.ApplyCapacityChoice that
sets MaxPlayers to null and advances to Visibility.
- Change GameCreationWizard.SetMaxPlayers signature from int to int? so
the 'no limit' branch compiles.
- Change CreateSessionCommand builder in both Telegram and Discord
submitters to take int? maxPlayers and drop the '?? 0' that would
have turned null into 0 (violating the DB CHECK and the 'no limit'
contract).
- In Discord BuildConfirmDescription, render '👥 Без лимита, waitlist
вкл/выкл' when MaxPlayers is null (the previous code silently
omitted the line).
- Expose BuildCommand as internal in both submitters and add
InternalsVisibleTo('GmRelay.Bot.Tests') to the DiscordBot assembly
for unit-test access.
Tests (9 new):
- WizardStepRenderTests.CapacityStep_HasWaitlistButtons — asserts the
'Без лимита' button is present.
- GameCreationWizardStepTransitionsTests.NoLimitCapacityButton_… —
asserts the choice advances to Visibility and leaves MaxPlayers null
in the JSON draft.
- GameCreationWizardStepTransitionsTests.ChoiceCallback_AdvancesToExpectedStep —
new Theory row for Capacity/no_limit.
- CreateSessionHandlerBuildCommandTests (new) — null/value propagation
through the Telegram submitter's BuildCommand.
- DiscordWizardStepCapacityRenderTests (new) — 'Без лимита' button is
rendered for both Capacity and PoolSlotCapacity, with the expected
custom-id shape.
- DiscordWizardSubmitterBuildCommandTests (new) — null/value
propagation through the Discord submitter's BuildCommand.
Closes#123