Compare commits

..

30 Commits

Author SHA1 Message Date
7799500d06 release: v2.29.0 2023-12-27 11:12:01 +00:00
c099991cd9 Merge pull request #1044 from nhrrs/fix-typo
Fix typo in `toBeClass`
2023-12-23 02:03:57 +00:00
e27d2e7394 Fix typo in toBeClass 2023-12-23 00:36:41 +00:00
8f738f5d49 Revert "Merge pull request #919 from WendellAdriel/feature/coverage-errors-only-flag-2"
This reverts commit 1e2ca40c5b, reversing
changes made to 4522cb5dcb.
2023-12-17 22:03:15 +00:00
1e2ca40c5b Merge pull request #919 from WendellAdriel/feature/coverage-errors-only-flag-2
[2.x] Print only files below the min coverage
2023-12-17 21:56:14 +00:00
4522cb5dcb Merge pull request #1014 from mjsafarali/chore/docker-file-optimization
[2.x] Dockerfile Optimization
2023-12-17 21:39:38 +00:00
9ee4191020 release: v2.28.1 2023-12-15 11:42:34 +00:00
cc65009d0a chore: adds "phpunit/phpunit": "^10.5.3" support 2023-12-15 11:42:23 +00:00
453133d382 chore: code style changes 2023-12-15 11:42:09 +00:00
dd0dddffd4 docs: updates sponsors 2023-12-11 12:05:58 +00:00
9a8f6e6414 release: v2.28.0 2023-12-05 19:06:22 +00:00
4ece95a040 tests: uses arch function 2023-12-05 19:06:11 +00:00
0cc09380bc chore: bumps dependencies 2023-12-05 19:06:03 +00:00
809fb855de release: v2.27.0 2023-12-04 11:11:35 +00:00
aa14f2e200 chore: uses specific symfony versions 2023-12-04 11:08:41 +00:00
e319bdb6d3 chore: fixes missing caret on workflow 2023-12-04 11:04:08 +00:00
fb7340b556 chore: fixes exclude key and add fail-fast 2023-12-04 11:02:41 +00:00
0528fec083 chore: fixes duplicated key name on workflow 2023-12-04 10:59:58 +00:00
1cbaaf6e12 chore: allows symfony 7 on composer 2023-12-04 10:55:34 +00:00
dc862f60b2 chore: adjusts workflow 2023-12-04 10:54:11 +00:00
ff04d54247 chore: adjusts workflow name 2023-12-04 10:40:29 +00:00
330cf05177 chore: adjusts workflow 2023-12-04 10:38:37 +00:00
42b5fa914c Fixes integration tests 2023-12-04 10:15:55 +00:00
3b1026b7d7 chore: fixes workflow name 2023-12-04 10:14:51 +00:00
b6151e0d01 chore: tests against Symonfy 7 2023-12-04 10:10:36 +00:00
d6db2c13c1 Merge pull request #1025 from xiCO2k/fix/allow-todo-argument
[2.x] Allow `--todo` argument.
2023-11-30 10:47:10 +00:00
07b6ff6c04 Update bin/pest
Co-authored-by: Owen Voke <development@voke.dev>
2023-11-30 07:49:24 +00:00
ac5da9e3f7 feat: Allow --todo argument. 2023-11-30 00:32:23 +00:00
4f35dbc607 chore: optimized version of the Dockerfile 2023-11-18 14:57:03 +03:30
8ea7b2b802 Add errors-only flag 2023-08-18 10:13:28 +01:00
26 changed files with 102 additions and 101 deletions

View File

