153 - Testing a Console Command

This commit is contained in:
Adam Wathan
2017-12-08 14:35:50 -05:00
parent d5cf2592b1
commit d4bcb02a8e
8 changed files with 65 additions and 5 deletions

View File

@@ -0,0 +1,14 @@
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
use App\InvitationCodeGenerator;
class InvitationCode extends Facade
{
protected static function getFacadeAccessor()
{
return InvitationCodeGenerator::class;
}
}

View File

@@ -0,0 +1,8 @@
<?php
namespace App;
interface InvitationCodeGenerator
{
public function generate();
}

View File

@@ -4,6 +4,7 @@ namespace App\Providers;
use App\TicketCodeGenerator;
use App\Billing\PaymentGateway;
use App\InvitationCodeGenerator;
use App\HashidsTicketCodeGenerator;
use App\Billing\StripePaymentGateway;
use Laravel\Dusk\DuskServiceProvider;
@@ -44,6 +45,7 @@ class AppServiceProvider extends ServiceProvider
$this->app->bind(PaymentGateway::class, StripePaymentGateway::class);
$this->app->bind(OrderConfirmationNumberGenerator::class, RandomOrderConfirmationNumberGenerator::class);
$this->app->bind(InvitationCodeGenerator::class, RandomOrderConfirmationNumberGenerator::class);
$this->app->bind(TicketCodeGenerator::class, HashidsTicketCodeGenerator::class);
}
}

View File

@@ -2,7 +2,7 @@
namespace App;
class RandomOrderConfirmationNumberGenerator implements OrderConfirmationNumberGenerator
class RandomOrderConfirmationNumberGenerator implements OrderConfirmationNumberGenerator, InvitationCodeGenerator
{
public function generate()
{

View File

@@ -80,5 +80,8 @@ $factory->define(App\Order::class, function (Faker\Generator $faker) {
});
$factory->define(App\Invitation::class, function (Faker\Generator $faker) {
return [];
return [
'email' => 'somebody@example.com',
'code' => 'TESTCODE1234',
];
});

View File

@@ -16,6 +16,7 @@ class CreateInvitationsTable extends Migration
Schema::create('invitations', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('user_id')->nullable();
$table->string('email');
$table->string('code');
$table->timestamps();
});

View File

@@ -1,5 +1,7 @@
<?php
use App\Invitation;
use App\Facades\InvitationCode;
use Illuminate\Foundation\Inspiring;
/*
@@ -13,6 +15,9 @@ use Illuminate\Foundation\Inspiring;
|
*/
Artisan::command('inspire', function () {
$this->comment(Inspiring::quote());
})->describe('Display an inspiring quote');
Artisan::command('invite-promoter {email}', function ($email) {
$invitation = Invitation::create([
'email' => $email,
'code' => InvitationCode::generate(),
]);
})->describe('Invite a new promoter to create an account.');

View File

@@ -0,0 +1,27 @@
<?php
namespace Tests\Feature;
use App\Invitation;
use Tests\TestCase;
use App\Facades\InvitationCode;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
class InvitePromoterTest extends TestCase
{
use RefreshDatabase;
/** @test */
function inviting_a_promoter_via_the_cli()
{
InvitationCode::shouldReceive('generate')->andReturn('TESTCODE1234');
$this->artisan('invite-promoter', ['email' => 'john@example.com']);
$this->assertEquals(1, Invitation::count());
$invitation = Invitation::first();
$this->assertEquals('john@example.com', $invitation->email);
$this->assertEquals('TESTCODE1234', $invitation->code);
}
}