diff --git a/tests/GmRelay.Bot.Tests/Discord/Wizard/DiscordWizardStepCapacityRenderTests.cs b/tests/GmRelay.Bot.Tests/Discord/Wizard/DiscordWizardStepCapacityRenderTests.cs index bbdd0c2..f5fe3a5 100644 --- a/tests/GmRelay.Bot.Tests/Discord/Wizard/DiscordWizardStepCapacityRenderTests.cs +++ b/tests/GmRelay.Bot.Tests/Discord/Wizard/DiscordWizardStepCapacityRenderTests.cs @@ -33,16 +33,18 @@ public sealed class DiscordWizardStepCapacityRenderTests Assert.Contains(labels, l => l.Contains("Без лимита", System.StringComparison.Ordinal)); } - [Fact] - public void RenderCapacity_NoLimitButton_HasChoiceCustomIdForNoLimit() + [Theory] + [InlineData(WizardStepNames.Capacity, "wizard:btn:choice:Capacity:no_limit")] + [InlineData(WizardStepNames.PoolSlotCapacity, "wizard:btn:choice:PoolSlotCapacity:no_limit")] + public void Render_NoLimitButton_HasChoiceCustomIdForNoLimit(string step, string expectedCustomIdPrefix) { - var draft = new WizardDraft { Step = WizardStepNames.Capacity }; + var draft = new WizardDraft { Step = step }; var render = DiscordWizardStep.Render(draft, new WizardPayload()); var buttons = ExtractButtons(render); var noLimit = buttons.SingleOrDefault(b => b.Label?.Contains("Без лимита", System.StringComparison.Ordinal) == true); Assert.NotNull(noLimit); - Assert.StartsWith("wizard:btn:choice:Capacity:no_limit", noLimit!.CustomId); + Assert.StartsWith(expectedCustomIdPrefix, noLimit!.CustomId); } private static System.Collections.Generic.List ExtractButtonLabels( diff --git a/tests/GmRelay.Bot.Tests/Web/CampaignTemplatesNavigationTests.cs b/tests/GmRelay.Bot.Tests/Web/CampaignTemplatesNavigationTests.cs index 9018686..7581e23 100644 --- a/tests/GmRelay.Bot.Tests/Web/CampaignTemplatesNavigationTests.cs +++ b/tests/GmRelay.Bot.Tests/Web/CampaignTemplatesNavigationTests.cs @@ -14,8 +14,16 @@ public sealed class CampaignTemplatesNavigationTests [Fact] public async Task NavMenu_ShouldExposeCurrentProjectVersion() { + // Read the version from Directory.Build.props (the canonical source of + // truth) so the test doesn't need to be hand-edited on every version + // bump. Asserting the rendered NavMenu matches the canonical version + // catches real bugs (e.g. someone bumps Directory.Build.props but + // forgets to update NavMenu.razor) without false alarms from a stale + // hard-coded literal. + var propsPath = FindRepositoryFile("Directory.Build.props"); + var version = ReadVersionFromProps(propsPath); var navMenu = await File.ReadAllTextAsync(FindRepositoryFile("src/GmRelay.Web/Components/Layout/NavMenu.razor")); - Assert.Contains("v3.9.3", navMenu, StringComparison.Ordinal); + Assert.Contains($"v{version}", navMenu, StringComparison.Ordinal); } [Fact] @@ -68,4 +76,23 @@ public sealed class CampaignTemplatesNavigationTests throw new FileNotFoundException($"Could not locate repository file '{relativePath}'."); } + + /// + /// Parse the <Version>...</Version> element from + /// Directory.Build.props. Tolerant of whitespace, comments and + /// attribute shuffling — the MSBuild schema for Version is just + /// a plain element with a string body. + /// + private static string ReadVersionFromProps(string propsPath) + { + var doc = System.Xml.Linq.XDocument.Load(propsPath); + var versionElement = doc.Descendants() + .FirstOrDefault(e => e.Name.LocalName == "Version"); + Assert.NotNull(versionElement); + var version = versionElement!.Value.Trim(); + Assert.False( + string.IsNullOrEmpty(version), + $" in {propsPath} is empty"); + return version; + } }