[ ['provider_id' => 10], ['provider_id' => 20], ], ]); $validator = validator([], []); foreach ($request->after() as $callback) { $callback($validator); } $this->assertSame( 'Todos os agendamentos do carrinho precisam ser do mesmo prestador.', $validator->errors()->first('schedules'), ); } public function test_request_accepts_schedules_from_the_same_provider(): void { $request = CartRequest::create('/cart/me', 'POST', [ 'provider_id' => 10, 'schedules' => [ ['date' => '2026-08-01'], ['provider_id' => 10, 'date' => '2026-08-02'], ], ]); $validator = validator([], []); foreach ($request->after() as $callback) { $callback($validator); } $this->assertFalse($validator->errors()->has('schedules')); } public function test_service_defensively_rejects_mixed_providers(): void { $method = new \ReflectionMethod(CartService::class, 'singleProviderId'); $this->expectException(ValidationException::class); $method->invoke(new CartService, [], [ ['provider_id' => 10], ['provider_id' => 20], ]); } public function test_checkout_rejects_a_cart_with_a_schedule_from_another_provider(): void { $cart = $this->cart(providerId: 10); $schedules = collect([ $this->schedule(id: 1, providerId: 10), $this->schedule(id: 2, providerId: 20), ]); $method = new \ReflectionMethod(PaymentService::class, 'validateCartForPayment'); $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Todos os agendamentos do carrinho precisam ser do mesmo prestador.'); $method->invoke(new PaymentService(new PagarmePaymentService), $cart, $schedules); } public function test_checkout_waits_until_every_schedule_is_accepted(): void { $cart = $this->cart(providerId: 10); $schedules = collect([ $this->schedule(id: 1, providerId: 10), $this->schedule(id: 2, providerId: 10, status: 'pending'), ]); $method = new \ReflectionMethod(PaymentService::class, 'validateCartForPayment'); $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Agendamento 2 precisa estar aceito para o carrinho ser pago.'); $method->invoke(new PaymentService(new PagarmePaymentService), $cart, $schedules); } private function cart(int $providerId): Cart { $provider = new Provider; $provider->forceFill([ 'id' => $providerId, 'recipient_id' => 'rp_test', ]); $cart = new Cart; $cart->forceFill([ 'id' => 1, 'client_id' => 30, 'provider_id' => $providerId, 'status' => CartStatusEnum::OPEN->value, ]); $cart->setRelation('provider', $provider); return $cart; } private function schedule(int $id, int $providerId, string $status = 'accepted'): Schedule { $schedule = new Schedule; $schedule->forceFill([ 'id' => $id, 'client_id' => 30, 'provider_id' => $providerId, 'status' => $status, 'total_amount' => 100, ]); return $schedule; } }