test: cleanup follow-up from PR #124 review
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
This commit is contained in:
@@ -33,16 +33,18 @@ public sealed class DiscordWizardStepCapacityRenderTests
|
|||||||
Assert.Contains(labels, l => l.Contains("Без лимита", System.StringComparison.Ordinal));
|
Assert.Contains(labels, l => l.Contains("Без лимита", System.StringComparison.Ordinal));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Theory]
|
||||||
public void RenderCapacity_NoLimitButton_HasChoiceCustomIdForNoLimit()
|
[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 render = DiscordWizardStep.Render(draft, new WizardPayload());
|
||||||
|
|
||||||
var buttons = ExtractButtons(render);
|
var buttons = ExtractButtons(render);
|
||||||
var noLimit = buttons.SingleOrDefault(b => b.Label?.Contains("Без лимита", System.StringComparison.Ordinal) == true);
|
var noLimit = buttons.SingleOrDefault(b => b.Label?.Contains("Без лимита", System.StringComparison.Ordinal) == true);
|
||||||
Assert.NotNull(noLimit);
|
Assert.NotNull(noLimit);
|
||||||
Assert.StartsWith("wizard:btn:choice:Capacity:no_limit", noLimit!.CustomId);
|
Assert.StartsWith(expectedCustomIdPrefix, noLimit!.CustomId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static System.Collections.Generic.List<string> ExtractButtonLabels(
|
private static System.Collections.Generic.List<string> ExtractButtonLabels(
|
||||||
|
|||||||
@@ -14,8 +14,16 @@ public sealed class CampaignTemplatesNavigationTests
|
|||||||
[Fact]
|
[Fact]
|
||||||
public async Task NavMenu_ShouldExposeCurrentProjectVersion()
|
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"));
|
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]
|
[Fact]
|
||||||
@@ -68,4 +76,23 @@ public sealed class CampaignTemplatesNavigationTests
|
|||||||
|
|
||||||
throw new FileNotFoundException($"Could not locate repository file '{relativePath}'.");
|
throw new FileNotFoundException($"Could not locate repository file '{relativePath}'.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parse the <c><Version>...</Version></c> element from
|
||||||
|
/// <c>Directory.Build.props</c>. Tolerant of whitespace, comments and
|
||||||
|
/// attribute shuffling — the MSBuild schema for <c>Version</c> is just
|
||||||
|
/// a plain element with a string body.
|
||||||
|
/// </summary>
|
||||||
|
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),
|
||||||
|
$"<Version> in {propsPath} is empty");
|
||||||
|
return version;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user