123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- <?php
- namespace Maatwebsite\Excel\Tests\Concerns;
- use Illuminate\Support\Facades\DB;
- use Maatwebsite\Excel\Tests\Data\Stubs\Database\Group;
- use Maatwebsite\Excel\Tests\Data\Stubs\Database\User;
- use Maatwebsite\Excel\Tests\Data\Stubs\FromGroupUsersQueuedQueryExport;
- use Maatwebsite\Excel\Tests\Data\Stubs\FromNestedArraysQueryExport;
- use Maatwebsite\Excel\Tests\Data\Stubs\FromNonEloquentQueryExport;
- use Maatwebsite\Excel\Tests\Data\Stubs\FromUsersQueryExport;
- use Maatwebsite\Excel\Tests\Data\Stubs\FromUsersQueryExportWithEagerLoad;
- use Maatwebsite\Excel\Tests\Data\Stubs\FromUsersQueryExportWithPrepareRows;
- use Maatwebsite\Excel\Tests\Data\Stubs\FromUsersScoutExport;
- use Maatwebsite\Excel\Tests\TestCase;
- class FromQueryTest extends TestCase
- {
- /**
- * Setup the test environment.
- */
- protected function setUp(): void
- {
- parent::setUp();
- $this->loadLaravelMigrations(['--database' => 'testing']);
- $this->withFactories(__DIR__ . '/../Data/Stubs/Database/Factories');
- $this->loadMigrationsFrom(dirname(__DIR__) . '/Data/Stubs/Database/Migrations');
- $group = factory(Group::class)->create([
- 'name' => 'Group 1',
- ]);
- factory(User::class)->times(100)->create()->each(function (User $user) use ($group) {
- $user->groups()->save($group);
- });
- $group_two = factory(Group::class)->create([
- 'name' => 'Group 2',
- ]);
- factory(User::class)->times(5)->create()->each(function (User $user) use ($group_two) {
- $user->groups()->save($group_two);
- });
- }
- /**
- * @test
- */
- public function can_export_from_query()
- {
- $export = new FromUsersQueryExport;
- $response = $export->store('from-query-store.xlsx');
- $this->assertTrue($response);
- $contents = $this->readAsArray(__DIR__ . '/../Data/Disks/Local/from-query-store.xlsx', 'Xlsx');
- $allUsers = $export->query()->get()->map(function (User $user) {
- return array_values($user->toArray());
- })->toArray();
- $this->assertEquals($allUsers, $contents);
- }
- /**
- * @test
- */
- public function can_export_from_relation_query_queued()
- {
- $export = new FromGroupUsersQueuedQueryExport();
- $export->queue('from-query-store.xlsx');
- $contents = $this->readAsArray(__DIR__ . '/../Data/Disks/Local/from-query-store.xlsx', 'Xlsx');
- $allUsers = $export->query()->get()->map(function ($row) use ($export) {
- return $export->map($row);
- })->toArray();
- $this->assertEquals($allUsers, $contents);
- }
- /**
- * @test
- */
- public function can_export_from_query_with_eager_loads()
- {
- DB::connection()->enableQueryLog();
- $export = new FromUsersQueryExportWithEagerLoad();
- $response = $export->store('from-query-with-eager-loads.xlsx');
- $this->assertTrue($response);
- // Should be 2 queries:
- // 1) select all users
- // 2) eager load query for groups
- $this->assertCount(2, DB::getQueryLog());
- DB::connection()->disableQueryLog();
- $contents = $this->readAsArray(__DIR__ . '/../Data/Disks/Local/from-query-with-eager-loads.xlsx', 'Xlsx');
- $allUsers = $export->query()->get()->map(function (User $user) use ($export) {
- return $export->map($user);
- })->toArray();
- $this->assertEquals($allUsers, $contents);
- }
- /**
- * @test
- */
- public function can_export_from_query_with_eager_loads_and_queued()
- {
- DB::connection()->enableQueryLog();
- $export = new FromUsersQueryExportWithEagerLoad();
- $export->queue('from-query-with-eager-loads.xlsx');
- // Should be 3 queries:
- // 1) Count users to create chunked queues
- // 2) select all users
- // 3) eager load query for groups
- $this->assertCount(3, DB::getQueryLog());
- DB::connection()->disableQueryLog();
- $contents = $this->readAsArray(__DIR__ . '/../Data/Disks/Local/from-query-with-eager-loads.xlsx', 'Xlsx');
- $allUsers = $export->query()->get()->map(function (User $user) use ($export) {
- return $export->map($user);
- })->toArray();
- $this->assertEquals($allUsers, $contents);
- }
- /**
- * @test
- */
- public function can_export_from_query_builder_without_using_eloquent()
- {
- $export = new FromNonEloquentQueryExport();
- $response = $export->store('from-query-without-eloquent.xlsx');
- $this->assertTrue($response);
- $contents = $this->readAsArray(__DIR__ . '/../Data/Disks/Local/from-query-without-eloquent.xlsx', 'Xlsx');
- $allUsers = $export->query()->get()->map(function ($row) {
- return array_values((array) $row);
- })->all();
- $this->assertEquals($allUsers, $contents);
- }
- /**
- * @test
- */
- public function can_export_from_query_builder_without_using_eloquent_and_queued()
- {
- $export = new FromNonEloquentQueryExport();
- $export->queue('from-query-without-eloquent.xlsx');
- $contents = $this->readAsArray(__DIR__ . '/../Data/Disks/Local/from-query-without-eloquent.xlsx', 'Xlsx');
- $allUsers = $export->query()->get()->map(function ($row) {
- return array_values((array) $row);
- })->all();
- $this->assertEquals($allUsers, $contents);
- }
- /**
- * @test
- */
- public function can_export_from_query_builder_with_nested_arrays()
- {
- $export = new FromNestedArraysQueryExport();
- $response = $export->store('from-query-with-nested-arrays.xlsx');
- $this->assertTrue($response);
- $contents = $this->readAsArray(__DIR__ . '/../Data/Disks/Local/from-query-with-nested-arrays.xlsx', 'Xlsx');
- $this->assertEquals($this->format_nested_arrays_expected_data($export->query()->get()), $contents);
- }
- /**
- * @test
- */
- public function can_export_from_query_builder_with_nested_arrays_queued()
- {
- $export = new FromNestedArraysQueryExport();
- $export->queue('from-query-with-nested-arrays.xlsx');
- $contents = $this->readAsArray(__DIR__ . '/../Data/Disks/Local/from-query-with-nested-arrays.xlsx', 'Xlsx');
- $this->assertEquals($this->format_nested_arrays_expected_data($export->query()->get()), $contents);
- }
- /**
- * @test
- */
- public function can_export_from_query_with_batch_caching()
- {
- config()->set('excel.cache.driver', 'batch');
- $export = new FromUsersQueryExport;
- $response = $export->store('from-query-store.xlsx');
- $this->assertTrue($response);
- $contents = $this->readAsArray(__DIR__ . '/../Data/Disks/Local/from-query-store.xlsx', 'Xlsx');
- $allUsers = $export->query()->get()->map(function (User $user) {
- return array_values($user->toArray());
- })->toArray();
- $this->assertEquals($allUsers, $contents);
- }
- /**
- * @test
- */
- public function can_export_from_query_with_prepare_rows()
- {
- $export = new FromUsersQueryExportWithPrepareRows;
- $this->assertTrue(method_exists($export, 'prepareRows'));
- $response = $export->store('from-query-store.xlsx');
- $this->assertTrue($response);
- $contents = $this->readAsArray(__DIR__ . '/../Data/Disks/Local/from-query-store.xlsx', 'Xlsx');
- $allUsers = $export->query()->get()->map(function (User $user) {
- $user->name .= '_prepared_name';
- return array_values($user->toArray());
- })->toArray();
- $this->assertEquals($allUsers, $contents);
- }
- /**
- * @test
- */
- public function can_export_from_scout()
- {
- if (!class_exists('\Laravel\Scout\Engines\DatabaseEngine')) {
- $this->markTestSkipped('Laravel Scout is too old');
- return;
- }
- $export = new FromUsersScoutExport;
- $response = $export->store('from-scout-store.xlsx');
- $this->assertTrue($response);
- $contents = $this->readAsArray(__DIR__ . '/../Data/Disks/Local/from-scout-store.xlsx', 'Xlsx');
- $allUsers = $export->query()->get()->map(function (User $user) {
- return array_values($user->toArray());
- })->toArray();
- $this->assertEquals($allUsers, $contents);
- }
- protected function format_nested_arrays_expected_data($groups)
- {
- $expected = [];
- foreach ($groups as $group) {
- $group_row = [$group->name, ''];
- foreach ($group->users as $key => $user) {
- if ($key === 0) {
- $group_row[1] = $user->email;
- $expected[] = $group_row;
- continue;
- }
- $expected[] = ['', $user->email];
- }
- }
- return $expected;
- }
- }
|