Files
PSProxmoxVE/tests/PSProxmoxVE.Core.Tests/PackageVersionCentralizationTests.cs
T
goodolclint-claude[bot] 4f9ee05edf refactor: centralize build config and pin the SDK (#156) (#182)
Adds global.json (10.0 SDK, rollForward latestFeature) so local dev
resolves the same SDK line CI pins in five workflows, instead of
floating to whatever is installed.

Adds Directory.Build.props for LangVersion/Nullable, the two
properties identical across all three csproj (TargetFramework stays
per-project since the test project multi-targets net10.0;net48).

Adds Directory.Packages.props with central package management, moving
every PackageReference version out of the three csproj into one file.
Newtonsoft.Json bumped 13.0.3 -> 13.0.4 in the single place instead of
two independent declarations that could drift. xunit.runner.visualstudio
stays at 4.0.0 (it runs xUnit v1/v2/v3 per its own description; nothing
in the issue's stated xunit 2.9.3 pairing required a downgrade).

Removes the self-referential $(NoWarn) from the Core csproj, a no-op.

Adds an explicit System.Memory 4.6.3 PackageReference to the net48
leg of the test project, which resolves the MSB3277 conflict between
System.Memory 4.0.1.2 and 4.0.5.0 (110 warnings -> 0). Scoped to net48
only per the issue, which names only the net48 test target.

Adds PackageVersionCentralizationTests, an xUnit test asserting none
of the three csproj declare a PackageReference Version attribute
outside Directory.Packages.props.

Co-authored-by: goodolclint-claude[bot] <323206664+goodolclint-claude[bot]@users.noreply.github.com>
2026-09-02 20:44:12 +00:00

54 lines
1.7 KiB
C#

using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using Xunit;
namespace PSProxmoxVE.Core.Tests
{
public class PackageVersionCentralizationTests
{
private static readonly string[] ProjectPaths =
{
"src/PSProxmoxVE.Core/PSProxmoxVE.Core.csproj",
"src/PSProxmoxVE/PSProxmoxVE.csproj",
"tests/PSProxmoxVE.Core.Tests/PSProxmoxVE.Core.Tests.csproj",
};
[Fact]
public void PackageReferences_DoNotPinVersionsPerProject()
{
var repoRoot = FindRepoRoot();
foreach (var relativePath in ProjectPaths)
{
var doc = XDocument.Load(Path.Combine(repoRoot, relativePath));
var pinned = doc.Descendants("PackageReference")
.Where(e => e.Attribute("Version") != null)
.Select(e => e.Attribute("Include")?.Value)
.ToList();
Assert.True(pinned.Count == 0,
$"{relativePath} pins a version directly instead of going through Directory.Packages.props: {string.Join(", ", pinned)}");
}
}
private static string FindRepoRoot()
{
var dir = new DirectoryInfo(AppContext.BaseDirectory);
while (dir != null && !File.Exists(Path.Combine(dir.FullName, "PSProxmoxVE.sln")))
{
dir = dir.Parent;
}
if (dir == null)
{
throw new InvalidOperationException(
"Could not locate repository root (PSProxmoxVE.sln) from " + AppContext.BaseDirectory);
}
return dir.FullName;
}
}
}