From c85facd93b8b4b8a7cd675e1e0bb9730947db85a Mon Sep 17 00:00:00 2001 From: Abner Tudtud <114082473+enjinabner@users.noreply.github.com> Date: Fri, 28 Jul 2023 17:26:48 +0800 Subject: [PATCH] Check highest bid (#8) --- src/Rules/MinimumPrice.php | 10 +++++++--- .../GraphQL/Mutations/PlaceBidTest.php | 20 ++++++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/Rules/MinimumPrice.php b/src/Rules/MinimumPrice.php index 7ebf77c..91751a2 100644 --- a/src/Rules/MinimumPrice.php +++ b/src/Rules/MinimumPrice.php @@ -39,9 +39,13 @@ public function setData($data) public function validate(string $attribute, mixed $value, Closure $fail): void { if ($listingId = Arr::get($this->data, 'listingId')) { - $listing = MarketplaceListing::where('listing_id', $listingId)->first(); - if ($listing && $value < $listing->price) { - $fail('enjin-platform-marketplace::validation.minimum_price')->translate(['price' => $listing->price]); + if (!$listing = MarketplaceListing::where('listing_id', $listingId)->with('highestBid')->first()) { + return; + } + + $price = $listing?->highestBid?->price ?? $listing?->price; + if ($value < $price) { + $fail('enjin-platform-marketplace::validation.minimum_price')->translate(['price' => $price]); } } } diff --git a/tests/Feature/GraphQL/Mutations/PlaceBidTest.php b/tests/Feature/GraphQL/Mutations/PlaceBidTest.php index 0800785..e1fb92d 100644 --- a/tests/Feature/GraphQL/Mutations/PlaceBidTest.php +++ b/tests/Feature/GraphQL/Mutations/PlaceBidTest.php @@ -76,7 +76,7 @@ public function test_it_will_fail_with_invalid_parameter_listing_id(): void public function test_it_will_fail_with_invalid_parameter_price(): void { $listing = $this->createListing(); - $data = ['listingId' => $listing->listing_id, 'price' => $price = fake()->numberBetween(1, 1000)]; + $data = ['listingId' => $listing->listing_id, 'price' => fake()->numberBetween(1, 1000)]; $response = $this->graphql( $this->method, array_merge($data, ['price' => null]), @@ -107,13 +107,27 @@ public function test_it_will_fail_with_invalid_parameter_price(): void $response['error'] ); + $listing->load('highestBid'); + $price = $listing?->highestBid?->price ?? $listing?->price; + $response = $this->graphql( + $this->method, + array_merge($data, ['price' => $price - 1]), + true + ); + $this->assertArraySubset( + ['price' => ["The minimum bidding price is {$price}."]], + $response['error'] + ); + + $listing->bids->each->delete(); + $price = $listing->price; $response = $this->graphql( $this->method, - array_merge($data, ['price' => $listing->price - 1]), + array_merge($data, ['price' => $price - 1]), true ); $this->assertArraySubset( - ['price' => ["The minimum bidding price is {$listing->price}."]], + ['price' => ["The minimum bidding price is {$price}."]], $response['error'] );