From 6adab40e031e4724c826455a1bdb9941075ba1bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Noco=C5=84?= Date: Fri, 23 Apr 2021 09:16:47 +0200 Subject: [PATCH] Fix copy from package with directories --- .../CopyFromPackageConfigurator.php | 4 +- ...pyDirectoryFromPackageConfiguratorTest.php | 47 ++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/Configurator/CopyFromPackageConfigurator.php b/src/Configurator/CopyFromPackageConfigurator.php index 75af761a7..7f4b39e49 100644 --- a/src/Configurator/CopyFromPackageConfigurator.php +++ b/src/Configurator/CopyFromPackageConfigurator.php @@ -73,6 +73,8 @@ private function removeFiles(array $manifest, string $from, string $to) private function copyDir(string $source, string $target, array $options) { + $overwrite = $options['force'] ?? false; + if (!is_dir($target)) { mkdir($target, 0777, true); } @@ -85,7 +87,7 @@ private function copyDir(string $source, string $target, array $options) mkdir($targetPath); $this->write(sprintf(' Created "%s"', $this->path->relativize($targetPath))); } - } elseif (!file_exists($targetPath)) { + } elseif ($overwrite || !file_exists($targetPath)) { $this->copyFile($item, $targetPath, $options); } } diff --git a/tests/Configurator/CopyDirectoryFromPackageConfiguratorTest.php b/tests/Configurator/CopyDirectoryFromPackageConfiguratorTest.php index 694b8709e..b09bc8cc1 100644 --- a/tests/Configurator/CopyDirectoryFromPackageConfiguratorTest.php +++ b/tests/Configurator/CopyDirectoryFromPackageConfiguratorTest.php @@ -55,6 +55,50 @@ public function testConfigureDirectory() } } + /** + * @dataProvider providerTestConfigureDirectoryWithExistingFiles + */ + public function testConfigureDirectoryWithExistingFiles(bool $force, string $sourceFileContent, string $existingTargetFileContent, string $expectedFinalTargetFileContent) + { + if (!is_dir($this->sourceDirectory)) { + mkdir($this->sourceDirectory, 0777, true); + } + foreach ($this->sourceFiles as $sourceFile) { + if (!file_exists($sourceFile)) { + file_put_contents($sourceFile, $sourceFileContent); + } + } + + if (!is_dir($this->targetDirectory)) { + mkdir($this->targetDirectory, 0777, true); + } + + foreach ($this->targetFiles as $targetFile) { + file_put_contents($targetFile, $existingTargetFileContent); + } + + $this->createConfigurator()->configure( + $this->recipe, + [$this->sourceFileRelativePath => $this->targetFileRelativePath], + $this->getMockBuilder(Lock::class)->disableOriginalConstructor()->getMock(), + ['force' => $force] + ); + + foreach ($this->targetFiles as $targetFile) { + $this->assertFileExists($targetFile); + $content = file_get_contents($targetFile); + $this->assertEquals($expectedFinalTargetFileContent, $content); + } + } + + public function providerTestConfigureDirectoryWithExistingFiles(): array + { + return [ + [true, 'NEW_CONTENT', 'OLD_CONTENT', 'NEW_CONTENT'], + [false, 'NEW_CONTENT', 'OLD_CONTENT', 'OLD_CONTENT'], + ]; + } + protected function setUp(): void { parent::setUp(); @@ -74,6 +118,7 @@ protected function setUp(): void ]; $this->io = $this->getMockBuilder(IOInterface::class)->getMock(); + $this->io->method('askConfirmation')->willReturn(true); $package = $this->getMockBuilder(PackageInterface::class)->getMock(); $this->recipe = $this->getMockBuilder(Recipe::class)->disableOriginalConstructor()->getMock(); @@ -106,7 +151,7 @@ protected function tearDown(): void private function createConfigurator(): CopyFromPackageConfigurator { - return new CopyFromPackageConfigurator($this->composer, $this->io, new Options(['root-dir' => FLEX_TEST_DIR])); + return new CopyFromPackageConfigurator($this->composer, $this->io, new Options(['root-dir' => FLEX_TEST_DIR], $this->io)); } private function cleanUpTargetFiles()