diff --git a/app/Billing/Charge.php b/app/Billing/Charge.php new file mode 100644 index 0000000..140db4d --- /dev/null +++ b/app/Billing/Charge.php @@ -0,0 +1,23 @@ +data = $data; + } + + public function amount() + { + return $this->data['amount']; + } + + public function cardLastFour() + { + return $this->data['card_last_four']; + } +} diff --git a/app/Billing/FakePaymentGateway.php b/app/Billing/FakePaymentGateway.php index c53b432..2a87ddb 100644 --- a/app/Billing/FakePaymentGateway.php +++ b/app/Billing/FakePaymentGateway.php @@ -5,16 +5,20 @@ namespace App\Billing; class FakePaymentGateway implements PaymentGateway { private $charges; + private $tokens; private $beforeFirstChargeCallback; public function __construct() { $this->charges = collect(); + $this->tokens = collect(); } - public function getValidTestToken() + public function getValidTestToken($cardNumber = '4242424242424242') { - return "valid-token"; + $token = 'fake-tok_'.str_random(24); + $this->tokens[$token] = $cardNumber; + return $token; } public function charge($amount, $token) @@ -25,10 +29,14 @@ class FakePaymentGateway implements PaymentGateway $callback($this); } - if ($token !== $this->getValidTestToken()) { + if (! $this->tokens->has($token)) { throw new PaymentFailedException; } - $this->charges[] = $amount; + + return $this->charges[] = new Charge([ + 'amount' => $amount, + 'card_last_four' => substr($this->tokens[$token], -4), + ]); } public function newChargesDuring($callback) @@ -40,7 +48,7 @@ class FakePaymentGateway implements PaymentGateway public function totalCharges() { - return $this->charges->sum(); + return $this->charges->map->amount()->sum(); } public function beforeFirstCharge($callback) diff --git a/database/migrations/2016_11_08_205823_create_orders_table.php b/database/migrations/2016_11_08_205823_create_orders_table.php index 803a78f..d51b725 100644 --- a/database/migrations/2016_11_08_205823_create_orders_table.php +++ b/database/migrations/2016_11_08_205823_create_orders_table.php @@ -15,7 +15,7 @@ class CreateOrdersTable extends Migration { Schema::create('orders', function (Blueprint $table) { $table->increments('id'); - $table->string('confirmation_number')->nullable(); + $table->string('confirmation_number'); $table->integer('amount'); $table->string('email'); $table->string('card_last_four')->nullable(); diff --git a/tests/unit/Billing/PaymentGatewayContractTests.php b/tests/unit/Billing/PaymentGatewayContractTests.php index 04025db..62bde6c 100644 --- a/tests/unit/Billing/PaymentGatewayContractTests.php +++ b/tests/unit/Billing/PaymentGatewayContractTests.php @@ -16,7 +16,18 @@ trait PaymentGatewayContractTests }); $this->assertCount(1, $newCharges); - $this->assertEquals(2500, $newCharges->sum()); + $this->assertEquals(2500, $newCharges->map->amount()->sum()); + } + + /** @test */ + function can_get_details_about_a_successful_charge() + { + $paymentGateway = $this->getPaymentGateway(); + + $charge = $paymentGateway->charge(2500, $paymentGateway->getValidTestToken('0000000000004242')); + + $this->assertEquals('4242', $charge->cardLastFour()); + $this->assertEquals(2500, $charge->amount()); } /** @test */ @@ -50,6 +61,6 @@ trait PaymentGatewayContractTests }); $this->assertCount(2, $newCharges); - $this->assertEquals([5000, 4000], $newCharges->all()); + $this->assertEquals([5000, 4000], $newCharges->map->amount()->all()); } }