protected function setUp()
 {
     parent::setUp();
     $this->orderId = OrderId::generate();
     $this->order = Order::orderProduct($this->orderId, ProductId::generate(), 100);
     $this->contract = Contract::with(Order::class);
 }
 /**
  * @test
  */
 public function it_should_behave_the_same_after_reconstitution()
 {
     $orderId = OrderId::generate();
     $history = new DomainEventsArray([new ProductWasOrdered($orderId, ProductId::generate(), 100), new PaymentWasMade($orderId, 50)]);
     $order = Order::reconstituteFrom($history);
     $order->pay(50);
     $changes = $order->getChanges();
     $this->assertCount(2, $changes);
     $this->assertInstanceOf(PaymentWasMade::class, $changes[0]);
     $this->assertInstanceOf(OrderWasPaidInFull::class, $changes[1]);
 }
 /**
  * @test
  */
 public function it_should_protect_invariants()
 {
     $orderId = OrderId::generate();
     $order = Order::orderProduct($orderId, ProductId::generate(), 100);
     $order->pay(50);
     $order->pay(50);
     $changes = $order->getChanges();
     $this->assertCount(4, $changes);
     $this->assertInstanceOf(ProductWasOrdered::class, $changes[0]);
     $this->assertInstanceOf(PaymentWasMade::class, $changes[1]);
     $this->assertInstanceOf(PaymentWasMade::class, $changes[2]);
     $this->assertInstanceOf(OrderWasPaidInFull::class, $changes[3]);
 }
 /**
  * @test
  * @dataProvider providePersistence
  * @param Persistence $persistence
  */
 public function retrieved_order_should_behave_the_same_as_the_original_order(Persistence $persistence)
 {
     $unitOfWork = $this->buildUnitOfWork($persistence);
     $repository = new OrderRepository($unitOfWork);
     $orderId = OrderId::generate();
     $order = Order::orderProduct($orderId, ProductId::generate(), 100);
     $repository->add($order);
     $unitOfWork->commit();
     $retrievedOrder = $repository->get($orderId);
     /** @var $retrievedOrder Order */
     $retrievedOrder->pay(50);
     $retrievedOrder->pay(50);
     $changes = $retrievedOrder->getChanges();
     $this->assertCount(3, $changes);
     $this->assertInstanceOf(PaymentWasMade::class, $changes[0]);
     $this->assertInstanceOf(PaymentWasMade::class, $changes[1]);
     $this->assertInstanceOf(OrderWasPaidInFull::class, $changes[2]);
 }
 protected function setUp()
 {
     parent::setUp();
     $this->order = Order::orderProduct(OrderId::generate(), ProductId::generate(), 100);
 }