diff --git a/app/Billing/FakePaymentGateway.php b/app/Billing/FakePaymentGateway.php index 668ef62..26182a6 100644 --- a/app/Billing/FakePaymentGateway.php +++ b/app/Billing/FakePaymentGateway.php @@ -31,6 +31,13 @@ class FakePaymentGateway implements PaymentGateway $this->charges[] = $amount; } + public function newChargesDuring($callback) + { + $chargesFrom = $this->charges->count(); + $callback($this); + return $this->charges->slice($chargesFrom)->values(); + } + public function totalCharges() { return $this->charges->sum(); diff --git a/app/Billing/PaymentGateway.php b/app/Billing/PaymentGateway.php index b1f5bf8..0ca0840 100644 --- a/app/Billing/PaymentGateway.php +++ b/app/Billing/PaymentGateway.php @@ -7,4 +7,5 @@ interface PaymentGateway public function charge($amount, $token); public function getValidTestToken(); + public function newChargesDuring($callback); } diff --git a/tests/unit/Billing/FakePaymentGatewayTest.php b/tests/unit/Billing/FakePaymentGatewayTest.php index 42c8c17..c2f4367 100644 --- a/tests/unit/Billing/FakePaymentGatewayTest.php +++ b/tests/unit/Billing/FakePaymentGatewayTest.php @@ -13,14 +13,33 @@ class FakePaymentGatewayTest extends TestCase return new FakePaymentGateway; } + /** @test */ + function can_fetch_charges_created_during_a_callback() + { + $paymentGateway = $this->getPaymentGateway(); + $paymentGateway->charge(2000, $paymentGateway->getValidTestToken()); + $paymentGateway->charge(3000, $paymentGateway->getValidTestToken()); + + $newCharges = $paymentGateway->newChargesDuring(function ($paymentGateway) { + $paymentGateway->charge(4000, $paymentGateway->getValidTestToken()); + $paymentGateway->charge(5000, $paymentGateway->getValidTestToken()); + }); + + $this->assertCount(2, $newCharges); + $this->assertEquals([4000, 5000], $newCharges->all()); + } + /** @test */ function charges_with_a_valid_payment_token_are_successful() { $paymentGateway = $this->getPaymentGateway(); - $paymentGateway->charge(2500, $paymentGateway->getValidTestToken()); + $newCharges = $paymentGateway->newChargesDuring(function ($paymentGateway) { + $paymentGateway->charge(2500, $paymentGateway->getValidTestToken()); + }); - $this->assertEquals(2500, $paymentGateway->totalCharges()); + $this->assertCount(1, $newCharges); + $this->assertEquals(2500, $newCharges->sum()); } /** @test */