|
3 | 3 | declare(strict_types=1); |
4 | 4 |
|
5 | 5 | use Saloon\Http\Faking\MockClient; |
| 6 | +use Saloon\Barstool\Models\Barstool; |
6 | 7 | use Saloon\Http\Faking\MockResponse; |
| 8 | +use Illuminate\Support\Facades\Queue; |
7 | 9 | use Illuminate\Support\Facades\Artisan; |
8 | | -use Saloon\Barstool\Models\Barstool; |
| 10 | +use Saloon\Barstool\Enums\RecordingType; |
9 | 11 | use Saloon\Http\Connectors\NullConnector; |
| 12 | +use Saloon\Barstool\Jobs\RecordBarstoolJob; |
10 | 13 |
|
11 | 14 | use function Pest\Laravel\assertDatabaseHas; |
12 | 15 | use function Pest\Laravel\assertDatabaseCount; |
|
565 | 568 | ->response_body->toBe(json_encode($responseBody)); |
566 | 569 |
|
567 | 570 | }); |
| 571 | + |
| 572 | +it('dispatches jobs when queue is enabled with correct payload', function () { |
| 573 | + Queue::fake(); |
| 574 | + |
| 575 | + config()->set('barstool.enabled', true); |
| 576 | + config()->set('barstool.queue.enabled', true); |
| 577 | + |
| 578 | + MockClient::global([ |
| 579 | + SoloUserRequest::class => MockResponse::make( |
| 580 | + body: ['data' => [['name' => 'John Wayne']]], |
| 581 | + status: 200, |
| 582 | + headers: ['Content-Type' => 'application/json'], |
| 583 | + ), |
| 584 | + ]); |
| 585 | + |
| 586 | + (new SoloUserRequest)->send(); |
| 587 | + |
| 588 | + Queue::assertPushed(RecordBarstoolJob::class, 2); |
| 589 | + |
| 590 | + Queue::assertPushed(RecordBarstoolJob::class, function (RecordBarstoolJob $job) { |
| 591 | + return $job->type === RecordingType::REQUEST |
| 592 | + && $job->data['connector_class'] === NullConnector::class |
| 593 | + && $job->data['request_class'] === SoloUserRequest::class |
| 594 | + && $job->data['method'] === 'GET' |
| 595 | + && $job->data['url'] === 'https://tests.saloon.dev/api/user' |
| 596 | + && $job->data['successful'] === false; |
| 597 | + }); |
| 598 | + |
| 599 | + Queue::assertPushed(RecordBarstoolJob::class, function (RecordBarstoolJob $job) { |
| 600 | + return $job->type === RecordingType::RESPONSE |
| 601 | + && $job->data['response_status'] === 200 |
| 602 | + && $job->data['successful'] === true |
| 603 | + && $job->data['response_body'] === json_encode(['data' => [['name' => 'John Wayne']]]) |
| 604 | + && array_key_exists('duration', $job->data); |
| 605 | + }); |
| 606 | + |
| 607 | + assertDatabaseCount('barstools', 0); |
| 608 | +}); |
| 609 | + |
| 610 | +it('dispatches jobs on the configured queue connection and name', function () { |
| 611 | + Queue::fake(); |
| 612 | + |
| 613 | + config()->set('barstool.enabled', true); |
| 614 | + config()->set('barstool.queue.enabled', true); |
| 615 | + config()->set('barstool.queue.connection', 'redis'); |
| 616 | + config()->set('barstool.queue.queue', 'barstool-recordings'); |
| 617 | + |
| 618 | + MockClient::global([ |
| 619 | + SoloUserRequest::class => MockResponse::make( |
| 620 | + body: ['data' => [['name' => 'John Wayne']]], |
| 621 | + status: 200, |
| 622 | + ), |
| 623 | + ]); |
| 624 | + |
| 625 | + (new SoloUserRequest)->send(); |
| 626 | + |
| 627 | + Queue::assertPushed(RecordBarstoolJob::class, function (RecordBarstoolJob $job) { |
| 628 | + return $job->connection === 'redis' && $job->queue === 'barstool-recordings'; |
| 629 | + }); |
| 630 | +}); |
| 631 | + |
| 632 | +it('processes queued jobs and creates database records with correct data', function () { |
| 633 | + config()->set('barstool.enabled', true); |
| 634 | + config()->set('barstool.queue.enabled', true); |
| 635 | + config()->set('queue.default', 'sync'); |
| 636 | + |
| 637 | + MockClient::global([ |
| 638 | + SoloUserRequest::class => MockResponse::make( |
| 639 | + body: ['data' => [['name' => 'John Wayne']]], |
| 640 | + status: 200, |
| 641 | + headers: ['Content-Type' => 'application/json'], |
| 642 | + ), |
| 643 | + ]); |
| 644 | + |
| 645 | + $response = (new SoloUserRequest)->send(); |
| 646 | + |
| 647 | + assertDatabaseCount('barstools', 1); |
| 648 | + |
| 649 | + $uuid = $response->getPsrRequest()->getHeader('X-Barstool-UUID')[0]; |
| 650 | + $barstool = Barstool::where('uuid', $uuid)->sole(); |
| 651 | + |
| 652 | + expect($barstool) |
| 653 | + ->connector_class->toBe(NullConnector::class) |
| 654 | + ->request_class->toBe(SoloUserRequest::class) |
| 655 | + ->method->toBe('GET') |
| 656 | + ->url->toBe('https://tests.saloon.dev/api/user') |
| 657 | + ->response_status->toBe(200) |
| 658 | + ->successful->toBeTrue() |
| 659 | + ->response_body->toBe(json_encode(['data' => [['name' => 'John Wayne']]])) |
| 660 | + ->duration->not->toBeNull() |
| 661 | + ->request_headers->toBeArray() |
| 662 | + ->response_headers->toBeArray(); |
| 663 | +}); |
| 664 | + |
| 665 | +it('dispatches a fatal job when queue is enabled with correct payload', function () { |
| 666 | + Queue::fake(); |
| 667 | + |
| 668 | + config()->set('barstool.enabled', true); |
| 669 | + config()->set('barstool.queue.enabled', true); |
| 670 | + |
| 671 | + MockClient::global([ |
| 672 | + SoloUserRequest::class => MockResponse::make( |
| 673 | + body: ['error' => 'Something went wrong'], |
| 674 | + status: 500, |
| 675 | + )->throw(fn ($pendingRequest) => new FatalRequestException(new Exception('Fatal error'), $pendingRequest)), |
| 676 | + ]); |
| 677 | + |
| 678 | + try { |
| 679 | + (new SoloUserRequest)->send(); |
| 680 | + } catch (FatalRequestException) { |
| 681 | + // Expected |
| 682 | + } |
| 683 | + |
| 684 | + Queue::assertPushed(RecordBarstoolJob::class, function (RecordBarstoolJob $job) { |
| 685 | + return $job->type === RecordingType::REQUEST |
| 686 | + && $job->data['connector_class'] === NullConnector::class |
| 687 | + && $job->data['request_class'] === SoloUserRequest::class; |
| 688 | + }); |
| 689 | + |
| 690 | + Queue::assertPushed(RecordBarstoolJob::class, function (RecordBarstoolJob $job) { |
| 691 | + return $job->type === RecordingType::FATAL |
| 692 | + && $job->data['fatal_error'] === 'Fatal error' |
| 693 | + && $job->data['successful'] === false |
| 694 | + && $job->data['response_body'] === null |
| 695 | + && array_key_exists('duration', $job->data); |
| 696 | + }); |
| 697 | +}); |
| 698 | + |
| 699 | +it('does not dispatch jobs when queue is disabled', function () { |
| 700 | + Queue::fake(); |
| 701 | + |
| 702 | + config()->set('barstool.enabled', true); |
| 703 | + config()->set('barstool.queue.enabled', false); |
| 704 | + |
| 705 | + MockClient::global([ |
| 706 | + SoloUserRequest::class => MockResponse::make( |
| 707 | + body: ['data' => [['name' => 'John Wayne']]], |
| 708 | + status: 200, |
| 709 | + ), |
| 710 | + ]); |
| 711 | + |
| 712 | + (new SoloUserRequest)->send(); |
| 713 | + |
| 714 | + Queue::assertNothingPushed(); |
| 715 | + |
| 716 | + assertDatabaseCount('barstools', 1); |
| 717 | +}); |
0 commit comments