* feat: add language selection chore: update tests so we have less error message test: update test * test: update tests * chore: remove duplicate translation * chore: lint for console * chore: remove comments * chore: make sure the affect url frame refresh after the language selection change * chore: add whole_course_translation and language to courseware meta (#1305) * feat: Add feedback widget UI mock Add unit tests Fix snapshot Clean Sequence component logEvent calls Clean unit test Put feedback widget behind whole course translation flag Fix useFeedbackWidget test * chore: add src and dest translation * feat: first iteration of plugin translation chore: update plugin instruction * feat: Connect FeedbackWidget with backend services (#1325) Connect FeedbackWidget with backend services Move feedback widget to unit translation plugin * feat: Add authentication to WCT feedback endpoints (#1329) * chore: add fetch config and move feedback widget for the plugin chore: rewrite and test the api request chore: rebase chore: update translation feedback chore: test chore: add more tests * chore: rebase * chore: update requested change * chore: update package * chore: upgrade frontend-lib-special-exams and frontend-lib-learning-assistant * chore: update tests * chore: remove unneeded package * chore: update example config * chore: add source-map-loader * fix: feedback widget render error after submit feedback (#1335) * fix: feedback widget render error after submit feedback * fix: widget logic --------- Co-authored-by: Rodrigo Martin <rodrigom_94@hotmail.com>
164 lines
4.9 KiB
JavaScript
164 lines
4.9 KiB
JavaScript
import { renderHook, act } from '@testing-library/react-hooks';
|
|
|
|
import useFeedbackWidget from './useFeedbackWidget';
|
|
import { createTranslationFeedback, getTranslationFeedback } from '../data/api';
|
|
|
|
jest.mock('../data/api', () => ({
|
|
createTranslationFeedback: jest.fn(),
|
|
getTranslationFeedback: jest.fn(),
|
|
}));
|
|
|
|
const initialProps = {
|
|
courseId: 'course-v1:edX+DemoX+Demo_Course',
|
|
translationLanguage: 'es',
|
|
unitId: 'block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0270f6de40fc',
|
|
userId: 3,
|
|
};
|
|
|
|
const newProps = {
|
|
courseId: 'course-v1:edX+DemoX+Demo_Course',
|
|
translationLanguage: 'fr',
|
|
unitId: 'block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0270f6de40fc',
|
|
userId: 3,
|
|
};
|
|
|
|
describe('useFeedbackWidget', () => {
|
|
beforeEach(async () => {
|
|
getTranslationFeedback.mockReturnValue('');
|
|
});
|
|
|
|
afterEach(() => {
|
|
jest.restoreAllMocks();
|
|
});
|
|
|
|
test('closeFeedbackWidget behavior', () => {
|
|
const { result, waitFor } = renderHook(() => useFeedbackWidget(initialProps));
|
|
waitFor(() => expect(result.current.showFeedbackWidget.toBe(true)));
|
|
act(() => {
|
|
result.current.closeFeedbackWidget();
|
|
});
|
|
expect(result.current.showFeedbackWidget).toBe(false);
|
|
});
|
|
|
|
test('openFeedbackWidget behavior', () => {
|
|
const { result } = renderHook(() => useFeedbackWidget(initialProps));
|
|
act(() => {
|
|
result.current.closeFeedbackWidget();
|
|
});
|
|
expect(result.current.showFeedbackWidget).toBe(false);
|
|
act(() => {
|
|
result.current.openFeedbackWidget();
|
|
});
|
|
expect(result.current.showFeedbackWidget).toBe(true);
|
|
});
|
|
|
|
test('openGratitudeText behavior', async () => {
|
|
const { result, waitFor } = renderHook(() => useFeedbackWidget(initialProps));
|
|
|
|
expect(result.current.showGratitudeText).toBe(false);
|
|
act(() => {
|
|
result.current.openGratitudeText();
|
|
});
|
|
expect(result.current.showGratitudeText).toBe(true);
|
|
// Wait for 3 seconds to hide the gratitude text
|
|
waitFor(() => {
|
|
expect(result.current.showGratitudeText).toBe(false);
|
|
}, { timeout: 3000 });
|
|
});
|
|
|
|
test('sendFeedback behavior', () => {
|
|
const { result, waitFor } = renderHook(() => useFeedbackWidget(initialProps));
|
|
const feedbackValue = true;
|
|
|
|
waitFor(() => expect(result.current.showFeedbackWidget.toBe(true)));
|
|
|
|
expect(result.current.showGratitudeText).toBe(false);
|
|
act(() => {
|
|
result.current.sendFeedback(feedbackValue);
|
|
});
|
|
|
|
waitFor(() => {
|
|
expect(result.current.showFeedbackWidget).toBe(false);
|
|
expect(result.current.showGratitudeText).toBe(true);
|
|
});
|
|
|
|
expect(createTranslationFeedback).toHaveBeenCalledWith({
|
|
courseId: initialProps.courseId,
|
|
feedbackValue,
|
|
translationLanguage: initialProps.translationLanguage,
|
|
unitId: initialProps.unitId,
|
|
userId: initialProps.userId,
|
|
});
|
|
|
|
// Wait for 3 seconds to hide the gratitude text
|
|
waitFor(() => {
|
|
expect(result.current.showGratitudeText).toBe(false);
|
|
}, { timeout: 3000 });
|
|
});
|
|
|
|
test('onThumbsUpClick behavior', () => {
|
|
const { result } = renderHook(() => useFeedbackWidget(initialProps));
|
|
|
|
act(() => {
|
|
result.current.onThumbsUpClick();
|
|
});
|
|
|
|
expect(createTranslationFeedback).toHaveBeenCalledWith({
|
|
courseId: initialProps.courseId,
|
|
feedbackValue: true,
|
|
translationLanguage: initialProps.translationLanguage,
|
|
unitId: initialProps.unitId,
|
|
userId: initialProps.userId,
|
|
});
|
|
});
|
|
|
|
test('onThumbsDownClick behavior', () => {
|
|
const { result } = renderHook(() => useFeedbackWidget(initialProps));
|
|
|
|
act(() => {
|
|
result.current.onThumbsDownClick();
|
|
});
|
|
|
|
expect(createTranslationFeedback).toHaveBeenCalledWith({
|
|
courseId: initialProps.courseId,
|
|
feedbackValue: false,
|
|
translationLanguage: initialProps.translationLanguage,
|
|
unitId: initialProps.unitId,
|
|
userId: initialProps.userId,
|
|
});
|
|
});
|
|
|
|
test('fetch feedback on initialization', () => {
|
|
const { waitFor } = renderHook(() => useFeedbackWidget(initialProps));
|
|
waitFor(() => {
|
|
expect(getTranslationFeedback).toHaveBeenCalledWith({
|
|
courseId: initialProps.courseId,
|
|
translationLanguage: initialProps.translationLanguage,
|
|
unitId: initialProps.unitId,
|
|
userId: initialProps.userId,
|
|
});
|
|
});
|
|
});
|
|
|
|
test('fetch feedback on props update', () => {
|
|
const { rerender, waitFor } = renderHook(() => useFeedbackWidget(initialProps));
|
|
waitFor(() => {
|
|
expect(getTranslationFeedback).toHaveBeenCalledWith({
|
|
courseId: initialProps.courseId,
|
|
translationLanguage: initialProps.translationLanguage,
|
|
unitId: initialProps.unitId,
|
|
userId: initialProps.userId,
|
|
});
|
|
});
|
|
rerender(newProps);
|
|
waitFor(() => {
|
|
expect(getTranslationFeedback).toHaveBeenCalledWith({
|
|
courseId: newProps.courseId,
|
|
translationLanguage: newProps.translationLanguage,
|
|
unitId: newProps.unitId,
|
|
userId: newProps.userId,
|
|
});
|
|
});
|
|
});
|
|
});
|