
# Testimine

Queuety pakub klassi `QueueFake`, mis asendab päris järjekorra mälusisese salvestiga. Väljastatud tööd salvestatakse jäljena, mitte andmebaasi, ning `create_batch()` salvestab mällu ka partiide metaandmed. Nii saate väljastamise käitumist kontrollida töötajaid käivitamata ja andmebaasi kirjutamata. Käsitleja nime järgi väljastamisel leitakse käsitleja endiselt registri kaudu, seega kutsuge stringina määratud käsitlejaga väljastamisel esmalt välja `Queuety::init()`; klassi `Contracts\Job` eksemplarid, `chain()`, `create_batch()` ja `batch()` toimivad selleta.

## Jäljendi seadistamine

Kutsuge testi alguses välja `Queuety::fake()`. See tagastab eksemplari `QueueFake`, mis salvestab kõik järgnevad väljastused.

```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()` loob uue `QueueFake` ja ühendab selle fassaadiga `Queuety`. `Queuety::dispatch()` ja `Dispatchable::dispatch()` salvestavad lisatud tööd. `Queuety::chain()` salvestab iga aheldatud töö tavalise lisamisena väljastamise järjekorras. `Queuety::create_batch()` salvestab nii lisatud tööd kui ka `assert_batched()`-i kasutatavad partiide metaandmed. `Queuety::batch()` salvestab lisatud tööd, kuid ei loo võltsitud partiide metaandmeid.

Jäljendi tühjendamiseks testide vahel kutsuge `tearDown()`-is välja `Queuety::reset()`. See tühjendab kogu fassaadi oleku, nii et kui mõni hilisem test vajab päris järjekorda, kutsuge uuesti välja `Queuety::init()`.

## Lisatud tööde kontrollimine

### `assert_pushed()`

Kontrollige, et kindlat tööklassi oleks vähemalt üks kord käivitatud.

```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 );
}
```

Lisage valikuline tagasihelistamisfunktsioon, et filtreerida payload’i või muude atribuutide alusel. Funktsioon saab argumendina salvestatud tööandmete massiivi, mille võtmed on `handler`, `payload`, `queue` ja `instance`. Fassaadi või trait’i `Dispatchable` kaudu väljastatud tööde puhul on `instance` väärtus `null`, seega filtreerige väärtuste `handler` ja `payload` järgi.

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

### `assert_pushed_times()`

Kontrollige, et töö oleks lisatud täpselt kindel arv kordi.

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

### `assert_not_pushed()`

Kontrollige, et tööd poleks kordagi väljastatud.

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

### `assert_nothing_pushed()`

Kontrollige, et ühtegi tööd poleks väljastatud.

```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();
}
```

## Partiide kontrollimine

### `assert_batched()`

Kontrollige, et partii oleks väljastatud. Soovi korral lisage tagasihelistamisfunktsioon, et filtreerida partii sisu järgi.

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

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

Tagasihelistamisfunktsioon saab massiivi võtmetega `jobs` ja `options`.

## Lisatud tööde uurimine

Kasutage `pushed()`, et hankida kõik kindla klassi salvestatud väljastused, ja `batches()`, et hankida kõik salvestatud partiid.

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

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

## Lähtestamine testide vahel

Kõigi salvestatud tööde ja partiide tühjendamiseks ilma uut eksemplari loomata kutsuge jäljendil välja `reset()`.

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

Jäljendi ja kogu sisemise oleku täielikuks mahavõtmiseks kutsuge välja `Queuety::reset()`.

## Täielik näide

```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();
    }
}
```
