Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 120 additions & 0 deletions TUnit.Engine.Tests/JUnitReporterTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
using Microsoft.Testing.Platform.Extensions;
using TUnit.Core;
using TUnit.Engine.Reporters;

namespace TUnit.Engine.Tests;

[NotInParallel]
public class JUnitReporterTests
{
private sealed class MockExtension : IExtension
{
public string Uid => "MockExtension";
public string DisplayName => "Mock";
public string Version => "1.0.0";
public string Description => "Mock Extension";
public Task<bool> IsEnabledAsync() => Task.FromResult(true);
}

[After(Test)]
public void Cleanup()
{
// Clean up environment variables after each test
Environment.SetEnvironmentVariable("TUNIT_DISABLE_JUNIT_REPORTER", null);
Environment.SetEnvironmentVariable("TUNIT_ENABLE_JUNIT_REPORTER", null);
Environment.SetEnvironmentVariable("GITLAB_CI", null);
Environment.SetEnvironmentVariable("CI_SERVER", null);
Environment.SetEnvironmentVariable("JUNIT_XML_OUTPUT_PATH", null);
}

Comment on lines +19 to +29

Copilot AI Dec 5, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The tests will not work as expected because they set environment variables directly, but the JUnitReporter uses EnvironmentVariableCache.Get() which caches environment variables on first access. Once the cache is initialized, setting environment variables with Environment.SetEnvironmentVariable() won't affect the cached values.

To fix this, you need to either:

  1. Add a method to clear/invalidate the EnvironmentVariableCache and call it in the Cleanup() method
  2. Use reflection to directly call the cache initialization or clear it
  3. Refactor tests to use dependency injection for environment variable access

Copilot uses AI. Check for mistakes.
[Test]
public async Task IsEnabledAsync_Should_Return_False_When_TUNIT_DISABLE_JUNIT_REPORTER_Is_Set()
{
// Arrange
Environment.SetEnvironmentVariable("TUNIT_DISABLE_JUNIT_REPORTER", "true");
Environment.SetEnvironmentVariable("GITLAB_CI", "true"); // Even with GitLab CI, should be disabled
var extension = new MockExtension();
var reporter = new JUnitReporter(extension);

// Act
var isEnabled = await reporter.IsEnabledAsync();

// Assert
await Assert.That(isEnabled).IsFalse();
}

[Test]
public async Task IsEnabledAsync_Should_Return_True_When_GITLAB_CI_Is_Set()
{
// Arrange
Environment.SetEnvironmentVariable("GITLAB_CI", "true");
var extension = new MockExtension();
var reporter = new JUnitReporter(extension);

// Act
var isEnabled = await reporter.IsEnabledAsync();

// Assert
await Assert.That(isEnabled).IsTrue();
}

[Test]
public async Task IsEnabledAsync_Should_Return_True_When_CI_SERVER_Is_Set()
{
// Arrange
Environment.SetEnvironmentVariable("CI_SERVER", "yes");
var extension = new MockExtension();
var reporter = new JUnitReporter(extension);

// Act
var isEnabled = await reporter.IsEnabledAsync();

// Assert
await Assert.That(isEnabled).IsTrue();
}

[Test]
public async Task IsEnabledAsync_Should_Return_True_When_TUNIT_ENABLE_JUNIT_REPORTER_Is_Set()
{
// Arrange
Environment.SetEnvironmentVariable("TUNIT_ENABLE_JUNIT_REPORTER", "true");
var extension = new MockExtension();
var reporter = new JUnitReporter(extension);

// Act
var isEnabled = await reporter.IsEnabledAsync();

// Assert
await Assert.That(isEnabled).IsTrue();
}

[Test]
public async Task IsEnabledAsync_Should_Return_False_When_No_Environment_Variables_Are_Set()
{
// Arrange
var extension = new MockExtension();
var reporter = new JUnitReporter(extension);

// Act
var isEnabled = await reporter.IsEnabledAsync();

// Assert
await Assert.That(isEnabled).IsFalse();
}

[Test]
public async Task IsEnabledAsync_Should_Prefer_Disable_Over_Enable()
{
// Arrange
Environment.SetEnvironmentVariable("TUNIT_DISABLE_JUNIT_REPORTER", "true");
Environment.SetEnvironmentVariable("TUNIT_ENABLE_JUNIT_REPORTER", "true");
var extension = new MockExtension();
var reporter = new JUnitReporter(extension);

// Act
var isEnabled = await reporter.IsEnabledAsync();

// Assert
await Assert.That(isEnabled).IsFalse();
}
}
45 changes: 45 additions & 0 deletions TUnit.Engine/CommandLineProviders/JUnitReporterCommandProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
using Microsoft.Testing.Platform.CommandLine;
using Microsoft.Testing.Platform.Extensions;
using Microsoft.Testing.Platform.Extensions.CommandLine;

