Files
frontend-app-discussions/src/data/redux.test.js
Adolfo R. Brandes 0c71e8b5b7 feat: Support runtime configuration (second attempt)
(This reintroduces the change in 9f84230c that was later reverted by
67b0b33a.)

frontend-platform supports runtime configuration since 2.5.0 (see the PR
that introduced it[1], but it requires MFE cooperation.  This implements
just that: by avoiding making configuration values constant, it should
now be possible to change them after initialization.

Almost all changes here relate to the `LMS_BASE_URL` setting, which in
most places was treated as a constant.

[1] https://github.com/openedx/frontend-platform/pull/335
2022-12-20 17:54:21 +05:00

108 lines
4.5 KiB
JavaScript

import MockAdapter from 'axios-mock-adapter';
import { Factory } from 'rosie';
import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';
import { initializeMockApp } from '@edx/frontend-platform/testing';
import { initializeStore } from '../store';
import { executeThunk } from '../test-utils';
import { getBlocksAPIResponse } from './__factories__';
import { getBlocksAPIURL } from './api';
import { RequestStatus } from './constants';
import { fetchCourseBlocks } from './thunks';
const blocksAPIURL = getBlocksAPIURL();
const courseId = 'course-v1:edX+DemoX+Demo_Course';
let axiosMock;
let store;
describe('Course blocks data layer tests', () => {
beforeEach(() => {
initializeMockApp({
authenticatedUser: {
userId: 3,
username: 'abc123',
administrator: true,
roles: [],
},
});
axiosMock = new MockAdapter(getAuthenticatedHttpClient());
Factory.resetAll();
store = initializeStore();
});
afterEach(() => {
axiosMock.reset();
});
it('successfully processes block data', async () => {
axiosMock.onGet(blocksAPIURL)
.reply(200, getBlocksAPIResponse());
await executeThunk(fetchCourseBlocks(courseId, 'test-user'), store.dispatch, store.getState);
expect(store.getState().blocks.chapters)
.toHaveLength(4);
expect(store.getState().blocks.chapters)
.toEqual([
'block-v1:edX+DemoX+Demo_Course+type@chapter+block@interactive_demonstrations',
'block-v1:edX+DemoX+Demo_Course+type@chapter+block@graded_interactions',
'block-v1:edX+DemoX+Demo_Course+type@chapter+block@social_integration',
'block-v1:edX+DemoX+Demo_Course+type@chapter+block@1414ffd5143b4b508f739b563ab468b7',
]);
expect(Object.keys(store.getState().blocks.topics))
.toEqual(['d9f970a42067413cbb633f81cfb12604', '98d8feb5971041a085512ae22b398613', '1d153da210844719a1a6cc39ca09673c', '265ca2d808814d76ad670957a2b6071f', '23347cb1d1e74ec79453ce361e38eb18', '4250393f9f684bfeb3f1d514e15592d1', 'eb264c9899b745fc81cd7405b53a7a65', 'aecab8f355744782af5a9470185f0005', 'cba3e4cd91d0466b9ac50926e495b76f', 'ed3164d1235645739374094a8172964b', 'b770140a122741fea651a50362dee7e6', 'c49f0dfb8fc94c9c8d9999cc95190c56', '53c486b035b4437c9197a543371e0f03', 'd7b66e45154b4af18f33213337685e91', '9ad16580878f49d1bf20ce1bc533d16e', 'b11488e3580241f08146cbcfca693d06', 'bb15269287ec44b6a2f69447db43d845', '239ef52e6eee468fb698b4217a7bafc6', 'cdad92273f7d4622aed770b7de8583bc', 'e4365aad2c39498d824cf984b3f9b083', '6e51dd8f181b44ffa6d91303a287ed3f', 'edx_demo_embedded_discussion', '31c83aefa6634e83a3c80b81f5447201', '0717ec26e67e49b2a9f30d2e15c417dd', 'df0905ee484844769644f330844253e7', 'e252d4de97c7426e8b67ff516a9962f6', '97f19f6202e54d6a9ea59f7a573725a1', 'd459fcb5792b459ca0aefe141e633ccc', 'ba12c2e0b81e4cef8e05e22049aafd63', 'a56e406f164746d8bbff76545e6d981f']);
expect(store.getState().blocks.topics['98d8feb5971041a085512ae22b398613'])
.toEqual({
chapterName: 'Example Week 1: Getting Started',
unitLink: 'http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@3dc16db8d14842e38324e95d4030b8a0',
unitName: 'Videos on edX',
verticalName: 'Lesson 1 - Getting Started',
});
Object.values(store.getState().blocks.topics)
.forEach(
topic => {
expect(topic.chapterName)
.not
.toEqual(undefined);
expect(topic.unitName)
.not
.toEqual(undefined);
expect(topic.verticalName)
.not
.toEqual(undefined);
expect(topic.unitLink)
.not
.toEqual(undefined);
},
);
});
it('handles network error', async () => {
axiosMock.onGet(blocksAPIURL).networkError();
await executeThunk(fetchCourseBlocks(courseId, 'test-user'), store.dispatch, store.getState);
expect(store.getState().blocks.status)
.toBe(RequestStatus.FAILED);
});
it('handles network timeout', async () => {
axiosMock.onGet(blocksAPIURL).timeout();
await executeThunk(fetchCourseBlocks(courseId, 'test-user'), store.dispatch, store.getState);
expect(store.getState().blocks.status)
.toBe(RequestStatus.FAILED);
});
it('handles access denied', async () => {
axiosMock.onGet(blocksAPIURL).reply(403, {});
await executeThunk(fetchCourseBlocks(courseId, 'test-user'), store.dispatch, store.getState);
expect(store.getState().blocks.status)
.toBe(RequestStatus.DENIED);
});
});