@ -1,42 +0,0 @@
name: Integration Tests
on:
push:
schedule:
- cron: '0 0 * * *'
jobs:
ci:
if: github.event_name != 'schedule' || github.repository == 'pestphp/pest'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
php: ['8.1', '8.2']
dependency-version: [prefer-lowest, prefer-stable]
name: PHP ${{ matrix.php }} - ${{ matrix.os }} - ${{ matrix.dependency-version }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
tools: composer:v2
coverage: none
- name: Setup Problem Matches
run: |
echo "::add-matcher::${{ runner.tool_cache }}/php.json"
echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
- name: Install PHP dependencies
run: composer update --${{ matrix.dependency-version }} --no-interaction --no-progress --ansi
- name: Integration Tests
run: composer test:integration

View File

@ -13,6 +13,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
fail-fast: true
matrix:
dependency-version: [prefer-lowest, prefer-stable]

View File

@ -6,18 +6,23 @@ on:
schedule:
- cron: '0 0 * * *'
jobs:
ci:
tests:
if: github.event_name != 'schedule' || github.repository == 'pestphp/pest'
runs-on: ${{ matrix.os }}
strategy:
fail-fast: true
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
symfony: ['6.4.0', '7.0.1']
php: ['8.1', '8.2', '8.3']
dependency-version: [prefer-lowest, prefer-stable]
dependency_version: [prefer-lowest, prefer-stable]
exclude:
- php: '8.1'
symfony: '7.0.1'
name: PHP ${{ matrix.php }} - ${{ matrix.os }} - ${{ matrix.dependency-version }}
name: PHP ${{ matrix.php }} - Symfony ^${{ matrix.symfony }} - ${{ matrix.os }} - ${{ matrix.dependency_version }}
steps:
- name: Checkout
@ -36,11 +41,13 @@ jobs:
echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
- name: Install PHP dependencies
run: composer update --${{ matrix.dependency-version }} --no-interaction --no-progress --ansi
run: composer update --${{ matrix.dependency_version }} --no-interaction --no-progress --ansi --with="symfony/console:^${{ matrix.symfony }}"
- name: Unit Tests
run: composer test:unit
- name: Unit Tests in Parallel
- name: Parallel Tests
run: composer test:parallel
- name: Integration Tests
run: composer test:integration

View File

@ -22,17 +22,16 @@ We cannot thank our sponsors enough for their incredible support in funding Pest
### Platinum Sponsors
- **[Forge](https://forge.laravel.com)**
- **[LoadForge](https://loadforge.com)**
- **[Spatie](https://spatie.be)**
- **[Worksome](https://www.worksome.com/)**
### Premium Sponsors
- [Akaunting](https://akaunting.com)
- [Codecourse](https://codecourse.com/)
- [Laracasts](https://laracasts.com/)
- [Codecourse](https://codecourse.com)
- [Laracasts](https://laracasts.com)
- [Laradir](https://laradir.com)
- [Localazy](https://localazy.com)
- [Meema](https://meema.io)
- [Zapiet](https://www.zapiet.com)
Pest is an open-sourced software licensed under the **[MIT license](https://opensource.org/licenses/MIT)**.

View File

@ -38,7 +38,7 @@ use Symfony\Component\Console\Output\ConsoleOutput;
unset($args[$key]);
}
if ($value === '--todos') {
if (in_array($value, ['--todo', '--todos'], true)) {
$todo = true;
unset($args[$key]);
}

View File

@ -19,14 +19,14 @@
"require": {
"php": "^8.1.0",
"brianium/paratest": "^7.3.1",
"nunomaduro/collision": "^7.10.0|^8.0.0",
"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.4.1",
"phpunit/phpunit": "^10.4.2"
"pestphp/pest-plugin-arch": "^2.5.0",
"phpunit/phpunit": "^10.5.3"
},
"conflict": {
"phpunit/phpunit": ">10.4.2",
"phpunit/phpunit": ">10.5.3",
"sebastian/exporter": "<5.1.0",
"webmozart/assert": "<1.11.0"
},
@ -52,8 +52,8 @@
},
"require-dev": {
"pestphp/pest-dev-tools": "^2.16.0",
"pestphp/pest-plugin-type-coverage": "^2.5.0",
"symfony/process": "^6.3.4"
"pestphp/pest-plugin-type-coverage": "^2.6.0",
"symfony/process": "^6.4.0|^7.0.0"
},
"minimum-stability": "dev",
"prefer-stable": true,

View File

@ -1,21 +1,16 @@
ARG PHP=8.1
FROM php:${PHP}-cli-alpine
RUN apk update \
&& apk add zip libzip-dev icu-dev git
RUN apk update && apk add \
zip libzip-dev icu-dev git \
RUN docker-php-ext-configure zip
RUN docker-php-ext-install zip
RUN docker-php-ext-enable zip
RUN docker-php-ext-configure zip intl
RUN docker-php-ext-install zip intl
RUN docker-php-ext-enable zip intl
RUN docker-php-ext-configure intl
RUN docker-php-ext-install intl
RUN docker-php-ext-enable intl
RUN apk add --no-cache $PHPIZE_DEPS linux-headers
RUN apk add --no-cache linux-headers
RUN pecl install xdebug
RUN docker-php-ext-enable xdebug
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html

View File

@ -91,7 +91,7 @@ final class DefaultResultCache implements ResultCache
*/
private array $times = [];
public function __construct(string $filepath = null)
public function __construct(?string $filepath = null)
{
if ($filepath !== null && is_dir($filepath)) {
$filepath .= DIRECTORY_SEPARATOR.self::DEFAULT_RESULT_CACHE_FILENAME;

View File

@ -190,7 +190,7 @@ final class Expectation
*
* @return EachExpectation<TValue>
*/
public function each(callable $callback = null): EachExpectation
public function each(?callable $callback = null): EachExpectation
{
if (! is_iterable($this->value)) {
throw new BadMethodCallException('Expectation value is not iterable.');
@ -535,7 +535,7 @@ final class Expectation
}
/**
* Asserts that the given expectation targets is an class.
* Asserts that the given expectation target is a class.
*/
public function toBeClass(): ArchExpectation
{

View File

@ -55,7 +55,7 @@ if (! function_exists('beforeEach')) {
*
* @return HigherOrderTapProxy<Expectable|TestCall|TestCase>|Expectable|TestCall|TestCase|mixed
*/
function beforeEach(Closure $closure = null): BeforeEachCall
function beforeEach(?Closure $closure = null): BeforeEachCall
{
$filename = Backtrace::file();
@ -116,7 +116,7 @@ if (! function_exists('test')) {
*
* @return Expectable|TestCall|TestCase|mixed
*/
function test(string $description = null, Closure $closure = null): HigherOrderTapProxy|TestCall
function test(?string $description = null, ?Closure $closure = null): HigherOrderTapProxy|TestCall
{
if ($description === null && TestSuite::getInstance()->test instanceof \PHPUnit\Framework\TestCase) {
return new HigherOrderTapProxy(TestSuite::getInstance()->test);
@ -136,7 +136,7 @@ if (! function_exists('it')) {
*
* @return Expectable|TestCall|TestCase|mixed
*/
function it(string $description, Closure $closure = null): TestCall
function it(string $description, ?Closure $closure = null): TestCall
{
$description = sprintf('it %s', $description);
@ -171,7 +171,7 @@ if (! function_exists('afterEach')) {
*
* @return Expectable|HigherOrderTapProxy<Expectable|TestCall|TestCase>|TestCall|mixed
*/
function afterEach(Closure $closure = null): AfterEachCall
function afterEach(?Closure $closure = null): AfterEachCall
{
$filename = Backtrace::file();

View File

@ -106,7 +106,7 @@ final class ServiceMessage
]);
}
public static function testIgnored(string $name, string $message, string $details = null): self
public static function testIgnored(string $name, string $message, ?string $details = null): self
{
return new self('testIgnored', [
'name' => $name,

View File

@ -920,7 +920,7 @@ final class Expectation
* @param (Closure(Throwable): mixed)|string $exception
* @return self<TValue>
*/
public function toThrow(callable|string|Throwable $exception, string $exceptionMessage = null, string $message = ''): self
public function toThrow(callable|string|Throwable $exception, ?string $exceptionMessage = null, string $message = ''): self
{
$callback = NullClosure::create();

View File

@ -35,7 +35,7 @@ final class AfterEachCall
public function __construct(
private readonly TestSuite $testSuite,
private readonly string $filename,
Closure $closure = null
?Closure $closure = null
) {
$this->closure = $closure instanceof Closure ? $closure : NullClosure::create();

View File

@ -40,7 +40,7 @@ final class BeforeEachCall
public function __construct(
public readonly TestSuite $testSuite,
private readonly string $filename,
Closure $closure = null
?Closure $closure = null
) {
$this->closure = $closure instanceof Closure ? $closure : NullClosure::create();

View File

@ -45,8 +45,8 @@ final class TestCall
public function __construct(
private readonly TestSuite $testSuite,
private readonly string $filename,
string $description = null,
Closure $closure = null
?string $description = null,
?Closure $closure = null
) {
$this->testCaseMethod = new TestCaseMethodFactory($filename, $description, $closure);
@ -60,7 +60,7 @@ final class TestCall
/**
* Asserts that the test throws the given `$exceptionClass` when called.
*/
public function throws(string|int $exception, string $exceptionMessage = null, int $exceptionCode = null): self
public function throws(string|int $exception, ?string $exceptionMessage = null, ?int $exceptionCode = null): self
{
if (is_int($exception)) {
$exceptionCode = $exception;
@ -92,7 +92,7 @@ final class TestCall
*
* @param (callable(): bool)|bool $condition
*/
public function throwsIf(callable|bool $condition, string|int $exception, string $exceptionMessage = null, int $exceptionCode = null): self
public function throwsIf(callable|bool $condition, string|int $exception, ?string $exceptionMessage = null, ?int $exceptionCode = null): self
{
$condition = is_callable($condition)
? $condition
@ -110,7 +110,7 @@ final class TestCall
*
* @param (callable(): bool)|bool $condition
*/
public function throwsUnless(callable|bool $condition, string|int $exception, string $exceptionMessage = null, int $exceptionCode = null): self
public function throwsUnless(callable|bool $condition, string|int $exception, ?string $exceptionMessage = null, ?int $exceptionCode = null): self
{
$condition = is_callable($condition)
? $condition
@ -375,7 +375,7 @@ final class TestCall
*
* @param array<int, mixed>|null $arguments
*/
private function addChain(string $file, int $line, string $name, array $arguments = null): self
private function addChain(string $file, int $line, string $name, ?array $arguments = null): self
{
$exporter = Exporter::default();

View File

@ -6,7 +6,7 @@ namespace Pest;
function version(): string
{
return '2.26.0';
return '2.29.0';
}
function testDirectory(string $file = ''): string

View File

@ -45,7 +45,7 @@ final class Environment implements HandlesArguments
/**
* Gets the environment name.
*/
public static function name(string $name = null): string
public static function name(?string $name = null): string
{
if (is_string($name)) {
self::$name = $name;

View File

@ -34,7 +34,7 @@ final class Parallel implements HandlesArguments
/**
* @var string[]
*/
private const UNSUPPORTED_ARGUMENTS = ['--todos', '--retry'];
private const UNSUPPORTED_ARGUMENTS = ['--todo', '--todos', '--retry'];
/**
* Whether the given command line arguments indicate that the test suite should be run in parallel.

View File

@ -41,7 +41,7 @@ final class Exporter
*
* @param array<int|string, mixed> $data
*/
public function shortenedRecursiveExport(array &$data, Context $context = null): string
public function shortenedRecursiveExport(array &$data, ?Context $context = null): string
{
$result = [];
$array = $data;

View File

@ -87,8 +87,8 @@ final class TestSuite
* Returns the current instance of the test suite.
*/
public static function getInstance(
string $rootPath = null,
string $testPath = null,
?string $rootPath = null,
?string $testPath = null,
): TestSuite {
if (is_string($rootPath) && is_string($testPath)) {
self::$instance = new TestSuite($rootPath, $testPath);

View File

@ -1,5 +1,5 @@
Pest Testing Framework 2.26.0.
Pest Testing Framework 2.29.0.
USAGE: pest <file> [options]

View File

@ -1,3 +1,3 @@
Pest Testing Framework 2.26.0.
Pest Testing Framework 2.29.0.

View File

@ -1348,10 +1348,12 @@
- visual snapshot of team city with ('SuccessOnly.php')
PASS Tests\Visual\Todo
✓ todos
✓ todos in parallel
✓ todo
✓ todo in parallel
WARN Tests\Visual\Version
- visual snapshot of help command output
Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 19 skipped, 964 passed (2282 assertions)
Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 19 skipped, 966 passed (2286 assertions)

View File

@ -0,0 +1,31 @@
TODO Tests\Features\BeforeEachProxiesToTestCallWithTodo - 4 todos
↓ is marked as todo 1
↓ is marked as todo 2
↓ is marked as todo 3
↓ shouldBeMarkedAsTodo
TODO Tests\Features\DatasetsTests - 1 todo
↓ forbids to define tests in Datasets dirs and Datasets.php files
TODO Tests\Features\Describe - 5 todos
↓ todo
↓ todo on hook → should not fail
↓ todo on hook → should run
↓ todo on describe → should not fail
↓ todo on describe → should run
TODO Tests\Features\Todo - 3 todos
↓ something todo later
↓ something todo later chained
↓ something todo later chained and with function body
PASS Tests\CustomTestCase\ChildTest
✓ override method
PASS Tests\CustomTestCase\ExecutedTest
✓ that gets executed
PASS Tests\CustomTestCase\ParentTest
✓ override method
Tests: 13 todos, 3 passed (3 assertions)

View File

@ -2,12 +2,12 @@
use Pest\Expectation;
test('globals')
arch('globals')
->expect(['dd', 'dump', 'ray', 'die', 'var_dump', 'sleep'])
->not->toBeUsed()
->ignoring(Expectation::class);
test('dependencies')
arch('dependencies')
->expect('Pest')
->toOnlyUse([
'dd',
@ -24,7 +24,7 @@ test('dependencies')
'Symfony\Component\Process',
])->ignoring(['Composer', 'PHPUnit', 'SebastianBergmann']);
test('contracts')
arch('contracts')
->expect('Pest\Contracts')
->toOnlyUse([
'NunoMaduro\Collision\Contracts',

View File

@ -26,10 +26,18 @@ $snapshot = function ($name) {
]));
};
test('todos', function () use ($run, $snapshot) {
expect($run('--todos', false))->toContain($snapshot('todos'));
})->skipOnWindows();
test('todos in parallel', function () use ($run, $snapshot) {
expect($run('--todos', true))->toContain($snapshot('todos'));
})->skipOnWindows();
test('todo', function () use ($run, $snapshot) {
expect($run('--todos', false))->toContain($snapshot('todo'));
expect($run('--todo', false))->toContain($snapshot('todo'));
})->skipOnWindows();
test('todo in parallel', function () use ($run, $snapshot) {
expect($run('--todos', true))->toContain($snapshot('todo'));
expect($run('--todo', true))->toContain($snapshot('todo'));
})->skipOnWindows();