'TEST10', 'type' => 'percentage', 'value' => 10, 'min_order_amount' => 100000, 'is_active' => true, ]); DiscountCode::create([ 'code' => 'INACTIVE', 'type' => 'fixed', 'value' => 50000, 'is_active' => false, ]); $response = $this->get('/api/v1/discount-codes'); $response->assertStatus(200) ->assertJson([ 'codes' => [ [ 'code' => 'TEST10', 'type' => 'percentage', 'value' => 10, ], ], ]) ->assertJsonCount(1, 'codes'); } #[Test] public function it_validates_discount_code_successfully() { DiscountCode::create([ 'code' => 'PERCENT10', 'type' => 'percentage', 'value' => 10, 'min_order_amount' => 100000, 'is_active' => true, ]); $response = $this->post('/api/v1/discount-codes/validate', [ 'code' => 'PERCENT10', 'total_price' => 500000, ]); $response->assertStatus(200) ->assertJson([ 'valid' => true, 'type' => 'percentage', 'value' => 10, 'discount_amount' => 50000, 'final_price' => 450000, ]); } #[Test] public function it_rejects_invalid_discount_code() { $response = $this->post('/api/v1/discount-codes/validate', [ 'code' => 'INVALID', 'total_price' => 500000, ]); $response->assertStatus(200) ->assertJson([ 'valid' => false, 'message' => 'کد تخفیف نامعتبر است.', ]); } #[Test] public function it_rejects_expired_discount_code() { DiscountCode::create([ 'code' => 'EXPIRED', 'type' => 'fixed', 'value' => 50000, 'is_active' => true, 'expires_at' => now()->subDay(), ]); $response = $this->post('/api/v1/discount-codes/validate', [ 'code' => 'EXPIRED', 'total_price' => 500000, ]); $response->assertStatus(200) ->assertJson([ 'valid' => false, 'message' => 'این کد تخفیف منقضی شده است.', ]); } #[Test] public function it_rejects_code_below_minimum_order_amount() { DiscountCode::create([ 'code' => 'MIN500', 'type' => 'fixed', 'value' => 50000, 'min_order_amount' => 500000, 'is_active' => true, ]); $response = $this->post('/api/v1/discount-codes/validate', [ 'code' => 'MIN500', 'total_price' => 100000, ]); $response->assertStatus(200) ->assertJson([ 'valid' => false, ]) ->assertJsonStructure(['message']); } #[Test] public function it_calculates_fixed_discount_correctly() { DiscountCode::create([ 'code' => 'FIXED50', 'type' => 'fixed', 'value' => 50000, 'min_order_amount' => 100000, 'is_active' => true, ]); $response = $this->post('/api/v1/discount-codes/validate', [ 'code' => 'FIXED50', 'total_price' => 500000, ]); $response->assertStatus(200) ->assertJson([ 'valid' => true, 'discount_amount' => 50000, 'final_price' => 450000, ]); } }