1
0
Fork 0
mirror of synced 2024-06-03 11:24:48 +12:00

feat: custom eventually assertion

This commit is contained in:
loks0n 2024-02-25 16:37:31 +00:00
parent 5bc6018c7c
commit b3fc8eb510
2 changed files with 68 additions and 0 deletions

View file

@ -0,0 +1,14 @@
<?php
namespace Appwrite\Tests;
use PHPUnit\Framework\Assert;
use Appwrite\Tests\Async\Eventually;
trait Async
{
public static function assertEventually(callable $probe, int $timeoutMilliseconds = 10000, int $waitMilliseconds = 500): void
{
Assert::assertThat($probe, new Eventually($timeoutMilliseconds, $waitMilliseconds));
}
}

View file

@ -0,0 +1,54 @@
<?php
namespace Appwrite\Tests\Async;
use PHPUnit\Framework\Constraint\Constraint;
final class Eventually extends Constraint
{
private int $timeoutMs;
private int $waitMs;
public function __construct(int $timeoutMs = 10000, int $waitMs = 500)
{
$this->timeoutMs = $timeoutMs;
$this->waitMs = $waitMs;
}
public function evaluate(mixed $probe, string $description = '', bool $returnResult = false): ?bool
{
if (!is_callable($probe)) {
throw new \Exception('Probe must be a callable');
}
$start = microtime(true);
$lastException = null;
do {
try {
$probe();
return true;
} catch (\Exception $exception) {
$lastException = $exception;
}
usleep($this->waitMs * 1000);
} while (microtime(true) - $start < $this->timeoutMs / 1000);
if ($returnResult) {
return false;
}
throw $lastException;
}
protected function failureDescription(mixed $other): string
{
return 'the given probe was satisfied within the provided timeout';
}
public function toString(): string
{
return 'Eventually';
}
}