diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 60991b7..c3cbeb0 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -6,7 +6,7 @@ on: - main env: - VERSION: 3.9.3 + VERSION: 3.9.4 jobs: # ЧАСТЬ 1: Собираем образы и кладем в Gitea (чтобы делиться с ребятами) diff --git a/Directory.Build.props b/Directory.Build.props index e5db704..3d01b11 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - 3.9.3 + 3.9.4 net10.0 preview enable diff --git a/compose.yaml b/compose.yaml index c8b359d..e98ed76 100644 --- a/compose.yaml +++ b/compose.yaml @@ -49,7 +49,7 @@ services: crond -f bot: - image: git.codeanddice.ru/toutsu/gmrelay-bot:3.9.3 + image: git.codeanddice.ru/toutsu/gmrelay-bot:3.9.4 restart: always depends_on: db: @@ -67,7 +67,7 @@ services: retries: 3 discord: - image: git.codeanddice.ru/toutsu/gmrelay-discord-bot:3.9.3 + image: git.codeanddice.ru/toutsu/gmrelay-discord-bot:3.9.4 restart: always depends_on: db: @@ -86,7 +86,7 @@ services: retries: 3 web: - image: git.codeanddice.ru/toutsu/gmrelay-web:3.9.3 + image: git.codeanddice.ru/toutsu/gmrelay-web:3.9.4 restart: always depends_on: db: diff --git a/src/GmRelay.Web/Components/Layout/NavMenu.razor b/src/GmRelay.Web/Components/Layout/NavMenu.razor index 2bcfee1..bb8c9b0 100644 --- a/src/GmRelay.Web/Components/Layout/NavMenu.razor +++ b/src/GmRelay.Web/Components/Layout/NavMenu.razor @@ -82,7 +82,7 @@ - + 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; + } }