namespace TUnit.Engine.CommandLineProviders;

internal class JUnitReporterCommandProvider(IExtension extension) : ICommandLineOptionsProvider
{
public const string JUnitOutputPathOption = "junit-output-path";

public Task<bool> IsEnabledAsync() => extension.IsEnabledAsync();

public string Uid => extension.Uid;

public string Version => extension.Version;

public string DisplayName => extension.DisplayName;

public string Description => extension.Description;

public IReadOnlyCollection<CommandLineOption> GetCommandLineOptions()
{
return
[
new CommandLineOption(
JUnitOutputPathOption,
"Path to output JUnit XML file (default: TestResults/{AssemblyName}-junit.xml)",
ArgumentArity.ExactlyOne,
false)
];
}

public Task<ValidationResult> ValidateOptionArgumentsAsync(
CommandLineOption commandOption,
string[] arguments)
{
return ValidationResult.ValidTask;
}

public Task<ValidationResult> ValidateCommandLineOptionsAsync(
ICommandLineOptions commandLineOptions)
{
return ValidationResult.ValidTask;
}
}
18 changes: 18 additions & 0 deletions TUnit.Engine/Extensions/TestApplicationBuilderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ public static void AddTUnit(this ITestApplicationBuilder testApplicationBuilder)
var githubReporter = new GitHubReporter(extension);
var githubReporterCommandProvider = new GitHubReporterCommandProvider(extension);

var junitReporter = new JUnitReporter(extension);
var junitReporterCommandProvider = new JUnitReporterCommandProvider(extension);

testApplicationBuilder.RegisterTestFramework(
serviceProvider => new TestFrameworkCapabilities(CreateCapabilities(serviceProvider)),
(capabilities, serviceProvider) => new TUnitTestFramework(extension, serviceProvider, capabilities));
Expand All @@ -46,6 +49,9 @@ public static void AddTUnit(this ITestApplicationBuilder testApplicationBuilder)
// GitHub reporter configuration
testApplicationBuilder.CommandLine.AddProvider(() => githubReporterCommandProvider);

// JUnit reporter configuration
testApplicationBuilder.CommandLine.AddProvider(() => junitReporterCommandProvider);

testApplicationBuilder.TestHost.AddDataConsumer(serviceProvider =>
{
// Apply command-line configuration if provided
Expand All @@ -58,6 +64,18 @@ public static void AddTUnit(this ITestApplicationBuilder testApplicationBuilder)
return githubReporter;
});
testApplicationBuilder.TestHost.AddTestHostApplicationLifetime(_ => githubReporter);

testApplicationBuilder.TestHost.AddDataConsumer(serviceProvider =>
{
// Apply command-line configuration if provided
var commandLineOptions = serviceProvider.GetRequiredService<ICommandLineOptions>();
if (commandLineOptions.TryGetOptionArgumentList(JUnitReporterCommandProvider.JUnitOutputPathOption, out var pathArgs))
{
junitReporter.SetOutputPath(pathArgs[0]);
}
return junitReporter;
});
testApplicationBuilder.TestHost.AddTestHostApplicationLifetime(_ => junitReporter);
}

private static IReadOnlyCollection<ITestFrameworkCapability> CreateCapabilities(IServiceProvider serviceProvider)
Expand Down
192 changes: 0 additions & 192 deletions TUnit.Engine/Helpers/EnvironmentVariableCache.cs

This file was deleted.

Loading
Loading