mohamedhekal/testharness

Laravel/Pest testing utilities: time travel, queue asserts, API envelope asserts, and lightweight architecture checks
Install
composer require mohamedhekal/testharness
PHP:^8.2
License:MIT
Last Updated:Jul 16, 2026
Links: GitHub  ·  Packagist
Maintainer: mohamedhekal

TestHarness

CI License: MIT PHP Laravel

Search terms: laravel, pest, testing, phpunit, queue, architecture, php, laravel-package, test-helpers, time-travel, dev-tools.

Laravel/Pest testing utilities: freeze time, assert queues, assert API envelopes, tenant test bags, and lightweight architecture checks.

Installation

composer require mohamedhekal/testharness --dev

Time travel

use Hekal\TestHarness\Support\TimeTravel;

TimeTravel::freeze('2026-01-15 10:00:00');
TimeTravel::travel(hours: 2);
TimeTravel::back();

$value = withFrozenTime('2026-07-01 08:00:00', fn () => now()->toDateString());

Queues

Queue::fake();
QueueAssert::assertPushed(MyJob::class, fn (MyJob $job) => $job->id === 1);

API envelopes

Compatible with ApiForge-style { data, error, meta }:

ApiEnvelopeAssert::assertOk($response);
ApiEnvelopeAssert::assertError($response, 'validation_failed', 422);

Architecture

Architecture::assertStrictTypes(__DIR__.'/../src');
Architecture::assertForbiddenFunctions(__DIR__.'/../src', ['dd', 'dump', 'ray']);

Tenant bag

TenantContext::run(['tenant_id' => 5], function () {
    // compose with your tenancy package inside the callback
});

Trait

use Hekal\TestHarness\Concerns\InteractsWithTestHarness;

abstract class TestCase extends \Tests\TestCase
{
    use InteractsWithTestHarness;
}

Limitations (v0.1)

  • Not a full Pest plugin—helpers + asserts only
  • Architecture checks are regex-based, not PHPStan
  • Queue asserts require Queue::fake() first

Testing

composer install && composer test

License

MIT