]> BookStack Code Mirror - bookstack/commitdiff
Added tests for confirmed registration
authorDan Brown <redacted>
Mon, 21 Sep 2015 19:54:11 +0000 (20:54 +0100)
committerDan Brown <redacted>
Mon, 21 Sep 2015 19:54:11 +0000 (20:54 +0100)
app/Http/Controllers/Auth/AuthController.php
app/Http/routes.php
app/User.php
config/mail.php
phpunit.xml
resources/views/users/edit.blade.php
tests/AuthTest.php

index 98346b30562b43c8dc069fafeb8ce30b8d161c6e..d533c8aeb8e9fd15c83ca5b8da55a98829c16eb4 100644 (file)
@@ -170,6 +170,18 @@ class AuthController extends Controller
         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.
      * @param $token
index 9681ad1f123a68cf6c38c101d84309b4cf248544..e605dbee1ed44e976c6c3bfee48e7435219f7e17 100644 (file)
@@ -94,6 +94,7 @@ Route::get('/register/confirm', 'Auth\AuthController@getRegisterConfirmation');
 Route::get('/register/confirm/awaiting', 'Auth\AuthController@showAwaitingConfirmation');
 Route::post('/register/confirm/resend', 'Auth\AuthController@resendConfirmation');
 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::post('/register', 'Auth\AuthController@postRegister');
 
index c7ce6b11e40812ec7379b55bc15384996bb9c7bf..ffe41229b5e74cbb4df1093e95eadf8034d4f014 100644 (file)
@@ -134,6 +134,10 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
         return '//www.gravatar.com/avatar/' . $emailHash . '?s=' . $size . '&d=identicon';
     }
 
+    /**
+     * Get the url for editing this user.
+     * @return string
+     */
     public function getEditUrl()
     {
         return '/users/' . $this->id;
index a45145309ababe1a77baee4f20152153194847cc..0386e0198414569006ad9b2228486f718a62cad9 100644 (file)
@@ -119,6 +119,6 @@ return [
     |
     */
 
-    'pretend' => false,
+    'pretend' => env('MAIL_PRETEND', false),
 
 ];
index 59afb8613649fcbba67c3d90aa6d6a509db6d976..0884937af13be5407195796ded8b53936cbc6f48 100644 (file)
@@ -25,5 +25,6 @@
         <env name="SESSION_DRIVER" value="array"/>
         <env name="QUEUE_DRIVER" value="sync"/>
         <env name="DB_CONNECTION" value="mysql_testing"/>
+        <env name="MAIL_PRETEND" value="true"/>
     </php>
 </phpunit>
index b981c64d8dc73414563035a659503ab150776ff6..2c3c6079f883943515fa65791b31a31c8929a357 100644 (file)
@@ -42,7 +42,7 @@
 
         <hr class="margin-top large">
 
-        @if($currentUser->id === $user->id)
+        @if($currentUser->id === $user->id && count($activeSocialDrivers) > 0)
             <h3>Social Accounts</h3>
             <p class="text-muted">
                 Here you can connect your other accounts for quicker and easier login. <br>
index 343823687a5f8735725667b50b4c44b4e6f6d711..99f132d3b44de94f74c31703009d20a4f0fe1d74 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use BookStack\EmailConfirmation;
+
 class AuthTest extends TestCase
 {
 
@@ -12,10 +14,9 @@ class AuthTest extends TestCase
     public function testLogin()
     {
         $this->visit('/')
-            ->seePageIs('/login')
-            ->type('[email protected]', '#email')
-            ->type('password', '#password')
-            ->press('Sign In')
+            ->seePageIs('/login');
+
+        $this->login('[email protected]', 'password')
             ->seePageIs('/')
             ->see('BookStack');
     }
@@ -41,9 +42,11 @@ class AuthTest extends TestCase
 
     public function testNormalRegistration()
     {
+        // Set settings and get user instance
         $this->setSettings(['registration-enabled' => 'true']);
         $user = factory(\BookStack\User::class)->make();
 
+        // Test form and ensure user is created
         $this->visit('/register')
             ->see('Sign Up')
             ->type($user->name, '#name')
@@ -51,15 +54,52 @@ class AuthTest extends TestCase
             ->type($user->password, '#password')
             ->press('Create Account')
             ->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');
-        foreach($settingsArray as $key => $value) {
-            $settings->put($key, $value);
-        }
+        // Set settings and get user instance
+        $this->setSettings(['registration-enabled' => 'true', 'registration-confirmation' => 'true']);
+        $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()
@@ -71,4 +111,30 @@ class AuthTest extends TestCase
             ->visit('/')
             ->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');
+    }
 }