Skip to content
Draft
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
12 changes: 9 additions & 3 deletions src/TeaPie/Reporting/JUnitXmlTestResultsSummaryReporter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,9 @@ private static void WriteFailedTest(
failedTest.Duration,
false,
failedTest.ErrorMessage,
stackTrace: failedTest.Exception?.StackTrace);
stackTrace: failedTest.Exception?.StackTrace,
sourceType: failedTest.SourceType,
requestName: failedTest.RequestName);

private static void WriteSkippedTest(
JUnitXmlWriter writer,
Expand All @@ -98,7 +100,9 @@ private static void WriteSkippedTest(
testCaseSummary.Name,
skippedTest.TestName,
0.0,
true);
true,
sourceType: skippedTest.SourceType,
requestName: skippedTest.RequestName);

private static void WritePassedTest(
JUnitXmlWriter writer,
Expand All @@ -108,5 +112,7 @@ private static void WritePassedTest(
testCaseSummary.Name,
passedTest.TestName,
passedTest.Duration,
false);
false,
sourceType: passedTest.SourceType,
requestName: passedTest.RequestName);
}
2 changes: 1 addition & 1 deletion src/TeaPie/Testing/Registrator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ private async Task RegisterBase(string testName, Func<Task> testFunction, bool s
testName,
skipTest,
testFunction,
new TestResult.NotRun() { TestName = testName, TestCasePath = testCase.RequestsFile.RelativePath },
new TestResult.NotRun() { TestName = testName, TestCasePath = testCase.RequestsFile.RelativePath, SourceType = "csx" },
testCase);

testCaseExecutionContext.RegisterTest(test);
Expand Down
19 changes: 16 additions & 3 deletions src/TeaPie/Testing/TestFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,23 @@ private static Test Create(
{
CheckParameters(description, out var requestExecutionContext);

var requestName = !string.IsNullOrEmpty(requestExecutionContext.Name)
? requestExecutionContext.Name
: null;

return CreateTest(testDirective.TestNameGetter(description.Parameters),
requestExecutionContext.TestCaseExecutionContext?.TestCase,
async () => await testDirective.TestFunction(requestExecutionContext.Response!, description.Parameters));
async () => await testDirective.TestFunction(requestExecutionContext.Response!, description.Parameters),
sourceType: "inline",
requestName: requestName);
}

