appwrite/tests/extensions/Async/Eventually.php

53 lines
1.2 KiB
PHP
Raw Normal View History

2024-09-18 13:29:44 +00:00
<?php
namespace Appwrite\Tests\Async;
use Appwrite\Tests\Async\Exceptions\Critical;
2024-09-18 13:29:44 +00:00
use PHPUnit\Framework\Constraint\Constraint;
final class Eventually extends Constraint
{
2024-09-25 11:32:09 +00:00
public function __construct(private int $timeoutMs, private int $waitMs)
2024-09-18 13:29:44 +00:00
{
}
chore: bump PHPStan to level 4 and fix all new errors Raises `phpstan.neon` level from 3 to 4 and fixes the 549 new errors that level 4 surfaces across 157 files. Fixes are root-cause — no `@phpstan-ignore`, no `@var` casts, no baseline entries, no widened types. A handful of latent bugs were fixed along the way: - `app/controllers/general.php`: path-traversal guard was negating `\substr(...)` before the strict comparison (`!\substr(...) === $base` was always `false === $base`). Rewritten as `\substr(...) !== $base`. - `src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php` and `.../TablesDB/Logs/XList.php`: were importing the raw Matomo `DeviceDetector` (whose `getDevice()` returns `?int`) but treating the result as an array with `deviceName/deviceBrand/deviceModel` keys. Swapped to `Appwrite\Detector\Detector`, matching the wrapper already used a few lines below for `$os`/`$client`. - `src/Appwrite/Platform/Modules/Functions/Workers/Builds.php`: a match key was checking `$resourceKey === 'functions'` when `$resourceKey` is `'functionId'|'siteId'` — always false. Switched to the intended `$resource->getCollection() === 'functions'` check. - `src/Appwrite/OpenSSL/OpenSSL.php`: `encrypt()` return type tightened to `string|false` to match `openssl_encrypt`; this lets callers' `=== false` error handling remain meaningful. - `app/controllers/api/messaging.php`: removed a dead `array_key_exists('from', [])` branch in the Msg91 provider (empty array literal; branch was unreachable). Large cleanup categories across the 549 fixes: - Removed redundant `?? default` on array offsets and expressions that PHPStan now knows are non-nullable. - Removed unreachable statements (mostly `return;` after `throw` or `markTestSkipped()`). - Removed redundant `is_array`/`is_string`/`is_bool`/`instanceof` checks on already-narrowed types. - Added `default =>` arms (or throwing arms) to non-exhaustive matches on `string`/`mixed` input. - Removed dead `$document === false` branches where method return types were tightened to non-nullable `Document`. - Removed unused properties (`$version` on Etsy/Zoom OAuth2, `$paths` on Installer State, `$source` on MigrationsWorker, `$account2` on two GraphQL auth tests), unused traits (`ApiVectorsDB`, `DatabaseFixture`), and an unused `cleanupStaleExecutions` task method. - Replaced `assertTrue(true)` and redundant `assertIsArray`/`assertIsString`/ `assertNotNull` assertions with `addToAssertionCount(1)` or `assertNotEmpty` where the runtime type was already known.
2026-04-19 12:01:20 +00:00
public function evaluate(mixed $probe, string $description = '', bool $returnResult = false): bool
2024-09-18 13:29:44 +00:00
{
if (!is_callable($probe)) {
throw new \Exception('Probe must be a callable');
}
$start = microtime(true);
$lastException = null;
do {
try {
$probe();
return true;
} catch (Critical $exception) {
throw $exception;
2024-09-18 13:29:44 +00:00
} 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 ' . $this->timeoutMs . 'ms.';
}
public function toString(): string
{
return 'Eventually';
}
}