|
1 | 1 | import { feedbackRequirement } from 'data/services/lms/constants';
|
2 | 2 |
|
| 3 | +import { keyStore } from '../../../utils'; |
3 | 4 | // import * in order to mock in-file references
|
4 | 5 | import * as selectors from './selectors';
|
5 | 6 |
|
@@ -44,6 +45,8 @@ const testState = {
|
44 | 45 | },
|
45 | 46 | };
|
46 | 47 |
|
| 48 | +const selectorKeys = keyStore(selectors); |
| 49 | + |
47 | 50 | describe('app selectors unit tests', () => {
|
48 | 51 | const { appSelector, simpleSelectors, rubric } = selectors;
|
49 | 52 | describe('appSelector', () => {
|
@@ -180,56 +183,86 @@ describe('app selectors unit tests', () => {
|
180 | 183 | });
|
181 | 184 | });
|
182 | 185 | });
|
183 |
| - describe('emptyGrade selector', () => { |
184 |
| - const { rubricConfig } = testState.app.oraMetadata; |
185 |
| - let preSelectors; |
186 |
| - let cb; |
| 186 | + describe('shouldIncludeFeedback', () => { |
| 187 | + it('returns true iff the passed feedback is optional or required', () => { |
| 188 | + expect(selectors.shouldIncludeFeedback(feedbackRequirement.optional)).toEqual(true); |
| 189 | + expect(selectors.shouldIncludeFeedback(feedbackRequirement.required)).toEqual(true); |
| 190 | + expect(selectors.shouldIncludeFeedback(feedbackRequirement.disabled)).toEqual(false); |
| 191 | + expect(selectors.shouldIncludeFeedback('aribitrary')).toEqual(false); |
| 192 | + }); |
| 193 | + }); |
| 194 | + describe('fillGradeData selector', () => { |
| 195 | + const cb = selectors.fillGradeData; |
| 196 | + const spies = {}; |
| 197 | + let oldRubric; |
| 198 | + const criteria = [ |
| 199 | + { name: 'criteria1', orderNum: 0, feedback: true }, |
| 200 | + { name: 'criteria2', orderNum: 1, feedback: false }, |
| 201 | + { name: 'criteria3', orderNum: 2, feedback: true }, |
| 202 | + ]; |
| 203 | + |
| 204 | + const data = { arbitrary: 'data', criteria }; |
| 205 | + beforeAll(() => { |
| 206 | + oldRubric = { ...rubric }; |
| 207 | + }); |
187 | 208 | beforeEach(() => {
|
188 |
| - ({ preSelectors, cb } = selectors.emptyGrade); |
189 |
| - }); |
190 |
| - it('is a memoized selector based on rubric.[hasConfig, criteria, feedbackConfig]', () => { |
191 |
| - expect(preSelectors).toEqual([ |
192 |
| - rubric.hasConfig, |
193 |
| - rubric.criteria, |
194 |
| - rubric.feedbackConfig, |
195 |
| - ]); |
196 |
| - }); |
197 |
| - describe('If the config is not loaded (hasConfig = undefined)', () => { |
198 |
| - it('returns null', () => { |
199 |
| - expect(cb(false, {}, '')).toEqual(null); |
| 209 | + rubric.hasConfig = jest.fn(() => true); |
| 210 | + rubric.feedbackConfig = jest.fn(() => true); |
| 211 | + rubric.criteria = jest.fn(() => criteria); |
| 212 | + spies.shouldIncludeFeedback = jest.spyOn( |
| 213 | + selectors, |
| 214 | + selectorKeys.shouldIncludeFeedback, |
| 215 | + ).mockImplementation(val => val); |
| 216 | + }); |
| 217 | + afterEach(() => { |
| 218 | + spies[selectorKeys.shouldIncludeFeedback].mockRestore(); |
| 219 | + }); |
| 220 | + afterAll(() => { |
| 221 | + selectors.rubric = { ...oldRubric }; |
| 222 | + }); |
| 223 | + |
| 224 | + describe('if rubric config is not loaded', () => { |
| 225 | + it('returns passed gradeData', () => { |
| 226 | + rubric.hasConfig.mockReturnValueOnce(false); |
| 227 | + expect(cb(testState, data)).toEqual(data); |
200 | 228 | });
|
201 | 229 | });
|
202 |
| - describe('The generated object', () => { |
203 |
| - it('loads an overallFeedback field iff feedbackConfig is optional or required', () => { |
204 |
| - let gradeData = cb(true, rubricConfig.criteria, feedbackRequirement.optional); |
205 |
| - expect(gradeData.overallFeedback).toEqual(''); |
206 |
| - gradeData = cb(true, rubricConfig.criteria, feedbackRequirement.required); |
207 |
| - expect(gradeData.overallFeedback).toEqual(''); |
208 |
| - gradeData = cb(true, rubricConfig.criteria, feedbackRequirement.disabled); |
209 |
| - expect(gradeData.overallFeedback).toEqual(undefined); |
| 230 | + |
| 231 | + describe('if rubric config is loaded', () => { |
| 232 | + describe('gradeData is passed, contains criteria', () => { |
| 233 | + it('returns the passed gradeData', () => { |
| 234 | + expect(cb(testState, data)).toEqual(data); |
| 235 | + }); |
210 | 236 | });
|
211 |
| - it('loads criteria with feedback field based on requirement config', () => { |
212 |
| - const gradeData = cb(true, rubricConfig.criteria, rubricConfig.feedback); |
213 |
| - const { criteria } = rubricConfig; |
214 |
| - expect(gradeData.criteria).toEqual([ |
215 |
| - { |
216 |
| - orderNum: criteria[0].orderNum, |
217 |
| - name: criteria[0].name, |
218 |
| - selectedOption: '', |
219 |
| - feedback: '', |
220 |
| - }, |
221 |
| - { |
222 |
| - orderNum: criteria[1].orderNum, |
223 |
| - name: criteria[1].name, |
224 |
| - selectedOption: '', |
225 |
| - }, |
226 |
| - { |
227 |
| - orderNum: criteria[2].orderNum, |
228 |
| - name: criteria[2].name, |
229 |
| - selectedOption: '', |
230 |
| - feedback: '', |
231 |
| - }, |
232 |
| - ]); |
| 237 | + describe('gradeData is not passed', () => { |
| 238 | + it('adds overall feedback iff is configured for inclusion', () => { |
| 239 | + expect(cb(testState, null).overallFeedback).toEqual(''); |
| 240 | + rubric.feedbackConfig.mockReturnValueOnce(false); |
| 241 | + expect(cb(testState, null).overallFeedback).toEqual(undefined); |
| 242 | + }); |
| 243 | + describe('criteria', () => { |
| 244 | + it('displays name, orderNum, and feedback per config and empty selection', () => { |
| 245 | + expect(cb(testState, null).criteria).toEqual([ |
| 246 | + { |
| 247 | + name: criteria[0].name, |
| 248 | + orderNum: criteria[0].orderNum, |
| 249 | + feedback: '', |
| 250 | + selectedOption: '', |
| 251 | + }, |
| 252 | + { |
| 253 | + name: criteria[1].name, |
| 254 | + orderNum: criteria[1].orderNum, |
| 255 | + selectedOption: '', |
| 256 | + }, |
| 257 | + { |
| 258 | + name: criteria[2].name, |
| 259 | + orderNum: criteria[2].orderNum, |
| 260 | + feedback: '', |
| 261 | + selectedOption: '', |
| 262 | + }, |
| 263 | + ]); |
| 264 | + }); |
| 265 | + }); |
233 | 266 | });
|
234 | 267 | });
|
235 | 268 | });
|
|
0 commit comments