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;
use Pest\Arch\Contracts\ArchExpectation;
use Pest\Expectation;
/**
* @internal
*/
abstract class AbstractPreset
{
/**
* The expectations.
*
* @var array<int, ArchExpectation>
*/
protected array $expectations = [];
/**
* Creates a new preset instance.
*
* @param array<int, string> $userNamespaces
* @param array<int, ArchExpectation> $expectations
*/
final public function __construct(// @phpstan-ignore-line
protected array $userNamespaces,
protected array $expectations = [],
final public function __construct(
private readonly array $userNamespaces,
) {
//
}
@ -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.
*/

View File

@ -7,7 +7,7 @@ namespace Pest\ArchPresets;
/**
* @internal
*/
final class Base extends AbstractPreset
final class Php extends AbstractPreset
{
/**
* 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;
use Pest\Arch\Contracts\ArchExpectation;
use Pest\Expectation;
/**
* @internal
*/
@ -14,6 +17,10 @@ final class Security extends AbstractPreset
*/
public function execute(): void
{
$this->eachUserNamespace(
fn (Expectation $namespace): ArchExpectation => $namespace->not->toHaveFileSystemPermissions('0777'),
);
$this->expectations[] = expect([
'md5',
'sha1',
@ -37,11 +44,5 @@ final class Security extends AbstractPreset
'dl',
'assert',
])->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;
use Pest\Arch\Contracts\ArchExpectation;
use Pest\Expectation;
/**
* @internal
*/
@ -14,14 +17,15 @@ final class Strict extends AbstractPreset
*/
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([
'sleep',
'usleep',
])->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".
*/
public function todo(
array|string $note = null,
array|string $issue = null,
array|string $assignee = null,
array|string $pr = null,
public function todo(// @phpstan-ignore-line
array|string|null $note = null,
array|string|null $assignee = null,
array|string|null $issue = null,
array|string|null $pr = null,
): self {
$this->skip('__TODO__');
@ -412,6 +412,8 @@ final class TestCall
/**
* Sets the test assignee(s).
*
* @param array<int, string>|string $assignee
*/
public function assignee(array|string $assignee): self
{

View File

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

View File

@ -6,8 +6,8 @@ namespace Pest;
use Pest\Arch\Support\Composer;
use Pest\ArchPresets\AbstractPreset;
use Pest\ArchPresets\Base;
use Pest\ArchPresets\Laravel;
use Pest\ArchPresets\Php;
use Pest\ArchPresets\Security;
use Pest\ArchPresets\Strict;
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
{
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)) !== [];
}
}