fix: Fix data API URL handling

All configuration calls must handled asynchronously, otherwise they risk
failure in runtime configuration scenarios.
This commit is contained in:
Adolfo R. Brandes
2023-11-21 14:58:14 -03:00
committed by Adolfo R. Brandes
parent 02cdccc77c
commit a622f8e86e
4 changed files with 10 additions and 10 deletions

View File

@@ -153,7 +153,7 @@ describe('<CreateOrRerunCourseForm />', () => {
userEvent.type(runInput, '1');
userEvent.click(createBtn);
});
await axiosMock.onPost(getCreateOrRerunCourseUrl).reply(200, { url });
await axiosMock.onPost(getCreateOrRerunCourseUrl()).reply(200, { url });
await executeThunk(updateCreateOrRerunCourseQuery({ org: 'testX', run: 'some' }), store.dispatch);
expect(window.location.assign).toHaveBeenCalledWith(`${process.env.STUDIO_BASE_URL}${url}`);
@@ -168,7 +168,7 @@ describe('<CreateOrRerunCourseForm />', () => {
const numberInput = screen.getByPlaceholderText(messages.courseNumberPlaceholder.defaultMessage);
const runInput = screen.getByPlaceholderText(messages.courseRunPlaceholder.defaultMessage);
const createBtn = screen.getByRole('button', { name: messages.createButton.defaultMessage });
await axiosMock.onPost(getCreateOrRerunCourseUrl).reply(200, { url, destinationCourseKey });
await axiosMock.onPost(getCreateOrRerunCourseUrl()).reply(200, { url, destinationCourseKey });
await act(async () => {
userEvent.type(displayNameInput, 'foo course name');
@@ -250,7 +250,7 @@ describe('<CreateOrRerunCourseForm />', () => {
it('shows alert error if postErrors presents', async () => {
render(<RootWrapper {...props} />);
await mockStore();
await axiosMock.onPost(getCreateOrRerunCourseUrl).reply(200, { errMsg: 'aaa' });
await axiosMock.onPost(getCreateOrRerunCourseUrl()).reply(200, { errMsg: 'aaa' });
await executeThunk(updateCreateOrRerunCourseQuery({ org: 'testX', run: 'some' }), store.dispatch);
expect(screen.getByText('aaa')).toBeInTheDocument();

View File

@@ -4,9 +4,9 @@ import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';
import { convertObjectToSnakeCase } from '../../utils';
export const getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;
export const getCreateOrRerunCourseUrl = new URL('course/', getApiBaseUrl()).href;
export const getCreateOrRerunCourseUrl = () => new URL('course/', getApiBaseUrl()).href;
export const getCourseRerunUrl = (courseId) => new URL(`/api/contentstore/v1/course_rerun/${courseId}`, getApiBaseUrl()).href;
export const getOrganizationsUrl = new URL('organizations', getApiBaseUrl()).href;
export const getOrganizationsUrl = () => new URL('organizations', getApiBaseUrl()).href;
/**
* Get's organizations data.
@@ -14,7 +14,7 @@ export const getOrganizationsUrl = new URL('organizations', getApiBaseUrl()).hre
*/
export async function getOrganizations() {
const { data } = await getAuthenticatedHttpClient().get(
getOrganizationsUrl,
getOrganizationsUrl(),
);
return camelCaseObject(data);
}
@@ -37,7 +37,7 @@ export async function getCourseRerun(courseId) {
*/
export async function createOrRerunCourse(courseData) {
const { data } = await getAuthenticatedHttpClient().post(
getCreateOrRerunCourseUrl,
getCreateOrRerunCourseUrl(),
convertObjectToSnakeCase(courseData, true),
);
return camelCaseObject(data);

View File

@@ -66,10 +66,10 @@ describe('generic api calls', () => {
org: 'edX',
run: 'Demo_Course',
};
axiosMock.onPost(getCreateOrRerunCourseUrl).reply(200, courseRerunData);
axiosMock.onPost(getCreateOrRerunCourseUrl()).reply(200, courseRerunData);
const result = await createOrRerunCourse(courseRerunData);
expect(axiosMock.history.post[0].url).toEqual(getCreateOrRerunCourseUrl);
expect(axiosMock.history.post[0].url).toEqual(getCreateOrRerunCourseUrl());
expect(result).toEqual(courseRerunData);
});
});

View File

@@ -42,7 +42,7 @@ describe('<OrganizationSection />', async () => {
});
store = initializeStore();
axiosMock = new MockAdapter(getAuthenticatedHttpClient());
axiosMock.onDelete(getOrganizationsUrl).reply(200);
axiosMock.onDelete(getOrganizationsUrl()).reply(200);
await executeThunk(fetchOrganizationsQuery(), store.dispatch);
useSelector.mockReturnValue(['edX', 'org']);
});