From 601c4b01fcc9f19ec1fa8ecc29a10dcda3fe8b0d Mon Sep 17 00:00:00 2001 From: Fabio Ivona Date: Wed, 22 Sep 2021 14:53:16 +0200 Subject: [PATCH] refactors to use a Plugin to parse --ci option --- bin/pest | 7 ++--- composer.json | 3 +- src/Plugins/Context.php | 47 +++++++++++++++++++++++++++++ src/Repositories/TestRepository.php | 3 +- src/TestSuite.php | 13 ++------ tests/.snapshots/success.txt | 6 +++- tests/Unit/Plugins/Context.php | 23 ++++++++++++++ tests/Unit/TestSuite.php | 26 ++++++++++------ 8 files changed, 100 insertions(+), 28 deletions(-) create mode 100644 src/Plugins/Context.php create mode 100644 tests/Unit/Plugins/Context.php diff --git a/bin/pest b/bin/pest index d34ddad6..2735abfc 100755 --- a/bin/pest +++ b/bin/pest @@ -31,8 +31,7 @@ use Symfony\Component\Console\Output\OutputInterface; $rootPath = dirname($autoloadPath, 2); $argv = new ArgvInput(); - $workingEnv = $argv->hasParameterOption('--ci') ? 'ci' : 'local'; - $testSuite = TestSuite::getInstance($rootPath, $argv->getParameterOption('--test-directory', 'tests'), $workingEnv); + $testSuite = TestSuite::getInstance($rootPath, $argv->getParameterOption('--test-directory', 'tests')); $isDecorated = $argv->getParameterOption('--colors', 'always') !== 'never'; $output = new ConsoleOutput(ConsoleOutput::VERBOSITY_NORMAL, $isDecorated); @@ -46,9 +45,9 @@ use Symfony\Component\Console\Output\OutputInterface; $args = $_SERVER['argv']; // Let's remove any arguments that PHPUnit does not understand - if ($argv->hasParameterOption(['--test-directory', '--ci'])) { + if ($argv->hasParameterOption('--test-directory')) { foreach ($args as $key => $value) { - if (strpos($value, '--test-directory') !== false || strpos($value, '--ci') !== false) { + if (strpos($value, '--test-directory') !== false) { unset($args[$key]); } } diff --git a/composer.json b/composer.json index d9ac0d22..cf6b5b79 100644 --- a/composer.json +++ b/composer.json @@ -79,7 +79,8 @@ "plugins": [ "Pest\\Plugins\\Coverage", "Pest\\Plugins\\Init", - "Pest\\Plugins\\Version" + "Pest\\Plugins\\Version", + "Pest\\Plugins\\Context" ] }, "laravel": { diff --git a/src/Plugins/Context.php b/src/Plugins/Context.php new file mode 100644 index 00000000..f7bafbe5 --- /dev/null +++ b/src/Plugins/Context.php @@ -0,0 +1,47 @@ + $argument) { + if ($argument === '--ci') { + unset($arguments[$index]); + self::getInstance()->env = 'ci'; + } + } + + return array_values($arguments); + } +} diff --git a/src/Repositories/TestRepository.php b/src/Repositories/TestRepository.php index 502b9fd1..f10012a9 100644 --- a/src/Repositories/TestRepository.php +++ b/src/Repositories/TestRepository.php @@ -11,6 +11,7 @@ use Pest\Exceptions\TestAlreadyExist; use Pest\Exceptions\TestCaseAlreadyInUse; use Pest\Exceptions\TestCaseClassOrTraitNotFound; use Pest\Factories\TestCaseFactory; +use Pest\Plugins\Context; use Pest\Support\Reflection; use Pest\Support\Str; use Pest\TestSuite; @@ -119,7 +120,7 @@ final class TestRepository */ private function testsUsingOnly(): array { - if (TestSuite::getInstance()->workingEnv === 'ci') { + if (Context::getInstance()->env === Context::ENV_CI) { return []; } diff --git a/src/TestSuite.php b/src/TestSuite.php index 252d40be..dc2c5a5a 100644 --- a/src/TestSuite.php +++ b/src/TestSuite.php @@ -73,13 +73,6 @@ final class TestSuite */ public $testPath; - /** - * Holds the current working environment identifier. - * - * @var string - */ - public $workingEnv; - /** * Holds an instance of the test suite. * @@ -100,17 +93,15 @@ final class TestSuite $this->rootPath = (string) realpath($rootPath); $this->testPath = $testPath; - $this->workingEnv = 'local'; } /** * Returns the current instance of the test suite. */ - public static function getInstance(string $rootPath = null, string $testPath = null, string $workingEnv = null): TestSuite + public static function getInstance(string $rootPath = null, string $testPath = null): TestSuite { if (is_string($rootPath) && is_string($testPath)) { - self::$instance = new TestSuite($rootPath, $testPath); - self::$instance->workingEnv = $workingEnv ?? 'local'; + self::$instance = new TestSuite($rootPath, $testPath); foreach (Plugin::$callables as $callable) { $callable(); diff --git a/tests/.snapshots/success.txt b/tests/.snapshots/success.txt index 686d701e..d7a866b9 100644 --- a/tests/.snapshots/success.txt +++ b/tests/.snapshots/success.txt @@ -623,6 +623,10 @@ ✓ it show the actual dataset of multiple non-named datasets in their description ✓ it show the correct description for mixed named and not-named datasets + PASS Tests\Unit\Plugins\Context + ✓ environment is set to CI when --ci option is used + ✓ environment is set to Local when --ci option is not used + PASS Tests\Unit\Plugins\Version ✓ it outputs the version when --version is used ✓ it do not outputs version when --version is not used @@ -682,5 +686,5 @@ ✓ it is a test ✓ it uses correct parent class - Tests: 4 incompleted, 9 skipped, 448 passed + Tests: 4 incompleted, 9 skipped, 450 passed \ No newline at end of file diff --git a/tests/Unit/Plugins/Context.php b/tests/Unit/Plugins/Context.php new file mode 100644 index 00000000..13f2f783 --- /dev/null +++ b/tests/Unit/Plugins/Context.php @@ -0,0 +1,23 @@ +env; + + $plugin = new Context(); + + $plugin->handleArguments(['foo', '--ci', 'bar']); + + expect(Context::getInstance()->env)->toBe(Context::ENV_CI); + + Context::getInstance()->env = $old_env; +}); + +test('environment is set to Local when --ci option is not used', function () { + $plugin = new Context(); + + $plugin->handleArguments(['foo', 'bar', 'baz']); + + expect(Context::getInstance()->env)->toBe(Context::ENV_LOCAL); +}); diff --git a/tests/Unit/TestSuite.php b/tests/Unit/TestSuite.php index 15c3848f..7e58f93d 100644 --- a/tests/Unit/TestSuite.php +++ b/tests/Unit/TestSuite.php @@ -2,13 +2,15 @@ use Pest\Exceptions\DatasetMissing; use Pest\Exceptions\TestAlreadyExist; +use Pest\Factories\TestCaseFactory; +use Pest\Plugins\Context; use Pest\TestSuite; it('does not allow to add the same test description twice', function () { $testSuite = new TestSuite(getcwd(), 'tests'); $test = function () {}; - $testSuite->tests->set(new \Pest\Factories\TestCaseFactory(__FILE__, 'foo', $test)); - $testSuite->tests->set(new \Pest\Factories\TestCaseFactory(__FILE__, 'foo', $test)); + $testSuite->tests->set(new TestCaseFactory(__FILE__, 'foo', $test)); + $testSuite->tests->set(new TestCaseFactory(__FILE__, 'foo', $test)); })->throws( TestAlreadyExist::class, sprintf('A test with the description `%s` already exist in the filename `%s`.', 'foo', __FILE__), @@ -17,7 +19,7 @@ it('does not allow to add the same test description twice', function () { it('alerts users about tests with arguments but no input', function () { $testSuite = new TestSuite(getcwd(), 'tests'); $test = function (int $arg) {}; - $testSuite->tests->set(new \Pest\Factories\TestCaseFactory(__FILE__, 'foo', $test)); + $testSuite->tests->set(new TestCaseFactory(__FILE__, 'foo', $test)); })->throws( DatasetMissing::class, sprintf("A test with the description '%s' has %d argument(s) ([%s]) and no dataset(s) provided in %s", 'foo', 1, 'int $arg', __FILE__), @@ -26,8 +28,8 @@ it('alerts users about tests with arguments but no input', function () { it('can return an array of all test suite filenames', function () { $testSuite = TestSuite::getInstance(getcwd(), 'tests'); $test = function () {}; - $testSuite->tests->set(new \Pest\Factories\TestCaseFactory(__FILE__, 'foo', $test)); - $testSuite->tests->set(new \Pest\Factories\TestCaseFactory(__FILE__, 'bar', $test)); + $testSuite->tests->set(new TestCaseFactory(__FILE__, 'foo', $test)); + $testSuite->tests->set(new TestCaseFactory(__FILE__, 'bar', $test)); expect($testSuite->tests->getFilenames())->toEqual([ __FILE__, @@ -39,11 +41,11 @@ it('can filter the test suite filenames to those with the only method', function $testSuite = TestSuite::getInstance(getcwd(), 'tests'); $test = function () {}; - $testWithOnly = new \Pest\Factories\TestCaseFactory(__FILE__, 'foo', $test); + $testWithOnly = new TestCaseFactory(__FILE__, 'foo', $test); $testWithOnly->only = true; $testSuite->tests->set($testWithOnly); - $testSuite->tests->set(new \Pest\Factories\TestCaseFactory('Baz/Bar/Boo.php', 'bar', $test)); + $testSuite->tests->set(new TestCaseFactory('Baz/Bar/Boo.php', 'bar', $test)); expect($testSuite->tests->getFilenames())->toEqual([ __FILE__, @@ -51,18 +53,22 @@ it('can filter the test suite filenames to those with the only method', function }); it('does not filter the test suite filenames to those with the only method when working in CI pipeline', function () { - $testSuite = TestSuite::getInstance(getcwd(), 'tests', 'ci'); + $old_env = Context::getInstance()->env; + Context::getInstance()->env = Context::ENV_CI; + $testSuite = TestSuite::getInstance(getcwd(), 'tests'); $test = function () {}; - $testWithOnly = new \Pest\Factories\TestCaseFactory(__FILE__, 'foo', $test); + $testWithOnly = new TestCaseFactory(__FILE__, 'foo', $test); $testWithOnly->only = true; $testSuite->tests->set($testWithOnly); - $testSuite->tests->set(new \Pest\Factories\TestCaseFactory('Baz/Bar/Boo.php', 'bar', $test)); + $testSuite->tests->set(new TestCaseFactory('Baz/Bar/Boo.php', 'bar', $test)); expect($testSuite->tests->getFilenames())->toEqual([ __FILE__, 'Baz/Bar/Boo.php', ]); + + Context::getInstance()->env = $old_env; });