mirror of
https://github.com/pestphp/pest.git
synced 2026-03-06 15:57:21 +01:00
Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3457841a9b | |||
| 5258e569c1 | |||
| abb416c2ff | |||
| dc1e4f040d | |||
| 5e1e701ce5 | |||
| f004591c5a | |||
| 86a96dd157 | |||
| 97dc32f9d2 | |||
| a3ab065343 | |||
| c390721ac3 | |||
| f83d758d4b |
13
README.md
13
README.md
@ -27,11 +27,12 @@ We cannot thank our sponsors enough for their incredible support in funding Pest
|
||||
|
||||
### Premium Sponsors
|
||||
|
||||
- [Akaunting](https://akaunting.com)
|
||||
- [Codecourse](https://codecourse.com)
|
||||
- [Laracasts](https://laracasts.com)
|
||||
- [Laradir](https://laradir.com)
|
||||
- [Localazy](https://localazy.com)
|
||||
- [Zapiet](https://www.zapiet.com)
|
||||
- [Akaunting](https://akaunting.com/?ref=pestphp)
|
||||
- [Codecourse](https://codecourse.com/?ref=pestphp)
|
||||
- [Laracasts](https://laracasts.com/?ref=pestphp)
|
||||
- [Laradir](https://laradir.com/?ref=pestphp)
|
||||
- [Localazy](https://localazy.com/?ref=pestphp)
|
||||
- [Stormlikes](https://www.stormlikes.net/?ref=pestphp)
|
||||
- [Zapiet](https://www.zapiet.com/?ref=pestphp)
|
||||
|
||||
Pest is an open-sourced software licensed under the **[MIT license](https://opensource.org/licenses/MIT)**.
|
||||
|
||||
@ -22,7 +22,7 @@
|
||||
"nunomaduro/collision": "^7.10.0|^8.0.1",
|
||||
"nunomaduro/termwind": "^1.15.1|^2.0.0",
|
||||
"pestphp/pest-plugin": "^2.1.1",
|
||||
"pestphp/pest-plugin-arch": "^2.5.0",
|
||||
"pestphp/pest-plugin-arch": "^2.6.1",
|
||||
"phpunit/phpunit": "^10.5.5"
|
||||
},
|
||||
"conflict": {
|
||||
@ -52,8 +52,8 @@
|
||||
},
|
||||
"require-dev": {
|
||||
"pestphp/pest-dev-tools": "^2.16.0",
|
||||
"pestphp/pest-plugin-type-coverage": "^2.6.0",
|
||||
"symfony/process": "^6.4.0|^7.0.0"
|
||||
"pestphp/pest-plugin-type-coverage": "^2.8.0",
|
||||
"symfony/process": "^6.4.0|^7.0.2"
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true,
|
||||
|
||||
@ -18,6 +18,7 @@ use Pest\Support\HigherOrderCallables;
|
||||
use Pest\Support\NullClosure;
|
||||
use Pest\Support\Str;
|
||||
use Pest\TestSuite;
|
||||
use PHPUnit\Framework\AssertionFailedError;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
@ -57,6 +58,14 @@ final class TestCall
|
||||
$this->testSuite->beforeEach->get($this->filename)[0]($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts that the test fails with the given message.
|
||||
*/
|
||||
public function fails(?string $message = null): self
|
||||
{
|
||||
return $this->throws(AssertionFailedError::class, $message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts that the test throws the given `$exceptionClass` when called.
|
||||
*/
|
||||
@ -199,12 +208,37 @@ final class TestCall
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Skips the current test on the given PHP version.
|
||||
*/
|
||||
public function skipOnPhp(string $version): self
|
||||
{
|
||||
if (mb_strlen($version) < 2) {
|
||||
throw new InvalidArgumentException('The version must start with [<] or [>].');
|
||||
}
|
||||
|
||||
if (str_starts_with($version, '>=') || str_starts_with($version, '<=')) {
|
||||
$operator = substr($version, 0, 2);
|
||||
$version = substr($version, 2);
|
||||
} elseif (str_starts_with($version, '>') || str_starts_with($version, '<')) {
|
||||
$operator = $version[0];
|
||||
$version = substr($version, 1);
|
||||
// ensure starts with number:
|
||||
} elseif (is_numeric($version[0])) {
|
||||
$operator = '==';
|
||||
} else {
|
||||
throw new InvalidArgumentException('The version must start with [<, >, <=, >=] or a number.');
|
||||
}
|
||||
|
||||
return $this->skip(version_compare(PHP_VERSION, $version, $operator), sprintf('This test is skipped on PHP [%s%s].', $operator, $version));
|
||||
}
|
||||
|
||||
/**
|
||||
* Skips the current test if the given test is running on Windows.
|
||||
*/
|
||||
public function skipOnWindows(): self
|
||||
{
|
||||
return $this->skipOn('Windows', 'This test is skipped on [Windows].');
|
||||
return $this->skipOnOs('Windows', 'This test is skipped on [Windows].');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -212,7 +246,7 @@ final class TestCall
|
||||
*/
|
||||
public function skipOnMac(): self
|
||||
{
|
||||
return $this->skipOn('Darwin', 'This test is skipped on [Mac].');
|
||||
return $this->skipOnOs('Darwin', 'This test is skipped on [Mac].');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -220,13 +254,13 @@ final class TestCall
|
||||
*/
|
||||
public function skipOnLinux(): self
|
||||
{
|
||||
return $this->skipOn('Linux', 'This test is skipped on [Linux].');
|
||||
return $this->skipOnOs('Linux', 'This test is skipped on [Linux].');
|
||||
}
|
||||
|
||||
/**
|
||||
* Skips the current test if the given test is running on the given operating systems.
|
||||
*/
|
||||
private function skipOn(string $osFamily, string $message): self
|
||||
private function skipOnOs(string $osFamily, string $message): self
|
||||
{
|
||||
return $osFamily === PHP_OS_FAMILY
|
||||
? $this->skip($message)
|
||||
|
||||
@ -6,7 +6,7 @@ namespace Pest;
|
||||
|
||||
function version(): string
|
||||
{
|
||||
return '2.29.1';
|
||||
return '2.31.0';
|
||||
}
|
||||
|
||||
function testDirectory(string $file = ''): string
|
||||
|
||||
@ -30,10 +30,12 @@ final class Cache implements HandlesArguments
|
||||
*/
|
||||
public function handleArguments(array $arguments): array
|
||||
{
|
||||
if (! $this->hasArgument('--cache-directory', $arguments)) {
|
||||
$arguments = $this->pushArgument(
|
||||
sprintf('--cache-directory=%s', realpath(self::TEMPORARY_FOLDER)),
|
||||
$arguments
|
||||
);
|
||||
}
|
||||
|
||||
if (! $this->hasArgument('--parallel', $arguments)) {
|
||||
return $this->pushArgument('--cache-result', $arguments);
|
||||
|
||||
@ -16,7 +16,17 @@ trait HandleArguments
|
||||
*/
|
||||
public function hasArgument(string $argument, array $arguments): bool
|
||||
{
|
||||
return in_array($argument, $arguments, true);
|
||||
foreach ($arguments as $arg) {
|
||||
if ($arg === $argument) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (str_starts_with($arg, "$argument=")) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
|
||||
Pest Testing Framework 2.29.1.
|
||||
Pest Testing Framework 2.31.0.
|
||||
|
||||
USAGE: pest <file> [options]
|
||||
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
|
||||
Pest Testing Framework 2.29.1.
|
||||
Pest Testing Framework 2.31.0.
|
||||
|
||||
|
||||
@ -898,6 +898,14 @@
|
||||
✓ it skips with falsy closure condition
|
||||
✓ it can be used in higher order tests
|
||||
|
||||
PASS Tests\Features\Fail
|
||||
✓ it may fail
|
||||
✓ it may fail with the given message
|
||||
|
||||
PASS Tests\Features\Fails
|
||||
✓ it may fail
|
||||
✓ it may fail with the given message
|
||||
|
||||
WARN Tests\Features\Helpers
|
||||
✓ it can set/get properties on $this
|
||||
! it gets null if property do not exist → Undefined property Tests\Features\Helpers::$wqdwqdqw
|
||||
@ -1085,6 +1093,12 @@
|
||||
- it can use something in the test case as a condition → This test was skipped
|
||||
- it can user higher order callables and skip
|
||||
|
||||
WARN Tests\Features\SkipOnPhp
|
||||
✓ it can run on php version
|
||||
- it can skip on specific php version → This test is skipped on PHP [==8.3.1].
|
||||
✓ it can run on specific php version
|
||||
- it can skip on php versions depending on constraint → This test is skipped on PHP [>=7.4.0].
|
||||
|
||||
PASS Tests\Features\Test
|
||||
✓ a test
|
||||
✓ higher order message test
|
||||
@ -1204,6 +1218,14 @@
|
||||
PASS Tests\Unit\Overrides\ThrowableBuilder
|
||||
✓ collision editor can be added to the stack trace
|
||||
|
||||
PASS Tests\Unit\Plugins\Concerns\HandleArguments
|
||||
✓ method hasArgument with ('--long-argument', true)
|
||||
✓ method hasArgument with ('-a', true)
|
||||
✓ method hasArgument with ('--with-equal-sign', true)
|
||||
✓ method hasArgument with ('someValue', true)
|
||||
✓ method hasArgument with ('--a', false)
|
||||
✓ method hasArgument with ('--undefined-argument', false)
|
||||
|
||||
PASS Tests\Unit\Plugins\Environment
|
||||
✓ environment is set to CI when --ci option is used
|
||||
✓ environment is set to Local when --ci option is not used
|
||||
@ -1356,4 +1378,4 @@
|
||||
WARN Tests\Visual\Version
|
||||
- visual snapshot of help command output
|
||||
|
||||
Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 19 skipped, 966 passed (2286 assertions)
|
||||
Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 21 skipped, 978 passed (2304 assertions)
|
||||
11
tests/Features/Fail.php
Normal file
11
tests/Features/Fail.php
Normal file
@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
use PHPUnit\Framework\AssertionFailedError;
|
||||
|
||||
it('may fail', function () {
|
||||
$this->fail();
|
||||
})->throws(AssertionFailedError::class);
|
||||
|
||||
it('may fail with the given message', function () {
|
||||
$this->fail('this is a failure');
|
||||
})->throws(AssertionFailedError::class, 'this is a failure');
|
||||
9
tests/Features/Fails.php
Normal file
9
tests/Features/Fails.php
Normal file
@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
it('may fail', function () {
|
||||
$this->fail();
|
||||
})->fails();
|
||||
|
||||
it('may fail with the given message', function () {
|
||||
$this->fail('this is a failure');
|
||||
})->fails('this is a failure');
|
||||
17
tests/Features/SkipOnPhp.php
Normal file
17
tests/Features/SkipOnPhp.php
Normal file
@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
it('can run on php version')
|
||||
->skipOnPhp('<=7.4.0')
|
||||
->assertTrue(true);
|
||||
|
||||
it('can skip on specific php version')
|
||||
->skipOnPhp(PHP_VERSION)
|
||||
->assertTrue(false);
|
||||
|
||||
it('can run on specific php version')
|
||||
->skipOnPhp('7.4.0')
|
||||
->assertTrue(true);
|
||||
|
||||
it('can skip on php versions depending on constraint')
|
||||
->skipOnPhp('>=7.4.0')
|
||||
->assertTrue(false);
|
||||
26
tests/Unit/Plugins/Concerns/HandleArguments.php
Normal file
26
tests/Unit/Plugins/Concerns/HandleArguments.php
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
use Pest\Plugins\Concerns\HandleArguments;
|
||||
|
||||
test('method hasArgument', function (string $argument, bool $expectedResult) {
|
||||
$obj = new class
|
||||
{
|
||||
use HandleArguments;
|
||||
};
|
||||
|
||||
$arguments = [
|
||||
'--long-argument',
|
||||
'someValue',
|
||||
'-a',
|
||||
'--with-equal-sign=1337',
|
||||
];
|
||||
|
||||
expect($obj->hasArgument($argument, $arguments))->toBe($expectedResult);
|
||||
})->with([
|
||||
['--long-argument', true],
|
||||
['-a', true],
|
||||
['--with-equal-sign', true],
|
||||
['someValue', true],
|
||||
['--a', false],
|
||||
['--undefined-argument', false],
|
||||
]);
|
||||
@ -16,7 +16,7 @@ $run = function () {
|
||||
|
||||
test('parallel', function () use ($run) {
|
||||
expect($run('--exclude-group=integration'))
|
||||
->toContain('Tests: 1 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 15 skipped, 953 passed (2267 assertions)')
|
||||
->toContain('Tests: 1 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 17 skipped, 965 passed (2285 assertions)')
|
||||
->toContain('Parallel: 3 processes');
|
||||
})->skipOnWindows();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user