diff --git a/composer.json b/composer.json index d9ac0d22b..cf6b5b798 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 000000000..f7bafbe5b --- /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 e522677aa..f10012a92 100644 --- a/src/Repositories/TestRepository.php +++ b/src/Repositories/TestRepository.php @@ -11,6 +11,7 @@ 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,6 +120,10 @@ public function build(TestSuite $testSuite, callable $each): void */ private function testsUsingOnly(): array { + if (Context::getInstance()->env === Context::ENV_CI) { + return []; + } + return array_filter($this->state, function ($testFactory): bool { return $testFactory->only; }); diff --git a/src/TestSuite.php b/src/TestSuite.php index f2b5ccded..dc2c5a5a5 100644 --- a/src/TestSuite.php +++ b/src/TestSuite.php @@ -91,8 +91,8 @@ public function __construct(string $rootPath, string $testPath) $this->afterEach = new AfterEachRepository(); $this->afterAll = new AfterAllRepository(); - $this->rootPath = (string) realpath($rootPath); - $this->testPath = $testPath; + $this->rootPath = (string) realpath($rootPath); + $this->testPath = $testPath; } /** diff --git a/tests/.snapshots/success.txt b/tests/.snapshots/success.txt index addf35367..ccef8873f 100644 --- a/tests/.snapshots/success.txt +++ b/tests/.snapshots/success.txt @@ -657,6 +657,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,6 +686,7 @@ ✓ it alerts users about tests with arguments but no input ✓ it can return an array of all test suite filenames ✓ it can filter the test suite filenames to those with the only method + ✓ it does not filter the test suite filenames to those with the only method when working in CI pipeline PASS Tests\Visual\Help ✓ visual snapshot of help command output @@ -715,5 +720,5 @@ ✓ it is a test ✓ it uses correct parent class - Tests: 4 incompleted, 9 skipped, 475 passed + Tests: 4 incompleted, 9 skipped, 478 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 000000000..13f2f7838 --- /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 7d6c88a91..7e58f93d8 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,17 +19,17 @@ 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__), ); it('can return an array of all test suite filenames', function () { - $testSuite = new TestSuite(getcwd(), 'tests'); + $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__, @@ -36,16 +38,37 @@ }); it('can filter the test suite filenames to those with the only method', function () { - $testSuite = new TestSuite(getcwd(), 'tests'); + $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__, ]); }); + +it('does not filter the test suite filenames to those with the only method when working in CI pipeline', function () { + $old_env = Context::getInstance()->env; + Context::getInstance()->env = Context::ENV_CI; + $testSuite = TestSuite::getInstance(getcwd(), 'tests'); + + $test = function () {}; + + $testWithOnly = new TestCaseFactory(__FILE__, 'foo', $test); + $testWithOnly->only = true; + $testSuite->tests->set($testWithOnly); + + $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; +});