Test a Pulsar application
Unit-test atomic Domain work, integration-test UseCases, bindings, and lifecycles, feature-test adapters, and use the package preset for structural rules. The smallest suitable test is recommended, provided it keeps the framework behavior being proved.
Before you begin
Run composer run reference:test and vendor/bin/pest tests/Integration/BootstrapIntegrationTest.php in core.
Prove durable delivery behavior
examples/reference-app/tests/Outbox/TransactionalOutboxTest.php — Atomic outbox and retry-deduplicated inbox evidence.
php
<?php
namespace Tests\Outbox;
use App\Models\User;
use App\Pulsar\Domain\Orders\DTOs\CreateOrderData;
use App\Pulsar\Services\Client\Modules\Orders\UseCases\PlaceOrder;
use App\Pulsar\Services\Internal\Modules\Orders\UseCases\RelayOutbox;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class TransactionalOutboxTest extends TestCase
{
use RefreshDatabase;
// #region transactional-outbox-test
public function test_outbox_write_is_atomic_and_the_inbox_deduplicates_relay_retry(): void
{
User::factory()->create(['tenant_id' => 'tenant-outbox']);
$order = app(PlaceOrder::class)->execute(new CreateOrderData('tenant-outbox', 'outbox-1', 100));
$key = 'order-placed-'.$order->id;
$this->assertDatabaseHas('outbox_messages', ['idempotency_key' => $key]);
$this->assertTrue(app(RelayOutbox::class)->execute($key));
$this->assertFalse(app(RelayOutbox::class)->execute($key));
$this->assertDatabaseCount('inbox_messages', 1);
}
// #endregion
}Verify and troubleshoot
Use fakes for mail, notification, queue, and Contracts; use real container and database integration for lifecycle and transaction claims. The preset enforces structural core only; behavioral rules such as no UseCase-to-UseCase calls still require review and focused tests.