49 - Moving the Email to the Reservation

This commit is contained in:
Adam Wathan
2016-12-15 11:51:22 -05:00
parent 2ab35a2f14
commit 11c3bfaae7
5 changed files with 28 additions and 12 deletions

View File

@@ -56,13 +56,13 @@ class Concert extends Model
return $this->createOrder($email, $tickets); return $this->createOrder($email, $tickets);
} }
public function reserveTickets($quantity) public function reserveTickets($quantity, $email)
{ {
$tickets = $this->findTickets($quantity)->each(function ($ticket) { $tickets = $this->findTickets($quantity)->each(function ($ticket) {
$ticket->reserve(); $ticket->reserve();
}); });
return new Reservation($tickets); return new Reservation($tickets, $email);
} }
public function findTickets($quantity) public function findTickets($quantity)

View File

@@ -31,13 +31,13 @@ class ConcertOrdersController extends Controller
try { try {
// Find some tickets // Find some tickets
$reservation = $concert->reserveTickets(request('ticket_quantity')); $reservation = $concert->reserveTickets(request('ticket_quantity'), request('email'));
// Charge the customer for the tickets // Charge the customer for the tickets
$this->paymentGateway->charge($reservation->totalCost(), request('payment_token')); $this->paymentGateway->charge($reservation->totalCost(), request('payment_token'));
// Create an order for those tickets // Create an order for those tickets
$order = Order::forTickets($reservation->tickets(), request('email'), $reservation->totalCost()); $order = Order::forTickets($reservation->tickets(), $reservation->email(), $reservation->totalCost());
return response()->json($order, 201); return response()->json($order, 201);

View File

@@ -5,10 +5,12 @@ namespace App;
class Reservation class Reservation
{ {
private $tickets; private $tickets;
private $email;
public function __construct($tickets) public function __construct($tickets, $email)
{ {
$this->tickets = $tickets; $this->tickets = $tickets;
$this->email = $email;
} }
public function totalCost() public function totalCost()
@@ -21,6 +23,11 @@ class Reservation
return $this->tickets; return $this->tickets;
} }
public function email()
{
return $this->email;
}
public function cancel() public function cancel()
{ {
foreach ($this->tickets as $ticket) { foreach ($this->tickets as $ticket) {

View File

@@ -124,9 +124,10 @@ class ConcertTest extends TestCase
$concert = factory(Concert::class)->create()->addTickets(3); $concert = factory(Concert::class)->create()->addTickets(3);
$this->assertEquals(3, $concert->ticketsRemaining()); $this->assertEquals(3, $concert->ticketsRemaining());
$reservation = $concert->reserveTickets(2); $reservation = $concert->reserveTickets(2, 'john@example.com');
$this->assertCount(2, $reservation->tickets()); $this->assertCount(2, $reservation->tickets());
$this->assertEquals('john@example.com', $reservation->email());
$this->assertEquals(1, $concert->ticketsRemaining()); $this->assertEquals(1, $concert->ticketsRemaining());
} }
@@ -137,7 +138,7 @@ class ConcertTest extends TestCase
$concert->orderTickets('jane@example.com', 2); $concert->orderTickets('jane@example.com', 2);
try { try {
$concert->reserveTickets(2); $concert->reserveTickets(2, 'john@example.com');
} catch (NotEnoughTicketsException $e) { } catch (NotEnoughTicketsException $e) {
$this->assertEquals(1, $concert->ticketsRemaining()); $this->assertEquals(1, $concert->ticketsRemaining());
return; return;
@@ -150,10 +151,10 @@ class ConcertTest extends TestCase
function cannot_reserve_tickets_that_have_already_been_reserved() function cannot_reserve_tickets_that_have_already_been_reserved()
{ {
$concert = factory(Concert::class)->create()->addTickets(3); $concert = factory(Concert::class)->create()->addTickets(3);
$concert->reserveTickets(2); $concert->reserveTickets(2, 'jane@example.com');
try { try {
$concert->reserveTickets(2); $concert->reserveTickets(2, 'john@example.com');
} catch (NotEnoughTicketsException $e) { } catch (NotEnoughTicketsException $e) {
$this->assertEquals(1, $concert->ticketsRemaining()); $this->assertEquals(1, $concert->ticketsRemaining());
return; return;

View File

@@ -18,7 +18,7 @@ class ReservationTest extends TestCase
(object) ['price' => 1200], (object) ['price' => 1200],
]); ]);
$reservation = new Reservation($tickets); $reservation = new Reservation($tickets, 'john@example.com');
$this->assertEquals(3600, $reservation->totalCost()); $this->assertEquals(3600, $reservation->totalCost());
} }
@@ -32,11 +32,19 @@ class ReservationTest extends TestCase
(object) ['price' => 1200], (object) ['price' => 1200],
]); ]);
$reservation = new Reservation($tickets); $reservation = new Reservation($tickets, 'john@example.com');
$this->assertEquals($tickets, $reservation->tickets()); $this->assertEquals($tickets, $reservation->tickets());
} }
/** @test */
function retrieving_the_customers_email()
{
$reservation = new Reservation(collect(), 'john@example.com');
$this->assertEquals('john@example.com', $reservation->email());
}
/** @test */ /** @test */
function reserved_tickets_are_released_when_a_reservation_is_cancelled() function reserved_tickets_are_released_when_a_reservation_is_cancelled()
{ {
@@ -46,7 +54,7 @@ class ReservationTest extends TestCase
Mockery::spy(Ticket::class), Mockery::spy(Ticket::class),
]); ]);
$reservation = new Reservation($tickets); $reservation = new Reservation($tickets, 'john@example.com');
$reservation->cancel(); $reservation->cancel();