Added tests for confirmed registration

This commit is contained in:
Dan Brown 2015-09-21 20:54:11 +01:00
parent e8dd7fda1f
commit 1b736ac045
7 changed files with 96 additions and 12 deletions

View File

@ -170,6 +170,18 @@ class AuthController extends Controller
return view('auth/register-confirm'); return view('auth/register-confirm');
} }
/**
* View the confirmation email as a standard web page.
* @param $token
* @return \Illuminate\View\View
* @throws UserRegistrationException
*/
public function viewConfirmEmail($token)
{
$confirmation = $this->emailConfirmationService->getEmailConfirmationFromToken($token);
return view('emails/email-confirmation', ['token' => $confirmation->token]);
}
/** /**
* Confirms an email via a token and logs the user into the system. * Confirms an email via a token and logs the user into the system.
* @param $token * @param $token

View File

@ -94,6 +94,7 @@ Route::get('/register/confirm', 'Auth\AuthController@getRegisterConfirmation');
Route::get('/register/confirm/awaiting', 'Auth\AuthController@showAwaitingConfirmation'); Route::get('/register/confirm/awaiting', 'Auth\AuthController@showAwaitingConfirmation');
Route::post('/register/confirm/resend', 'Auth\AuthController@resendConfirmation'); Route::post('/register/confirm/resend', 'Auth\AuthController@resendConfirmation');
Route::get('/register/confirm/{token}', 'Auth\AuthController@confirmEmail'); Route::get('/register/confirm/{token}', 'Auth\AuthController@confirmEmail');
Route::get('/register/confirm/{token}/email', 'Auth\AuthController@viewConfirmEmail');
Route::get('/register/service/{socialDriver}', 'Auth\AuthController@socialRegister'); Route::get('/register/service/{socialDriver}', 'Auth\AuthController@socialRegister');
Route::post('/register', 'Auth\AuthController@postRegister'); Route::post('/register', 'Auth\AuthController@postRegister');

View File

@ -134,6 +134,10 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
return '//www.gravatar.com/avatar/' . $emailHash . '?s=' . $size . '&d=identicon'; return '//www.gravatar.com/avatar/' . $emailHash . '?s=' . $size . '&d=identicon';
} }
/**
* Get the url for editing this user.
* @return string
*/
public function getEditUrl() public function getEditUrl()
{ {
return '/users/' . $this->id; return '/users/' . $this->id;

View File

@ -119,6 +119,6 @@ return [
| |
*/ */
'pretend' => false, 'pretend' => env('MAIL_PRETEND', false),
]; ];

View File

@ -25,5 +25,6 @@
<env name="SESSION_DRIVER" value="array"/> <env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/> <env name="QUEUE_DRIVER" value="sync"/>
<env name="DB_CONNECTION" value="mysql_testing"/> <env name="DB_CONNECTION" value="mysql_testing"/>
<env name="MAIL_PRETEND" value="true"/>
</php> </php>
</phpunit> </phpunit>

View File

@ -42,7 +42,7 @@
<hr class="margin-top large"> <hr class="margin-top large">
@if($currentUser->id === $user->id) @if($currentUser->id === $user->id && count($activeSocialDrivers) > 0)
<h3>Social Accounts</h3> <h3>Social Accounts</h3>
<p class="text-muted"> <p class="text-muted">
Here you can connect your other accounts for quicker and easier login. <br> Here you can connect your other accounts for quicker and easier login. <br>

View File

@ -1,5 +1,7 @@
<?php <?php
use BookStack\EmailConfirmation;
class AuthTest extends TestCase class AuthTest extends TestCase
{ {
@ -12,10 +14,9 @@ class AuthTest extends TestCase
public function testLogin() public function testLogin()
{ {
$this->visit('/') $this->visit('/')
->seePageIs('/login') ->seePageIs('/login');
->type('admin@admin.com', '#email')
->type('password', '#password') $this->login('admin@admin.com', 'password')
->press('Sign In')
->seePageIs('/') ->seePageIs('/')
->see('BookStack'); ->see('BookStack');
} }
@ -41,9 +42,11 @@ class AuthTest extends TestCase
public function testNormalRegistration() public function testNormalRegistration()
{ {
// Set settings and get user instance
$this->setSettings(['registration-enabled' => 'true']); $this->setSettings(['registration-enabled' => 'true']);
$user = factory(\BookStack\User::class)->make(); $user = factory(\BookStack\User::class)->make();
// Test form and ensure user is created
$this->visit('/register') $this->visit('/register')
->see('Sign Up') ->see('Sign Up')
->type($user->name, '#name') ->type($user->name, '#name')
@ -51,15 +54,52 @@ class AuthTest extends TestCase
->type($user->password, '#password') ->type($user->password, '#password')
->press('Create Account') ->press('Create Account')
->seePageIs('/') ->seePageIs('/')
->see($user->name); ->see($user->name)
->seeInDatabase('users', ['name' => $user->name, 'email' => $user->email]);
} }
private function setSettings($settingsArray) public function testConfirmedRegistration()
{ {
$settings = app('BookStack\Services\SettingService'); // Set settings and get user instance
foreach($settingsArray as $key => $value) { $this->setSettings(['registration-enabled' => 'true', 'registration-confirmation' => 'true']);
$settings->put($key, $value); $user = factory(\BookStack\User::class)->make();
}
// Mock Mailer to ensure mail is being sent
$mockMailer = Mockery::mock('Illuminate\Contracts\Mail\Mailer');
$mockMailer->shouldReceive('send')->with('emails/email-confirmation', Mockery::type('array'), Mockery::type('callable'))->twice();
$this->app->instance('mailer', $mockMailer);
// Go through registration process
$this->visit('/register')
->see('Sign Up')
->type($user->name, '#name')
->type($user->email, '#email')
->type($user->password, '#password')
->press('Create Account')
->seePageIs('/register/confirm')
->seeInDatabase('users', ['name' => $user->name, 'email' => $user->email, 'email_confirmed' => false]);
// Test access and resend confirmation email
$this->login($user->email, $user->password)
->seePageIs('/register/confirm/awaiting')
->see('Resend')
->visit('/books')
->seePageIs('/register/confirm/awaiting')
->press('Resend Confirmation Email');
// Get confirmation
$user = $user->where('email', '=', $user->email)->first();
$emailConfirmation = EmailConfirmation::where('user_id', '=', $user->id)->first();
// Check confirmation email button and confirmation activation.
$this->visit('/register/confirm/' . $emailConfirmation->token . '/email')
->see('Email Confirmation')
->click('Confirm Email')
->seePageIs('/')
->see($user->name)
->notSeeInDatabase('email_confirmations', ['token' => $emailConfirmation->token])
->seeInDatabase('users', ['name' => $user->name, 'email' => $user->email, 'email_confirmed' => true]);
} }
public function testLogout() public function testLogout()
@ -71,4 +111,30 @@ class AuthTest extends TestCase
->visit('/') ->visit('/')
->seePageIs('/login'); ->seePageIs('/login');
} }
/**
* Quickly sets an array of settings.
* @param $settingsArray
*/
private function setSettings($settingsArray)
{
$settings = app('BookStack\Services\SettingService');
foreach ($settingsArray as $key => $value) {
$settings->put($key, $value);
}
}
/**
* Perform a login
* @param string $email
* @param string $password
* @return $this
*/
private function login($email, $password)
{
return $this->visit('/login')
->type($email, '#email')
->type($password, '#password')
->press('Sign In');
}
} }