diff --git a/resources/assets/src/components/auth/Forgot.vue b/resources/assets/src/components/auth/Forgot.vue new file mode 100644 index 00000000..c311d514 --- /dev/null +++ b/resources/assets/src/components/auth/Forgot.vue @@ -0,0 +1,117 @@ + + + + + diff --git a/resources/assets/src/components/route.js b/resources/assets/src/components/route.js index 905d9de0..ad8ad7d4 100644 --- a/resources/assets/src/components/route.js +++ b/resources/assets/src/components/route.js @@ -44,4 +44,9 @@ export default [ component: () => import('./auth/Register'), el: 'form' }, + { + path: 'auth/forgot', + component: () => import('./auth/Forgot'), + el: 'form' + }, ]; diff --git a/resources/assets/tests/components/auth/Forgot.test.js b/resources/assets/tests/components/auth/Forgot.test.js new file mode 100644 index 00000000..18fea09a --- /dev/null +++ b/resources/assets/tests/components/auth/Forgot.test.js @@ -0,0 +1,50 @@ +import Vue from 'vue'; +import { mount } from '@vue/test-utils'; +import Forgot from '@/components/auth/Forgot'; + +test('click to refresh captcha', () => { + jest.spyOn(Date, 'now'); + const wrapper = mount(Forgot); + wrapper.find('img').trigger('click'); + expect(Date.now).toHaveBeenCalledTimes(2); +}); + +test('submit forgot form', async () => { + jest.spyOn(Date, 'now'); + Vue.prototype.$http.post + .mockResolvedValueOnce({ errno: 1, msg: 'fail' }) + .mockResolvedValueOnce({ errno: 0, msg: 'ok' }); + const wrapper = mount(Forgot); + const button = wrapper.find('button'); + const info = wrapper.find('.callout-info'); + const warning = wrapper.find('.callout-warning'); + const success = wrapper.find('.callout-success'); + + 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.emptyCaptcha'); + + wrapper.find('[type="text"]').setValue('captcha'); + button.trigger('click'); + await wrapper.vm.$nextTick(); + expect(Vue.prototype.$http.post).toBeCalledWith( + '/auth/forgot', + { email: 'a@b.c', captcha: 'captcha' } + ); + expect(warning.text()).toBe('fail'); + expect(Date.now).toHaveBeenCalledTimes(2); + + button.trigger('click'); + await wrapper.vm.$nextTick(); + expect(success.text()).toBe('ok'); +}); diff --git a/resources/lang/en/front-end.yml b/resources/lang/en/front-end.yml index f56e656b..674434f7 100644 --- a/resources/lang/en/front-end.yml +++ b/resources/lang/en/front-end.yml @@ -29,6 +29,9 @@ auth: repeat-pwd: Repeat your password nickname-intro: Whatever you like expect special characters register-button: Register + forgot: + login-link: I do remember it + button: Send skinlib: addToCloset: Add to closet diff --git a/resources/lang/zh_CN/front-end.yml b/resources/lang/zh_CN/front-end.yml index efe987f0..963cadf2 100644 --- a/resources/lang/zh_CN/front-end.yml +++ b/resources/lang/zh_CN/front-end.yml @@ -29,6 +29,9 @@ auth: repeat-pwd: 重复密码 nickname-intro: 昵称可使用汉字,不可包含特殊字符 register-button: 注册 + forgot: + login-link: 我又想起来了 + button: 发送 skinlib: addToCloset: 添加至衣柜 diff --git a/resources/views/auth/forgot.tpl b/resources/views/auth/forgot.tpl index 2bb26777..56d7f35b 100644 --- a/resources/views/auth/forgot.tpl +++ b/resources/views/auth/forgot.tpl @@ -16,38 +16,7 @@