-
Notifications
You must be signed in to change notification settings - Fork 18
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'main' into bilalqamar95/jest-v29-upgrade
- Loading branch information
Showing
71 changed files
with
3,638 additions
and
2,277 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
// eslint-disable-next-line import/no-extraneous-dependencies | ||
const { createConfig } = require('@edx/frontend-build'); | ||
const { createConfig } = require('@openedx/frontend-build'); | ||
|
||
module.exports = createConfig('eslint'); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,23 +1,28 @@ | ||
import { examRequiresAccessToken, store } from './data'; | ||
import { useDispatch, useSelector } from 'react-redux'; | ||
import { examRequiresAccessToken } from './data'; | ||
|
||
export const useIsExam = () => { | ||
const { exam } = useSelector(state => state.specialExams); | ||
|
||
export function isExam() { | ||
const { exam } = store.getState().examState; | ||
return !!exam?.id; | ||
} | ||
}; | ||
|
||
export const useExamAccessToken = () => { | ||
const { exam, examAccessToken } = useSelector(state => state.specialExams); | ||
|
||
export function getExamAccess() { | ||
const { exam, examAccessToken } = store.getState().examState; | ||
if (!exam) { | ||
return ''; | ||
} | ||
|
||
return examAccessToken.exam_access_token; | ||
} | ||
}; | ||
|
||
export const useFetchExamAccessToken = () => { | ||
const { exam } = useSelector(state => state.specialExams); | ||
const dispatch = useDispatch(); | ||
|
||
export async function fetchExamAccess() { | ||
const { exam } = store.getState().examState; | ||
const { dispatch } = store; | ||
if (!exam) { | ||
return Promise.resolve(); | ||
} | ||
return dispatch(examRequiresAccessToken()); | ||
} | ||
return () => dispatch(examRequiresAccessToken()); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,60 +1,81 @@ | ||
import { Factory } from 'rosie'; | ||
|
||
import { isExam, getExamAccess, fetchExamAccess } from './api'; | ||
import { store } from './data'; | ||
import { useExamAccessToken, useFetchExamAccessToken, useIsExam } from './api'; | ||
import { initializeMockApp, initializeTestStore, render } from './setupTest'; | ||
|
||
/** | ||
* Hooks must be run in the scope of a component. To run the hook, wrap it in a test component whose sole | ||
* responsibility it is to run the hook and assign it to a return value that is returned by the function. | ||
* @param {*} hook: the hook function to run | ||
* @param {*} store: an initial store, passed to the call to render | ||
* @returns: the return value of the hook | ||
*/ | ||
const getHookReturnValue = (hook, store) => { | ||
let returnVal; | ||
const TestComponent = () => { | ||
returnVal = hook(); | ||
return null; | ||
}; | ||
render(<TestComponent />, { store }); | ||
return returnVal; | ||
}; | ||
|
||
describe('External API integration tests', () => { | ||
describe('Test isExam with exam', () => { | ||
describe('Test useIsExam with exam', () => { | ||
let store; | ||
|
||
beforeAll(() => { | ||
jest.mock('./data'); | ||
initializeMockApp(); | ||
const mockExam = Factory.build('exam', { attempt: Factory.build('attempt') }); | ||
const mockToken = Factory.build('examAccessToken'); | ||
const mockState = { examState: { exam: mockExam, examAccessToken: mockToken } }; | ||
store.getState = jest.fn().mockReturnValue(mockState); | ||
const mockState = { specialExams: { exam: mockExam, examAccessToken: mockToken } }; | ||
store = initializeTestStore(mockState); | ||
}); | ||
|
||
afterAll(() => { | ||
jest.clearAllMocks(); | ||
jest.resetAllMocks(); | ||
}); | ||
|
||
it('isExam should return true if exam is set', () => { | ||
expect(isExam()).toBe(true); | ||
it('useIsExam should return true if exam is set', () => { | ||
expect(getHookReturnValue(useIsExam, store)).toBe(true); | ||
}); | ||
|
||
it('getExamAccess should return exam access token if access token', () => { | ||
expect(getExamAccess()).toBeTruthy(); | ||
it('useExamAccessToken should return exam access token if access token', () => { | ||
expect(getHookReturnValue(useExamAccessToken, store)).toBeTruthy(); | ||
}); | ||
|
||
it('fetchExamAccess should dispatch get exam access token', () => { | ||
const dispatchReturn = fetchExamAccess(); | ||
expect(dispatchReturn).toBeInstanceOf(Promise); | ||
it('useFetchExamAccessToken should dispatch get exam access token', () => { | ||
// The useFetchExamAccessToken hook returns a function that calls dispatch, so we must call the returned | ||
// value to invoke dispatch. | ||
expect(getHookReturnValue(useFetchExamAccessToken, store)()).toBeInstanceOf(Promise); | ||
}); | ||
}); | ||
|
||
describe('Test isExam without exam', () => { | ||
describe('Test useIsExam without exam', () => { | ||
let store; | ||
|
||
beforeAll(() => { | ||
jest.mock('./data'); | ||
const mockState = { examState: { exam: null, examAccessToken: null } }; | ||
store.getState = jest.fn().mockReturnValue(mockState); | ||
const mockState = { specialExams: { exam: null, examAccessToken: null } }; | ||
store = initializeTestStore(mockState); | ||
}); | ||
|
||
afterAll(() => { | ||
jest.clearAllMocks(); | ||
jest.resetAllMocks(); | ||
}); | ||
|
||
it('isExam should return false if exam is not set', () => { | ||
expect(isExam()).toBe(false); | ||
it('useIsExam should return false if exam is not set', () => { | ||
expect(getHookReturnValue(useIsExam, store)).toBe(false); | ||
}); | ||
|
||
it('getExamAccess should return empty string if exam access token not set', () => { | ||
expect(getExamAccess()).toBeFalsy(); | ||
it('useExamAccessToken should return empty string if exam access token not set', () => { | ||
expect(getHookReturnValue(useExamAccessToken, store)).toBeFalsy(); | ||
}); | ||
|
||
it('fetchExamAccess should not dispatch get exam access token', () => { | ||
const dispatchReturn = fetchExamAccess(); | ||
expect(dispatchReturn).toBeInstanceOf(Promise); | ||
it('useFetchExamAccessToken should not dispatch get exam access token', () => { | ||
expect(getHookReturnValue(useFetchExamAccessToken, store)).toBeInstanceOf(Promise); | ||
}); | ||
}); | ||
}); |
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.