mirror of
https://github.com/nothingworksinc/ticketbeast.git
synced 2026-02-08 13:50:42 +00:00
3.3 - Refusing Orders When There Are No More Tickets
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
namespace App;
|
namespace App;
|
||||||
|
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use App\Exceptions\NotEnoughTicketsException;
|
||||||
|
|
||||||
class Concert extends Model
|
class Concert extends Model
|
||||||
{
|
{
|
||||||
@@ -41,8 +42,13 @@ class Concert extends Model
|
|||||||
|
|
||||||
public function orderTickets($email, $ticketQuantity)
|
public function orderTickets($email, $ticketQuantity)
|
||||||
{
|
{
|
||||||
|
$tickets = $this->tickets()->available()->take($ticketQuantity)->get();
|
||||||
|
|
||||||
|
if ($tickets->count() < $ticketQuantity) {
|
||||||
|
throw new NotEnoughTicketsException;
|
||||||
|
}
|
||||||
|
|
||||||
$order = $this->orders()->create(['email' => $email]);
|
$order = $this->orders()->create(['email' => $email]);
|
||||||
$tickets = $this->tickets()->take($ticketQuantity)->get();
|
|
||||||
|
|
||||||
foreach ($tickets as $ticket) {
|
foreach ($tickets as $ticket) {
|
||||||
$order->tickets()->save($ticket);
|
$order->tickets()->save($ticket);
|
||||||
@@ -60,6 +66,6 @@ class Concert extends Model
|
|||||||
|
|
||||||
public function ticketsRemaining()
|
public function ticketsRemaining()
|
||||||
{
|
{
|
||||||
return $this->tickets()->whereNull('order_id')->count();
|
return $this->tickets()->available()->count();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
5
app/Exceptions/NotEnoughTicketsException.php
Normal file
5
app/Exceptions/NotEnoughTicketsException.php
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Exceptions;
|
||||||
|
|
||||||
|
class NotEnoughTicketsException extends \RuntimeException {}
|
||||||
@@ -6,5 +6,8 @@ use Illuminate\Database\Eloquent\Model;
|
|||||||
|
|
||||||
class Ticket extends Model
|
class Ticket extends Model
|
||||||
{
|
{
|
||||||
//
|
public function scopeAvailable($query)
|
||||||
|
{
|
||||||
|
return $query->whereNull('order_id');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
use App\Concert;
|
use App\Concert;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
use App\Exceptions\NotEnoughTicketsException;
|
||||||
use Illuminate\Foundation\Testing\WithoutMiddleware;
|
use Illuminate\Foundation\Testing\WithoutMiddleware;
|
||||||
use Illuminate\Foundation\Testing\DatabaseMigrations;
|
use Illuminate\Foundation\Testing\DatabaseMigrations;
|
||||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||||
@@ -58,6 +59,7 @@ class ConcertTest extends TestCase
|
|||||||
function can_order_concert_tickets()
|
function can_order_concert_tickets()
|
||||||
{
|
{
|
||||||
$concert = factory(Concert::class)->create();
|
$concert = factory(Concert::class)->create();
|
||||||
|
$concert->addTickets(3);
|
||||||
|
|
||||||
$order = $concert->orderTickets('jane@example.com', 3);
|
$order = $concert->orderTickets('jane@example.com', 3);
|
||||||
|
|
||||||
@@ -84,4 +86,41 @@ class ConcertTest extends TestCase
|
|||||||
|
|
||||||
$this->assertEquals(20, $concert->ticketsRemaining());
|
$this->assertEquals(20, $concert->ticketsRemaining());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @test */
|
||||||
|
function trying_to_purchase_more_tickets_than_remain_throws_an_exception()
|
||||||
|
{
|
||||||
|
$concert = factory(Concert::class)->create();
|
||||||
|
$concert->addTickets(10);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$concert->orderTickets('jane@example.com', 11);
|
||||||
|
} catch (NotEnoughTicketsException $e) {
|
||||||
|
$order = $concert->orders()->where('email', 'jane@example.com')->first();
|
||||||
|
$this->assertNull($order);
|
||||||
|
$this->assertEquals(10, $concert->ticketsRemaining());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->fail("Order succeeded even though there were not enough tickets remaining.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @test */
|
||||||
|
function cannot_order_tickets_that_have_already_been_purchased()
|
||||||
|
{
|
||||||
|
$concert = factory(Concert::class)->create();
|
||||||
|
$concert->addTickets(10);
|
||||||
|
$concert->orderTickets('jane@example.com', 8);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$concert->orderTickets('john@example.com', 3);
|
||||||
|
} catch (NotEnoughTicketsException $e) {
|
||||||
|
$johnsOrder = $concert->orders()->where('email', 'john@example.com')->first();
|
||||||
|
$this->assertNull($johnsOrder);
|
||||||
|
$this->assertEquals(2, $concert->ticketsRemaining());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->fail("Order succeeded even though there were not enough tickets remaining.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user