
# Testaus

Queuety tarjoaa `QueueFake`-luokan, joka korvaa varsinaisen jonon muistissa olevalla tietovarastolla. Lähetetyt työt tallennetaan tietokantaan kirjoittamisen sijaan, ja myös `create_batch()` tallentaa erän metatiedot muistiin. Näin voit varmistaa töiden lähettämisen toiminnan suorittamatta työntekijöitä tai kirjoittamatta tietokantaan. Käsittelijän nimellä lähettäminen hakee käsittelijän edelleen rekisteristä, joten kutsu ensin `Queuety::init()`, kun lähetät työn merkkijonomuotoisella käsittelijällä; `Contracts\Job`-esiintymät, `chain()`, `create_batch()` ja `batch()` toimivat ilman sitä.

## Valekomponentin käyttöönotto

Kutsu `Queuety::fake()` testisi alussa. Se palauttaa `QueueFake`-esiintymän, joka tallentaa kaikki myöhemmät töiden lähetykset.

```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()` luo uuden `QueueFake`-olion ja kytkee sen `Queuety`-julkisivuun. `Queuety::dispatch()` ja `Dispatchable::dispatch()` tallentavat jonoon lisätyt työt. `Queuety::chain()` tallentaa jokaisen ketjutetun työn tavallisena lisäyksenä lähetysjärjestyksessä. `Queuety::create_batch()` tallentaa sekä jonoon lisätyt työt että `assert_batched()`-metodin käyttämät erän metatiedot. `Queuety::batch()` tallentaa jonoon lisätyt työt, mutta ei luo valemetatietoja eristä.

Tyhjennä valekomponentti testien välissä kutsumalla `Queuety::reset()`-metodia `tearDown()`-kohdassa. Se tyhjentää julkisivun kaiken tilan, joten kutsu uudelleen `Queuety::init()`, jos myöhemmässä testissä tarvitaan varsinainen jono.

## Jonoon lisättyjen töiden tarkistaminen

### `assert_pushed()`

Varmista, että tietty työluokka lähetettiin vähintään kerran.

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

Välitä valinnainen takaisinkutsufunktio, jolla suodatetaan hyötykuorman tai muiden ominaisuuksien perusteella. Takaisinkutsufunktio saa tallennetun työn tietotaulukon, jonka avaimet ovat `handler`, `payload`, `queue` ja `instance`. `instance` on `null` töille, jotka lähetetään julkisivun tai `Dispatchable`-piirteen kautta, joten hae töitä `handler`- ja `payload`-arvojen perusteella.

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

### `assert_pushed_times()`

Varmista, että työ lisättiin jonoon täsmälleen tietyn määrän kertoja.

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

### `assert_not_pushed()`

Varmista, ettei työtä lähetetty koskaan.

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

### `assert_nothing_pushed()`

Varmista, ettei yhtäkään työtä lähetetty.

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

## Erien tarkistaminen

### `assert_batched()`

Varmista, että erä lähetettiin. Voit halutessasi välittää takaisinkutsufunktion erän sisällön suodattamiseen.

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

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

Takaisinkutsufunktio saa taulukon, jonka avaimet ovat `jobs` ja `options`.

## Jonoon lisättyjen töiden tarkastelu

Hae `pushed()`-metodilla kaikki tietylle luokalle tallennetut lähetykset ja `batches()`-metodilla kaikki tallennetut erät.

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

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

## Nollaaminen testien välillä

Tyhjennä kaikki tallennetut työt ja erät luomatta uutta esiintymää kutsumalla valekomponentin `reset()`-metodia.

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

Voit myös purkaa valekomponentin ja tyhjentää kaiken sisäisen tilan kutsumalla `Queuety::reset()`-metodia.

## Täysi esimerkki

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