blessing-skin-server/resources/assets/src/js/__tests__/auth.test.js

375 lines
12 KiB
JavaScript

/* eslint no-unused-vars: "off" */
const $ = require('jquery');
window.$ = window.jQuery = $;
describe('tests for "captcha" module', () => {
it('refresh captcha', async () => {
const url = jest.fn(path => path);
window.url = url;
document.body.innerHTML = `
<img class="captcha" src="" />
<input id="captcha" value="old" />
`;
require('../auth/captcha')();
expect($('.captcha').attr('src')).toEqual(expect.stringContaining('auth/captcha?'));
expect($('#captcha').val()).toBe('');
});
});
describe('tests for "login" module', () => {
const modulePath = '../auth/login';
it('login', async () => {
const fetch = jest.fn()
.mockImplementationOnce(option => {
option.beforeSend();
return Promise.resolve({ errno: 0, msg: 'success' });
})
.mockImplementationOnce(() => Promise.resolve(
{ errno: 1, msg: 'warning1', login_fails: 1 }
))
.mockImplementationOnce(() => Promise.resolve(
{ errno: 1, msg: 'warning2', login_fails: 4 }
));
const trans = jest.fn(key => key);
const url = jest.fn(path => path);
const swal = jest.fn();
const refreshCaptcha = jest.fn();
window.fetch = fetch;
window.trans = trans;
window.url = url;
window.swal = swal;
window.showMsg = jest.fn();
window.refreshCaptcha = refreshCaptcha;
document.body.innerHTML = `
<input id="identification" />
<input id="password" />
<div id="captcha-form"></div>
<input id="captcha" />
<input id="keep" checked />
<button id="login-button"></button>
`;
require(modulePath);
$('button').click();
expect(trans).toBeCalledWith('auth.emptyIdentification');
expect($('#identification').is(':focus')).toBe(true);
$('#identification').val('username');
$('button').click();
expect(trans).toBeCalledWith('auth.emptyPassword');
expect($('#password').is(':focus')).toBe(true);
$('#password').val('password');
$('button').click();
expect(trans).toBeCalledWith('auth.emptyCaptcha');
expect($('#captcha').is(':focus')).toBe(true);
$('#captcha').val('captcha');
await $('button').click();
expect(fetch).toBeCalledWith(expect.objectContaining({
type: 'POST',
url: 'auth/login',
dataType: 'json',
data: {
identification: 'username',
password: 'password',
keep: true,
captcha: 'captcha'
}
}));
expect($('button').html()).toBe(
'<i class="fa fa-spinner fa-spin"></i> auth.loggingIn'
);
expect($('button').prop('disabled')).toBe(true);
expect(swal).toBeCalledWith({ type: 'success', html: 'success' });
$('#captcha-form').css('display', 'none');
await $('button').click();
expect($('#captcha-form').css('display')).toBe('none');
expect(refreshCaptcha).toBeCalled();
expect(showMsg).toBeCalledWith('warning1', 'warning');
expect($('button').html()).toBe('auth.login');
expect($('button').prop('disabled')).toBe(false);
await $('button').click();
expect(swal).toBeCalledWith({ type: 'error', html: 'auth.tooManyFails' });
expect($('#captcha-form').css('display')).not.toBe('none');
expect(showMsg).toBeCalledWith('warning2', 'warning');
});
});
describe('tests for "register" module', () => {
const modulePath = '../auth/register';
it('register', async () => {
const fetch = jest.fn()
.mockImplementationOnce(option => {
option.beforeSend();
return Promise.resolve({ errno: 0, msg: 'success' });
})
.mockImplementationOnce(() => Promise.resolve(
{ errno: 1, msg: 'warning' }
));
const trans = jest.fn(key => key);
const url = jest.fn(path => path);
const swal = jest.fn();
const showMsg = jest.fn();
const refreshCaptcha = jest.fn();
window.fetch = fetch;
window.trans = trans;
window.url = url;
window.swal = swal;
window.showMsg = showMsg;
window.refreshCaptcha = refreshCaptcha;
document.body.innerHTML = `
<input id="email" />
<input id="nickname" />
<input id="password" />
<input id="confirm-pwd" />
<div id="captcha-form"></div>
<input id="captcha" />
<button id="register-button"></button>
`;
require(modulePath);
$('button').click();
expect(trans).toBeCalledWith('auth.emptyEmail');
expect($('#email').is(':focus')).toBe(true);
$('#email').val('email');
$('button').click();
expect(trans).toBeCalledWith('auth.invalidEmail');
expect(showMsg).toBeCalledWith('auth.invalidEmail', 'warning');
expect($('#email').is(':focus')).toBe(true);
$('#email').val('a@b.c');
$('button').click();
expect(trans).toBeCalledWith('auth.emptyPassword');
expect($('#password').is(':focus')).toBe(true);
$('#password').val('secret');
$('button').click();
expect(trans).toBeCalledWith('auth.invalidPassword');
expect(showMsg).toBeCalledWith('auth.invalidPassword', 'warning');
expect($('#password').is(':focus')).toBe(true);
$('#password').val('too_long_password');
$('#password').blur();
$('button').click();
expect(trans).toBeCalledWith('auth.invalidPassword');
expect(showMsg).toBeCalledWith('auth.invalidPassword', 'warning');
expect($('#password').is(':focus')).toBe(true);
$('#password').val('password');
$('button').click();
expect(trans).toBeCalledWith('auth.emptyConfirmPwd');
expect($('#confirm-pwd').is(':focus')).toBe(true);
$('#confirm-pwd').val('not_same');
$('button').click();
expect(trans).toBeCalledWith('auth.invalidConfirmPwd');
expect(showMsg).toBeCalledWith('auth.invalidConfirmPwd', 'warning');
expect($('#confirm-pwd').is(':focus')).toBe(true);
$('#confirm-pwd').val('password');
$('button').click();
expect(trans).toBeCalledWith('auth.emptyNickname');
expect($('#nickname').is(':focus')).toBe(true);
$('#nickname').val('nickname');
$('button').click();
expect(trans).toBeCalledWith('auth.emptyCaptcha');
expect($('#captcha').is(':focus')).toBe(true);
$('#captcha').val('captcha');
await $('button').click();
expect(fetch).toBeCalledWith(expect.objectContaining({
type: 'POST',
url: 'auth/register',
dataType: 'json',
data: {
email: 'a@b.c',
nickname: 'nickname',
password: 'password',
captcha: 'captcha'
}
}));
expect($('button').html()).toBe(
'<i class="fa fa-spinner fa-spin"></i> auth.registering'
);
expect($('button').prop('disabled')).toBe(true);
expect(swal).toBeCalledWith({ type: 'success', html: 'success' });
await $('button').click();
expect(refreshCaptcha).toBeCalled();
expect(showMsg).toBeCalledWith('warning', 'warning');
expect($('button').html()).toBe('auth.register');
});
});
describe('tests for "forgot" module', () => {
const modulePath = '../auth/forgot';
it('forgot password', async () => {
const fetch = jest.fn()
.mockImplementationOnce(option => {
option.beforeSend();
return Promise.resolve({ errno: 0, msg: 'success' });
})
.mockImplementationOnce(() => Promise.resolve(
{ errno: 1, msg: 'warning' }
));
const trans = jest.fn(key => key);
const url = jest.fn(path => path);
const swal = jest.fn();
const showMsg = jest.fn();
const refreshCaptcha = jest.fn();
window.fetch = fetch;
window.trans = trans;
window.url = url;
window.swal = swal;
window.showMsg = showMsg;
window.refreshCaptcha = refreshCaptcha;
document.body.innerHTML = `
<input id="email" />
<div id="captcha-form"></div>
<input id="captcha" />
<button id="forgot-button"></button>
`;
require(modulePath);
$('button').click();
expect(trans).toBeCalledWith('auth.emptyEmail');
expect($('#email').is(':focus')).toBe(true);
$('#email').val('email');
$('button').click();
expect(trans).toBeCalledWith('auth.invalidEmail');
expect(showMsg).toBeCalledWith('auth.invalidEmail', 'warning');
expect($('#email').is(':focus')).toBe(true);
$('#email').val('a@b.c');
$('button').click();
expect(trans).toBeCalledWith('auth.emptyCaptcha');
expect($('#captcha').is(':focus')).toBe(true);
$('#captcha').val('captcha');
await $('button').click();
expect(fetch).toBeCalledWith(expect.objectContaining({
type: 'POST',
url: 'auth/forgot',
dataType: 'json',
data: {
email: 'a@b.c',
captcha: 'captcha'
}
}));
expect($('button').html()).toBe('auth.send');
expect($('button').prop('disabled')).toBe(true);
expect(showMsg).toBeCalledWith('success', 'success');
await $('button').click();
expect(refreshCaptcha).toBeCalled();
expect(showMsg).toBeCalledWith('warning', 'warning');
expect($('button').html()).toBe('auth.send');
});
});
describe('tests for "reset" module', () => {
const modulePath = '../auth/reset';
it('reset password', async () => {
const fetch = jest.fn()
.mockImplementationOnce(option => {
option.beforeSend();
return Promise.resolve({ errno: 0, msg: 'success' });
})
.mockImplementationOnce(() => Promise.resolve(
{ errno: 1, msg: 'warning' }
));
const trans = jest.fn(key => key);
const url = jest.fn(path => path);
const swal = jest.fn().mockReturnValue(Promise.resolve());
const showMsg = jest.fn();
const getQueryString = jest.fn().mockReturnValue('token');
window.fetch = fetch;
window.trans = trans;
window.url = url;
window.swal = swal;
window.showMsg = showMsg;
window.refreshCaptcha = jest.fn();
window.getQueryString = getQueryString;
document.body.innerHTML = `
<input id="uid" value="1" />
<input id="password" />
<input id="confirm-pwd" />
<button id="reset-button"></button>
`;
require(modulePath);
$('button').click();
expect(trans).toBeCalledWith('auth.emptyPassword');
expect($('#password').is(':focus')).toBe(true);
$('#password').val('secret');
$('button').click();
expect(trans).toBeCalledWith('auth.invalidPassword');
expect(showMsg).toBeCalledWith('auth.invalidPassword', 'warning');
expect($('#password').is(':focus')).toBe(true);
$('#password').val('too_long_password');
$('#password').blur();
$('button').click();
expect(trans).toBeCalledWith('auth.invalidPassword');
expect(showMsg).toBeCalledWith('auth.invalidPassword', 'warning');
expect($('#password').is(':focus')).toBe(true);
$('#password').val('password');
$('button').click();
expect(trans).toBeCalledWith('auth.emptyConfirmPwd');
expect($('#confirm-pwd').is(':focus')).toBe(true);
$('#confirm-pwd').val('not_same');
$('button').click();
expect(trans).toBeCalledWith('auth.invalidConfirmPwd');
expect(showMsg).toBeCalledWith('auth.invalidConfirmPwd', 'warning');
expect($('#confirm-pwd').is(':focus')).toBe(true);
$('#confirm-pwd').val('password');
await $('button').click();
expect(getQueryString).toBeCalledWith('token');
expect(fetch).toBeCalledWith(expect.objectContaining({
type: 'POST',
url: 'auth/reset',
dataType: 'json',
data: {
uid: '1',
password: 'password',
token: 'token'
}
}));
expect($('button').html()).toBe(
'<i class="fa fa-spinner fa-spin"></i> auth.resetting'
);
expect($('button').prop('disabled')).toBe(true);
expect(swal).toBeCalledWith({ type: 'success', html: 'success' });
await $('button').click();
expect(showMsg).toBeCalledWith('warning', 'warning');
expect($('button').html()).toBe('auth.reset');
});
});