mirror of
https://github.com/pestphp/pest.git
synced 2026-03-11 02:07:23 +01:00
Merge pull request #405 from def-studio/add-new-ci-option-to-pest-bin
Add new --ci option to pest bin
This commit is contained in:
@ -79,7 +79,8 @@
|
|||||||
"plugins": [
|
"plugins": [
|
||||||
"Pest\\Plugins\\Coverage",
|
"Pest\\Plugins\\Coverage",
|
||||||
"Pest\\Plugins\\Init",
|
"Pest\\Plugins\\Init",
|
||||||
"Pest\\Plugins\\Version"
|
"Pest\\Plugins\\Version",
|
||||||
|
"Pest\\Plugins\\Context"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"laravel": {
|
"laravel": {
|
||||||
|
|||||||
47
src/Plugins/Context.php
Normal file
47
src/Plugins/Context.php
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Pest\Plugins;
|
||||||
|
|
||||||
|
use Pest\Contracts\Plugins\HandlesArguments;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
final class Context implements HandlesArguments
|
||||||
|
{
|
||||||
|
public const ENV_CI = 'ci';
|
||||||
|
public const ENV_LOCAL = 'local';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Pest\Plugins\Context
|
||||||
|
*/
|
||||||
|
private static $instance;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $env = 'local';
|
||||||
|
|
||||||
|
public static function getInstance(): Context
|
||||||
|
{
|
||||||
|
if (self::$instance === null) {
|
||||||
|
self::$instance = new self();
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::$instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function handleArguments(array $arguments): array
|
||||||
|
{
|
||||||
|
foreach ($arguments as $index => $argument) {
|
||||||
|
if ($argument === '--ci') {
|
||||||
|
unset($arguments[$index]);
|
||||||
|
self::getInstance()->env = 'ci';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_values($arguments);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -11,6 +11,7 @@ use Pest\Exceptions\TestAlreadyExist;
|
|||||||
use Pest\Exceptions\TestCaseAlreadyInUse;
|
use Pest\Exceptions\TestCaseAlreadyInUse;
|
||||||
use Pest\Exceptions\TestCaseClassOrTraitNotFound;
|
use Pest\Exceptions\TestCaseClassOrTraitNotFound;
|
||||||
use Pest\Factories\TestCaseFactory;
|
use Pest\Factories\TestCaseFactory;
|
||||||
|
use Pest\Plugins\Context;
|
||||||
use Pest\Support\Reflection;
|
use Pest\Support\Reflection;
|
||||||
use Pest\Support\Str;
|
use Pest\Support\Str;
|
||||||
use Pest\TestSuite;
|
use Pest\TestSuite;
|
||||||
@ -119,6 +120,10 @@ final class TestRepository
|
|||||||
*/
|
*/
|
||||||
private function testsUsingOnly(): array
|
private function testsUsingOnly(): array
|
||||||
{
|
{
|
||||||
|
if (Context::getInstance()->env === Context::ENV_CI) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
return array_filter($this->state, function ($testFactory): bool {
|
return array_filter($this->state, function ($testFactory): bool {
|
||||||
return $testFactory->only;
|
return $testFactory->only;
|
||||||
});
|
});
|
||||||
|
|||||||
@ -91,8 +91,8 @@ final class TestSuite
|
|||||||
$this->afterEach = new AfterEachRepository();
|
$this->afterEach = new AfterEachRepository();
|
||||||
$this->afterAll = new AfterAllRepository();
|
$this->afterAll = new AfterAllRepository();
|
||||||
|
|
||||||
$this->rootPath = (string) realpath($rootPath);
|
$this->rootPath = (string) realpath($rootPath);
|
||||||
$this->testPath = $testPath;
|
$this->testPath = $testPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -657,6 +657,10 @@
|
|||||||
✓ it show the actual dataset of multiple non-named datasets in their description
|
✓ 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
|
✓ 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
|
PASS Tests\Unit\Plugins\Version
|
||||||
✓ it outputs the version when --version is used
|
✓ it outputs the version when --version is used
|
||||||
✓ it do not outputs version when --version is not 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 alerts users about tests with arguments but no input
|
||||||
✓ it can return an array of all test suite filenames
|
✓ it can return an array of all test suite filenames
|
||||||
✓ it can filter the test suite filenames to those with the only method
|
✓ 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
|
PASS Tests\Visual\Help
|
||||||
✓ visual snapshot of help command output
|
✓ visual snapshot of help command output
|
||||||
@ -715,5 +720,5 @@
|
|||||||
✓ it is a test
|
✓ it is a test
|
||||||
✓ it uses correct parent class
|
✓ it uses correct parent class
|
||||||
|
|
||||||
Tests: 4 incompleted, 9 skipped, 475 passed
|
Tests: 4 incompleted, 9 skipped, 478 passed
|
||||||
|
|
||||||
23
tests/Unit/Plugins/Context.php
Normal file
23
tests/Unit/Plugins/Context.php
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Pest\Plugins\Context;
|
||||||
|
|
||||||
|
test('environment is set to CI when --ci option is used', function () {
|
||||||
|
$old_env = Context::getInstance()->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);
|
||||||
|
});
|
||||||
@ -2,13 +2,15 @@
|
|||||||
|
|
||||||
use Pest\Exceptions\DatasetMissing;
|
use Pest\Exceptions\DatasetMissing;
|
||||||
use Pest\Exceptions\TestAlreadyExist;
|
use Pest\Exceptions\TestAlreadyExist;
|
||||||
|
use Pest\Factories\TestCaseFactory;
|
||||||
|
use Pest\Plugins\Context;
|
||||||
use Pest\TestSuite;
|
use Pest\TestSuite;
|
||||||
|
|
||||||
it('does not allow to add the same test description twice', function () {
|
it('does not allow to add the same test description twice', function () {
|
||||||
$testSuite = new TestSuite(getcwd(), 'tests');
|
$testSuite = new TestSuite(getcwd(), 'tests');
|
||||||
$test = function () {};
|
$test = function () {};
|
||||||
$testSuite->tests->set(new \Pest\Factories\TestCaseFactory(__FILE__, 'foo', $test));
|
$testSuite->tests->set(new TestCaseFactory(__FILE__, 'foo', $test));
|
||||||
$testSuite->tests->set(new \Pest\Factories\TestCaseFactory(__FILE__, 'foo', $test));
|
$testSuite->tests->set(new TestCaseFactory(__FILE__, 'foo', $test));
|
||||||
})->throws(
|
})->throws(
|
||||||
TestAlreadyExist::class,
|
TestAlreadyExist::class,
|
||||||
sprintf('A test with the description `%s` already exist in the filename `%s`.', 'foo', __FILE__),
|
sprintf('A test with the description `%s` already exist in the filename `%s`.', 'foo', __FILE__),
|
||||||
@ -17,17 +19,17 @@ it('does not allow to add the same test description twice', function () {
|
|||||||
it('alerts users about tests with arguments but no input', function () {
|
it('alerts users about tests with arguments but no input', function () {
|
||||||
$testSuite = new TestSuite(getcwd(), 'tests');
|
$testSuite = new TestSuite(getcwd(), 'tests');
|
||||||
$test = function (int $arg) {};
|
$test = function (int $arg) {};
|
||||||
$testSuite->tests->set(new \Pest\Factories\TestCaseFactory(__FILE__, 'foo', $test));
|
$testSuite->tests->set(new TestCaseFactory(__FILE__, 'foo', $test));
|
||||||
})->throws(
|
})->throws(
|
||||||
DatasetMissing::class,
|
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__),
|
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 () {
|
it('can return an array of all test suite filenames', function () {
|
||||||
$testSuite = new TestSuite(getcwd(), 'tests');
|
$testSuite = TestSuite::getInstance(getcwd(), 'tests');
|
||||||
$test = function () {};
|
$test = function () {};
|
||||||
$testSuite->tests->set(new \Pest\Factories\TestCaseFactory(__FILE__, 'foo', $test));
|
$testSuite->tests->set(new TestCaseFactory(__FILE__, 'foo', $test));
|
||||||
$testSuite->tests->set(new \Pest\Factories\TestCaseFactory(__FILE__, 'bar', $test));
|
$testSuite->tests->set(new TestCaseFactory(__FILE__, 'bar', $test));
|
||||||
|
|
||||||
expect($testSuite->tests->getFilenames())->toEqual([
|
expect($testSuite->tests->getFilenames())->toEqual([
|
||||||
__FILE__,
|
__FILE__,
|
||||||
@ -36,16 +38,37 @@ it('can return an array of all test suite filenames', function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('can filter the test suite filenames to those with the only method', function () {
|
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 () {};
|
$test = function () {};
|
||||||
|
|
||||||
$testWithOnly = new \Pest\Factories\TestCaseFactory(__FILE__, 'foo', $test);
|
$testWithOnly = new TestCaseFactory(__FILE__, 'foo', $test);
|
||||||
$testWithOnly->only = true;
|
$testWithOnly->only = true;
|
||||||
$testSuite->tests->set($testWithOnly);
|
$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([
|
expect($testSuite->tests->getFilenames())->toEqual([
|
||||||
__FILE__,
|
__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;
|
||||||
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user