From c4c0f5c3c008d10572c517de12b76b0b66caa67a Mon Sep 17 00:00:00 2001 From: Lexey Felde Date: Sun, 7 May 2017 03:55:03 +0300 Subject: [PATCH] Add new method, add tests --- .scrutinizer.yml | 25 +- .travis.yml | 6 +- README.md | 1 - composer.json | 8 +- env-diff | 37 +++ phpunit.xml.dist | 2 +- src/Composer/ScriptHandler.php | 5 +- src/Config.php | 26 +- src/Env.php | 32 +++ src/Env/Dumper.php | 2 +- src/Env/Parser.php | 29 ++- src/IO/ComposerIO.php | 48 ++++ src/IO/ConsoleIO.php | 60 +++++ src/IO/IOInterface.php | 24 ++ src/Processor.php | 64 +++-- tests/Composer/ScriptHandlerTest.php | 115 ++++++++- tests/ConfigTest.php | 45 ++++ tests/ProcessorTest.php | 243 ++++++++++++++---- .../delete-old-variable}/.env | 0 .../delete-old-variable}/.env.dist | 0 .../delete-old-variable}/.expected | 0 .../invalid/dist-not-found/error.txt | 1 + .../invalid/invalid-delimiter/.env.dist} | 0 .../invalid/invalid-delimiter/error.txt | 1 + .../invalid/invalid-string/.env.dist} | 0 .../invalid/invalid-string/error.txt | 1 + .../subdirectory}/.expected | 0 .../subdirectory/sub}/.env.dist | 0 .../valid}/append-new-variable/.env | 0 .../valid}/append-new-variable/.env.dist | 0 .../valid/append-new-variable}/.expected | 0 .../valid}/create-new-env-file/.env.dist | 0 .../valid}/create-new-env-file/.expected | 0 .../valid/do-not-delete-old-variable/.env | 3 + .../do-not-delete-old-variable}/.env.dist | 0 .../do-not-delete-old-variable/.expected | 0 .../valid}/do-not-replace-old-variable/.env | 0 .../do-not-replace-old-variable/.env.dist | 1 + .../do-not-replace-old-variable/.expected | 0 .../valid}/remove-comments/.env | 0 .../valid}/remove-comments/.env.dist | 0 .../valid/remove-comments/.expected} | 0 .../fixtures/actualize/valid/trim-spaces/.env | 2 + .../actualize/valid/trim-spaces/.env.dist | 3 + .../actualize/valid/trim-spaces/.expected | 3 + .../invalid/dist-not-found/error.txt | 1 + .../invalid/invalid-delimiter/.env.dist | 1 + .../invalid/invalid-delimiter/error.txt | 1 + .../invalid/invalid-string/.env.dist | 1 + .../invalid/invalid-string/error.txt | 1 + .../invalid/target-not-found/.env.dist | 1 + .../invalid/target-not-found/error.txt | 1 + .../difference/valid/changed-values/.env | 2 + .../difference/valid/changed-values/.env.dist | 2 + .../valid/changed-values/expected.log | 3 + .../difference/valid/extra-values/.env | 3 + .../difference/valid/extra-values/.env.dist | 2 + .../valid/extra-values/expected.log | 3 + .../fixtures/difference/valid/identical/.env | 3 + .../difference/valid/identical/.env.dist | 2 + .../difference/valid/identical/expected.log | 1 + .../difference/valid/missed-values/.env | 1 + .../difference/valid/missed-values/.env.dist | 2 + .../valid/missed-values/expected.log | 3 + tests/fixtures/difference/valid/mixed/.env | 3 + .../fixtures/difference/valid/mixed/.env.dist | 3 + .../difference/valid/mixed/expected.log | 5 + 67 files changed, 730 insertions(+), 102 deletions(-) create mode 100644 env-diff create mode 100644 src/Env.php create mode 100644 src/IO/ComposerIO.php create mode 100644 src/IO/ConsoleIO.php create mode 100644 src/IO/IOInterface.php create mode 100644 tests/ConfigTest.php rename tests/fixtures/{testcases/do-not-delete-old-variable => actualize/delete-old-variable}/.env (100%) rename tests/fixtures/{testcases/do-not-delete-old-variable => actualize/delete-old-variable}/.env.dist (100%) rename tests/fixtures/{testcases/remove-comments => actualize/delete-old-variable}/.expected (100%) create mode 100644 tests/fixtures/actualize/invalid/dist-not-found/error.txt rename tests/fixtures/{invalid/invalid_delimeter.env => actualize/invalid/invalid-delimiter/.env.dist} (100%) create mode 100644 tests/fixtures/actualize/invalid/invalid-delimiter/error.txt rename tests/fixtures/{invalid/invalid_string.env => actualize/invalid/invalid-string/.env.dist} (100%) create mode 100644 tests/fixtures/actualize/invalid/invalid-string/error.txt rename tests/fixtures/{testcases/append-new-variable => actualize/subdirectory}/.expected (100%) rename tests/fixtures/{testcases/trim-spaces => actualize/subdirectory/sub}/.env.dist (100%) rename tests/fixtures/{testcases => actualize/valid}/append-new-variable/.env (100%) rename tests/fixtures/{testcases => actualize/valid}/append-new-variable/.env.dist (100%) rename tests/fixtures/{testcases/trim-spaces => actualize/valid/append-new-variable}/.expected (100%) rename tests/fixtures/{testcases => actualize/valid}/create-new-env-file/.env.dist (100%) rename tests/fixtures/{testcases => actualize/valid}/create-new-env-file/.expected (100%) create mode 100644 tests/fixtures/actualize/valid/do-not-delete-old-variable/.env rename tests/fixtures/{testcases/do-not-replace-old-variable => actualize/valid/do-not-delete-old-variable}/.env.dist (100%) rename tests/fixtures/{testcases => actualize/valid}/do-not-delete-old-variable/.expected (100%) rename tests/fixtures/{testcases => actualize/valid}/do-not-replace-old-variable/.env (100%) create mode 100644 tests/fixtures/actualize/valid/do-not-replace-old-variable/.env.dist rename tests/fixtures/{testcases => actualize/valid}/do-not-replace-old-variable/.expected (100%) rename tests/fixtures/{testcases => actualize/valid}/remove-comments/.env (100%) rename tests/fixtures/{testcases => actualize/valid}/remove-comments/.env.dist (100%) rename tests/fixtures/{testcases/trim-spaces/.env => actualize/valid/remove-comments/.expected} (100%) create mode 100644 tests/fixtures/actualize/valid/trim-spaces/.env create mode 100644 tests/fixtures/actualize/valid/trim-spaces/.env.dist create mode 100644 tests/fixtures/actualize/valid/trim-spaces/.expected create mode 100644 tests/fixtures/difference/invalid/dist-not-found/error.txt create mode 100644 tests/fixtures/difference/invalid/invalid-delimiter/.env.dist create mode 100644 tests/fixtures/difference/invalid/invalid-delimiter/error.txt create mode 100644 tests/fixtures/difference/invalid/invalid-string/.env.dist create mode 100644 tests/fixtures/difference/invalid/invalid-string/error.txt create mode 100644 tests/fixtures/difference/invalid/target-not-found/.env.dist create mode 100644 tests/fixtures/difference/invalid/target-not-found/error.txt create mode 100644 tests/fixtures/difference/valid/changed-values/.env create mode 100644 tests/fixtures/difference/valid/changed-values/.env.dist create mode 100644 tests/fixtures/difference/valid/changed-values/expected.log create mode 100644 tests/fixtures/difference/valid/extra-values/.env create mode 100644 tests/fixtures/difference/valid/extra-values/.env.dist create mode 100644 tests/fixtures/difference/valid/extra-values/expected.log create mode 100644 tests/fixtures/difference/valid/identical/.env create mode 100644 tests/fixtures/difference/valid/identical/.env.dist create mode 100644 tests/fixtures/difference/valid/identical/expected.log create mode 100644 tests/fixtures/difference/valid/missed-values/.env create mode 100644 tests/fixtures/difference/valid/missed-values/.env.dist create mode 100644 tests/fixtures/difference/valid/missed-values/expected.log create mode 100644 tests/fixtures/difference/valid/mixed/.env create mode 100644 tests/fixtures/difference/valid/mixed/.env.dist create mode 100644 tests/fixtures/difference/valid/mixed/expected.log diff --git a/.scrutinizer.yml b/.scrutinizer.yml index 580b87c..bab4a41 100644 --- a/.scrutinizer.yml +++ b/.scrutinizer.yml @@ -18,11 +18,20 @@ checks: fix_identation_4spaces: true fix_doc_comments: true -build: - tests: - override: - - - command: 'vendor/bin/phpunit --coverage-clover=some-file' - coverage: - file: 'some-file' - format: 'clover' +tools: + external_code_coverage: + timeout: 600 + runs: 3 + php_analyzer: true + php_code_coverage: false + php_code_sniffer: + config: + standard: PSR2 + filter: + paths: ['src'] + php_loc: + enabled: true + excluded_dirs: [vendor, tests] + php_cpd: + enabled: true + excluded_dirs: [vendor, tests] diff --git a/.travis.yml b/.travis.yml index 7879239..63250b1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,4 +13,8 @@ php: before_script: - composer install -script: vendor/bin/phpunit +script: vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover + +after_script: + - wget https://scrutinizer-ci.com/ocular.phar + - php ocular.phar code-coverage:upload --format=php-clover coverage.clover \ No newline at end of file diff --git a/README.md b/README.md index c1990ba..87183bf 100644 --- a/README.md +++ b/README.md @@ -26,4 +26,3 @@ composer Scripts composer event [link-travis]: https://travis-ci.org/Tekill/env-diff [link-scrutinizer]: https://scrutinizer-ci.com/g/Tekill/env-diff/code-structure/ [link-code-quality]: https://scrutinizer-ci.com/g/Tekill/env-diff -[link-author]: https://github.com/Tekill diff --git a/composer.json b/composer.json index 40220c7..92f8699 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,8 @@ } ], "require": { - "php": ">=5.6" + "php": ">=5.6", + "symfony/console": "~2.8|~3.0" }, "require-dev": { "composer/composer": "1.0.*@dev", @@ -18,5 +19,8 @@ }, "autoload": { "psr-4": { "LF\\EnvDiff\\": "src/" } - } + }, + "bin": [ + "env-diff" + ] } diff --git a/env-diff b/env-diff new file mode 100644 index 0000000..3b9be7f --- /dev/null +++ b/env-diff @@ -0,0 +1,37 @@ +#!/usr/bin/env php +actualizeEnv(LF\EnvDiff\Config::createFormArray($config)); + $processor->showDifference(LF\EnvDiff\Config::createFormArray($config)); + + exit(0); + } +} + +fwrite( + STDERR, + 'You need to set up the project dependencies using Composer:' . PHP_EOL . PHP_EOL . + ' composer install' . PHP_EOL . PHP_EOL . + 'You can learn all about Composer on https://getcomposer.org/.' . PHP_EOL +); + +exit(1); diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 0943b6b..3244e62 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -9,7 +9,7 @@ - ./ + ./src ./tests ./vendor diff --git a/src/Composer/ScriptHandler.php b/src/Composer/ScriptHandler.php index a12dfe9..cf7c146 100644 --- a/src/Composer/ScriptHandler.php +++ b/src/Composer/ScriptHandler.php @@ -5,6 +5,7 @@ use Composer\Script\Event; use InvalidArgumentException; use LF\EnvDiff\Config; +use LF\EnvDiff\IO\ComposerIO; use LF\EnvDiff\Processor; use RuntimeException; @@ -19,7 +20,7 @@ class ScriptHandler public static function actualizeEnv(Event $event) { $configs = self::extractConfigs($event); - $processor = new Processor($event->getIO()); + $processor = new Processor(new ComposerIO($event->getIO())); foreach ($configs as $config) { $processor->actualizeEnv(Config::createFormArray($config)); @@ -35,7 +36,7 @@ public static function actualizeEnv(Event $event) public static function showDifference(Event $event) { $configs = self::extractConfigs($event); - $processor = new Processor($event->getIO()); + $processor = new Processor(new ComposerIO($event->getIO())); foreach ($configs as $config) { $processor->showDifference(Config::createFormArray($config)); diff --git a/src/Config.php b/src/Config.php index 9697bbb..ef35771 100644 --- a/src/Config.php +++ b/src/Config.php @@ -4,6 +4,9 @@ class Config { + const DEFAULT_TARGET = '.env'; + CONST DEFAULT_DIST = '.env.dist'; + /** @var string */ private $dist; @@ -13,6 +16,20 @@ class Config /** @var bool */ private $keepOutdatedEnv; + /** + * Config constructor. + * + * @param string $dist + * @param string $target + * @param bool $keepOutdatedEnv + */ + public function __construct($dist = self::DEFAULT_DIST, $target = self::DEFAULT_TARGET, $keepOutdatedEnv = true) + { + $this->dist = $dist; + $this->target = $target; + $this->keepOutdatedEnv = $keepOutdatedEnv; + } + /** * @param array $config * @@ -26,16 +43,11 @@ public static function createFormArray(array $config = []) if (empty($config['dist'])) { $config['dist'] = $config['target'] . '.dist'; } - if (empty($config['keep-outdated'])) { + if (!isset($config['keep-outdated'])) { $config['keep-outdated'] = true; } - $self = new static(); - $self->target = $config['target']; - $self->dist = $config['dist']; - $self->keepOutdatedEnv = (bool) $config['keep-outdated']; - - return $self; + return new static($config['dist'], $config['target'], (bool) $config['keep-outdated']); } /** diff --git a/src/Env.php b/src/Env.php new file mode 100644 index 0000000..3bf217c --- /dev/null +++ b/src/Env.php @@ -0,0 +1,32 @@ +dump($envArray); + } + + /** + * @param string $path + * + * @return array + * + * @throws InvalidArgumentException + */ + public static function parse($path) + { + return (new Parser())->parse($path); + } +} diff --git a/src/Env/Dumper.php b/src/Env/Dumper.php index 2a18cb8..f3d5032 100644 --- a/src/Env/Dumper.php +++ b/src/Env/Dumper.php @@ -9,7 +9,7 @@ class Dumper * * @return string */ - public static function dump(array $envArray) + public function dump(array $envArray) { $dump = ''; diff --git a/src/Env/Parser.php b/src/Env/Parser.php index 8e188f3..aed38cd 100644 --- a/src/Env/Parser.php +++ b/src/Env/Parser.php @@ -13,30 +13,45 @@ class Parser * * @throws InvalidArgumentException */ - public static function parse($path) + public function parse($path) { if (!is_file($path)) { throw new InvalidArgumentException(sprintf('The file "%s" does not exist', $path)); } - $file = fopen($path, 'r'); + $file = fopen($path, 'rb'); - $env = []; + $number = 0; + $env = []; while (false === feof($file)) { $line = trim(fgets($file)); - // Ignore empty lines + $number++; - if (empty($line) === true || $line[0] === '#') { + if ($this->isCommentOrEmpty($line)) { continue; } if (false === strpos($line, '=')) { - throw new InvalidArgumentException(sprintf('Line `%s` is not valid env variable', $line)); + throw new InvalidArgumentException( + sprintf('Parse error at %d line: `%s` is not valid env value', $number, $line) + ); } - list($name, $value) = explode('=', $line); + list($name, $value) = explode('=', $line, 2); $env[trim($name)] = trim($value); } + fclose($file); + return $env; } + + /** + * @param string $line + * + * @return bool + */ + private function isCommentOrEmpty($line) + { + return (mb_strlen($line) === 0 || $line[0] === '#'); + } } diff --git a/src/IO/ComposerIO.php b/src/IO/ComposerIO.php new file mode 100644 index 0000000..90d060a --- /dev/null +++ b/src/IO/ComposerIO.php @@ -0,0 +1,48 @@ +io = $io; + } + + /** + * {@inheritdoc} + */ + public function write($message) + { + $this->io->write($message); + } + + /** + * {@inheritdoc} + */ + public function isInteractive() + { + return $this->io->isInteractive(); + } + + /** + * {@inheritdoc} + */ + public function ask($question, $default = null) + { + return $this->ask($question, $default); + } +} diff --git a/src/IO/ConsoleIO.php b/src/IO/ConsoleIO.php new file mode 100644 index 0000000..75fdbd0 --- /dev/null +++ b/src/IO/ConsoleIO.php @@ -0,0 +1,60 @@ +input = $input; + $this->output = $output; + $this->questionHelper = new QuestionHelper(); + } + + /** + * {@inheritdoc} + */ + public function write($message) + { + $this->output->writeln($message); + } + + /** + * {@inheritdoc} + */ + public function isInteractive() + { + $this->input->isInteractive(); + } + + /** + * {@inheritdoc} + */ + public function ask($question, $default = null) + { + return $this->questionHelper->ask($this->input, $this->output, new Question($question, $default)); + } +} diff --git a/src/IO/IOInterface.php b/src/IO/IOInterface.php new file mode 100644 index 0000000..2e37eda --- /dev/null +++ b/src/IO/IOInterface.php @@ -0,0 +1,24 @@ +getDist(); $target = $config->getTarget(); + $exists = is_file($target); + + $this->io->write(sprintf('Actualize env from %s', $dist)); - $distEnv = Parser::parse($dist); - $actualEnv = is_file($target) ? Parser::parse($target) : []; + try { + $distEnv = Env::parse($dist); + $actualEnv = $exists ? Env::parse($target) : []; + } catch (InvalidArgumentException $exception) { + $this->io->write(sprintf('%s, abort', $exception->getMessage())); - $this->io->write(sprintf('%s the "%s" file', is_file($target) ? 'Check' : 'Creating', $target)); + return true; + } $actualEnv = $this->processEnv($distEnv, $actualEnv, $config->isKeepOutdatedEnv()); @@ -48,38 +55,59 @@ public function actualizeEnv(Config $config) ksort($actualEnv); file_put_contents( $target, - '# This file is auto-generated during the composer install' . PHP_EOL . Dumper::dump($actualEnv) + '# This file is auto-generated during the composer install' . PHP_EOL . Env::dump($actualEnv) ); + + $this->io->write(sprintf('%s has been %s', $target, $exists ? 'updated' : 'created')); + + return false; } /** * @param Config $config * * @throws InvalidArgumentException + * + * @return bool */ public function showDifference(Config $config) { $dist = $config->getDist(); $target = $config->getTarget(); - $distEnv = Parser::parse($dist); - $actualEnv = is_file($target) ? Parser::parse($target) : []; + try { + $distEnv = Env::parse($dist); + $actualEnv = Env::parse($target); + } catch (InvalidArgumentException $exception) { + $this->io->write(sprintf('%s', $exception->getMessage())); + + return true; + } + + $extraEnv = array_diff_key($actualEnv, $distEnv); + $missingEnv = array_diff_key($distEnv, $actualEnv); + $changedEnv = array_diff(array_intersect_key($distEnv, $actualEnv), $actualEnv); - $extraEnv = array_diff_assoc($actualEnv, $distEnv); - $missingEnv = array_diff_assoc($distEnv, $actualEnv); + if (!count($missingEnv) && !count($extraEnv) && !count($changedEnv)) { + $this->io->write(sprintf('%s and %s is identical', $target, $dist)); - if (count($missingEnv)) { - $this->io->write( - sprintf('Your %s and %s files are not in sync.', $target, $dist) - ); + return false; } + $this->io->write(sprintf('Diff between %s and %s files:', $target, $dist)); + $this->io->write(''); + + foreach ($missingEnv as $env => $value) { + $this->io->write(sprintf('- %s=%s', $env, $value)); + } foreach ($extraEnv as $env => $value) { - $this->io->write(sprintf('- %s=%s', $env, $value)); + $this->io->write(sprintf('+ %s=%s', $env, $value)); } - foreach ($missingEnv as $env => $value) { - $this->io->write(sprintf('+ %s=%s', $env, $value)); + foreach ($changedEnv as $env => $default) { + $this->io->write(sprintf('@ %s=%s (%s)', $env, $actualEnv[$env], $default)); } + + return false; } /** diff --git a/tests/Composer/ScriptHandlerTest.php b/tests/Composer/ScriptHandlerTest.php index 708f4b4..bad04c2 100644 --- a/tests/Composer/ScriptHandlerTest.php +++ b/tests/Composer/ScriptHandlerTest.php @@ -2,8 +2,10 @@ namespace LF\EnvHandler\Tests\Composer; +use Composer\Script\Event; use LF\EnvDiff\Composer\ScriptHandler; use PHPUnit\Framework\TestCase; +use PHPUnit_Framework_MockObject_MockObject; class ScriptHandlerTest extends TestCase { @@ -13,7 +15,7 @@ class ScriptHandlerTest extends TestCase public function provideInvalidConfiguration() { return [ - 'invalid type' => [ + 'invalid type' => [ ['lf-diff-env' => 'not an array'], 'The extra.lf-env-diff setting must be an array or a configuration object', ], @@ -27,10 +29,108 @@ public function provideInvalidConfiguration() /** * @dataProvider provideInvalidConfiguration() * - * @param mixed $extras + * @param array $extras * @param string $exceptionMessage */ - public function testInvalidConfiguration($extras, $exceptionMessage) + public function testActualizeEnvInvalidConfiguration(array $extras, $exceptionMessage) + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage($exceptionMessage); + + $event = $this->createEvent($extras); + $event + ->expects(self::never()) + ->method('getIO'); + + ScriptHandler::actualizeEnv($event); + } + + /** + * @dataProvider provideInvalidConfiguration() + * + * @param array $extras + * @param string $exceptionMessage + */ + public function testShowDifferenceInvalidConfiguration(array $extras, $exceptionMessage) + { + $this->expectException('InvalidArgumentException'); + $this->expectExceptionMessage($exceptionMessage); + + $event = $this->createEvent($extras); + $event + ->expects(self::never()) + ->method('getIO'); + + ScriptHandler::showDifference($event); + } + + /** + * @return array + */ + public function provideValidConfiguration() + { + return [ + [ + [ + 'lf-diff-env' => [ + [ + 'dist' => 'fixtures/difference/valid/identical/.env.dist', + 'target' => 'fixtures/difference/valid/identical/.env' + ], + [ + 'dist' => 'fixtures/difference/valid/identical/.env.dist', + 'target' => 'fixtures/difference/valid/identical/.env' + ] + ] + ] + ] + ]; + } + + /** + * @dataProvider provideValidConfiguration() + * + * @param array $extras + */ + public function testActualizeEnvValidConfiguration(array $extras) + { + $io = $this->createMock('Composer\IO\IOInterface'); + + $event = $this->createEvent($extras); + $event + ->expects(self::once()) + ->method('getIO') + ->willReturn($io); + + chdir(dirname(__DIR__)); + ScriptHandler::actualizeEnv($event); + } + + /** + * @dataProvider provideValidConfiguration() + * + * @param array $extras + */ + public function testShowDifferenceValidConfiguration(array $extras) + { + $io = $this->createMock('Composer\IO\IOInterface'); + + $event = $this->createEvent($extras); + $event + ->expects(self::once()) + ->method('getIO') + ->willReturn($io); + + chdir(dirname(__DIR__)); + ScriptHandler::showDifference($event); + } + + /** + * @param array $extras + * + * @return PHPUnit_Framework_MockObject_MockObject | Event + */ + private function createEvent(array $extras = []) { $package = $this->createMock('Composer\Package\PackageInterface'); $package->expects(self::once()) @@ -46,14 +146,7 @@ public function testInvalidConfiguration($extras, $exceptionMessage) $event->expects(self::once()) ->method('getComposer') ->willReturn($composer); - $event->expects(self::never()) - ->method('getIO'); - - chdir(__DIR__); - - $this->expectException('InvalidArgumentException'); - $this->expectExceptionMessage($exceptionMessage); - ScriptHandler::actualizeEnv($event); + return $event; } } diff --git a/tests/ConfigTest.php b/tests/ConfigTest.php new file mode 100644 index 0000000..c6bea71 --- /dev/null +++ b/tests/ConfigTest.php @@ -0,0 +1,45 @@ + [ + [], + new Config('.env.dist', '.env') + ], + 'custom target' => [ + ['target' => '.custom'], + new Config('.custom.dist', '.custom') + ], + 'custom target & dist' => [ + ['target' => '.custom', 'dist' => '.env.dist'], + new Config('.env.dist', '.custom') + ], + 'keep-outdated is false' => [ + ['keep-outdated' => false], + new Config('.env.dist', '.env', false) + ] + ]; + } + + /** + * @dataProvider createFromArrayDataProvider() + * + * @param array $array + * @param Config $expected + */ + public function testCreateFromArray(array $array, Config $expected) + { + self::assertEquals($expected, Config::createFormArray($array)); + } +} diff --git a/tests/ProcessorTest.php b/tests/ProcessorTest.php index 8c95700..13c460a 100644 --- a/tests/ProcessorTest.php +++ b/tests/ProcessorTest.php @@ -2,8 +2,8 @@ namespace LF\EnvHandler\Tests; -use Composer\IO\IOInterface; use LF\EnvDiff\Config; +use LF\EnvDiff\IO\IOInterface; use LF\EnvDiff\Processor; use PHPUnit\Framework\TestCase; use Symfony\Component\Filesystem\Filesystem; @@ -20,102 +20,259 @@ protected function setUp() { parent::setUp(); - $this->io = $this->createMock('Composer\IO\IOInterface'); + $this->io = $this->createMock('LF\EnvDiff\IO\IOInterface'); $this->processor = new Processor($this->io); } /** * @return array */ - public function provideInvalidConfiguration() + public function actualizeEnvDataProvider() { - return [ - 'no file' => [ - Config::createFormArray(), - 'The file ".env.dist" does not exist', - ], - ]; + $config = Config::createFormArray( + [ + 'dist' => '.env.dist', + 'target' => '.env' + ] + ); + $tests = []; + + foreach (glob(__DIR__ . '/fixtures/actualize/valid/*/') as $folder) { + $tests[basename($folder)] = [$folder, $config, false]; + $tests[basename($folder) . ' interactive'] = [$folder, $config, true]; + } + + $subdirectory = realpath(__DIR__ . '/fixtures/actualize/subdirectory/') . '/'; + $configSubdirectory = Config::createFormArray( + [ + 'dist' => 'sub/.env.dist', + 'target' => 'expected/.env' + ] + ); + + $tests[$subdirectory] = [$subdirectory, $configSubdirectory, false]; + $tests[$subdirectory . ' interactive'] = [$subdirectory, $configSubdirectory, false]; + + return $tests; } /** - * @dataProvider provideInvalidConfiguration + * @dataProvider actualizeEnvDataProvider() * + * @param string $directory * @param Config $config - * @param string $exceptionMessage + * @param bool $isInteractive */ - public function testInvalidConfiguration(Config $config, $exceptionMessage) + public function testActualizeEnv($directory, Config $config, $isInteractive) { - $this->expectExceptionMessage($exceptionMessage); + $workingDir = sys_get_temp_dir() . '/lf_env_diff_tests/'; + $fs = new Filesystem(); + + if (is_dir($workingDir)) { + $fs->remove($workingDir); + } + + $fs->copy($directory . $config->getDist(), $workingDir . $config->getDist()); + + if ($exists = file_exists($directory . '/' . $config->getTarget())) { + $fs->copy($directory . $config->getTarget(), $workingDir . $config->getTarget()); + } + + chdir($workingDir); + $this->io->expects(self::once()) + ->method('isInteractive') + ->willReturn($isInteractive); + $this->io->expects(self::any()) + ->method('write'); + $this->io->expects(self::any()) + ->method('ask') + ->willReturnArgument(1); - $this->processor->actualizeEnv($config); + self::assertFalse( + $this->processor->actualizeEnv($config) + ); + self::assertFileEquals( + $directory . '/.expected', + $workingDir . $config->getTarget() + ); } /** * @return array */ - public function actualizeEnvDataProvider() + public function actualizeEnvDataWithRemoveOutdatedProvider() { - $config = Config::createFormArray([ - 'dist' => '.env.dist', - 'target' => '.env' - ]); - $tests = []; + $tests = []; - foreach (glob(__DIR__ . '/fixtures/testcases/*/') as $folder) { - $tests[basename($folder)] = [$folder, $config, false]; - $tests[basename($folder) . ' interactive'] = [$folder, $config, true]; - } + $subdirectory = realpath(__DIR__ . '/fixtures/actualize/delete-old-variable/') . '/'; + $configSubdirectory = new Config('.env.dist', '.env', false); + + $tests[$subdirectory] = [$subdirectory, $configSubdirectory, false]; + $tests[$subdirectory . ' interactive'] = [$subdirectory, $configSubdirectory, false]; return $tests; } /** - * @dataProvider actualizeEnvDataProvider() + * @dataProvider actualizeEnvDataWithRemoveOutdatedProvider() * * @param string $directory * @param Config $config * @param bool $isInteractive */ - public function testActualizeEnv($directory, Config $config, $isInteractive) + public function testActualizeEnvWithRemoveOutdated($directory, Config $config, $isInteractive) { - $workingDir = sys_get_temp_dir() . '/lf_env_dot_handler/'; - $exists = $this->initializeTestCase($config, $directory, $workingDir); + $workingDir = sys_get_temp_dir() . '/lf_env_diff_tests/'; + $fs = new Filesystem(); + + if (is_dir($workingDir)) { + $fs->remove($workingDir); + } + + $fs->copy($directory . $config->getDist(), $workingDir . $config->getDist()); - $message = sprintf('%s the "%s" file', $exists ? 'Check' : 'Creating', $config->getTarget()); + if ($exists = file_exists($directory . '/' . $config->getTarget())) { + $fs->copy($directory . $config->getTarget(), $workingDir . $config->getTarget()); + } + + chdir($workingDir); $this->io->expects(self::once()) ->method('isInteractive') ->willReturn($isInteractive); $this->io->expects(self::any()) - ->method('write') - ->willReturn($message); + ->method('write'); $this->io->expects(self::any()) ->method('ask') ->willReturnArgument(1); - $this->processor->actualizeEnv($config); - + self::assertFalse( + $this->processor->actualizeEnv($config) + ); self::assertFileEquals( $directory . '/.expected', - $workingDir . '/' . $config->getTarget() + $workingDir . $config->getTarget() + ); + } + + /** + * @return array + */ + public function actualizeEnvParseFailedDataProvider() + { + $invalidDirectory = 'fixtures/actualize/invalid/'; + $tests = []; + + chdir(__DIR__); + foreach (scandir($invalidDirectory) as $folder) { + if ($folder === '.' || $folder === '..') { + continue; + } + $tests[basename($folder)] = [ + new Config($invalidDirectory . $folder . '/.env.dist'), + file_get_contents($invalidDirectory . $folder . '/error.txt') + ]; + } + + return $tests; + } + + /** + * @dataProvider actualizeEnvParseFailedDataProvider() + * + * @param Config $config + * @param string $errorMessage + */ + public function testActualizeEnvParseFailed(Config $config, $errorMessage) + { + $this->io->expects(self::at(1)) + ->method('write') + ->with($errorMessage); + + chdir(__DIR__); + self::assertTrue( + $this->processor->actualizeEnv($config) ); } - private function initializeTestCase(Config $config, $dataDir, $workingDir) + /** + * @return array + */ + public function showDifferenceDataProvider() { - $fs = new Filesystem(); + $tests = []; - if (is_dir($workingDir)) { - $fs->remove($workingDir); + foreach (glob(__DIR__ . '/fixtures/difference/valid/*/') as $folder) { + $tests[basename($folder)] = [$folder, file($folder . 'expected.log')]; + } + + return $tests; + } + + /** + * @dataProvider showDifferenceDataProvider() + * + * @param string $directory + * @param array $lines + */ + public function testShowDifference($directory, array $lines) + { + $config = Config::createFormArray( + [ + 'dist' => '.env.dist', + 'target' => '.env' + ] + ); + + foreach ($lines as $id => $line) { + $this->io->expects(self::at($id)) + ->method('write') + ->with(trim($line)); } - $fs->copy($dataDir . $config->getDist(), $workingDir . $config->getDist()); + chdir($directory); + + self::assertFalse( + $this->processor->showDifference($config) + ); + } + + /** + * @return array + */ + public function showDifferenceParseFailedDataProvider() + { + $invalidDirectory = 'fixtures/difference/invalid/'; + $tests = []; - if ($exists = file_exists($dataDir . '/' . $config->getTarget())) { - $fs->copy($dataDir . $config->getTarget(), $workingDir . $config->getTarget()); + chdir(__DIR__); + foreach (scandir($invalidDirectory) as $folder) { + if ($folder === '.' || $folder === '..') { + continue; + } + $tests[basename($folder)] = [ + new Config($invalidDirectory . $folder . '/.env.dist', $invalidDirectory . $folder . '/.env'), + file_get_contents($invalidDirectory . $folder . '/error.txt') + ]; } - chdir($workingDir); + return $tests; + } + + /** + * @dataProvider showDifferenceParseFailedDataProvider() + * + * @param Config $config + * @param string $errorMessage + */ + public function testShowDifferenceFailed(Config $config, $errorMessage) + { + $this->io->expects(self::once()) + ->method('write') + ->with($errorMessage); - return $exists; + chdir(__DIR__); + self::assertTrue( + $this->processor->showDifference($config) + ); } } diff --git a/tests/fixtures/testcases/do-not-delete-old-variable/.env b/tests/fixtures/actualize/delete-old-variable/.env similarity index 100% rename from tests/fixtures/testcases/do-not-delete-old-variable/.env rename to tests/fixtures/actualize/delete-old-variable/.env diff --git a/tests/fixtures/testcases/do-not-delete-old-variable/.env.dist b/tests/fixtures/actualize/delete-old-variable/.env.dist similarity index 100% rename from tests/fixtures/testcases/do-not-delete-old-variable/.env.dist rename to tests/fixtures/actualize/delete-old-variable/.env.dist diff --git a/tests/fixtures/testcases/remove-comments/.expected b/tests/fixtures/actualize/delete-old-variable/.expected similarity index 100% rename from tests/fixtures/testcases/remove-comments/.expected rename to tests/fixtures/actualize/delete-old-variable/.expected diff --git a/tests/fixtures/actualize/invalid/dist-not-found/error.txt b/tests/fixtures/actualize/invalid/dist-not-found/error.txt new file mode 100644 index 0000000..7734eba --- /dev/null +++ b/tests/fixtures/actualize/invalid/dist-not-found/error.txt @@ -0,0 +1 @@ +The file "fixtures/actualize/invalid/dist-not-found/.env.dist" does not exist, abort \ No newline at end of file diff --git a/tests/fixtures/invalid/invalid_delimeter.env b/tests/fixtures/actualize/invalid/invalid-delimiter/.env.dist similarity index 100% rename from tests/fixtures/invalid/invalid_delimeter.env rename to tests/fixtures/actualize/invalid/invalid-delimiter/.env.dist diff --git a/tests/fixtures/actualize/invalid/invalid-delimiter/error.txt b/tests/fixtures/actualize/invalid/invalid-delimiter/error.txt new file mode 100644 index 0000000..95080bf --- /dev/null +++ b/tests/fixtures/actualize/invalid/invalid-delimiter/error.txt @@ -0,0 +1 @@ +Parse error at 1 line: `FOO:'bar'` is not valid env value, abort \ No newline at end of file diff --git a/tests/fixtures/invalid/invalid_string.env b/tests/fixtures/actualize/invalid/invalid-string/.env.dist similarity index 100% rename from tests/fixtures/invalid/invalid_string.env rename to tests/fixtures/actualize/invalid/invalid-string/.env.dist diff --git a/tests/fixtures/actualize/invalid/invalid-string/error.txt b/tests/fixtures/actualize/invalid/invalid-string/error.txt new file mode 100644 index 0000000..5896d21 --- /dev/null +++ b/tests/fixtures/actualize/invalid/invalid-string/error.txt @@ -0,0 +1 @@ +Parse error at 1 line: `this is not a valid env variable` is not valid env value, abort \ No newline at end of file diff --git a/tests/fixtures/testcases/append-new-variable/.expected b/tests/fixtures/actualize/subdirectory/.expected similarity index 100% rename from tests/fixtures/testcases/append-new-variable/.expected rename to tests/fixtures/actualize/subdirectory/.expected diff --git a/tests/fixtures/testcases/trim-spaces/.env.dist b/tests/fixtures/actualize/subdirectory/sub/.env.dist similarity index 100% rename from tests/fixtures/testcases/trim-spaces/.env.dist rename to tests/fixtures/actualize/subdirectory/sub/.env.dist diff --git a/tests/fixtures/testcases/append-new-variable/.env b/tests/fixtures/actualize/valid/append-new-variable/.env similarity index 100% rename from tests/fixtures/testcases/append-new-variable/.env rename to tests/fixtures/actualize/valid/append-new-variable/.env diff --git a/tests/fixtures/testcases/append-new-variable/.env.dist b/tests/fixtures/actualize/valid/append-new-variable/.env.dist similarity index 100% rename from tests/fixtures/testcases/append-new-variable/.env.dist rename to tests/fixtures/actualize/valid/append-new-variable/.env.dist diff --git a/tests/fixtures/testcases/trim-spaces/.expected b/tests/fixtures/actualize/valid/append-new-variable/.expected similarity index 100% rename from tests/fixtures/testcases/trim-spaces/.expected rename to tests/fixtures/actualize/valid/append-new-variable/.expected diff --git a/tests/fixtures/testcases/create-new-env-file/.env.dist b/tests/fixtures/actualize/valid/create-new-env-file/.env.dist similarity index 100% rename from tests/fixtures/testcases/create-new-env-file/.env.dist rename to tests/fixtures/actualize/valid/create-new-env-file/.env.dist diff --git a/tests/fixtures/testcases/create-new-env-file/.expected b/tests/fixtures/actualize/valid/create-new-env-file/.expected similarity index 100% rename from tests/fixtures/testcases/create-new-env-file/.expected rename to tests/fixtures/actualize/valid/create-new-env-file/.expected diff --git a/tests/fixtures/actualize/valid/do-not-delete-old-variable/.env b/tests/fixtures/actualize/valid/do-not-delete-old-variable/.env new file mode 100644 index 0000000..17c896a --- /dev/null +++ b/tests/fixtures/actualize/valid/do-not-delete-old-variable/.env @@ -0,0 +1,3 @@ +# This file is auto-generated during the composer install +FOO='bar' +SOME_VARIABLE='old' diff --git a/tests/fixtures/testcases/do-not-replace-old-variable/.env.dist b/tests/fixtures/actualize/valid/do-not-delete-old-variable/.env.dist similarity index 100% rename from tests/fixtures/testcases/do-not-replace-old-variable/.env.dist rename to tests/fixtures/actualize/valid/do-not-delete-old-variable/.env.dist diff --git a/tests/fixtures/testcases/do-not-delete-old-variable/.expected b/tests/fixtures/actualize/valid/do-not-delete-old-variable/.expected similarity index 100% rename from tests/fixtures/testcases/do-not-delete-old-variable/.expected rename to tests/fixtures/actualize/valid/do-not-delete-old-variable/.expected diff --git a/tests/fixtures/testcases/do-not-replace-old-variable/.env b/tests/fixtures/actualize/valid/do-not-replace-old-variable/.env similarity index 100% rename from tests/fixtures/testcases/do-not-replace-old-variable/.env rename to tests/fixtures/actualize/valid/do-not-replace-old-variable/.env diff --git a/tests/fixtures/actualize/valid/do-not-replace-old-variable/.env.dist b/tests/fixtures/actualize/valid/do-not-replace-old-variable/.env.dist new file mode 100644 index 0000000..f2058ff --- /dev/null +++ b/tests/fixtures/actualize/valid/do-not-replace-old-variable/.env.dist @@ -0,0 +1 @@ +FOO='bar' \ No newline at end of file diff --git a/tests/fixtures/testcases/do-not-replace-old-variable/.expected b/tests/fixtures/actualize/valid/do-not-replace-old-variable/.expected similarity index 100% rename from tests/fixtures/testcases/do-not-replace-old-variable/.expected rename to tests/fixtures/actualize/valid/do-not-replace-old-variable/.expected diff --git a/tests/fixtures/testcases/remove-comments/.env b/tests/fixtures/actualize/valid/remove-comments/.env similarity index 100% rename from tests/fixtures/testcases/remove-comments/.env rename to tests/fixtures/actualize/valid/remove-comments/.env diff --git a/tests/fixtures/testcases/remove-comments/.env.dist b/tests/fixtures/actualize/valid/remove-comments/.env.dist similarity index 100% rename from tests/fixtures/testcases/remove-comments/.env.dist rename to tests/fixtures/actualize/valid/remove-comments/.env.dist diff --git a/tests/fixtures/testcases/trim-spaces/.env b/tests/fixtures/actualize/valid/remove-comments/.expected similarity index 100% rename from tests/fixtures/testcases/trim-spaces/.env rename to tests/fixtures/actualize/valid/remove-comments/.expected diff --git a/tests/fixtures/actualize/valid/trim-spaces/.env b/tests/fixtures/actualize/valid/trim-spaces/.env new file mode 100644 index 0000000..b42df1b --- /dev/null +++ b/tests/fixtures/actualize/valid/trim-spaces/.env @@ -0,0 +1,2 @@ +# This file is auto-generated during the composer install +FOO='bar' \ No newline at end of file diff --git a/tests/fixtures/actualize/valid/trim-spaces/.env.dist b/tests/fixtures/actualize/valid/trim-spaces/.env.dist new file mode 100644 index 0000000..965f257 --- /dev/null +++ b/tests/fixtures/actualize/valid/trim-spaces/.env.dist @@ -0,0 +1,3 @@ + FOO= 'bar' + +APPEND = 'new line' \ No newline at end of file diff --git a/tests/fixtures/actualize/valid/trim-spaces/.expected b/tests/fixtures/actualize/valid/trim-spaces/.expected new file mode 100644 index 0000000..eba4f3f --- /dev/null +++ b/tests/fixtures/actualize/valid/trim-spaces/.expected @@ -0,0 +1,3 @@ +# This file is auto-generated during the composer install +APPEND='new line' +FOO='bar' \ No newline at end of file diff --git a/tests/fixtures/difference/invalid/dist-not-found/error.txt b/tests/fixtures/difference/invalid/dist-not-found/error.txt new file mode 100644 index 0000000..965dd2a --- /dev/null +++ b/tests/fixtures/difference/invalid/dist-not-found/error.txt @@ -0,0 +1 @@ +The file "fixtures/difference/invalid/dist-not-found/.env.dist" does not exist \ No newline at end of file diff --git a/tests/fixtures/difference/invalid/invalid-delimiter/.env.dist b/tests/fixtures/difference/invalid/invalid-delimiter/.env.dist new file mode 100644 index 0000000..69371c6 --- /dev/null +++ b/tests/fixtures/difference/invalid/invalid-delimiter/.env.dist @@ -0,0 +1 @@ +FOO:'bar' \ No newline at end of file diff --git a/tests/fixtures/difference/invalid/invalid-delimiter/error.txt b/tests/fixtures/difference/invalid/invalid-delimiter/error.txt new file mode 100644 index 0000000..7821112 --- /dev/null +++ b/tests/fixtures/difference/invalid/invalid-delimiter/error.txt @@ -0,0 +1 @@ +Parse error at 1 line: `FOO:'bar'` is not valid env value \ No newline at end of file diff --git a/tests/fixtures/difference/invalid/invalid-string/.env.dist b/tests/fixtures/difference/invalid/invalid-string/.env.dist new file mode 100644 index 0000000..4b791db --- /dev/null +++ b/tests/fixtures/difference/invalid/invalid-string/.env.dist @@ -0,0 +1 @@ +this is not a valid env variable \ No newline at end of file diff --git a/tests/fixtures/difference/invalid/invalid-string/error.txt b/tests/fixtures/difference/invalid/invalid-string/error.txt new file mode 100644 index 0000000..be6b2b7 --- /dev/null +++ b/tests/fixtures/difference/invalid/invalid-string/error.txt @@ -0,0 +1 @@ +Parse error at 1 line: `this is not a valid env variable` is not valid env value \ No newline at end of file diff --git a/tests/fixtures/difference/invalid/target-not-found/.env.dist b/tests/fixtures/difference/invalid/target-not-found/.env.dist new file mode 100644 index 0000000..f2058ff --- /dev/null +++ b/tests/fixtures/difference/invalid/target-not-found/.env.dist @@ -0,0 +1 @@ +FOO='bar' \ No newline at end of file diff --git a/tests/fixtures/difference/invalid/target-not-found/error.txt b/tests/fixtures/difference/invalid/target-not-found/error.txt new file mode 100644 index 0000000..4f92c79 --- /dev/null +++ b/tests/fixtures/difference/invalid/target-not-found/error.txt @@ -0,0 +1 @@ +The file "fixtures/difference/invalid/target-not-found/.env" does not exist \ No newline at end of file diff --git a/tests/fixtures/difference/valid/changed-values/.env b/tests/fixtures/difference/valid/changed-values/.env new file mode 100644 index 0000000..2a37e96 --- /dev/null +++ b/tests/fixtures/difference/valid/changed-values/.env @@ -0,0 +1,2 @@ +FOO='bar' +APPEND='new' diff --git a/tests/fixtures/difference/valid/changed-values/.env.dist b/tests/fixtures/difference/valid/changed-values/.env.dist new file mode 100644 index 0000000..71f18fb --- /dev/null +++ b/tests/fixtures/difference/valid/changed-values/.env.dist @@ -0,0 +1,2 @@ +FOO='bar' +APPEND='new line' \ No newline at end of file diff --git a/tests/fixtures/difference/valid/changed-values/expected.log b/tests/fixtures/difference/valid/changed-values/expected.log new file mode 100644 index 0000000..5a191e9 --- /dev/null +++ b/tests/fixtures/difference/valid/changed-values/expected.log @@ -0,0 +1,3 @@ +Diff between .env and .env.dist files: + +@ APPEND='new' ('new line') \ No newline at end of file diff --git a/tests/fixtures/difference/valid/extra-values/.env b/tests/fixtures/difference/valid/extra-values/.env new file mode 100644 index 0000000..f347ed8 --- /dev/null +++ b/tests/fixtures/difference/valid/extra-values/.env @@ -0,0 +1,3 @@ +FOO='bar' +APPEND='new line' +EXTRA=true \ No newline at end of file diff --git a/tests/fixtures/difference/valid/extra-values/.env.dist b/tests/fixtures/difference/valid/extra-values/.env.dist new file mode 100644 index 0000000..71f18fb --- /dev/null +++ b/tests/fixtures/difference/valid/extra-values/.env.dist @@ -0,0 +1,2 @@ +FOO='bar' +APPEND='new line' \ No newline at end of file diff --git a/tests/fixtures/difference/valid/extra-values/expected.log b/tests/fixtures/difference/valid/extra-values/expected.log new file mode 100644 index 0000000..e4a8092 --- /dev/null +++ b/tests/fixtures/difference/valid/extra-values/expected.log @@ -0,0 +1,3 @@ +Diff between .env and .env.dist files: + ++ EXTRA=true \ No newline at end of file diff --git a/tests/fixtures/difference/valid/identical/.env b/tests/fixtures/difference/valid/identical/.env new file mode 100644 index 0000000..eba4f3f --- /dev/null +++ b/tests/fixtures/difference/valid/identical/.env @@ -0,0 +1,3 @@ +# This file is auto-generated during the composer install +APPEND='new line' +FOO='bar' \ No newline at end of file diff --git a/tests/fixtures/difference/valid/identical/.env.dist b/tests/fixtures/difference/valid/identical/.env.dist new file mode 100644 index 0000000..71f18fb --- /dev/null +++ b/tests/fixtures/difference/valid/identical/.env.dist @@ -0,0 +1,2 @@ +FOO='bar' +APPEND='new line' \ No newline at end of file diff --git a/tests/fixtures/difference/valid/identical/expected.log b/tests/fixtures/difference/valid/identical/expected.log new file mode 100644 index 0000000..60f57e5 --- /dev/null +++ b/tests/fixtures/difference/valid/identical/expected.log @@ -0,0 +1 @@ +.env and .env.dist is identical \ No newline at end of file diff --git a/tests/fixtures/difference/valid/missed-values/.env b/tests/fixtures/difference/valid/missed-values/.env new file mode 100644 index 0000000..c562679 --- /dev/null +++ b/tests/fixtures/difference/valid/missed-values/.env @@ -0,0 +1 @@ +FOO='bar' diff --git a/tests/fixtures/difference/valid/missed-values/.env.dist b/tests/fixtures/difference/valid/missed-values/.env.dist new file mode 100644 index 0000000..71f18fb --- /dev/null +++ b/tests/fixtures/difference/valid/missed-values/.env.dist @@ -0,0 +1,2 @@ +FOO='bar' +APPEND='new line' \ No newline at end of file diff --git a/tests/fixtures/difference/valid/missed-values/expected.log b/tests/fixtures/difference/valid/missed-values/expected.log new file mode 100644 index 0000000..20aece9 --- /dev/null +++ b/tests/fixtures/difference/valid/missed-values/expected.log @@ -0,0 +1,3 @@ +Diff between .env and .env.dist files: + +- APPEND='new line' \ No newline at end of file diff --git a/tests/fixtures/difference/valid/mixed/.env b/tests/fixtures/difference/valid/mixed/.env new file mode 100644 index 0000000..5ebc2fc --- /dev/null +++ b/tests/fixtures/difference/valid/mixed/.env @@ -0,0 +1,3 @@ +FOO='bar' +APPEND='new' +EXTRA=true \ No newline at end of file diff --git a/tests/fixtures/difference/valid/mixed/.env.dist b/tests/fixtures/difference/valid/mixed/.env.dist new file mode 100644 index 0000000..5ec5d44 --- /dev/null +++ b/tests/fixtures/difference/valid/mixed/.env.dist @@ -0,0 +1,3 @@ +FOO='bar' +APPEND='new line' +MISSED=true \ No newline at end of file diff --git a/tests/fixtures/difference/valid/mixed/expected.log b/tests/fixtures/difference/valid/mixed/expected.log new file mode 100644 index 0000000..92d76d9 --- /dev/null +++ b/tests/fixtures/difference/valid/mixed/expected.log @@ -0,0 +1,5 @@ +Diff between .env and .env.dist files: + +- MISSED=true ++ EXTRA=true +@ APPEND='new' ('new line') \ No newline at end of file