diff --git a/resources/assets/src/components/auth/Register.vue b/resources/assets/src/components/auth/Register.vue new file mode 100644 index 00000000..db6bc25a --- /dev/null +++ b/resources/assets/src/components/auth/Register.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/resources/assets/src/components/route.js b/resources/assets/src/components/route.js index 2eb3d70d..905d9de0 100644 --- a/resources/assets/src/components/route.js +++ b/resources/assets/src/components/route.js @@ -39,4 +39,9 @@ export default [ component: () => import('./auth/Login'), el: 'form' }, + { + path: 'auth/register', + component: () => import('./auth/Register'), + el: 'form' + }, ]; diff --git a/resources/assets/tests/components/auth/Register.test.js b/resources/assets/tests/components/auth/Register.test.js new file mode 100644 index 00000000..2b39250f --- /dev/null +++ b/resources/assets/tests/components/auth/Register.test.js @@ -0,0 +1,83 @@ +import Vue from 'vue'; +import { mount } from '@vue/test-utils'; +import Register from '@/components/auth/Register'; +import { swal } from '@/js/notify'; + +jest.mock('@/js/notify'); + +test('click to refresh captcha', () => { + jest.spyOn(Date, 'now'); + const wrapper = mount(Register); + wrapper.find('img').trigger('click'); + expect(Date.now).toHaveBeenCalledTimes(2); +}); + +test('register', async () => { + jest.spyOn(Date, 'now'); + Vue.prototype.$http.post + .mockResolvedValueOnce({ errno: 1, msg: 'fail' }) + .mockResolvedValueOnce({ errno: 0, msg: 'ok' }); + const wrapper = mount(Register); + const button = wrapper.find('button'); + const info = wrapper.find('.callout-info'); + const warning = wrapper.find('.callout-warning'); + + button.trigger('click'); + expect(Vue.prototype.$http.post).not.toBeCalled(); + expect(info.text()).toBe('auth.emptyEmail'); + + wrapper.find('[type="email"]').setValue('a'); + button.trigger('click'); + expect(Vue.prototype.$http.post).not.toBeCalled(); + expect(info.text()).toBe('auth.invalidEmail'); + + wrapper.find('[type="email"]').setValue('a@b.c'); + button.trigger('click'); + expect(Vue.prototype.$http.post).not.toBeCalled(); + expect(info.text()).toBe('auth.emptyPassword'); + + wrapper.findAll('[type="password"]').at(0).setValue('123456'); + button.trigger('click'); + expect(Vue.prototype.$http.post).not.toBeCalled(); + expect(info.text()).toBe('auth.invalidPassword'); + + wrapper.findAll('[type="password"]').at(0).setValue('12345678'); + button.trigger('click'); + expect(Vue.prototype.$http.post).not.toBeCalled(); + expect(info.text()).toBe('auth.invalidConfirmPwd'); + + wrapper.findAll('[type="password"]').at(1).setValue('123456'); + button.trigger('click'); + expect(Vue.prototype.$http.post).not.toBeCalled(); + expect(info.text()).toBe('auth.invalidConfirmPwd'); + + wrapper.findAll('[type="password"]').at(1).setValue('12345678'); + button.trigger('click'); + expect(Vue.prototype.$http.post).not.toBeCalled(); + expect(info.text()).toBe('auth.emptyNickname'); + + wrapper.findAll('[type="text"]').at(0).setValue('abc'); + button.trigger('click'); + expect(Vue.prototype.$http.post).not.toBeCalled(); + expect(info.text()).toBe('auth.emptyCaptcha'); + + wrapper.findAll('[type="text"]').at(1).setValue('captcha'); + button.trigger('click'); + await wrapper.vm.$nextTick(); + expect(Vue.prototype.$http.post).toBeCalledWith( + '/auth/register', + { + email: 'a@b.c', + password: '12345678', + nickname: 'abc', + captcha: 'captcha' + } + ); + expect(warning.text()).toBe('fail'); + expect(Date.now).toHaveBeenCalledTimes(2); + + button.trigger('click'); + await wrapper.vm.$nextTick(); + jest.runAllTimers(); + expect(swal).toBeCalledWith({ type: 'success', html: 'ok' }); +}); diff --git a/resources/lang/en/front-end.yml b/resources/lang/en/front-end.yml index 31d069f5..f56e656b 100644 --- a/resources/lang/en/front-end.yml +++ b/resources/lang/en/front-end.yml @@ -26,6 +26,9 @@ auth: login-link: Already registered? Log in here. forgot-link: Forgot password? keep: Remember me + repeat-pwd: Repeat your password + nickname-intro: Whatever you like expect special characters + register-button: Register skinlib: addToCloset: Add to closet diff --git a/resources/lang/zh_CN/front-end.yml b/resources/lang/zh_CN/front-end.yml index 988b3f90..efe987f0 100644 --- a/resources/lang/zh_CN/front-end.yml +++ b/resources/lang/zh_CN/front-end.yml @@ -26,6 +26,9 @@ auth: login-link: 已经有账号了?登录 forgot-link: 忘记密码? keep: 记住我 + repeat-pwd: 重复密码 + nickname-intro: 昵称可使用汉字,不可包含特殊字符 + register-button: 注册 skinlib: addToCloset: 添加至衣柜 diff --git a/resources/views/auth/register.tpl b/resources/views/auth/register.tpl index a9b3929f..a0dae36d 100644 --- a/resources/views/auth/register.tpl +++ b/resources/views/auth/register.tpl @@ -12,51 +12,7 @@
@lang('auth.register.message', ['sitename' => option_localized('site_name')])
- +