
# Testavimas

Queuety pateikia `QueueFake` klasę, kuri tikrąją eilę pakeičia atmintyje veikiančia saugykla. Išsiųstos užduotys įrašomos, o ne saugomos duomenų bazėje; `create_batch()` taip pat atmintyje įrašo paketinių užduočių metaduomenis. Taip galite patikrinti užduočių išsiuntimo veikimą nepaleisdami vykdytojų ir nerašydami į duomenų bazę. Išsiunčiant pagal apdorojimo komponento pavadinimą, komponentas vis tiek ieškomas registre, todėl, jei išsiunčiate pagal eilutės pavidalo apdorojimo komponentą, pirmiausia iškvieskite `Queuety::init()`; `Contracts\Job` egzemplioriai, `chain()`, `create_batch()` ir `batch()` veikia ir be šio iškvietimo.

## Netikros eilės nustatymas

Testo pradžioje iškvieskite `Queuety::fake()`. Jis grąžina `QueueFake` egzempliorių, kuris įrašo visus vėlesnius užduočių išsiuntimus.

```php
use Queuety\Queuety;

class SendEmailTest extends \PHPUnit\Framework\TestCase {
    protected function setUp(): void {
        $this->fake = Queuety::fake();
    }

    protected function tearDown(): void {
        Queuety::reset();
    }
}
```

`Queuety::fake()` sukuria naują `QueueFake` ir prijungia jį prie `Queuety` fasado. `Queuety::dispatch()` ir `Dispatchable::dispatch()` registruoja į eilę įkeltas užduotis. `Queuety::chain()` registruoja kiekvieną grandininę užduotį kaip įprastą įkėlimą į eilę pagal išsiuntimo tvarką. `Queuety::create_batch()` registruoja ir į eilę įkeltas užduotis, ir paketų metaduomenis, kuriuos naudoja `assert_batched()`. `Queuety::batch()` registruoja į eilę įkeltas užduotis, bet nesukuria netikrų paketų metaduomenų.

Per testus iškvieskite `Queuety::reset()` `tearDown()`, kad išvalytumėte netikrą eilę. Taip išvaloma visa fasado būsena, todėl iškvieskite `Queuety::init()` dar kartą, jei vėlesniam testui reikia tikros eilės.

## Tikrinimas, ar užduotys buvo įkeltos į eilę

### `assert_pushed()`

Patikrinkite, ar konkrečios užduočių klasės užduotis buvo išsiųsta bent kartą.

```php
public function test_welcome_email_is_sent(): void {
    $this->fake = Queuety::fake();

    // Code under test...
    register_new_user( 'user@example.com' );

    $this->fake->assert_pushed( SendWelcomeEmailJob::class );
}
```

Galite perduoti pasirenkamą atgalinio iškvietimo funkciją, kuri filtruoja pagal naudingąją apkrovą ar kitus atributus. Funkcija gauna registruotų užduoties duomenų masyvą su raktais `handler`, `payload`, `queue` ir `instance`. Per fasadą arba požymį `Dispatchable` išsiųstų užduočių `instance` yra `null`, todėl filtruokite pagal `handler` ir `payload`.

```php
$this->fake->assert_pushed( SendWelcomeEmailJob::class, function ( array $job ) {
    return $job['payload']['to'] === 'user@example.com';
} );
```

### `assert_pushed_times()`

Patikrinkite, ar užduotis į eilę įkelta tiksliai nurodytą kartų skaičių.

```php
$this->fake->assert_pushed_times( SendEmailJob::class, 3 );
```

### `assert_not_pushed()`

Patikrinkite, ar užduotis niekada nebuvo išsiųsta.

```php
$this->fake->assert_not_pushed( DeleteAccountJob::class );
```

### `assert_nothing_pushed()`

Patikrinkite, ar išvis nebuvo išsiųsta jokių užduočių.

```php
public function test_no_jobs_on_invalid_input(): void {
    $this->fake = Queuety::fake();

    process_input( '' ); // invalid, should not dispatch anything

    $this->fake->assert_nothing_pushed();
}
```

## Paketų tikrinimas

### `assert_batched()`

Patikrinkite, ar paketas buvo išsiųstas. Pasirinktinai galite perduoti atgalinio iškvietimo funkciją, kuri filtruoja pagal paketo turinį.

```php
$this->fake->assert_batched();

$this->fake->assert_batched( function ( array $batch ) {
    return count( $batch['jobs'] ) === 3;
} );
```

Funkcija gauna masyvą su raktais `jobs` ir `options`.

## Į eilę įkeltų užduočių peržiūra

Naudokite `pushed()`, kad gautumėte visas užregistruotas konkrečios klasės išsiųstas užduotis, ir `batches()`, kad gautumėte visus užregistruotus paketus.

```php
$emails = $this->fake->pushed( SendEmailJob::class );
// [ ['handler' => '...', 'payload' => [...], 'queue' => 'default', 'instance' => null], ... ]

$batches = $this->fake->batches();
// [ ['jobs' => [...], 'options' => [...]], ... ]
```

## Būsenos nustatymas iš naujo tarp testų

Iškvieskite netikro objekto `reset()`, kad išvalytumėte visas užregistruotas užduotis ir paketus nesukurdami naujo egzemplioriaus.

```php
$this->fake->reset();
```

Arba iškvieskite `Queuety::reset()`, kad visiškai panaikintumėte netikrą objektą ir visą vidinę būseną.

## Išsamus pavyzdys

```php
use PHPUnit\Framework\TestCase;
use Queuety\Queuety;

class OrderWorkflowTest extends TestCase {
    private \Queuety\Testing\QueueFake $fake;

    protected function setUp(): void {
        $this->fake = Queuety::fake();
    }

    protected function tearDown(): void {
        Queuety::reset();
    }

    public function test_order_dispatches_payment_job(): void {
        $order = create_order( [ 'total' => 99.99 ] );

        $this->fake->assert_pushed( ProcessPaymentJob::class, function ( array $job ) use ( $order ) {
            return $job['payload']['order_id'] === $order->id;
        } );
        $this->fake->assert_not_pushed( RefundJob::class );
    }

    public function test_bulk_import_dispatches_batch(): void {
        start_bulk_import( $rows );

        $this->fake->assert_batched( function ( array $batch ) use ( $rows ) {
            return count( $batch['jobs'] ) === count( $rows );
        } );
    }

    public function test_nothing_dispatched_without_data(): void {
        process_empty_queue();

        $this->fake->assert_nothing_pushed();
    }
}
```
