Skip to content

Commit

Permalink
Merge pull request #1237 from smirok/teamcity-fix-for-tests-with-dataset
Browse files Browse the repository at this point in the history
fix: unify the `locationHint` prefix and prettify both `locationHint` and `name` parameters for testing with datasets
  • Loading branch information
nunomaduro authored Sep 11, 2024
2 parents 45f1648 + 7227d24 commit ce61ced
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 10 deletions.
41 changes: 38 additions & 3 deletions src/Logging/Converter.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
use PHPUnit\Event\Test\MarkedIncomplete;
use PHPUnit\Event\Test\Skipped;
use PHPUnit\Event\TestSuite\TestSuite;
use PHPUnit\Event\TestSuite\TestSuiteForTestMethodWithDataProvider;
use PHPUnit\Framework\Exception as FrameworkException;
use PHPUnit\TestRunner\TestResult\TestResult as PhpUnitTestResult;

Expand Down Expand Up @@ -147,6 +148,13 @@ public function getStackTrace(Throwable $throwable): string
*/
public function getTestSuiteName(TestSuite $testSuite): string
{
if ($testSuite instanceof TestSuiteForTestMethodWithDataProvider) {
$firstTest = $this->getFirstTest($testSuite);
if ($firstTest != null) {
return $this->getTestMethodNameWithoutDatasetSuffix($firstTest);
}
}

$name = $testSuite->name();

if (! str_starts_with($name, self::PREFIX)) {
Expand All @@ -168,6 +176,35 @@ public function getTrimmedTestClassName(TestMethod $test): string
* Gets the test suite location.
*/
public function getTestSuiteLocation(TestSuite $testSuite): ?string
{
$firstTest = $this->getFirstTest($testSuite);
if ($firstTest == null) {
return null;
}
$path = $firstTest->testDox()->prettifiedClassName();
$classRelativePath = $this->toRelativePath($path);

if ($testSuite instanceof TestSuiteForTestMethodWithDataProvider) {
$methodName = $this->getTestMethodNameWithoutDatasetSuffix($firstTest);

return "$classRelativePath::$methodName";
}

return $classRelativePath;
}

/**
* Gets the prettified test method name without dataset-related suffix.
*/
private function getTestMethodNameWithoutDatasetSuffix(TestMethod $testMethod): string
{
return Str::beforeLast($testMethod->testDox()->prettifiedMethodName(), ' with data set ');
}

/**
* Gets the first test from the test suite.
*/
private function getFirstTest(TestSuite $testSuite): ?TestMethod
{
$tests = $testSuite->tests()->asArray();

Expand All @@ -181,9 +218,7 @@ public function getTestSuiteLocation(TestSuite $testSuite): ?string
throw ShouldNotHappen::fromMessage('Not an instance of TestMethod');
}

$path = $firstTest->testDox()->prettifiedClassName();

return $this->toRelativePath($path);
return $firstTest;
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/Logging/TeamCity/ServiceMessage.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public static function testSuiteStarted(string $name, ?string $location): self
{
return new self('testSuiteStarted', [
'name' => $name,
'locationHint' => $location === null ? null : "file://$location",
'locationHint' => $location === null ? null : "pest_qn://$location",
]);
}

Expand Down
2 changes: 1 addition & 1 deletion tests/.snapshots/Failure.php.inc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
##teamcity[testSuiteStarted name='Tests/tests/Failure' locationHint='file://tests/.tests/Failure.php' flowId='1234']
##teamcity[testSuiteStarted name='Tests/tests/Failure' locationHint='pest_qn://tests/.tests/Failure.php' flowId='1234']
##teamcity[testCount count='8' flowId='1234']
##teamcity[testStarted name='it can fail with comparison' locationHint='pest_qn://tests/.tests/Failure.php::it can fail with comparison' flowId='1234']
##teamcity[testFailed name='it can fail with comparison' message='Failed asserting that true matches expected false.' details='at tests/.tests/Failure.php:6' type='comparisonFailure' actual='true' expected='false' flowId='1234']
Expand Down
10 changes: 7 additions & 3 deletions tests/.snapshots/SuccessOnly.php.inc
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
##teamcity[testSuiteStarted name='Tests/tests/SuccessOnly' locationHint='file://tests/.tests/SuccessOnly.php' flowId='1234']
##teamcity[testCount count='2' flowId='1234']
##teamcity[testSuiteStarted name='Tests/tests/SuccessOnly' locationHint='pest_qn://tests/.tests/SuccessOnly.php' flowId='1234']
##teamcity[testCount count='3' flowId='1234']
##teamcity[testStarted name='it can pass with comparison' locationHint='pest_qn://tests/.tests/SuccessOnly.php::it can pass with comparison' flowId='1234']
##teamcity[testFinished name='it can pass with comparison' duration='100000' flowId='1234']
##teamcity[testStarted name='can also pass' locationHint='pest_qn://tests/.tests/SuccessOnly.php::can also pass' flowId='1234']
##teamcity[testFinished name='can also pass' duration='100000' flowId='1234']
##teamcity[testSuiteStarted name='can pass with dataset' locationHint='pest_qn://tests/.tests/SuccessOnly.php::can pass with dataset' flowId='1234']
##teamcity[testStarted name='can pass with dataset with data set "(true)"' locationHint='pest_qn://tests/.tests/SuccessOnly.php::can pass with dataset with data set "(true)"' flowId='1234']
##teamcity[testFinished name='can pass with dataset with data set "(true)"' duration='100000' flowId='1234']
##teamcity[testSuiteFinished name='can pass with dataset' flowId='1234']
##teamcity[testSuiteFinished name='Tests/tests/SuccessOnly' flowId='1234']

[90mTests:[39m [32;1m2 passed[39;22m[90m (2 assertions)[39m
[90mTests:[39m [32;1m3 passed[39;22m[90m (3 assertions)[39m
Duration: 1.00s

4 changes: 4 additions & 0 deletions tests/.tests/SuccessOnly.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,7 @@
test('can also pass', function () {
expect("string")->toBeString();
});

test('can pass with dataset', function ($value) {
expect($value)->toEqual(true);
})->with([true]);
4 changes: 2 additions & 2 deletions tests/Visual/JUnit.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@
expect($result['testsuite']['@attributes'])
->name->toBe('Tests\tests\SuccessOnly')
->file->toBe($normalizedPath('tests/.tests/SuccessOnly.php'))
->tests->toBe('2')
->assertions->toBe('2')
->tests->toBe('3')
->assertions->toBe('3')
->errors->toBe('0')
->failures->toBe('0')
->skipped->toBe('0');
Expand Down

0 comments on commit ce61ced

Please sign in to comment.