From 7227d24611bcf83fc89d9a5acae69e164afc367e Mon Sep 17 00:00:00 2001 From: Ilia Smirnov Date: Wed, 11 Sep 2024 16:42:06 +0200 Subject: [PATCH] fix: unify the `locationHint` prefix and prettify both `locationHint` and `name` parameters for testing with datasets --- src/Logging/Converter.php | 41 +++++++++++++++++++++++-- src/Logging/TeamCity/ServiceMessage.php | 2 +- tests/.snapshots/Failure.php.inc | 2 +- tests/.snapshots/SuccessOnly.php.inc | 10 ++++-- tests/.tests/SuccessOnly.php | 4 +++ tests/Visual/JUnit.php | 4 +-- 6 files changed, 53 insertions(+), 10 deletions(-) diff --git a/src/Logging/Converter.php b/src/Logging/Converter.php index 92b67db1..eff6b3a2 100644 --- a/src/Logging/Converter.php +++ b/src/Logging/Converter.php @@ -18,6 +18,7 @@ use PHPUnit\Event\Test\Failed; 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; @@ -147,6 +148,13 @@ final readonly class Converter */ 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)) { @@ -168,6 +176,35 @@ final readonly class Converter * 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(); @@ -181,9 +218,7 @@ final readonly class Converter throw ShouldNotHappen::fromMessage('Not an instance of TestMethod'); } - $path = $firstTest->testDox()->prettifiedClassName(); - - return $this->toRelativePath($path); + return $firstTest; } /** diff --git a/src/Logging/TeamCity/ServiceMessage.php b/src/Logging/TeamCity/ServiceMessage.php index ed73b0dd..afa18f7d 100644 --- a/src/Logging/TeamCity/ServiceMessage.php +++ b/src/Logging/TeamCity/ServiceMessage.php @@ -38,7 +38,7 @@ final class ServiceMessage { return new self('testSuiteStarted', [ 'name' => $name, - 'locationHint' => $location === null ? null : "file://$location", + 'locationHint' => $location === null ? null : "pest_qn://$location", ]); } diff --git a/tests/.snapshots/Failure.php.inc b/tests/.snapshots/Failure.php.inc index c8cb7d63..efd42309 100644 --- a/tests/.snapshots/Failure.php.inc +++ b/tests/.snapshots/Failure.php.inc @@ -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'] diff --git a/tests/.snapshots/SuccessOnly.php.inc b/tests/.snapshots/SuccessOnly.php.inc index 26670e8e..b00a0e36 100644 --- a/tests/.snapshots/SuccessOnly.php.inc +++ b/tests/.snapshots/SuccessOnly.php.inc @@ -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'] - Tests: 2 passed (2 assertions) + Tests: 3 passed (3 assertions) Duration: 1.00s diff --git a/tests/.tests/SuccessOnly.php b/tests/.tests/SuccessOnly.php index 38672a0d..cb4009a6 100644 --- a/tests/.tests/SuccessOnly.php +++ b/tests/.tests/SuccessOnly.php @@ -9,3 +9,7 @@ it('can pass with comparison', function () { test('can also pass', function () { expect("string")->toBeString(); }); + +test('can pass with dataset', function ($value) { + expect($value)->toEqual(true); +})->with([true]); diff --git a/tests/Visual/JUnit.php b/tests/Visual/JUnit.php index 560778b3..3523bdd6 100644 --- a/tests/Visual/JUnit.php +++ b/tests/Visual/JUnit.php @@ -36,8 +36,8 @@ test('junit output', function () use ($normalizedPath, $run) { 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');