Files
frontend-app-authoring/src/course-checklist/ChecklistSection/utils/courseChecklistValidators.test.js
diana-villalvazo-wgu 5df4cd941d fix: refactor best practices checklist logic (#2038)
The Best Practices Checklist behavior was wrong for some cases:

* Video: if duration is null it shouldn't be marked as completed
* Video: if there are no videos it shouldn't be marked as completed
* Unit depth: if course doesn't have units it shouldn't be marked as completed
* Diverse learning sequence: description mentions that 80% should contain multiple content types, so if it is exactly 80% it should be marked as completed
2025-06-04 16:46:01 -03:00

284 lines
9.4 KiB
JavaScript

import * as validators from './courseChecklistValidators';
describe('courseCheckValidators utility functions', () => {
describe('hasWelcomeMessage', () => {
it('returns true when course run has an update', () => {
expect(validators.hasWelcomeMessage({ hasUpdate: true })).toEqual(true);
});
it('returns false when course run does not have an update', () => {
expect(validators.hasWelcomeMessage({ hasUpdate: false })).toEqual(false);
});
});
describe('hasGradingPolicy', () => {
it('returns true when sum of weights is 1', () => {
expect(validators.hasGradingPolicy(
{ hasGradingPolicy: true, sumOfWeights: 1 },
)).toEqual(true);
});
it('returns true when sum of weights is not 1 due to floating point approximation (1.00004)', () => {
expect(validators.hasGradingPolicy(
{ hasGradingPolicy: true, sumOfWeights: 1.00004 },
)).toEqual(true);
});
it('returns false when sum of weights is not 1', () => {
expect(validators.hasGradingPolicy(
{ hasGradingPolicy: true, sumOfWeights: 2 },
)).toEqual(false);
});
it('returns true when hasGradingPolicy is true', () => {
expect(validators.hasGradingPolicy(
{ hasGradingPolicy: true, sumOfWeights: 1 },
)).toEqual(true);
});
it('returns false when hasGradingPolicy is false', () => {
expect(validators.hasGradingPolicy(
{ hasGradingPolicy: false, sumOfWeights: 1 },
)).toEqual(false);
});
});
describe('hasCertificate', () => {
it('returns true when certificates are activated and course run has a certificate', () => {
expect(validators.hasCertificate({ isActivated: true, hasCertificate: true }))
.toEqual(true);
});
it('returns false when certificates are not activated and course run has a certificate', () => {
expect(validators.hasCertificate({ isActivated: false, hasCertificate: true }))
.toEqual(false);
});
it('returns false when certificates are activated and course run does not have a certificate', () => {
expect(validators.hasCertificate({ isActivated: true, hasCertificate: false }))
.toEqual(false);
});
it('returns false when certificates are not activated and course run does not have a certificate', () => {
expect(validators.hasCertificate({ isActivated: false, hasCertificate: false }))
.toEqual(false);
});
});
describe('hasDates', () => {
it('returns true when course run has start date and end date', () => {
expect(validators.hasDates({ hasStartDate: true, hasEndDate: true })).toEqual(true);
});
it('returns false when course run has no start date and end date', () => {
expect(validators.hasDates({ hasStartDate: false, hasEndDate: true })).toEqual(false);
});
it('returns true when course run has start date and no end date', () => {
expect(validators.hasDates({ hasStartDate: true, hasEndDate: false })).toEqual(false);
});
it('returns true when course run has no start date and no end date', () => {
expect(validators.hasDates({ hasStartDate: false, hasEndDate: false })).toEqual(false);
});
});
describe('hasAssignmentDeadlines', () => {
it('returns true when a course run has start and end date and all assignments are within range', () => {
expect(validators.hasAssignmentDeadlines(
{
assignmentsWithDatesBeforeStart: 0,
assignmentsWithDatesAfterEnd: 0,
assignmentsWithOraDatesAfterEnd: 0,
assignmentsWithOraDatesBeforeStart: 0,
},
{
hasStartDate: true,
hasEndDate: true,
},
)).toEqual(true);
});
it('returns false when a course run has no start and no end date', () => {
expect(validators.hasAssignmentDeadlines(
{},
{
hasStartDate: false,
hasEndDate: false,
},
)).toEqual(false);
});
it('returns false when a course has start and end date and no assignments', () => {
expect(validators.hasAssignmentDeadlines(
{
totalNumber: 0,
},
{
hasStartDate: true,
hasEndDate: true,
},
)).toEqual(false);
});
it('returns false when a course run has start and end date and assignments before start', () => {
expect(validators.hasAssignmentDeadlines(
{
assignmentsWithDatesBeforeStart: ['test'],
assignmentsWithDatesAfterEnd: 0,
assignmentsWithOraDatesAfterEnd: 0,
assignmentsWithOraDatesBeforeStart: 0,
},
{
hasStartDate: true,
hasEndDate: true,
},
)).toEqual(false);
});
it('returns false when a course run has start and end date and assignments after end', () => {
expect(validators.hasAssignmentDeadlines(
{
assignmentsWithDatesBeforeStart: 0,
assignmentsWithDatesAfterEnd: ['test'],
assignmentsWithOraDatesAfterEnd: 0,
assignmentsWithOraDatesBeforeStart: 0,
},
{
hasStartDate: true,
hasEndDate: true,
},
)).toEqual(false);
});
});
it(
'returns false when a course run has start and end date and an ora with a date before start',
() => {
expect(validators.hasAssignmentDeadlines(
{
assignmentsWithDatesBeforeStart: 0,
assignmentsWithDatesAfterEnd: 0,
assignmentsWithOraDatesAfterEnd: 0,
assignmentsWithOraDatesBeforeStart: ['test'],
},
{
hasStartDate: true,
hasEndDate: true,
},
)).toEqual(false);
},
);
it(
'returns false when a course run has start and end date and an ora with a date after end',
() => {
expect(validators.hasAssignmentDeadlines(
{
assignmentsWithDatesBeforeStart: 0,
assignmentsWithDatesAfterEnd: 0,
assignmentsWithOraDatesAfterEnd: ['test'],
assignmentsWithOraDatesBeforeStart: 0,
},
{
hasStartDate: true,
hasEndDate: true,
},
)).toEqual(false);
},
);
describe('hasShortVideoDuration', () => {
it('returns false if course run has no videos', () => {
expect(validators.hasShortVideoDuration({ totalNumber: 0 })).toEqual(false);
});
it('returns true if course run videos have a median duration <= to 600', () => {
expect(validators.hasShortVideoDuration({ totalNumber: 1, durations: { median: 100 } }))
.toEqual(true);
});
it('returns true if course run videos have a median duration > to 600', () => {
expect(validators.hasShortVideoDuration({ totalNumber: 10, durations: { median: 700 } }))
.toEqual(false);
});
});
describe('hasDiverseSequences', () => {
it('returns true if < 20% of visible subsections have more than one block type', () => {
expect(validators.hasDiverseSequences({ totalVisible: 10, numWithOneBlockType: 1 }))
.toEqual(true);
});
it('returns false if no visible subsections', () => {
expect(validators.hasDiverseSequences({ totalVisible: 0 })).toEqual(false);
});
it('returns false if >= 20% of visible subsections have more than one block type', () => {
expect(validators.hasDiverseSequences({ totalVisible: 10, numWithOneBlockType: 3 }))
.toEqual(false);
});
it('return false if < 0 visible subsections', () => {
expect(validators.hasDiverseSequences({ totalVisible: -1, numWithOneBlockType: 1 }))
.toEqual(false);
});
});
describe('hasWeeklyHighlights', () => {
it('returns true when course run has highlights enabled', () => {
const data = { highlightsActiveForCourse: true, highlightsEnabled: true };
expect(validators.hasWeeklyHighlights(data)).toEqual(true);
});
it('returns false when course run has highlights enabled', () => {
const data = { highlightsActiveForCourse: false, highlightsEnabled: false };
expect(validators.hasWeeklyHighlights(data)).toEqual(false);
data.highlightsEnabled = true;
data.highlightsActiveForCourse = false;
expect(validators.hasWeeklyHighlights(data)).toEqual(false);
data.highlightsEnabled = false;
data.highlightsActiveForCourse = true;
expect(validators.hasWeeklyHighlights(data)).toEqual(false);
});
});
describe('hasShortUnitDepth', () => {
it('returns true when course run has median number of blocks <= 3', () => {
const units = {
totalVisible: 2,
numBlocks: {
median: 3,
},
};
expect(validators.hasShortUnitDepth(units)).toEqual(true);
});
it('returns false when course run has median number of blocks > 3', () => {
const units = {
totalVisible: 2,
numBlocks: {
median: 4,
},
};
expect(validators.hasShortUnitDepth(units)).toEqual(false);
});
});
describe('hasProctoringEscalationEmail', () => {
it('returns true when the course has a proctoring escalation email', () => {
const proctoring = { hasProctoringEscalationEmail: true };
expect(validators.hasProctoringEscalationEmail(proctoring)).toEqual(true);
});
it('returns false when the course does not have a proctoring escalation email', () => {
const proctoring = { hasProctoringEscalationEmail: false };
expect(validators.hasProctoringEscalationEmail(proctoring)).toEqual(false);
});
});
});