feat(presets): reworks code

This commit is contained in:
Nuno Maduro
2024-08-07 11:08:29 +01:00
parent 17058d1709
commit 9353015691
10 changed files with 80 additions and 27 deletions

View File

@ -5,21 +5,27 @@ declare(strict_types=1);
namespace Pest\ArchPresets; namespace Pest\ArchPresets;
use Pest\Arch\Contracts\ArchExpectation; use Pest\Arch\Contracts\ArchExpectation;
use Pest\Expectation;
/** /**
* @internal * @internal
*/ */
abstract class AbstractPreset abstract class AbstractPreset
{ {
/**
* The expectations.
*
* @var array<int, ArchExpectation>
*/
protected array $expectations = [];
/** /**
* Creates a new preset instance. * Creates a new preset instance.
* *
* @param array<int, string> $userNamespaces * @param array<int, string> $userNamespaces
* @param array<int, ArchExpectation> $expectations
*/ */
final public function __construct(// @phpstan-ignore-line final public function __construct(
protected array $userNamespaces, private readonly array $userNamespaces,
protected array $expectations = [],
) { ) {
// //
} }
@ -44,6 +50,20 @@ abstract class AbstractPreset
); );
} }
/**
* Runs the given callback for each namespace.
*
* @param callable(Expectation<string|null>): ArchExpectation ...$callbacks
*/
final public function eachUserNamespace(callable ...$callbacks): void
{
foreach ($this->userNamespaces as $namespace) {
foreach ($callbacks as $callback) {
$this->expectations[] = $callback(expect($namespace));
}
}
}
/** /**
* Flushes the expectations. * Flushes the expectations.
*/ */

View File

@ -7,7 +7,7 @@ namespace Pest\ArchPresets;
/** /**
* @internal * @internal
*/ */
final class Base extends AbstractPreset final class Php extends AbstractPreset
{ {
/** /**
* Executes the arch preset. * Executes the arch preset.

View File

@ -0,0 +1,25 @@
<?php
declare(strict_types=1);
namespace Pest\ArchPresets;
use Pest\Arch\Contracts\ArchExpectation;
use Pest\Expectation;
/**
* @internal
*/
final class Relaxed extends AbstractPreset
{
/**
* Executes the arch preset.
*/
public function execute(): void
{
$this->eachUserNamespace(
fn (Expectation $namespace): ArchExpectation => $namespace->not->toUseStrictTypes(),
fn (Expectation $namespace): ArchExpectation => $namespace->classes()->not->toBeFinal(),
);
}
}

View File

@ -4,6 +4,9 @@ declare(strict_types=1);
namespace Pest\ArchPresets; namespace Pest\ArchPresets;
use Pest\Arch\Contracts\ArchExpectation;
use Pest\Expectation;
/** /**
* @internal * @internal
*/ */
@ -14,6 +17,10 @@ final class Security extends AbstractPreset
*/ */
public function execute(): void public function execute(): void
{ {
$this->eachUserNamespace(
fn (Expectation $namespace): ArchExpectation => $namespace->not->toHaveFileSystemPermissions('0777'),
);
$this->expectations[] = expect([ $this->expectations[] = expect([
'md5', 'md5',
'sha1', 'sha1',
@ -37,11 +44,5 @@ final class Security extends AbstractPreset
'dl', 'dl',
'assert', 'assert',
])->not->toBeUsed(); ])->not->toBeUsed();
foreach ($this->userNamespaces as $namespace) {
$this->expectations[] = expect($namespace)
->not
->toHaveFileSystemPermissions('0777');
}
} }
} }

View File

