From 551e4cad271db62dccf9d96741ef10481f190903 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 30 Oct 2023 10:04:37 +1100 Subject: [PATCH] Tests for filtering invoice item reports --- app/Export/CSV/InvoiceItemExport.php | 17 +++ .../Export/ReportCsvGenerationTest.php | 114 +++++++++++++++--- 2 files changed, 117 insertions(+), 14 deletions(-) diff --git a/app/Export/CSV/InvoiceItemExport.php b/app/Export/CSV/InvoiceItemExport.php index 8ccc8a39ff55..f3da05653b62 100644 --- a/app/Export/CSV/InvoiceItemExport.php +++ b/app/Export/CSV/InvoiceItemExport.php @@ -72,10 +72,27 @@ class InvoiceItemExport extends BaseExport $query = $this->addDateRange($query); + $query = $this->applyFilters($query); + return $query; } + private function applyFilters(Builder $query): Builder + { + + if(isset($this->input['product_key'])) { + + $products = explode(",", $this->input['product_key']); + + foreach($products as $product) + $query->orWhereJsonContains('line_items', ['product_key' => $product]); + + } + + return $query; + } + public function returnJson() { $query = $this->init(); diff --git a/tests/Feature/Export/ReportCsvGenerationTest.php b/tests/Feature/Export/ReportCsvGenerationTest.php index 2df5bf10648b..2b44110073a4 100644 --- a/tests/Feature/Export/ReportCsvGenerationTest.php +++ b/tests/Feature/Export/ReportCsvGenerationTest.php @@ -11,26 +11,27 @@ namespace Tests\Feature\Export; -use App\DataMapper\CompanySettings; -use App\Export\CSV\PaymentExport; -use App\Export\CSV\ProductExport; -use App\Export\CSV\TaskExport; -use App\Export\CSV\VendorExport; -use App\Factory\CompanyUserFactory; -use App\Models\Account; +use Tests\TestCase; +use App\Models\User; use App\Models\Client; -use App\Models\ClientContact; -use App\Models\Company; -use App\Models\CompanyToken; use App\Models\Credit; +use League\Csv\Reader; +use App\Models\Account; +use App\Models\Company; use App\Models\Expense; use App\Models\Invoice; -use App\Models\User; +use App\Models\CompanyToken; +use App\Models\ClientContact; +use App\Export\CSV\TaskExport; use App\Utils\Traits\MakesHash; -use Illuminate\Routing\Middleware\ThrottleRequests; +use App\Export\CSV\VendorExport; +use App\Export\CSV\PaymentExport; +use App\Export\CSV\ProductExport; +use App\DataMapper\CompanySettings; +use App\Factory\CompanyUserFactory; +use App\Factory\InvoiceItemFactory; use Illuminate\Support\Facades\Http; -use League\Csv\Reader; -use Tests\TestCase; +use Illuminate\Routing\Middleware\ThrottleRequests; /** * @test @@ -290,6 +291,91 @@ class ReportCsvGenerationTest extends TestCase return $response; } + + public function testProductJsonFiltering() + { + + $query = Invoice::query(); + + $products = explode(",", "clown,joker,batman"); + + foreach($products as $product) { + $query->orWhereJsonContains('line_items', ['product_key' => $product]); + } + + $this->assertEquals(0, $query->count()); + + + } + + public function testProductKeyFilterQueries() + { + + $item = InvoiceItemFactory::create(); + $item->product_key = 'haloumi'; + + $line_items = []; + + $line_items[] = $item; + $q = Invoice::whereJsonContains('line_items', ['product_key' => 'haloumi']); + + $this->assertEquals(0, $q->count()); + + Invoice::factory()->create( + [ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'client_id' => $this->client->id, + 'line_items' => $line_items + ] + ); + + $this->assertEquals(1, $q->count()); + + $q->forceDelete(); + + Invoice::factory()->create( + [ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'client_id' => $this->client->id, + 'line_items' => $line_items + ] + ); + + $item = InvoiceItemFactory::create(); + $item->product_key = 'bob the builder'; + + $line_items = []; + + $line_items[] = $item; + + $q = Invoice::whereJsonContains('line_items', ['product_key' => 'bob the builder']); + + $this->assertEquals(0, $q->count()); + + Invoice::factory()->create( + [ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'client_id' => $this->client->id, + 'line_items' => $line_items + ] + ); + + $this->assertEquals(1, $q->count()); + + $q = Invoice::whereJsonContains('line_items', ['product_key' => 'Bob the builder']); + $this->assertEquals(0, $q->count()); + + $q = Invoice::whereJsonContains('line_items', ['product_key' => 'bob']); + $this->assertEquals(0, $q->count()); + + $q->forceDelete(); + + Invoice::withTrashed()->cursor()->each(function ($i){ $i->forceDelete();}); + } + public function testVendorCsvGeneration() {