createMock(HttpClientInterface::class); $serializerMock ??= $this->createMock(SerializerInterface::class); $pricingStrategyMock ??= $this->createMock(PricingStrategy::class); $clientServiceMock ??= $this->createMock(ClientService::class); return new OrderService($httpClientMock, $serializerMock, $pricingStrategyMock, $clientServiceMock); } public function testCrmGetsCalledOnValidOrderRequest() { $httpClientMock = $this->createMock(HttpClientInterface::class); $httpClientMock->expects($this->once())->method('request')->with('POST', '/order'); $order = new AcceptOrderCommand( $this->createValidOrderDto(), $this->createClient(balance: 100_00) ); $sut = $this->createOrderService(httpClientMock: $httpClientMock); $sut->acceptOrder($order); } public function testTotalPriceIsDeducedFromClientBalance() { $initialBalance = 10000_00; $price = 6900_00; $command = new AcceptOrderCommand( $order = $this->createValidOrderDto(), $client = $this->createClient($initialBalance), ); $pricingStrategyMock = $this->createMock(PricingStrategy::class); $pricingStrategyMock ->expects($this->atLeastOnce()) ->method('calculateTotalPriceOfOrder') ->with($order) ->willReturn($price); $sut = $this->createOrderService(pricingStrategyMock: $pricingStrategyMock); $sut->acceptOrder($command); $this->assertEquals($initialBalance, $client->getInitialBalance(), 'Initial balance got changed after placing order'); $this->assertEquals($initialBalance - $price, $client->getBalance(), 'Current balance not changed after placing order'); } public function testClientIsUpdatedAfterPlacingOrder() { $command = new AcceptOrderCommand( $this->createValidOrderDto(), $client = $this->createClient(10000_00), ); $clientServiceMock = $this->createMock(ClientService::class); $clientServiceMock->expects($this->once())->method('save')->with($client); $sut = $this->createOrderService(clientServiceMock: $clientServiceMock); $sut->acceptOrder($command); } }