fix: Update eslint configuration and resolve linting errors and test failures (#847)

This commit is contained in:
Shahbaz Shabbir
2023-04-12 22:52:49 +05:00
committed by GitHub
parent 347e0cd336
commit 107dd6f360
10 changed files with 108 additions and 88 deletions

View File

@@ -48,7 +48,6 @@ module.exports = createConfig('eslint', {
},
],
'function-paren-newline': 'off',
'no-import-assign': 'off',
'react/no-unstable-nested-components': 'off',
},
});

View File

@@ -2,8 +2,7 @@ import React from 'react';
import { Provider } from 'react-redux';
import { getConfig, mergeConfig } from '@edx/frontend-platform';
import * as analytics from '@edx/frontend-platform/analytics';
import * as auth from '@edx/frontend-platform/auth';
import { sendPageEvent, sendTrackEvent } from '@edx/frontend-platform/analytics';
import { configure, injectIntl, IntlProvider } from '@edx/frontend-platform/i18n';
import { mount } from 'enzyme';
import { MemoryRouter } from 'react-router-dom';
@@ -15,9 +14,11 @@ import { clearThirdPartyAuthContextErrorMessage } from '../data/actions';
import { RenderInstitutionButton } from '../InstitutionLogistration';
import Logistration from '../Logistration';
jest.mock('@edx/frontend-platform/analytics');
jest.mock('@edx/frontend-platform/analytics', () => ({
sendPageEvent: jest.fn(),
sendTrackEvent: jest.fn(),
}));
jest.mock('@edx/frontend-platform/auth');
analytics.sendPageEvent = jest.fn();
const mockStore = configureStore();
const IntlLogistration = injectIntl(Logistration);
@@ -41,7 +42,13 @@ describe('Logistration', () => {
);
beforeEach(() => {
auth.getAuthenticatedUser = jest.fn(() => ({ userId: 3, username: 'test-user' }));
jest.mock('@edx/frontend-platform/auth', () => ({
getAuthenticatedUser: jest.fn(() => ({
userId: 3,
username: 'test-user',
})),
}));
configure({
loggingService: { logError: jest.fn() },
config: {
@@ -182,8 +189,8 @@ describe('Logistration', () => {
const logistration = mount(reduxWrapper(<IntlLogistration {...props} />));
logistration.find(RenderInstitutionButton).simulate('click', { institutionLogin: true });
expect(analytics.sendTrackEvent).toHaveBeenCalledWith('edx.bi.institution_login_form.toggled', { category: 'user-engagement' });
expect(analytics.sendPageEvent).toHaveBeenCalledWith('login_and_registration', 'institution_login');
expect(sendTrackEvent).toHaveBeenCalledWith('edx.bi.institution_login_form.toggled', { category: 'user-engagement' });
expect(sendPageEvent).toHaveBeenCalledWith('login_and_registration', 'institution_login');
mergeConfig({
DISABLE_ENTERPRISE_LOGIN: '',

View File

@@ -2,7 +2,7 @@
/* eslint-disable react/function-component-definition */
import React from 'react';
import * as auth from '@edx/frontend-platform/auth';
import { fetchAuthenticatedUser, getAuthenticatedUser } from '@edx/frontend-platform/auth';
import { mount } from 'enzyme';
import { UnAuthOnlyRoute } from '..';
@@ -10,7 +10,10 @@ import { LOGIN_PAGE } from '../../data/constants';
import { MemoryRouter, BrowserRouter as Router, Switch } from 'react-router-dom';
jest.mock('@edx/frontend-platform/auth');
jest.mock('@edx/frontend-platform/auth', () => ({
getAuthenticatedUser: jest.fn(),
fetchAuthenticatedUser: jest.fn(),
}));
const RRD = require('react-router-dom');
// Just render plain div with its children
@@ -44,20 +47,21 @@ describe('UnAuthOnlyRoute', () => {
username: 'gonzo',
other: 'data',
};
auth.getAuthenticatedUser = jest.fn(() => user);
auth.fetchAuthenticatedUser = jest.fn(() => ({ then: () => auth.getAuthenticatedUser() }));
getAuthenticatedUser.mockReturnValue(user);
fetchAuthenticatedUser.mockReturnValueOnce(Promise.resolve(user));
mount(routerWrapper());
expect(auth.fetchAuthenticatedUser).toBeCalledWith({ forceRefresh: true });
expect(fetchAuthenticatedUser).toBeCalledWith({ forceRefresh: true });
});
it('should have called with forceRefresh false', () => {
auth.getAuthenticatedUser = jest.fn(() => null);
auth.fetchAuthenticatedUser = jest.fn(() => ({ then: () => auth.getAuthenticatedUser() }));
getAuthenticatedUser.mockReturnValue(null);
fetchAuthenticatedUser.mockReturnValueOnce(Promise.resolve(null));
mount(routerWrapper());
expect(auth.fetchAuthenticatedUser).toBeCalledWith({ forceRefresh: false });
expect(fetchAuthenticatedUser).toBeCalledWith({ forceRefresh: false });
});
});

View File

@@ -3,8 +3,6 @@ import { Provider } from 'react-redux';
import CookiePolicyBanner from '@edx/frontend-component-cookie-policy-banner';
import { mergeConfig } from '@edx/frontend-platform';
import * as analytics from '@edx/frontend-platform/analytics';
import * as auth from '@edx/frontend-platform/auth';
import { configure, injectIntl, IntlProvider } from '@edx/frontend-platform/i18n';
import { mount } from 'enzyme';
import { createMemoryHistory } from 'history';
@@ -17,11 +15,12 @@ import { PASSWORD_RESET } from '../../reset-password/data/constants';
import { setForgotPasswordFormData } from '../data/actions';
import ForgotPasswordPage from '../ForgotPasswordPage';
jest.mock('@edx/frontend-platform/analytics');
jest.mock('@edx/frontend-platform/analytics', () => ({
sendPageEvent: jest.fn(),
sendTrackEvent: jest.fn(),
}));
jest.mock('@edx/frontend-platform/auth');
analytics.sendPageEvent = jest.fn();
const IntlForgotPasswordPage = injectIntl(ForgotPasswordPage);
const mockStore = configureStore();
const history = createMemoryHistory();
@@ -51,7 +50,12 @@ describe('ForgotPasswordPage', () => {
beforeEach(() => {
store = mockStore(initialState);
auth.getAuthenticatedUser = jest.fn(() => ({ userId: 3, username: 'test-user' }));
jest.mock('@edx/frontend-platform/auth', () => ({
getAuthenticatedUser: jest.fn(() => ({
userId: 3,
username: 'test-user',
})),
}));
configure({
loggingService: { logError: jest.fn() },
config: {

View File

@@ -1,6 +1,5 @@
import React from 'react';
import * as auth from '@edx/frontend-platform/auth';
import { injectIntl, IntlProvider } from '@edx/frontend-platform/i18n';
import { mount } from 'enzyme';
import { MemoryRouter } from 'react-router-dom';
@@ -20,8 +19,9 @@ import {
} from '../data/constants';
import LoginFailureMessage from '../LoginFailure';
jest.mock('@edx/frontend-platform/auth');
auth.getAuthService = jest.fn();
jest.mock('@edx/frontend-platform/auth', () => ({
getAuthService: jest.fn(),
}));
const IntlLoginFailureMessage = injectIntl(LoginFailureMessage);

View File

@@ -3,8 +3,7 @@ import { Provider } from 'react-redux';
import CookiePolicyBanner from '@edx/frontend-component-cookie-policy-banner';
import { getConfig, mergeConfig } from '@edx/frontend-platform';
import * as analytics from '@edx/frontend-platform/analytics';
import * as auth from '@edx/frontend-platform/auth';
import { sendPageEvent } from '@edx/frontend-platform/analytics';
import { injectIntl, IntlProvider } from '@edx/frontend-platform/i18n';
import { mount } from 'enzyme';
import { MemoryRouter } from 'react-router-dom';
@@ -19,12 +18,13 @@ import { INTERNAL_SERVER_ERROR } from '../data/constants';
import LoginFailureMessage from '../LoginFailure';
import LoginPage from '../LoginPage';
jest.mock('@edx/frontend-platform/analytics');
jest.mock('@edx/frontend-platform/auth');
analytics.sendTrackEvent = jest.fn();
analytics.sendPageEvent = jest.fn();
auth.getAuthService = jest.fn();
jest.mock('@edx/frontend-platform/analytics', () => ({
sendPageEvent: jest.fn(),
sendTrackEvent: jest.fn(),
}));
jest.mock('@edx/frontend-platform/auth', () => ({
getAuthService: jest.fn(),
}));
const IntlLoginFailureMessage = injectIntl(LoginFailureMessage);
const IntlLoginPage = injectIntl(LoginPage);
@@ -682,7 +682,7 @@ describe('LoginPage', () => {
it('should send page event when login page is rendered', () => {
mount(reduxWrapper(<IntlLoginPage {...props} />));
expect(analytics.sendPageEvent).toHaveBeenCalledWith('login_and_registration', 'login');
expect(sendPageEvent).toHaveBeenCalledWith('login_and_registration', 'login');
});
it('tests that form is only scrollable on form submission', () => {

View File

@@ -2,10 +2,9 @@ import React from 'react';
import { Provider } from 'react-redux';
import { getConfig, mergeConfig } from '@edx/frontend-platform';
import * as analytics from '@edx/frontend-platform/analytics';
import * as auth from '@edx/frontend-platform/auth';
import { identifyAuthenticatedUser, sendTrackEvent } from '@edx/frontend-platform/analytics';
import { getAuthenticatedUser } from '@edx/frontend-platform/auth';
import { configure, injectIntl, IntlProvider } from '@edx/frontend-platform/i18n';
import * as logging from '@edx/frontend-platform/logging';
import { mount } from 'enzyme';
import { createMemoryHistory } from 'history';
import { act } from 'react-dom/test-utils';
@@ -21,18 +20,20 @@ import ProgressiveProfiling from '../ProgressiveProfiling';
const IntlProgressiveProfilingPage = injectIntl(ProgressiveProfiling);
const mockStore = configureStore();
jest.mock('@edx/frontend-platform/analytics');
jest.mock('@edx/frontend-platform/auth');
jest.mock('@edx/frontend-platform/logging');
analytics.sendTrackEvent = jest.fn();
analytics.sendPageEvent = jest.fn();
analytics.identifyAuthenticatedUser = jest.fn();
logging.getLoggingService = jest.fn();
auth.configure = jest.fn();
auth.ensureAuthenticatedUser = jest.fn().mockImplementation(() => Promise.resolve(true));
auth.hydrateAuthenticatedUser = jest.fn().mockImplementation(() => Promise.resolve(true));
jest.mock('@edx/frontend-platform/analytics', () => ({
sendPageEvent: jest.fn(),
sendTrackEvent: jest.fn(),
identifyAuthenticatedUser: jest.fn(),
}));
jest.mock('@edx/frontend-platform/auth', () => ({
configure: jest.fn(),
ensureAuthenticatedUser: jest.fn().mockImplementation(() => Promise.resolve(true)),
hydrateAuthenticatedUser: jest.fn().mockImplementation(() => Promise.resolve(true)),
getAuthenticatedUser: jest.fn(),
}));
jest.mock('@edx/frontend-platform/logging', () => ({
getLoggingService: jest.fn(),
}));
const history = createMemoryHistory();
@@ -129,14 +130,14 @@ describe('ProgressiveProfilingTests', () => {
});
it('should make identify call to segment on progressive profiling page', async () => {
auth.getAuthenticatedUser = jest.fn(() => ({ userId: 3, username: 'abc123' }));
getAuthenticatedUser.mockReturnValue({ userId: 3, username: 'abc123' });
await getProgressiveProfilingPage();
expect(analytics.identifyAuthenticatedUser).toHaveBeenCalledWith(3);
expect(analytics.identifyAuthenticatedUser).toHaveBeenCalled();
expect(identifyAuthenticatedUser).toHaveBeenCalledWith(3);
expect(identifyAuthenticatedUser).toHaveBeenCalled();
});
it('should submit user profile details on form submission', async () => {
auth.getAuthenticatedUser = jest.fn(() => ({ userId: 3, username: 'abc123' }));
getAuthenticatedUser.mockReturnValue({ userId: 3, username: 'abc123' });
const formPayload = {
gender: 'm',
extended_profile: [{ field_name: 'company', field_value: 'test company' }],
@@ -155,14 +156,14 @@ describe('ProgressiveProfilingTests', () => {
progressiveProfilingPage.find('button.btn-link').simulate('click');
expect(progressiveProfilingPage.find('.pgn__modal-content-container').exists()).toBeTruthy();
expect(analytics.sendTrackEvent).toHaveBeenCalledWith('edx.bi.welcome.page.skip.link.clicked');
expect(sendTrackEvent).toHaveBeenCalledWith('edx.bi.welcome.page.skip.link.clicked');
});
it('should send analytic event for support link click', async () => {
const progressiveProfilingPage = await getProgressiveProfilingPage();
progressiveProfilingPage.find('.progressive-profiling-support a[target="_blank"]').simulate('click');
expect(analytics.sendTrackEvent).toHaveBeenCalledWith('edx.bi.welcome.page.support.link.clicked');
expect(sendTrackEvent).toHaveBeenCalledWith('edx.bi.welcome.page.support.link.clicked');
});
it('should show error message when patch request fails', async () => {
@@ -206,7 +207,7 @@ describe('ProgressiveProfilingTests', () => {
},
});
auth.getAuthenticatedUser = jest.fn(() => ({ userId: 3, username: 'abc123' }));
getAuthenticatedUser.mockReturnValue({ userId: 3, username: 'abc123' });
const progressiveProfilingPage = await getProgressiveProfilingPage();
expect(progressiveProfilingPage.find('button.btn-brand').text()).toEqual('Next');
@@ -241,7 +242,7 @@ describe('ProgressiveProfilingTests', () => {
},
});
auth.getAuthenticatedUser = jest.fn(() => ({ userId: 3, username: 'abc123' }));
getAuthenticatedUser.mockReturnValue({ userId: 3, username: 'abc123' });
const progressiveProfilingPage = await getProgressiveProfilingPage();
expect(progressiveProfilingPage.find('button.btn-brand').text()).toEqual('Submit');

View File

@@ -2,14 +2,14 @@ import React from 'react';
import { Provider } from 'react-redux';
import { getConfig, mergeConfig } from '@edx/frontend-platform';
import * as analytics from '@edx/frontend-platform/analytics';
import { sendTrackEvent } from '@edx/frontend-platform/analytics';
import { injectIntl, IntlProvider } from '@edx/frontend-platform/i18n';
import { mount } from 'enzyme';
import { act } from 'react-dom/test-utils';
import configureStore from 'redux-mock-store';
import { DEFAULT_REDIRECT_URL } from '../../data/constants';
import * as getPersonalizedRecommendations from '../data/service';
import getPersonalizedRecommendations from '../data/service';
import { trackRecommendationCardClickOptimizely } from '../optimizelyExperiment';
import RecommendationsPage from '../RecommendationsPage';
import { mockedGeneralRecommendations, mockedResponse } from './mockedData';
@@ -17,14 +17,17 @@ import { mockedGeneralRecommendations, mockedResponse } from './mockedData';
const IntlRecommendationsPage = injectIntl(RecommendationsPage);
const mockStore = configureStore();
jest.mock('@edx/frontend-platform/analytics');
jest.mock('../data/service');
jest.mock('@edx/frontend-platform/analytics', () => ({
sendTrackEvent: jest.fn(),
}));
jest.mock('../data/service', () => ({
__esModule: true,
default: jest.fn(),
}));
jest.mock('../optimizelyExperiment', () => ({
trackRecommendationCardClickOptimizely: jest.fn(),
}));
analytics.sendTrackEvent = jest.fn();
describe('RecommendationsPageTests', () => {
mergeConfig({
GENERAL_RECOMMENDATIONS: '[]',
@@ -72,10 +75,10 @@ describe('RecommendationsPageTests', () => {
href: getConfig().BASE_URL,
assign: jest.fn().mockImplementation((value) => { window.location.href = value; }),
};
getPersonalizedRecommendations.default = jest.fn().mockImplementation(() => Promise.resolve([]));
getPersonalizedRecommendations.mockImplementation(() => Promise.resolve([]));
await getRecommendationsPage({});
expect(getPersonalizedRecommendations.default).toHaveBeenCalledTimes(0);
expect(getPersonalizedRecommendations).toHaveBeenCalledTimes(0);
expect(window.location.href).toEqual(DASHBOARD_URL);
});
it('redirects to dashboard if user click on skip button', async () => {
@@ -92,21 +95,21 @@ describe('RecommendationsPageTests', () => {
},
},
};
getPersonalizedRecommendations.default = jest.fn().mockImplementation(() => Promise.resolve(mockedResponse));
getPersonalizedRecommendations.mockImplementation(() => Promise.resolve(mockedResponse));
const recommendationsPage = await getRecommendationsPage(props);
recommendationsPage.find('button').simulate('click');
expect(window.location.href).toEqual(DASHBOARD_URL);
});
it('should call trackRecommendationCardClickOptimizely when card is clicked', async () => {
getPersonalizedRecommendations.default = jest.fn().mockImplementation(() => Promise.resolve(mockedResponse));
getPersonalizedRecommendations.mockImplementation(() => Promise.resolve(mockedResponse));
const recommendationsPage = await getRecommendationsPage();
recommendationsPage.find('.card-box').first().simulate('click');
expect(trackRecommendationCardClickOptimizely).toHaveBeenCalledTimes(1);
});
it('should show loading state to user', async () => {
getPersonalizedRecommendations.default = jest.fn().mockImplementation(() => Promise.resolve(mockedResponse));
getPersonalizedRecommendations.mockImplementation(() => Promise.resolve(mockedResponse));
await act(async () => {
const recommendationsPage = mount(reduxWrapper(<IntlRecommendationsPage {...defaultProps} />));
expect(recommendationsPage.find('.centered-align-spinner').exists()).toBeTruthy();
@@ -116,11 +119,12 @@ describe('RecommendationsPageTests', () => {
it('should call getPersonalizedRecommendations', async () => {
delete window.location;
window.location = { assign: jest.fn() };
getPersonalizedRecommendations.default = jest.fn().mockImplementation(() => Promise.resolve([]));
getPersonalizedRecommendations.mockClear();
getPersonalizedRecommendations.mockImplementation(() => Promise.resolve([]));
await getRecommendationsPage();
expect(getPersonalizedRecommendations.default).toHaveBeenCalledTimes(1);
expect(analytics.sendTrackEvent).toHaveBeenCalledWith(
expect(getPersonalizedRecommendations).toHaveBeenCalledTimes(1);
expect(sendTrackEvent).toHaveBeenCalledWith(
'edx.bi.user.recommendations.viewed',
{
page: 'authn_recommendations',
@@ -133,14 +137,14 @@ describe('RecommendationsPageTests', () => {
});
it('should display recommendations returned by Algolia', async () => {
getPersonalizedRecommendations.default = jest.fn().mockImplementation(() => Promise.resolve(mockedResponse));
getPersonalizedRecommendations.mockImplementation(() => Promise.resolve(mockedResponse));
const recommendationsPage = await getRecommendationsPage();
expect(recommendationsPage.find('#course-recommendations').exists()).toBeTruthy();
});
it('should not display recommendations if error comes in while fetching the recommendations', async () => {
getPersonalizedRecommendations.default = jest.fn().mockImplementation(() => Promise.reject(mockedResponse));
getPersonalizedRecommendations.mockImplementation(() => Promise.reject(mockedResponse));
const recommendationsPage = await getRecommendationsPage();
expect(recommendationsPage.find('#recommendation-card').exists()).toBeFalsy();
@@ -149,7 +153,7 @@ describe('RecommendationsPageTests', () => {
it('should redirect if recommended courses count is less than RECOMMENDATIONS_COUNT', async () => {
delete window.location;
window.location = { assign: jest.fn() };
getPersonalizedRecommendations.default = jest.fn().mockImplementation(() => Promise.resolve([mockedResponse[0]]));
getPersonalizedRecommendations.mockImplementation(() => Promise.resolve([mockedResponse[0]]));
const recommendationsPage = await getRecommendationsPage();
expect(recommendationsPage.find('#course-recommendations').exists()).toBeFalsy();
@@ -160,14 +164,14 @@ describe('RecommendationsPageTests', () => {
mergeConfig({
GENERAL_RECOMMENDATIONS: mockedGeneralRecommendations,
});
getPersonalizedRecommendations.default = jest.fn().mockImplementation(() => Promise.resolve([]));
getPersonalizedRecommendations.mockImplementation(() => Promise.resolve([]));
const recommendationsPage = await getRecommendationsPage();
expect(recommendationsPage.find('#course-recommendations').exists()).toBeTruthy();
});
it('should display all owners for a course', async () => {
getPersonalizedRecommendations.default = jest.fn().mockImplementation(() => Promise.resolve(mockedResponse));
getPersonalizedRecommendations.mockImplementation(() => Promise.resolve(mockedResponse));
const recommendationsPage = await getRecommendationsPage();
expect(

View File

@@ -3,7 +3,7 @@ import { Provider } from 'react-redux';
import CookiePolicyBanner from '@edx/frontend-component-cookie-policy-banner';
import { getConfig, mergeConfig } from '@edx/frontend-platform';
import * as analytics from '@edx/frontend-platform/analytics';
import { sendPageEvent } from '@edx/frontend-platform/analytics';
import {
configure, getLocale, injectIntl, IntlProvider,
} from '@edx/frontend-platform/i18n';
@@ -27,15 +27,15 @@ import {
import RegistrationFailureMessage from '../RegistrationFailure';
import RegistrationPage from '../RegistrationPage';
jest.mock('@edx/frontend-platform/analytics');
jest.mock('@edx/frontend-platform/analytics', () => ({
sendPageEvent: jest.fn(),
sendTrackEvent: jest.fn(),
}));
jest.mock('@edx/frontend-platform/i18n', () => ({
...jest.requireActual('@edx/frontend-platform/i18n'),
getLocale: jest.fn(),
}));
analytics.sendTrackEvent = jest.fn();
analytics.sendPageEvent = jest.fn();
const IntlRegistrationPage = injectIntl(RegistrationPage);
const IntlRegistrationFailure = injectIntl(RegistrationFailureMessage);
const mockStore = configureStore();
@@ -878,7 +878,7 @@ describe('RegistrationPage', () => {
it('should send page event when register page is rendered', () => {
mount(reduxWrapper(<IntlRegistrationPage {...props} />));
expect(analytics.sendPageEvent).toHaveBeenCalledWith('login_and_registration', 'register');
expect(sendPageEvent).toHaveBeenCalledWith('login_and_registration', 'register');
});
it('should populate form with pipeline user details', () => {

View File

@@ -2,7 +2,6 @@ import React from 'react';
import { Provider } from 'react-redux';
import CookiePolicyBanner from '@edx/frontend-component-cookie-policy-banner';
import * as auth from '@edx/frontend-platform/auth';
import { configure, injectIntl, IntlProvider } from '@edx/frontend-platform/i18n';
import { mount } from 'enzyme';
import { createMemoryHistory } from 'history';
@@ -69,11 +68,13 @@ describe('ResetPasswordPage', () => {
},
});
auth.getHttpClient = jest.fn(() => ({
post: async () => ({
data: {},
catch: () => {},
}),
jest.mock('@edx/frontend-platform/auth', () => ({
getHttpClient: jest.fn(() => ({
post: async () => ({
data: {},
catch: () => {},
}),
})),
}));
store.dispatch = jest.fn(store.dispatch);