Add tests for user email verification

This commit is contained in:
printempw 2018-07-27 02:00:54 +08:00
parent 58987edd12
commit d08996e509
4 changed files with 163 additions and 0 deletions

View File

@ -3,6 +3,54 @@
const $ = require('jquery');
window.$ = window.jQuery = $;
describe('tests for "verification" module', () => {
const modulePath = '../user/verification';
it('send verification email', async () => {
const url = jest.fn(path => path);
const swal = jest.fn();
const showAjaxError = jest.fn();
window.url = url;
window.swal = swal;
window.showAjaxError = showAjaxError;
const fetch = jest.fn()
.mockImplementationOnce(option => {
option.beforeSend();
return Promise.resolve({ errno: 0, msg: 'success' });
})
.mockImplementationOnce(() => Promise.resolve(
{ errno: 1, msg: 'warning' }
))
.mockImplementationOnce(() => Promise.reject(new Error));
window.fetch = fetch;
document.body.innerHTML = `
<a id="send-verification-email">Send</a>
<span id="sending-indicator" style="display:none;">Sending</span>
`;
require(modulePath);
await $('a').click();
expect(fetch).toBeCalledWith(expect.objectContaining({
type: 'POST',
url: 'user/email-verification',
dataType: 'json'
}));
expect(swal).toBeCalledWith({ type: 'success', html: 'success' });
// I don't know why $(el).is(':visible') does not work here
expect($('#send-verification-email').css('display')).toBe('');
expect($('#sending-indicator').css('display')).toBe('none');
await $('a').click();
expect(swal).toBeCalledWith({ type: 'warning', html: 'warning' });
await $('a').click();
expect(showAjaxError).toBeCalled();
});
});
describe('tests for "closet" module', () => {
const modulePath = '../user/closet';

View File

@ -664,6 +664,27 @@ class AuthControllerTest extends TestCase
$this->assertTrue($user->verifyPassword('12345678'));
}
public function testVerify()
{
$user = factory(User::class, 'unverified')->create();
// Should be forbidden if `uid` or `token` is empty
$this->visit('/auth/verify')
->see(trans('auth.verify.invalid'));
// Should be forbidden if `uid` is invalid
$this->visit('/auth/verify?uid=-1&token=nothing')
->see(trans('auth.verify.invalid'));
// Should be forbidden if `token` is invalid
$this->visit("/auth/verify?uid={$user->uid}&token=nothing")
->see(trans('auth.verify.expired'));
// Success
$this->visit("/auth/verify?uid={$user->uid}&token={$user->verification_token}")
->see(trans('auth.verify.success'));
}
public function testCaptcha()
{
if (!function_exists('imagettfbbox') || getenv('TRAVIS_PHP_VERSION' == '5.5')) {

View File

@ -62,6 +62,18 @@ class MiddlewareTest extends TestCase
])->visit('/user')->seePageIs('/auth/login');
}
public function testCheckUserVerified()
{
$this->actAs('unverified')
->get('/skinlib/upload')
->assertResponseStatus(403)
->see(trans('auth.check.verified'));
$this->actAs('normal')
->get('/skinlib/upload')
->assertResponseOk();
}
public function testCheckAdministrator()
{
// Without logged in

View File

@ -30,6 +30,11 @@ class UserControllerTest extends TestCase
->see(0) // Storage
->see(bs_announcement())
->see($user->score);
$unverified = factory(User::class, 'unverified')->create();
$this->actAs($unverified)
->visit('/user')
->see(trans('user.verification.notice.title'));
}
public function testSign()
@ -96,6 +101,82 @@ class UserControllerTest extends TestCase
]);
}
public function testSendVerificationEmail()
{
$user = factory(User::class, 'unverified')->create();
$verified = factory(User::class)->create();
// Too fast
$this->actAs($user)
->withSession([
'last_mail_time' => time() - 10
])
->post('/user/email-verification')
->seeJson([
'errno' => 1,
'msg' => trans('user.verification.frequent-mail')
]);
$this->flushSession();
// Already verified
$this->actAs($verified)
->post('/user/email-verification')
->seeJson([
'errno' => 1,
'msg' => trans('user.verification.verified')
]);
// Should handle exception when sending email
Mail::shouldReceive('send')
->once()
->andThrow(new Mockery\Exception('A fake exception.'));
$this->actAs($user)
->post('/user/email-verification')
->seeJson([
'errno' => 2,
'msg' => trans('user.verification.failed', ['msg' => 'A fake exception.'])
]);
$user->fresh();
$url = option('site_url')."/auth/verify?uid={$user->uid}&token={$user->verification_token}";
Mail::shouldReceive('send')
->once()
->with(
'mails.email-verification',
Mockery::on(function ($actual) use ($url) {
$this->assertEquals(0, stristr($url, $actual['url']));
return true;
}),
Mockery::on(function (Closure $closure) use ($user) {
$mock = Mockery::mock(Illuminate\Mail\Message::class);
$mock->shouldReceive('from')
->once()
->with(config('mail.username'), option_localized('site_name'));
$mock->shouldReceive('to')
->once()
->with($user->email)
->andReturnSelf();
$mock->shouldReceive('subject')
->once()
->with(trans('user.verification.mail.title', ['sitename' => option_localized('site_name')]));
$closure($mock);
return true;
})
);
// Success
$this->actAs($user)
->post('/user/email-verification')
->seeJson([
'errno' => 0,
'msg' => trans('user.verification.success')
])->assertSessionHas('last_mail_time');
}
public function testProfile()
{
$this->visit('/user/profile')
@ -329,6 +410,7 @@ class UserControllerTest extends TestCase
'msg' => trans('user.profile.email.success')
]);
$this->assertEquals('a@b.c', User::find($user->uid)->email);
$this->assertEquals(0, User::find($user->uid)->verified);
// After changed email, user should re-login.
$this->visit('/user')->seePageIs('/auth/login');