Files
satellite-provider/SatelliteProvider.Tests/ToolingConfigurationTests.cs
T
Oleksandr Bezdieniezhnykh 68359350fc [AZ-372] Add .editorconfig, Directory.Build.props, format/coverage wiring
Wires the C19 tooling baseline so dotnet format and Coverlet gate the
test script and a small NetAnalyzers ruleset (CA1001, CA1051, CA1816,
CA2227) at warning severity is visible from the next build.

- .editorconfig (new, root=true): whitespace rules, per-extension
  indent sizes, C# style preferences as suggestions, initial CA rules.
- Directory.Build.props (new): EnableNETAnalyzers=true,
  AnalysisLevel=latest, AnalysisMode=None so only rules explicitly
  enabled in .editorconfig fire; EnforceCodeStyleInBuild=false to keep
  build clean from style.
- scripts/run-tests.sh: Step 0 runs dotnet format whitespace
  --verify-no-changes via Docker SDK; unit/integration test calls now
  collect XPlat Code Coverage into TestResults/. New --skip-format
  escape hatch.
- .gitignore: TestResults/, coverage.cobertura.xml, *.coverage.
- SatelliteProvider.Tests/ToolingConfigurationTests.cs (new, 6 tests):
  runtime assertions that the config files, script wiring, and
  coverlet.collector reference are all in place; mirrors the
  AcceptanceCriteriaRT2Tests pattern.

Whitespace cleanup that the new format gate uncovers is staged for the
next commit (per AZ-372 spec: "commit cleanup as a separate batch").

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-11 04:42:45 +03:00

101 lines
3.5 KiB
C#

using FluentAssertions;
namespace SatelliteProvider.Tests;
public class ToolingConfigurationTests
{
[Fact]
public void EditorConfig_ExistsAtRoot_AZ372_AC1()
{
var path = LocateRepoFile(".editorconfig");
path.Should().NotBeNull(".editorconfig must exist at the workspace root for `dotnet format` to honor formatting rules");
var content = File.ReadAllText(path!);
content.Should().Contain("root = true");
content.Should().Contain("indent_style = space");
content.Should().Contain("end_of_line = lf");
content.Should().Contain("insert_final_newline = true");
content.Should().Contain("trim_trailing_whitespace = true");
}
[Fact]
public void EditorConfig_DefinesInitialAnalyzerRuleset_AZ372_AC3()
{
var path = LocateRepoFile(".editorconfig");
path.Should().NotBeNull();
var content = File.ReadAllText(path!);
content.Should().Contain("dotnet_diagnostic.CA1001.severity = warning");
content.Should().Contain("dotnet_diagnostic.CA1051.severity = warning");
content.Should().Contain("dotnet_diagnostic.CA1816.severity = warning");
content.Should().Contain("dotnet_diagnostic.CA2227.severity = warning");
}
[Fact]
public void DirectoryBuildProps_ExistsAtRoot_AZ372_AC3()
{
var path = LocateRepoFile("Directory.Build.props");
path.Should().NotBeNull("Directory.Build.props centralizes analyzer settings for every csproj");
var content = File.ReadAllText(path!);
content.Should().Contain("<EnableNETAnalyzers>true</EnableNETAnalyzers>");
content.Should().Contain("<AnalysisLevel>latest</AnalysisLevel>");
content.Should().Contain("<AnalysisMode>None</AnalysisMode>",
"AnalysisMode=None ensures only rules explicitly enabled in .editorconfig fire; protects against analyzer flood");
}
[Fact]
public void RunTestsScript_WiresFormatVerify_AZ372_AC1()
{
var path = LocateRepoFile(Path.Combine("scripts", "run-tests.sh"));
path.Should().NotBeNull();
var content = File.ReadAllText(path!);
content.Should().Contain("dotnet format whitespace");
content.Should().Contain("--verify-no-changes",
"AC-1 requires the script to gate on whitespace conformance via dotnet format");
}
[Fact]
public void RunTestsScript_CollectsCoverage_AZ372_AC2()
{
var path = LocateRepoFile(Path.Combine("scripts", "run-tests.sh"));
path.Should().NotBeNull();
var content = File.ReadAllText(path!);
content.Should().Contain("XPlat Code Coverage");
}
[Fact]
public void TestProject_ReferencesCoverletCollector_AZ372_AC2()
{
var path = LocateRepoFile(Path.Combine("SatelliteProvider.Tests", "SatelliteProvider.Tests.csproj"));
path.Should().NotBeNull();
var content = File.ReadAllText(path!);
content.Should().Contain("coverlet.collector",
"Coverlet collector is the data collector that produces XPlat Code Coverage reports");
}
private static string? LocateRepoFile(string relativePath)
{
var dir = new DirectoryInfo(Directory.GetCurrentDirectory());
while (dir is not null)
{
var candidate = Path.Combine(dir.FullName, relativePath);
if (File.Exists(candidate))
{
return candidate;
}
dir = dir.Parent;
}
return null;
}
}