private static Test CreateTest(string testName, TestCase? testCase, Func<Task> testFunction)
private static Test CreateTest(
string testName,
TestCase? testCase,
Func<Task> testFunction,
string? sourceType = null,
string? requestName = null)
{
var test = new Test(
$"[{_factoryCount}] {testName}",
Expand All @@ -47,7 +58,9 @@ private static Test CreateTest(string testName, TestCase? testCase, Func<Task> t
new TestResult.NotRun()
{
TestName = testName,
TestCasePath = testCase?.RequestsFile.RelativePath ?? string.Empty
TestCasePath = testCase?.RequestsFile.RelativePath ?? string.Empty,
SourceType = sourceType,
RequestName = requestName
},
testCase);

Expand Down
4 changes: 4 additions & 0 deletions src/TeaPie/Testing/TestResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,8 @@ public partial record Failed(long Duration, string ErrorMessage, Exception? Exce
public required string TestName { get; init; }

public string TestCasePath { get; init; }

public string? SourceType { get; init; }

public string? RequestName { get; init; }
}
8 changes: 6 additions & 2 deletions src/TeaPie/Testing/Tester.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,14 +126,18 @@ private TestResult.Passed CreatePassedResult(Test test, TestCase? testCase) =>
new(_stopWatch.ElapsedMilliseconds)
{
TestName = test.Name,
TestCasePath = testCase?.RequestsFile.RelativePath ?? string.Empty
TestCasePath = testCase?.RequestsFile.RelativePath ?? string.Empty,
SourceType = test.Result.SourceType,
RequestName = test.Result.RequestName
};

private TestResult.Failed CreateFailedResult(Test test, Exception ex, TestCase? testCase) =>
new(_stopWatch.ElapsedMilliseconds, ex.Message, ex)
{
TestName = test.Name,
TestCasePath = testCase?.RequestsFile.RelativePath ?? string.Empty
TestCasePath = testCase?.RequestsFile.RelativePath ?? string.Empty,
SourceType = test.Result.SourceType,
RequestName = test.Result.RequestName
};

#region Logging
Expand Down
14 changes: 13 additions & 1 deletion src/TeaPie/Xml/JUnitXmlWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,26 @@ public void WriteTestCase(
bool skipped,
string? failureMessage = null,
string failureType = "AssertionError",
string? stackTrace = null)
string? stackTrace = null,
string? sourceType = null,
string? requestName = null)
{
EnsureTestSuiteWritten();

_writer.WriteStartElement("testcase");
WriteNameAndTimeAttributes(testName, timeMs);
_writer.WriteAttributeString("classname", className);

if (!string.IsNullOrEmpty(sourceType))
{
_writer.WriteAttributeString("source", sourceType);
}

if (!string.IsNullOrEmpty(requestName))
{
_writer.WriteAttributeString("request", requestName);
}

if (skipped)
{
_writer.WriteElementString("skipped", string.Empty);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,57 @@ public void EnsureTimeFormatUsesDotAsDecimalSeparator()
Contains(".", suite.Attribute("time")?.Value);
}

[Fact]
public void WriteSourceAttributeForInlineTests()
{
var summary = CreateMockTestSummaryWithSourceInfo();

var reporter = new JUnitXmlTestResultsSummaryReporter(TestFilePath);
reporter.Report(summary);

var doc = XDocument.Load(TestFilePath);
var inlineTest = doc.Descendants("testcase")
.FirstOrDefault(tc => tc.Attribute("name")?.Value == "InlineTest");

NotNull(inlineTest);
Equal("inline", inlineTest.Attribute("source")?.Value);
Equal("EditCarRequest", inlineTest.Attribute("request")?.Value);
}

[Fact]
public void WriteSourceAttributeForCsxTests()
{
var summary = CreateMockTestSummaryWithSourceInfo();

var reporter = new JUnitXmlTestResultsSummaryReporter(TestFilePath);
reporter.Report(summary);

var doc = XDocument.Load(TestFilePath);
var csxTest = doc.Descendants("testcase")
.FirstOrDefault(tc => tc.Attribute("name")?.Value == "CsxTest");

NotNull(csxTest);
Equal("csx", csxTest.Attribute("source")?.Value);
Null(csxTest.Attribute("request"));
}

[Fact]
public void OmitSourceAndRequestAttributesWhenNotSet()
{
var summary = CreateMockTestSummary();

var reporter = new JUnitXmlTestResultsSummaryReporter(TestFilePath);
reporter.Report(summary);

var doc = XDocument.Load(TestFilePath);
var testCase = doc.Descendants("testcase")
.FirstOrDefault(tc => tc.Attribute("name")?.Value == "Test1");

NotNull(testCase);
Null(testCase.Attribute("source"));
Null(testCase.Attribute("request"));
}

private static CollectionTestResultsSummary CreateMockTestSummary()
{
var summary = new CollectionTestResultsSummary();
Expand All @@ -144,4 +195,24 @@ private static CollectionTestResultsSummary CreateMockTestSummary()

return summary;
}

private static CollectionTestResultsSummary CreateMockTestSummaryWithSourceInfo()
{
var summary = new CollectionTestResultsSummary();
summary.AddPassedTest("SampleTestCase", new TestResult.Passed(150)
{
TestName = "InlineTest",
SourceType = "inline",
RequestName = "EditCarRequest"
});
summary.AddPassedTest("SampleTestCase", new TestResult.Passed(200)
{
TestName = "CsxTest",
SourceType = "csx"
});

summary.Start();

return summary;
}
}
57 changes: 57 additions & 0 deletions tests/TeaPie.Tests/Xml/JUnitXmlWriterShould.cs
Original file line number Diff line number Diff line change
Expand Up @@ -139,4 +139,61 @@ public void EnsureTimeFormatUsesDotAsDecimalSeparator()
NotNull(suite);
Contains(".", suite.Attribute("time")?.Value);
}

[Fact]
public void WriteSourceAttributeWhenProvided()
{
using (var writer = new JUnitXmlWriter(TestFilePath))
{
writer.WriteTestSuitesRoot();
writer.WriteTestSuite("SuiteF", totalTests: 1, skipped: 0, failures: 0, timeMs: 100);
writer.WriteTestCase("Tests", "InlineTest", 50, skipped: false, sourceType: "inline", requestName: "MyRequest");
writer.EndTestSuite();
writer.EndTestSuitesRoot();
}

var doc = XDocument.Load(TestFilePath);
var testCase = doc.Descendants("testcase").First();

Equal("inline", testCase.Attribute("source")?.Value);
Equal("MyRequest", testCase.Attribute("request")?.Value);
}

[Fact]
public void WriteCsxSourceAttributeWithoutRequestAttribute()
{
using (var writer = new JUnitXmlWriter(TestFilePath))
{
writer.WriteTestSuitesRoot();
writer.WriteTestSuite("SuiteG", totalTests: 1, skipped: 0, failures: 0, timeMs: 100);
writer.WriteTestCase("Tests", "CsxTest", 50, skipped: false, sourceType: "csx");
writer.EndTestSuite();
writer.EndTestSuitesRoot();
}

var doc = XDocument.Load(TestFilePath);
var testCase = doc.Descendants("testcase").First();

Equal("csx", testCase.Attribute("source")?.Value);
Null(testCase.Attribute("request"));
}

[Fact]
public void OmitSourceAndRequestAttributesWhenNotProvided()
{
using (var writer = new JUnitXmlWriter(TestFilePath))
{
writer.WriteTestSuitesRoot();
writer.WriteTestSuite("SuiteH", totalTests: 1, skipped: 0, failures: 0, timeMs: 100);
writer.WriteTestCase("Tests", "PlainTest", 50, skipped: false);
writer.EndTestSuite();
writer.EndTestSuitesRoot();
}

var doc = XDocument.Load(TestFilePath);
var testCase = doc.Descendants("testcase").First();

Null(testCase.Attribute("source"));
Null(testCase.Attribute("request"));
}
}
Loading