ShouldQueueWithoutChainTest.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <?php
  2. use Illuminate\Queue\Events\JobProcessed;
  3. use Illuminate\Queue\SyncQueue;
  4. use Illuminate\Support\Facades\Event;
  5. use Illuminate\Support\Facades\Queue;
  6. use Maatwebsite\Excel\Jobs\AfterImportJob;
  7. use Maatwebsite\Excel\Jobs\QueueImport;
  8. use Maatwebsite\Excel\Jobs\ReadChunk;
  9. use Maatwebsite\Excel\Tests\Data\Stubs\QueueImportWithoutJobChaining;
  10. use Maatwebsite\Excel\Tests\TestCase;
  11. class ShouldQueueWithoutChainTest extends TestCase
  12. {
  13. /**
  14. * Setup the test environment.
  15. */
  16. protected function setUp(): void
  17. {
  18. parent::setUp();
  19. $this->loadLaravelMigrations(['--database' => 'testing']);
  20. $this->loadMigrationsFrom(dirname(__DIR__) . '/Data/Stubs/Database/Migrations');
  21. }
  22. /**
  23. * @test
  24. */
  25. public function can_import_to_model_in_chunks()
  26. {
  27. DB::connection()->enableQueryLog();
  28. $import = new QueueImportWithoutJobChaining();
  29. $import->import('import-users.xlsx');
  30. $this->assertCount(2, DB::getQueryLog());
  31. DB::connection()->disableQueryLog();
  32. }
  33. /**
  34. * @test
  35. */
  36. public function can_import_to_model_without_job_chaining()
  37. {
  38. Queue::fake();
  39. $import = new QueueImportWithoutJobChaining();
  40. $import->import('import-users.xlsx');
  41. Queue::assertPushed(ReadChunk::class, 2);
  42. Queue::assertPushed(AfterImportJob::class, 1);
  43. Queue::assertPushed(AfterImportJob::class, function ($import) {
  44. return !is_null($import->delay);
  45. });
  46. Queue::assertNotPushed(QueueImport::class);
  47. }
  48. /**
  49. * @test
  50. */
  51. public function a_queue_name_can_be_specified_when_importing()
  52. {
  53. Queue::fake();
  54. $import = new QueueImportWithoutJobChaining();
  55. $import->queue = 'queue-name';
  56. $import->import('import-users.xlsx');
  57. Queue::assertPushedOn('queue-name', ReadChunk::class);
  58. Queue::assertPushedOn('queue-name', AfterImportJob::class);
  59. }
  60. /**
  61. * @test
  62. */
  63. public function the_cleanup_only_runs_when_all_jobs_are_done()
  64. {
  65. $fake = Queue::fake();
  66. if (method_exists($fake, 'serializeAndRestore')) {
  67. $fake->serializeAndRestore(); // More realism
  68. }
  69. $import = new QueueImportWithoutJobChaining();
  70. $import->import('import-users.xlsx');
  71. $jobs = Queue::pushedJobs();
  72. $chunks = collect($jobs[ReadChunk::class])->pluck('job');
  73. $chunks->each(function (ReadChunk $chunk) {
  74. self::assertFalse(ReadChunk::isComplete($chunk->getUniqueId()));
  75. });
  76. self::assertCount(2, $chunks);
  77. $afterImport = $jobs[AfterImportJob::class][0]['job'];
  78. if (!method_exists($fake, 'except')) {
  79. /** @var SyncQueue $queue */
  80. $fake = app(SyncQueue::class);
  81. $fake->setContainer(app());
  82. } else {
  83. $fake->except([AfterImportJob::class, ReadChunk::class]);
  84. }
  85. $fake->push($chunks->first());
  86. self::assertTrue(ReadChunk::isComplete($chunks->first()->getUniqueId()));
  87. self::assertFalse(ReadChunk::isComplete($chunks->last()->getUniqueId()));
  88. Event::listen(JobProcessed::class, function (JobProcessed $event) {
  89. self::assertTrue($event->job->isReleased());
  90. });
  91. $fake->push($afterImport);
  92. Event::forget(JobProcessed::class);
  93. $fake->push($chunks->last());
  94. Event::listen(JobProcessed::class, function (JobProcessed $event) {
  95. self::assertFalse($event->job->isReleased());
  96. });
  97. $fake->push($afterImport);
  98. Event::forget(JobProcessed::class);
  99. }
  100. }