diff --git a/app/Concert.php b/app/Concert.php index f92d6ff..4be36e2 100644 --- a/app/Concert.php +++ b/app/Concert.php @@ -69,16 +69,7 @@ class Concert extends Model public function createOrder($email, $tickets) { - $order = Order::create([ - 'email' => $email, - 'amount' => $tickets->sum('price'), - ]); - - foreach ($tickets as $ticket) { - $order->tickets()->save($ticket); - } - - return $order; + return Order::forTickets($tickets, $email); } public function addTickets($quantity) diff --git a/app/Http/Controllers/ConcertOrdersController.php b/app/Http/Controllers/ConcertOrdersController.php index 5b34583..7d43c76 100644 --- a/app/Http/Controllers/ConcertOrdersController.php +++ b/app/Http/Controllers/ConcertOrdersController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Order; use App\Concert; use Illuminate\Http\Request; use App\Billing\PaymentGateway; @@ -36,7 +37,7 @@ class ConcertOrdersController extends Controller $this->paymentGateway->charge(request('ticket_quantity') * $concert->ticket_price, request('payment_token')); // Create an order for those tickets - $order = $concert->createOrder(request('email'), $tickets); + $order = Order::forTickets($tickets, request('email')); return response()->json($order, 201); diff --git a/app/Order.php b/app/Order.php index 8350c38..9d6e4d6 100644 --- a/app/Order.php +++ b/app/Order.php @@ -8,6 +8,20 @@ class Order extends Model { protected $guarded = []; + public static function forTickets($tickets, $email) + { + $order = self::create([ + 'email' => $email, + 'amount' => $tickets->sum('price'), + ]); + + foreach ($tickets as $ticket) { + $order->tickets()->save($ticket); + } + + return $order; + } + public function concert() { return $this->belongsTo(Concert::class); diff --git a/tests/unit/OrderTest.php b/tests/unit/OrderTest.php index 290c4fa..82cf123 100644 --- a/tests/unit/OrderTest.php +++ b/tests/unit/OrderTest.php @@ -10,6 +10,20 @@ class OrderTest extends TestCase { use DatabaseMigrations; + /** @test */ + function creating_an_order_from_tickets_and_email() + { + $concert = factory(Concert::class)->create(['ticket_price' => 1200])->addTickets(5); + $this->assertEquals(5, $concert->ticketsRemaining()); + + $order = Order::forTickets($concert->findTickets(3), 'john@example.com'); + + $this->assertEquals('john@example.com', $order->email); + $this->assertEquals(3, $order->ticketQuantity()); + $this->assertEquals(3600, $order->amount); + $this->assertEquals(2, $concert->ticketsRemaining()); + } + /** @test */ function converting_to_an_array() {