| File: PowerShellScripts\WriteClassModeTestPropsTests.cs | Web Access |
| Project: src\tests\Infrastructure.Tests\Infrastructure.Tests.csproj (Infrastructure.Tests) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using Aspire.TestUtilities; using Xunit; namespace Infrastructure.Tests; public class WriteClassModeTestPropsTests : IDisposable { private readonly TemporaryWorkspace _workspace; private readonly string _scriptPath; private readonly ITestOutputHelper _output; public WriteClassModeTestPropsTests(ITestOutputHelper output) { _output = output; _workspace = TemporaryWorkspace.Create(output); _scriptPath = Path.Combine(RepoRoot.Path, "eng", "scripts", "write-class-mode-test-props.ps1"); } public void Dispose() => _workspace.Dispose(); [Fact] [RequiresTools(["pwsh"])] public async Task WritesOverrideProjectToBuildForSplitProjectsWithoutPartitions() { var artifactsDir = Path.Combine(_workspace.Path, "artifacts"); Directory.CreateDirectory(artifactsDir); TestDataBuilder.CreateTestsMetadataJson( Path.Combine(artifactsDir, "RegularProject.tests-metadata.json"), projectName: "RegularProject", testProjectPath: "tests/RegularProject/RegularProject.csproj"); TestDataBuilder.CreateSplitTestsMetadataJson( Path.Combine(artifactsDir, "PartitionSplitProject.tests-metadata.json"), projectName: "PartitionSplitProject", testProjectPath: "tests/PartitionSplitProject/PartitionSplitProject.csproj"); TestDataBuilder.CreateTestsPartitionsJson( Path.Combine(artifactsDir, "PartitionSplitProject.tests-partitions.json"), "1"); TestDataBuilder.CreateSplitTestsMetadataJson( Path.Combine(artifactsDir, "ClassSplitProject.tests-metadata.json"), projectName: "ClassSplitProject", testProjectPath: "tests/ClassSplitProject/ClassSplitProject.csproj"); var outputPropsPath = Path.Combine(_workspace.Path, "ClassModeProjects.props"); var result = await RunScript(artifactsDir, outputPropsPath); result.EnsureSuccessful(); Assert.Contains("Class-mode split projects: 1", result.Output); var propsXml = File.ReadAllText(outputPropsPath); Assert.Contains("$(RepoRoot)tests/ClassSplitProject/ClassSplitProject.csproj", propsXml); Assert.DoesNotContain("RegularProject.csproj", propsXml); Assert.DoesNotContain("PartitionSplitProject.csproj", propsXml); } [Fact] [RequiresTools(["pwsh"])] public async Task WritesZeroCountWhenEverySplitProjectAlreadyHasPartitions() { var artifactsDir = Path.Combine(_workspace.Path, "artifacts"); Directory.CreateDirectory(artifactsDir); TestDataBuilder.CreateSplitTestsMetadataJson( Path.Combine(artifactsDir, "PartitionSplitProject.tests-metadata.json"), projectName: "PartitionSplitProject", testProjectPath: "tests/PartitionSplitProject/PartitionSplitProject.csproj"); TestDataBuilder.CreateTestsPartitionsJson( Path.Combine(artifactsDir, "PartitionSplitProject.tests-partitions.json"), "1"); var outputPropsPath = Path.Combine(_workspace.Path, "ClassModeProjects.props"); var result = await RunScript(artifactsDir, outputPropsPath); result.EnsureSuccessful(); Assert.Contains("Class-mode split projects: 0", result.Output); var propsXml = File.ReadAllText(outputPropsPath); Assert.DoesNotContain("OverrideProjectToBuild", propsXml); } [Fact] [RequiresTools(["pwsh"])] public async Task FailsWhenClassModeMetadataDoesNotContainProjectPath() { var artifactsDir = Path.Combine(_workspace.Path, "artifacts"); Directory.CreateDirectory(artifactsDir); File.WriteAllText( Path.Combine(artifactsDir, "Broken.tests-metadata.json"), """ { "projectName": "Broken", "splitTests": "true" } """); var outputPropsPath = Path.Combine(_workspace.Path, "ClassModeProjects.props"); var result = await RunScript(artifactsDir, outputPropsPath); Assert.NotEqual(0, result.ExitCode); Assert.Contains("does not contain testProjectPath", result.Output); } private async Task<CommandResult> RunScript(string artifactsDir, string outputPropsPath) { using var cmd = new PowerShellCommand(_scriptPath, _output) .WithTimeout(TimeSpan.FromMinutes(1)); return await cmd.ExecuteAsync( "-ArtifactsDir", $"\"{artifactsDir}\"", "-OutputPropsPath", $"\"{outputPropsPath}\""); } }