fix: add missing check for graded units (#508)

This fixes a bug where if the learner needs an integrity signature, but
the unit is not graded, neither the honor code panel nor the unit
content would display.
This commit is contained in:
Bianca Severino
2021-06-28 10:12:58 -04:00
committed by GitHub
parent 5c68c1d554
commit f9fbc1eb49
2 changed files with 55 additions and 25 deletions

View File

@@ -98,6 +98,7 @@ function Unit({
const [iframeHeight, setIframeHeight] = useState(0);
const [hasLoaded, setHasLoaded] = useState(false);
const [modalOptions, setModalOptions] = useState({ open: false });
const [shouldDisplayHonorCode, setShouldDisplayHonorCode] = useState(false);
const unit = useModel('units', id);
const course = useModel('coursewareMeta', courseId);
@@ -110,6 +111,14 @@ function Unit({
// Do not remove this hook. See function description.
useLoadBearingHook(id);
useEffect(() => {
if (userNeedsIntegritySignature && unit.graded) {
setShouldDisplayHonorCode(true);
} else {
setShouldDisplayHonorCode(false);
}
}, [userNeedsIntegritySignature]);
// We use this ref so that we can hold a reference to the currently active event listener.
const messageEventListenerRef = useRef(null);
useEffect(() => {
@@ -169,7 +178,7 @@ function Unit({
{ mmp2p.meta.showLock && (
<MMP2PLockPaywall options={mmp2p} />
)}
{!mmp2p.meta.blockContent && unit.graded && userNeedsIntegritySignature && (
{!mmp2p.meta.blockContent && shouldDisplayHonorCode && (
<Suspense
fallback={(
<PageLoading
@@ -181,7 +190,7 @@ function Unit({
</Suspense>
)}
{ /** [MM-P2P] Experiment (conditional) */ }
{!mmp2p.meta.blockContent && !userNeedsIntegritySignature && !hasLoaded && (
{!mmp2p.meta.blockContent && !shouldDisplayHonorCode && !hasLoaded && (
<PageLoading
srMessage={intl.formatMessage(messages['learn.loading.learning.sequence'])}
/>
@@ -212,7 +221,7 @@ function Unit({
/>
)}
{ /** [MM-P2P] Experiment (conditional) */ }
{ !mmp2p.meta.blockContent && !userNeedsIntegritySignature && (
{ !mmp2p.meta.blockContent && !shouldDisplayHonorCode && (
<div className="unit-iframe-wrapper">
<iframe
id="unit-iframe"

View File

@@ -11,21 +11,32 @@ describe('Unit', () => {
'courseMetadata',
{ content_type_gating_enabled: true },
);
const unitBlocks = [Factory.build(
'block',
{ type: 'problem', graded: 'true' },
{ courseId: courseMetadata.id },
), Factory.build(
'block',
{
type: 'vertical',
contains_content_type_gated_content: true,
bookmarked: true,
graded: true,
},
{ courseId: courseMetadata.id },
)];
const [unit, unitThatContainsGatedContent] = unitBlocks;
const courseMetadataNeedsSignature = Factory.build(
'courseMetadata',
{ user_needs_integrity_signature: true },
);
const unitBlocks = [
Factory.build(
'block',
{ type: 'problem', graded: 'true' },
{ courseId: courseMetadata.id },
), Factory.build(
'block',
{
type: 'vertical',
contains_content_type_gated_content: true,
bookmarked: true,
graded: true,
},
{ courseId: courseMetadata.id },
),
Factory.build(
'block',
{ type: 'problem', graded: false },
{ courseId: courseMetadata.id },
),
];
const [unit, unitThatContainsGatedContent, ungradedUnit] = unitBlocks;
beforeAll(async () => {
await initializeTestStore({ courseMetadata, unitBlocks });
@@ -52,18 +63,28 @@ describe('Unit', () => {
expect(screen.getByText('Loading locked content messaging...')).toBeInTheDocument();
});
it('displays HonorCode when userNeedsIntegritySignature is true', async () => {
const signatureMetadata = Factory.build(
'courseMetadata',
{ user_needs_integrity_signature: true },
);
it('does not display HonorCode for ungraded units', async () => {
const signatureStore = await initializeTestStore(
{ courseMetadata: signatureMetadata, unitBlocks },
{ courseMetadata: courseMetadataNeedsSignature, unitBlocks },
false,
);
const signatureData = {
id: ungradedUnit.id,
courseId: courseMetadataNeedsSignature.id,
format: 'Homework',
};
render(<Unit {...signatureData} />, { store: signatureStore });
expect(screen.getByText('Loading learning sequence...')).toBeInTheDocument();
});
it('displays HonorCode for graded units if user needs integrity signature', async () => {
const signatureStore = await initializeTestStore(
{ courseMetadata: courseMetadataNeedsSignature, unitBlocks },
false,
);
const signatureData = {
id: unit.id,
courseId: signatureMetadata.id,
courseId: courseMetadataNeedsSignature.id,
format: 'Homework',
};
render(<Unit {...signatureData} />, { store: signatureStore });