From 7790660fe847300d41b8e6b93f5515a9a53196c1 Mon Sep 17 00:00:00 2001 From: ahtesham-quraish Date: Mon, 10 Apr 2023 17:37:35 +0500 Subject: [PATCH] fix: registration test coverage Increase test coverage of registration flow VAN-1368 --- src/register/data/tests/reducers.test.js | 115 ++++++++++++++++++- src/register/tests/RegistrationPage.test.jsx | 54 ++++++++- 2 files changed, 167 insertions(+), 2 deletions(-) diff --git a/src/register/data/tests/reducers.test.js b/src/register/data/tests/reducers.test.js index 518cbd4028..df03d7a17e 100644 --- a/src/register/data/tests/reducers.test.js +++ b/src/register/data/tests/reducers.test.js @@ -1,12 +1,13 @@ import { getConfig } from '@edx/frontend-platform'; -import { DEFAULT_STATE } from '../../../data/constants'; +import { DEFAULT_REDIRECT_URL, DEFAULT_STATE, PENDING_STATE } from '../../../data/constants'; import { BACKUP_REGISTRATION_DATA, REGISTER_CLEAR_USERNAME_SUGGESTIONS, REGISTER_FORM_VALIDATIONS, REGISTER_NEW_USER, REGISTER_SET_COUNTRY_CODE, + REGISTER_SET_USER_PIPELINE_DATA_LOADED, REGISTERATION_CLEAR_BACKEND_ERROR, } from '../actions'; import reducer from '../reducers'; @@ -63,6 +64,42 @@ describe('Registration Reducer Tests', () => { }, ); }); + it('should set redirect url dashboard on registration success action', () => { + const payload = { + redirectUrl: `${getConfig().BASE_URL}${DEFAULT_REDIRECT_URL}`, + success: true, + }; + const action = { + type: REGISTER_NEW_USER.SUCCESS, + payload, + }; + + expect(reducer(defaultState, action)).toEqual( + { + ...defaultState, + registrationResult: payload, + }, + ); + }); + + it('should set the registration call and set the registration error object empty', () => { + const action = { + type: REGISTER_NEW_USER.BEGIN, + }; + + expect(reducer({ + ...defaultState, + registrationError: { + email: 'This email already exist.', + }, + }, action)).toEqual( + { + ...defaultState, + submitState: PENDING_STATE, + registrationError: {}, + }, + ); + }); it('should show username suggestions returned by registration error', () => { const payload = { usernameSuggestions: ['test12'] }; @@ -79,7 +116,68 @@ describe('Registration Reducer Tests', () => { }, ); }); + it('should set the register user when SSO pipline data is loaded', () => { + const payload = { value: true }; + const action = { + type: REGISTER_SET_USER_PIPELINE_DATA_LOADED, + payload, + }; + + expect(reducer(defaultState, action)).toEqual( + { + ...defaultState, + userPipelineDataLoaded: true, + }, + ); + }); + it('should set country code on blur', () => { + const action = { + type: REGISTER_SET_COUNTRY_CODE, + payload: { countryCode: 'PK' }, + }; + + expect(reducer({ + ...defaultState, + registrationFormData: { + ...defaultState.registrationFormData, + configurableFormFields: { + ...defaultState.registrationFormData.configurableFormFields, + country: { + name: 'Pakistan', + code: 'PK', + }, + }, + }, + }, action)).toEqual( + { + ...defaultState, + registrationFormData: { + ...defaultState.registrationFormData, + configurableFormFields: { + ...defaultState.registrationFormData.configurableFormFields, + country: { + name: 'Pakistan', + code: 'PK', + }, + }, + }, + }, + ); + }); + it(' registration api failure when api rate limit hits', () => { + const action = { + type: REGISTER_FORM_VALIDATIONS.FAILURE, + }; + + expect(reducer(defaultState, action)).toEqual( + { + ...defaultState, + validationApiRateLimited: true, + validations: null, + }, + ); + }); it('should clear username suggestions', () => { const state = { ...defaultState, @@ -92,6 +190,21 @@ describe('Registration Reducer Tests', () => { expect(reducer(state, action)).toEqual({ ...defaultState }); }); + it('should take back data during form reset', () => { + const state = { + ...defaultState, + shouldBackupState: true, + }; + const action = { + type: BACKUP_REGISTRATION_DATA.BASE, + }; + + expect(reducer(state, action)).toEqual({ + ...defaultState, + shouldBackupState: true, + }); + }); + it('should not reset username suggestions and fields data during form reset', () => { const state = { ...defaultState, diff --git a/src/register/tests/RegistrationPage.test.jsx b/src/register/tests/RegistrationPage.test.jsx index 420c546fcf..e7c8442977 100644 --- a/src/register/tests/RegistrationPage.test.jsx +++ b/src/register/tests/RegistrationPage.test.jsx @@ -346,6 +346,15 @@ describe('RegistrationPage', () => { expect(registrationPage.find('#email-warning').text()).toEqual('Did you mean: john@hotmail.com?'); }); + it('should click on email suggestions for common service provider domain typos', () => { + store.dispatch = jest.fn(store.dispatch); + const registrationPage = mount(reduxWrapper()); + + registrationPage.find('input#email').simulate('change', { target: { value: 'john@yopmail.com', name: 'email' } }); + registrationPage.find('input#email').simulate('blur'); + registrationPage.find('.email-warning-alert-link').first().simulate('click'); + expect(registrationPage.find('input#email').props().value).toEqual('john@hotmail.com'); + }); it('should give error for common top level domain mistakes', () => { store.dispatch = jest.fn(store.dispatch); @@ -384,7 +393,32 @@ describe('RegistrationPage', () => { expect(registrationPage.find('input#username').prop('value')).toEqual('test-user'); }); + it('should remove extra character if username is more than 30 character long', () => { + const registrationPage = mount(reduxWrapper()); + registrationPage.find('input#username').simulate('change', { target: { value: 'why_this_is_not_valid_username_', name: 'username' } }); + expect(registrationPage.find('input#username').prop('value')).toEqual(''); + }); + + it('should give error with suggestion for common top level domain mistakes', () => { + const registrationPage = mount(reduxWrapper()); + registrationPage.find('input#email').simulate('change', { target: { value: 'ahtesham@hotmail', name: 'email' } }); + registrationPage.find('input#email').simulate('blur'); + + const receievedMessage = 'Did you mean ahtesham@hotmail.com?'; + expect(registrationPage.find('.alert-text').text()).toEqual(receievedMessage); + }); + + it('should call backend validation api for password validation', () => { + store.dispatch = jest.fn(store.dispatch); + const registrationPage = mount(reduxWrapper()); + registrationPage.find('input#password').simulate('change', { target: { value: 'aziz194@', name: 'password' } }); + registrationPage.find('input#password').simulate('blur'); + + expect(store.dispatch).toHaveBeenCalledWith(fetchRealtimeValidations({ + form_field_key: 'password', email: '', name: '', username: '', password: 'aziz194@', + })); + }); // ******** test field focus in functionality ******** it('should clear field related error messages on input field Focus', () => { @@ -644,6 +678,25 @@ describe('RegistrationPage', () => { expect(registrationPage.find('button.username-suggestion').length).toEqual(3); }); + it('should click on username suggestions when full name is populated', () => { + store = mockStore({ + ...initialState, + register: { + ...initialState.register, + usernameSuggestions: ['test_1', 'test_12', 'test_123'], + registrationFormData: { + ...registrationFormData, + username: ' ', + }, + }, + }); + + const registrationPage = mount(reduxWrapper()); + registrationPage.find('input#name').simulate('change', { target: { value: 'test name', name: 'name' } }); + registrationPage.find('.username-suggestion').first().simulate('click'); + expect(registrationPage.find('input#username').props().value).toEqual('test_1'); + }); + it('should clear username suggestions when close icon is clicked', () => { store = mockStore({ ...initialState, @@ -1110,7 +1163,6 @@ describe('RegistrationPage', () => { const registrationPage = mount(reduxWrapper()); registrationPage.find('input#email').simulate('change', { target: { value: 'test1@gmail.com', name: 'email' } }); registrationPage.find('input#confirm_email').simulate('blur', { target: { value: 'test2@gmail.com', name: 'confirm_email' } }); - expect(registrationPage.find('div#confirm_email-error').text()).toEqual('The email addresses do not match.'); });