@ -4,6 +4,9 @@ declare(strict_types=1);
namespace Pest\ArchPresets; namespace Pest\ArchPresets;
use Pest\Arch\Contracts\ArchExpectation;
use Pest\Expectation;
/** /**
* @internal * @internal
*/ */
@ -14,14 +17,15 @@ final class Strict extends AbstractPreset
*/ */
public function execute(): void public function execute(): void
{ {
$this->eachUserNamespace(
fn (Expectation $namespace): ArchExpectation => $namespace->toUseStrictTypes(),
fn (Expectation $namespace): ArchExpectation => $namespace->classes()->toBeFinal(),
fn (Expectation $namespace): ArchExpectation => $namespace->classes()->not->toBeAbstract(),
);
$this->expectations[] = expect([ $this->expectations[] = expect([
'sleep', 'sleep',
'usleep', 'usleep',
])->not->toBeUsed(); ])->not->toBeUsed();
foreach ($this->userNamespaces as $namespace) {
$this->expectations[] = expect($namespace)
->toUseStrictTypes();
}
} }
} }

View File

@ -355,11 +355,11 @@ final class TestCall
/** /**
* Sets the test as "todo". * Sets the test as "todo".
*/ */
public function todo( public function todo(// @phpstan-ignore-line
array|string $note = null, array|string|null $note = null,
array|string $issue = null, array|string|null $assignee = null,
array|string $assignee = null, array|string|null $issue = null,
array|string $pr = null, array|string|null $pr = null,
): self { ): self {
$this->skip('__TODO__'); $this->skip('__TODO__');
@ -412,6 +412,8 @@ final class TestCall
/** /**
* Sets the test assignee(s). * Sets the test assignee(s).
*
* @param array<int, string>|string $assignee
*/ */
public function assignee(array|string $assignee): self public function assignee(array|string $assignee): self
{ {

View File

@ -405,6 +405,7 @@ final class WrapperRunner implements RunnerInterface
} }
$testSuite = (new LogMerger)->merge($this->junitFiles); $testSuite = (new LogMerger)->merge($this->junitFiles);
assert($testSuite instanceof \ParaTest\JUnit\TestSuite);
(new Writer)->write( (new Writer)->write(
$testSuite, $testSuite,
$this->options->configuration->logfileJunit(), $this->options->configuration->logfileJunit(),

View File

@ -6,8 +6,8 @@ namespace Pest;
use Pest\Arch\Support\Composer; use Pest\Arch\Support\Composer;
use Pest\ArchPresets\AbstractPreset; use Pest\ArchPresets\AbstractPreset;
use Pest\ArchPresets\Base;
use Pest\ArchPresets\Laravel; use Pest\ArchPresets\Laravel;
use Pest\ArchPresets\Php;
use Pest\ArchPresets\Security; use Pest\ArchPresets\Security;
use Pest\ArchPresets\Strict; use Pest\ArchPresets\Strict;
use Pest\PendingCalls\TestCall; use Pest\PendingCalls\TestCall;
@ -34,11 +34,11 @@ final class Preset
} }
/** /**
* Uses the Pest base preset and returns the test call instance. * Uses the Pest php preset and returns the test call instance.
*/ */
public function base(): Base public function php(): Php
{ {
return $this->executePreset(new Base($this->baseNamespaces())); return $this->executePreset(new Php($this->baseNamespaces()));
} }
/** /**

View File

@ -22,6 +22,6 @@ final readonly class AssigneeTestCaseFilter implements TestCaseMethodFilter
*/ */
public function accept(TestCaseMethodFactory $factory): bool public function accept(TestCaseMethodFactory $factory): bool
{ {
return array_filter($factory->assignees, fn ($assignee): bool => str_starts_with($assignee, $this->assignee)) !== []; return array_filter($factory->assignees, fn (string $assignee): bool => str_starts_with($assignee, $this->assignee)) !== [];
} }
} }

View File

@ -2,7 +2,7 @@
use Pest\Expectation; use Pest\Expectation;
arch()->preset()->base()->ignoring([ arch()->preset()->php()->ignoring([
Expectation::class, Expectation::class,
'debug_backtrace', 'debug_backtrace',
'var_export', 'var_export',