
# Δοκιμές

Το Queuety παρέχει μια κλάση `QueueFake` που αντικαθιστά την πραγματική ουρά με ένα αποθηκευτικό μέσο στη μνήμη. Οι εργασίες που αποστέλλονται καταγράφονται αντί να γράφονται στη βάση δεδομένων, ενώ το `create_batch()` καταγράφει επίσης τα μεταδεδομένα δέσμης στη μνήμη. Έτσι μπορείτε να ελέγχετε τη συμπεριφορά αποστολής χωρίς να εκτελείτε worker ή να γράφετε στη βάση δεδομένων. Η αποστολή με όνομα χειριστή εξακολουθεί να εντοπίζει τον χειριστή μέσω του μητρώου, επομένως καλέστε πρώτα το `Queuety::init()` για αποστολή με συμβολοσειρά χειριστή. Οι παρουσίες `Contracts\Job`, τα `chain()`, τα `create_batch()` και τα `batch()` λειτουργούν χωρίς αυτό.

## Ρύθμιση της προσομοιωμένης ουράς

Καλέστε το `Queuety::fake()` στην αρχή της δοκιμής σας. Επιστρέφει μια παρουσία `QueueFake` που καταγράφει όλες τις επόμενες αποστολές.

```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()` δημιουργεί ένα νέο `QueueFake` και το συνδέει με το facade `Queuety`. Τα `Queuety::dispatch()` και `Dispatchable::dispatch()` καταγράφουν τις εργασίες που προστέθηκαν. Το `Queuety::chain()` καταγράφει κάθε εργασία αλυσίδας ως κανονική προσθήκη, με τη σειρά αποστολής. Το `Queuety::create_batch()` καταγράφει τόσο τις εργασίες που προστέθηκαν όσο και τα μεταδεδομένα δέσμης που χρησιμοποιεί το `assert_batched()`. Το `Queuety::batch()` καταγράφει τις εργασίες που προστέθηκαν, αλλά δεν δημιουργεί προσομοιωμένα μεταδεδομένα δέσμης.

Καλέστε το `Queuety::reset()` στο `tearDown()` για να εκκαθαρίσετε την προσομοιωμένη ουρά μεταξύ δοκιμών. Εκκαθαρίζει όλη την κατάσταση του facade, επομένως καλέστε ξανά το `Queuety::init()` αν μια επόμενη δοκιμή χρειάζεται την πραγματική ουρά.

## Έλεγχος ότι προστέθηκαν εργασίες

### `assert_pushed()`

Ελέγξτε ότι μια συγκεκριμένη κλάση εργασίας αποστάλθηκε τουλάχιστον μία φορά.

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

Περάστε προαιρετικά μια συνάρτηση επανάκλησης για φιλτράρισμα βάσει payload ή άλλων χαρακτηριστικών. Η συνάρτηση λαμβάνει τον καταγεγραμμένο πίνακα δεδομένων εργασίας με τα κλειδιά `handler`, `payload`, `queue` και `instance`. Το `instance` είναι `null` για εργασίες που αποστέλλονται μέσω του facade ή του trait `Dispatchable`, επομένως κάντε αντιστοίχιση με τα `handler` και `payload`.

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

### `assert_pushed_times()`

Ελέγξτε ότι μια εργασία προστέθηκε ακριβώς συγκεκριμένο αριθμό φορών.

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

### `assert_not_pushed()`

Ελέγξτε ότι μια εργασία δεν αποστάλθηκε ποτέ.

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

### `assert_nothing_pushed()`

Ελέγξτε ότι δεν αποστάλθηκαν καθόλου εργασίες.

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

## Έλεγχος δεσμών

### `assert_batched()`

Ελέγξτε ότι αποστάλθηκε μια δέσμη. Προαιρετικά, περάστε μια συνάρτηση επανάκλησης για φιλτράρισμα βάσει του περιεχομένου της δέσμης.

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

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

Η συνάρτηση επανάκλησης λαμβάνει έναν πίνακα με τα κλειδιά `jobs` και `options`.

## Εξέταση εργασιών που προστέθηκαν

Χρησιμοποιήστε το `pushed()` για να ανακτήσετε όλες τις καταγεγραμμένες αποστολές μιας συγκεκριμένης κλάσης και το `batches()` για να ανακτήσετε όλες τις καταγεγραμμένες δέσμες.

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

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

## Επαναφορά μεταξύ δοκιμών

Καλέστε το `reset()` στην προσομοιωμένη ουρά για να εκκαθαρίσετε όλες τις καταγεγραμμένες εργασίες και δέσμες χωρίς να δημιουργήσετε νέα παρουσία.

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

Εναλλακτικά, καλέστε το `Queuety::reset()` για να καταργήσετε πλήρως την προσομοιωμένη ουρά και όλη την εσωτερική της κατάσταση.

## Πλήρες παράδειγμα

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