6.9 - Respecting Reservations

This commit is contained in:
Adam Wathan
2016-11-20 20:10:15 -05:00
parent c3c80722f5
commit 79a26c77ed
4 changed files with 37 additions and 3 deletions

View File

@@ -58,7 +58,9 @@ class Concert extends Model
public function reserveTickets($quantity)
{
return $this->findTickets($quantity);
return $this->findTickets($quantity)->each(function ($ticket) {
$ticket->reserve();
});
}
public function findTickets($quantity)

View File

@@ -31,7 +31,7 @@ class ConcertOrdersController extends Controller
try {
// Find some tickets
$tickets = $concert->findTickets(request('ticket_quantity'));
$tickets = $concert->reserveTickets(request('ticket_quantity'));
$reservation = new Reservation($tickets);
// Charge the customer for the tickets

View File

@@ -11,7 +11,7 @@ class Ticket extends Model
public function scopeAvailable($query)
{
return $query->whereNull('order_id');
return $query->whereNull('order_id')->whereNull('reserved_at');
}
public function reserve()

View File

@@ -129,4 +129,36 @@ class ConcertTest extends TestCase
$this->assertCount(2, $reservedTickets);
$this->assertEquals(1, $concert->ticketsRemaining());
}
/** @test */
function cannot_reserve_tickets_that_have_already_been_purchased()
{
$concert = factory(Concert::class)->create()->addTickets(3);
$concert->orderTickets('jane@example.com', 2);
try {
$concert->reserveTickets(2);
} catch (NotEnoughTicketsException $e) {
$this->assertEquals(1, $concert->ticketsRemaining());
return;
}
$this->fail("Reserving tickets succeeded even though the tickets were already sold.");
}
/** @test */
function cannot_reserve_tickets_that_have_already_been_reserved()
{
$concert = factory(Concert::class)->create()->addTickets(3);
$concert->reserveTickets(2);
try {
$concert->reserveTickets(2);
} catch (NotEnoughTicketsException $e) {
$this->assertEquals(1, $concert->ticketsRemaining());
return;
}
$this->fail("Reserving tickets succeeded even though the tickets were already reserved.");
}
}