diff --git a/Build/rector/rector.php b/Build/rector/rector.php index e231ebf..82c83c6 100644 --- a/Build/rector/rector.php +++ b/Build/rector/rector.php @@ -13,6 +13,7 @@ use Rector\CodingStyle\Rector\Encapsed\EncapsedStringsToSprintfRector; use Rector\Config\RectorConfig; use Rector\Php81\Rector\FuncCall\NullToStrictStringFuncCallArgRector; +use Rector\TypeDeclaration\Rector\Class_\TypedPropertyFromCreateMockAssignRector; use Rector\TypeDeclaration\Rector\StmtsAwareInterface\SafeDeclareStrictTypesRector; use Rector\ValueObject\PhpVersion; use Ssch\TYPO3Rector\CodeQuality\General\ExtEmConfRector; @@ -62,6 +63,10 @@ FlipTypeControlToUseExclusiveTypeRector::class => [ '*/Classes/PhpParser/Printer/PrettyTypo3Printer.php', ], + // Avoid stripping class types from mock properties to keep IDE autocomplete working in functional tests + TypedPropertyFromCreateMockAssignRector::class => [ + '*/Tests/Functional/*', + ], '*Build/*', '*Resources/*', '*Model/*', diff --git a/Classes/Configuration/ExtConf.php b/Classes/Configuration/ExtConf.php index 91b002e..2b44f60 100644 --- a/Classes/Configuration/ExtConf.php +++ b/Classes/Configuration/ExtConf.php @@ -64,16 +64,16 @@ public function getExportDirectory(): string $exportDirectory = trim($this->exportDirectory); if ($exportDirectory === '' || $exportDirectory === '0') { - // Fall back to typo3temp/kickstarter - return sprintf( - '/%s/%s/', - trim(Environment::getPublicPath(), '/'), - 'typo3temp/kickstarter', - ); + $base = Environment::getPublicPath(); + $suffix = 'typo3temp/kickstarter'; + } else { + $base = Environment::getProjectPath(); + $suffix = ltrim($exportDirectory, '/'); } - // sprintf() in ExtensionInformation will add trailing slash - return Environment::getProjectPath() . '/' . rtrim($exportDirectory, '/'); + $path = rtrim($base, '/') . '/' . rtrim($suffix, '/'); + + return $path === '' ? '/' : $path; } public function isActivateModule(): bool diff --git a/Tests/Functional/Configuration/ExtConfTest.php b/Tests/Functional/Configuration/ExtConfTest.php new file mode 100644 index 0000000..074eb71 --- /dev/null +++ b/Tests/Functional/Configuration/ExtConfTest.php @@ -0,0 +1,138 @@ +extensionConfigurationMock = $this->createMock(ExtensionConfiguration::class); + + Environment::initialize( + $this->createMock(ApplicationContext::class), + cli: true, + composerMode: true, + projectPath: '', + publicPath: '', + varPath: '', + configPath: 'config', + currentScript: '', + os: 'UNIX', + ); + } + + protected function tearDown(): void + { + unset( + $this->extensionConfigurationMock, + ); + } + + #[Test] + public function getExportDirectoryInitiallyReturnsTypo3TempPath(): void + { + $config = []; + $subject = new ExtConf(...$config); + + self::assertSame( + '/typo3temp/kickstarter', + $subject->getExportDirectory(), + ); + } + + public static function exportDirectoryDataProvider(): array + { + return [ + 'Directory with empty string' => ['', '/typo3temp/kickstarter'], + 'Directory with zero' => ['0', '/typo3temp/kickstarter'], + 'Directory with no slashes' => ['packages', '/packages'], + 'Directory with starting slash' => ['/packages', '/packages'], + 'Directory with leading slash' => ['packages/', '/packages'], + 'Directory wrapped with slashes' => ['/packages/', '/packages'], + ]; + } + + #[Test] + #[DataProvider( + methodName: 'exportDirectoryDataProvider', + )] + public function getExportDirectoryWithExportDirectoryReturnsExportDirectory( + string $configuredExportDirectory, + string $expectedExportDirectory, + ): void { + $config = [ + 'exportDirectory' => $configuredExportDirectory, + ]; + $subject = new ExtConf(...$config); + + self::assertSame( + $expectedExportDirectory, + $subject->getExportDirectory(), + ); + } + + #[Test] + public function isActivateModuleInitiallyFalse(): void + { + $config = []; + $subject = new ExtConf(...$config); + + self::assertFalse( + $subject->isActivateModule(), + ); + } + + #[Test] + public function isActivateModuleWithTrueStillTrue(): void + { + $config = [ + 'activateModule' => true, + ]; + $subject = new ExtConf(...$config); + + self::assertTrue( + $subject->isActivateModule(), + ); + } + + #[Test] + public function isActivateModuleWithFalseStillFalse(): void + { + $config = [ + 'activateModule' => false, + ]; + $subject = new ExtConf(...$config); + + self::assertFalse( + $subject->isActivateModule(), + ); + } +}