diff --git a/packages/core/src/Search/CustomerIndexer.php b/packages/core/src/Search/CustomerIndexer.php index 17ccfaf1a6..52ce758c91 100644 --- a/packages/core/src/Search/CustomerIndexer.php +++ b/packages/core/src/Search/CustomerIndexer.php @@ -29,7 +29,10 @@ public function getFilterableFields(): array public function makeAllSearchableUsing(Builder $query): Builder { return $query->with([ - 'users', + 'users' => fn ($query) => $query->select( + $query->getModel()->qualifyColumn('id'), + $query->getModel()->qualifyColumn('email'), + ), ]); } diff --git a/packages/core/src/Search/OrderIndexer.php b/packages/core/src/Search/OrderIndexer.php index 6bd113161d..8885d26452 100644 --- a/packages/core/src/Search/OrderIndexer.php +++ b/packages/core/src/Search/OrderIndexer.php @@ -35,11 +35,33 @@ public function getFilterableFields(): array public function makeAllSearchableUsing(Builder $query): Builder { return $query->with([ - 'channel', - 'transactions', - 'productLines', - 'addresses', - 'tags', + 'channel' => fn ($query) => $query->select('id', 'name'), + 'transactions' => fn ($query) => $query->select('id', 'order_id', 'reference'), + 'productLines' => fn ($query) => $query->select('id', 'order_id', 'description', 'identifier'), + 'addresses' => fn ($query) => $query->select( + 'id', + 'order_id', + 'country_id', + 'type', + 'first_name', + 'last_name', + 'company_name', + 'tax_identifier', + 'line_one', + 'line_two', + 'line_three', + 'city', + 'state', + 'postcode', + 'contact_email', + 'contact_phone', + )->with([ + 'country' => fn ($query) => $query->select('id', 'name'), + ]), + 'tags' => fn ($query) => $query->select( + $query->getModel()->qualifyColumn('id'), + $query->getModel()->qualifyColumn('value'), + ), ]); } diff --git a/packages/core/src/Search/ProductIndexer.php b/packages/core/src/Search/ProductIndexer.php index 1ae577b5e3..35fc8140c7 100644 --- a/packages/core/src/Search/ProductIndexer.php +++ b/packages/core/src/Search/ProductIndexer.php @@ -30,9 +30,9 @@ public function makeAllSearchableUsing(Builder $query): Builder { return $query->with([ 'thumbnail', - 'variants', - 'productType', - 'brand', + 'variants' => fn ($query) => $query->select('id', 'sku', 'product_id'), + 'productType' => fn ($query) => $query->select('id', 'name'), + 'brand' => fn ($query) => $query->select('id', 'name'), ]); } diff --git a/packages/core/src/Search/ProductOptionIndexer.php b/packages/core/src/Search/ProductOptionIndexer.php index 14ee25e874..05959bea28 100644 --- a/packages/core/src/Search/ProductOptionIndexer.php +++ b/packages/core/src/Search/ProductOptionIndexer.php @@ -24,7 +24,9 @@ public function getFilterableFields(): array public function makeAllSearchableUsing(Builder $query): Builder { - return $query; + return $query->with([ + 'values' => fn ($query) => $query->select('id', 'product_option_id', 'name'), + ]); } public function toSearchableArray(Model $model): array diff --git a/tests/core/Unit/Search/BrandIndexerTest.php b/tests/core/Unit/Search/BrandIndexerTest.php index 7f9dfbd7e5..46163068db 100644 --- a/tests/core/Unit/Search/BrandIndexerTest.php +++ b/tests/core/Unit/Search/BrandIndexerTest.php @@ -9,7 +9,7 @@ use Lunar\Search\BrandIndexer; use Lunar\Tests\Core\TestCase; -uses(TestCase::class); +uses(TestCase::class)->group('search', 'indexer'); uses(RefreshDatabase::class); @@ -64,5 +64,4 @@ ->and($data)->not()->toHaveKey($attributeC->handle) ->and($data)->toHaveKey($attributeD->handle.'_en') ->and($data)->toHaveKey($attributeD->handle.'_dk'); - -})->group('foo'); +}); diff --git a/tests/core/Unit/Search/CustomerIndexerTest.php b/tests/core/Unit/Search/CustomerIndexerTest.php index 0c33b1973b..6be7d49e94 100644 --- a/tests/core/Unit/Search/CustomerIndexerTest.php +++ b/tests/core/Unit/Search/CustomerIndexerTest.php @@ -10,7 +10,7 @@ use Lunar\Tests\Core\Stubs\User; use Lunar\Tests\Core\TestCase; -uses(TestCase::class); +uses(TestCase::class)->group('search', 'indexer'); uses(RefreshDatabase::class); diff --git a/tests/core/Unit/Search/OrderIndexerTest.php b/tests/core/Unit/Search/OrderIndexerTest.php index 4e748cb365..054a531d3b 100644 --- a/tests/core/Unit/Search/OrderIndexerTest.php +++ b/tests/core/Unit/Search/OrderIndexerTest.php @@ -1,12 +1,17 @@ group('search', 'indexer'); uses(RefreshDatabase::class); @@ -16,6 +21,10 @@ 'default' => true, ]); + $country = Country::factory()->create([ + 'name' => 'United Kingdom', + ]); + $order = Order::factory()->create([ 'user_id' => null, 'placed_at' => now(), @@ -24,9 +33,45 @@ ], ]); + $transaction = Transaction::factory()->create([ + 'order_id' => $order->id, + ]); + + $line = OrderLine::factory()->create([ + 'order_id' => $order->id, + 'type' => 'physical', + ]); + + OrderLine::factory()->create([ + 'order_id' => $order->id, + 'type' => 'shipping', + ]); + + $address = OrderAddress::factory()->create([ + 'order_id' => $order->id, + 'country_id' => $country->id, + 'type' => 'shipping', + ]); + + $tag = Tag::factory()->create([ + 'value' => 'vip', + ]); + + $order->tags()->attach($tag); + $data = app(OrderIndexer::class)->toSearchableArray($order); expect($data['currency_code'])->toEqual('GBP'); expect($data['channel'])->toEqual($order->channel->name); expect($data['total'])->toEqual($order->total->value); + expect($data['charges']->pluck('reference')->all())->toBe([$transaction->reference]); + expect($data['lines'])->toEqual([[ + 'description' => $line->description, + 'identifier' => $line->identifier, + ]]); + expect($data['shipping_first_name'])->toEqual($address->first_name); + expect($data['shipping_last_name'])->toEqual($address->last_name); + expect($data['shipping_country'])->toEqual($country->name); + expect($data['shipping_fullname'])->toEqual($address->first_name.' '.$address->last_name); + expect($data['tags'])->toBe(['vip']); }); diff --git a/tests/core/Unit/Search/ProductIndexerTest.php b/tests/core/Unit/Search/ProductIndexerTest.php index 38251dca3d..cc611c3310 100644 --- a/tests/core/Unit/Search/ProductIndexerTest.php +++ b/tests/core/Unit/Search/ProductIndexerTest.php @@ -10,7 +10,7 @@ use Lunar\Search\ProductIndexer; use Lunar\Tests\Core\TestCase; -uses(TestCase::class); +uses(TestCase::class)->group('search', 'indexer'); uses(RefreshDatabase::class); @@ -60,6 +60,7 @@ ]); $data = app(ProductIndexer::class)->toSearchableArray($product); + expect($data)->toHaveKey('id'); expect($data['skus'])->toBe([$variant->sku]); expect($data['status'])->toEqual($product->status); diff --git a/tests/core/Unit/Search/ProductOptionIndexerTest.php b/tests/core/Unit/Search/ProductOptionIndexerTest.php index 785c687279..42694857bf 100644 --- a/tests/core/Unit/Search/ProductOptionIndexerTest.php +++ b/tests/core/Unit/Search/ProductOptionIndexerTest.php @@ -2,18 +2,27 @@ use Illuminate\Foundation\Testing\RefreshDatabase; use Lunar\Models\ProductOption; +use Lunar\Models\ProductOptionValue; use Lunar\Search\ProductOptionIndexer; use Lunar\Tests\Core\TestCase; -uses(TestCase::class); +uses(TestCase::class)->group('search', 'indexer'); uses(RefreshDatabase::class); test('can return correct searchable data', function () { $productOption = ProductOption::factory()->create(); + $value = ProductOptionValue::factory()->create([ + 'product_option_id' => $productOption->id, + 'name' => [ + 'en' => 'Small', + ], + ]); + $data = app(ProductOptionIndexer::class)->toSearchableArray($productOption); expect($data['name_en'])->toEqual($productOption->name->en) - ->and($data['label_en'])->toEqual($productOption->label->en); + ->and($data['label_en'])->toEqual($productOption->label->en) + ->and($data['option_'.$value->id.'_en'])->toEqual('Small'); }); diff --git a/tests/core/Unit/Search/ScoutIndexerTest.php b/tests/core/Unit/Search/ScoutIndexerTest.php index 4b954882b0..79b0b175d3 100644 --- a/tests/core/Unit/Search/ScoutIndexerTest.php +++ b/tests/core/Unit/Search/ScoutIndexerTest.php @@ -11,7 +11,7 @@ use Lunar\Search\ScoutIndexer; use Lunar\Tests\Core\TestCase; -uses(TestCase::class); +uses(TestCase::class)->group('search', 'indexer'); uses(RefreshDatabase::class);