From 50bbe5ca500fe4a7ead28a489af6e5e2ddb43f89 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 6 Nov 2025 13:59:21 +0100 Subject: [PATCH] fix raw mask escape --- src/DefinitionMasksResolver.php | 6 ++++ src/UsedInstructionResolver.php | 3 ++ .../DefinitionMasksResolverTest.php | 27 +++++++++++---- .../Fixture/AnotherBehatContext.php | 5 +++ .../Fixture/some_file.feature | 5 +++ .../UsedInstructionResolverTest.php | 34 +++++++++++++++++++ 6 files changed, 73 insertions(+), 7 deletions(-) create mode 100644 tests/UsedInstructionResolver/Fixture/some_file.feature create mode 100644 tests/UsedInstructionResolver/UsedInstructionResolverTest.php diff --git a/src/DefinitionMasksResolver.php b/src/DefinitionMasksResolver.php index 67f94e20c..702dadecd 100644 --- a/src/DefinitionMasksResolver.php +++ b/src/DefinitionMasksResolver.php @@ -18,6 +18,9 @@ use Rector\Behastan\ValueObject\MaskCollection; use SplFileInfo; +/** + * @see \Rector\Behastan\Tests\DefinitionMasksResolver\DefinitionMasksResolverTest + */ final readonly class DefinitionMasksResolver { public function __construct( @@ -76,6 +79,9 @@ public function resolve(array $contextFiles): MaskCollection continue; } + // remove \/ escape from mask + $rawMask = str_replace('\/', '/', $rawMask); + $masks[] = new ExactMask( $rawMask, $classMethodContextDefinition->getFilePath(), diff --git a/src/UsedInstructionResolver.php b/src/UsedInstructionResolver.php index 3171b9d61..2fe216277 100644 --- a/src/UsedInstructionResolver.php +++ b/src/UsedInstructionResolver.php @@ -8,6 +8,9 @@ use RuntimeException; use Symfony\Component\Finder\SplFileInfo; +/** + * @see \Rector\Behastan\Tests\UsedInstructionResolver\UsedInstructionResolverTest + */ final class UsedInstructionResolver { /** diff --git a/tests/DefinitionMasksResolver/DefinitionMasksResolverTest.php b/tests/DefinitionMasksResolver/DefinitionMasksResolverTest.php index 6a85c4066..5c7e21503 100644 --- a/tests/DefinitionMasksResolver/DefinitionMasksResolverTest.php +++ b/tests/DefinitionMasksResolver/DefinitionMasksResolverTest.php @@ -12,24 +12,37 @@ final class DefinitionMasksResolverTest extends AbstractTestCase { - public function test(): void + private DefinitionMasksResolver $definitionMasksResolver; + + private BehatMetafilesFinder $behatMetafilesFinder; + + protected function setUp(): void { - $behatMetafilesFinder = $this->make(BehatMetafilesFinder::class); - $contextFileInfos = $behatMetafilesFinder->findContextFiles([__DIR__ . '/Fixture']); + parent::setUp(); - $definitionMasksResolver = $this->make(DefinitionMasksResolver::class); + $this->definitionMasksResolver = $this->make(DefinitionMasksResolver::class); - $maskCollection = $definitionMasksResolver->resolve($contextFileInfos); + $this->behatMetafilesFinder = $this->make(BehatMetafilesFinder::class); + } - $this->assertCount(2, $maskCollection->all()); + public function test(): void + { + $contextFileInfos = $this->behatMetafilesFinder->findContextFiles([__DIR__ . '/Fixture']); + $maskCollection = $this->definitionMasksResolver->resolve($contextFileInfos); + + $this->assertCount(3, $maskCollection->all()); $exactMasks = $maskCollection->byType(ExactMask::class); - $this->assertCount(2, $exactMasks); + $this->assertCount(3, $exactMasks); $this->assertContainsOnlyInstancesOf(ExactMask::class, $exactMasks); $firstExactMask = $exactMasks[0]; $this->assertSame('I click homepage', $firstExactMask->mask); $this->assertSame(AnotherBehatContext::class, $firstExactMask->className); $this->assertSame(__DIR__ . '/Fixture/AnotherBehatContext.php', $firstExactMask->filePath); + + $slashMask = $exactMasks[2]; + + $this->assertSame('Do this and / that', $slashMask->mask); } } diff --git a/tests/DefinitionMasksResolver/Fixture/AnotherBehatContext.php b/tests/DefinitionMasksResolver/Fixture/AnotherBehatContext.php index 519e1b3c2..e8bc66ee8 100644 --- a/tests/DefinitionMasksResolver/Fixture/AnotherBehatContext.php +++ b/tests/DefinitionMasksResolver/Fixture/AnotherBehatContext.php @@ -19,4 +19,9 @@ public function action(): void public function deadAction(): void { } + + #[Then('Do this and \/ that')] + public function trickyAction(): void + { + } } diff --git a/tests/UsedInstructionResolver/Fixture/some_file.feature b/tests/UsedInstructionResolver/Fixture/some_file.feature new file mode 100644 index 000000000..f8815ab90 --- /dev/null +++ b/tests/UsedInstructionResolver/Fixture/some_file.feature @@ -0,0 +1,5 @@ +Feature: User login + Scenario: Successful login + Given I am on the login page + When I fill in valid credentials + Then I should see the dashboard diff --git a/tests/UsedInstructionResolver/UsedInstructionResolverTest.php b/tests/UsedInstructionResolver/UsedInstructionResolverTest.php new file mode 100644 index 000000000..781889ea3 --- /dev/null +++ b/tests/UsedInstructionResolver/UsedInstructionResolverTest.php @@ -0,0 +1,34 @@ +usedInstructionResolver = $this->make(UsedInstructionResolver::class); + } + + public function test(): void + { + $fileInfo = new SplFileInfo(__DIR__ . '/Fixture/some_file.feature', '', ''); + + $instructions = $this->usedInstructionResolver->resolveInstructionsFromFeatureFiles([$fileInfo]); + + $this->assertSame([ + 'I am on the login page', + 'I fill in valid credentials', + 'I should see the dashboard', + ], $instructions); + } +}