Compare commits

...

1 Commits

Author SHA1 Message Date
jansenk
32be24cfe6 feat: don't show masters-only columns for courses without a masters track 2023-05-08 15:05:00 -04:00
4 changed files with 70 additions and 23 deletions

View File

@@ -92,7 +92,11 @@ export const formatMinAssignmentGrade = (percentGrade, options) => (
* @param {string} label - assignment filter label
* @return {string[]} - list of table headers
*/
export const headingMapper = (category, label = 'All') => {
export const headingMapper = (
category,
label = 'All',
hasMastersTrack = false,
) => {
const filters = {
all: section => section.label,
byCategory: section => section.label && section.category === category,
@@ -105,17 +109,25 @@ export const headingMapper = (category, label = 'All') => {
} else {
filter = filters.byLabel;
}
const {
username,
fullName,
email,
totalGrade,
} = Headings;
let userIdentificationHeadings;
if (hasMastersTrack) {
userIdentificationHeadings = [username, fullName, email];
} else {
userIdentificationHeadings = [username];
}
const filteredLabels = (entry) => entry.filter(filter).map(s => s.label);
return (entry) => (
entry
? [username, fullName, email, ...filteredLabels(entry), totalGrade]
? [...userIdentificationHeadings, ...filteredLabels(entry), totalGrade]
: []
);
};

View File

@@ -182,7 +182,7 @@ describe('grades selectors', () => {
});
describe('headingMapper', () => {
const expectedHeaders = (subsectionLabels) => ([
const expectedMastersHeaders = (subsectionLabels) => ([
USERNAME_HEADING,
FULL_NAME_HEADING,
EMAIL_HEADING,
@@ -190,27 +190,37 @@ describe('grades selectors', () => {
TOTAL_COURSE_GRADE_HEADING,
]);
const expectedNonMastersHeaders = (subsectionLabels) => ([
USERNAME_HEADING,
...subsectionLabels,
TOTAL_COURSE_GRADE_HEADING,
]);
const rows = genericResultsRows;
const selector = selectors.headingMapper;
it('creates headers for all assignments when no filtering is applied', () => {
expect(selector('All')(genericResultsRows)).toEqual(
expectedHeaders([rows[0].label, rows[1].label, rows[2].label]),
);
});
it('creates headers for only matching assignment types when type filter is applied', () => {
expect(
selector('Homework')(genericResultsRows),
).toEqual(
expectedHeaders([rows[0].label, rows[1].label]),
);
});
it('creates headers for only matching assignment when label filter is applied', () => {
expect(selector('Homework', rows[1].label)(rows)).toEqual(
expectedHeaders([rows[1].label]),
);
});
it('returns an empty array when no entries are passed', () => {
expect(selector('all')(undefined)).toEqual([]);
[true, false].forEach((isMasters) => {
const expectedHeaders = isMasters ? expectedMastersHeaders : expectedNonMastersHeaders;
describe(isMasters ? 'Masters' : 'Not Masters', () => {
it('creates headers for all assignments when no filtering is applied', () => {
expect(selector('All', 'All', isMasters)(genericResultsRows)).toEqual(
expectedHeaders([rows[0].label, rows[1].label, rows[2].label]),
);
});
it('creates headers for only matching assignment types when type filter is applied', () => {
expect(
selector('Homework', 'All', isMasters)(genericResultsRows),
).toEqual(
expectedHeaders([rows[0].label, rows[1].label]),
);
});
it('creates headers for only matching assignment when label filter is applied', () => {
expect(selector('Homework', rows[1].label, isMasters)(rows)).toEqual(
expectedHeaders([rows[1].label]),
);
});
it('returns an empty array when no entries are passed', () => {
expect(selector('all')(undefined)).toEqual([]);
});
});
});
});

View File

@@ -109,6 +109,7 @@ export const formattedGradeLimits = (state) => {
export const getHeadings = (state) => grades.headingMapper(
filters.assignmentType(state) || 'All',
filters.selectedAssignmentLabel(state) || 'All',
tracks.stateHasMastersTrack(state),
)(grades.getExampleSectionBreakdown(state));
/**

View File

@@ -295,20 +295,27 @@ describe('root selectors', () => {
const selector = moduleSelectors.getHeadings;
beforeEach(() => {
selectors.grades.headingMapper = jest.fn(
(type, label) => (breakdown) => ({ headingMapper: { type, label, breakdown } }),
(type, label, hasMastersTrack) => (breakdown) => ({
headingMapper: {
type, label, hasMastersTrack, breakdown,
},
}),
);
selectors.filters.assignmentType = jest.fn();
selectors.filters.selectedAssignmentLabel = jest.fn();
selectors.tracks.stateHasMastersTrack = jest.fn();
selectors.grades.getExampleSectionBreakdown = mockFn('getExampleSectionBreakdown');
});
describe('no assignmentType or label selected', () => {
it('maps selected filters into getExampleSectionBreakdown', () => {
selectors.filters.assignmentType.mockReturnValue(undefined);
selectors.filters.selectedAssignmentLabel.mockReturnValue(undefined);
selectors.tracks.stateHasMastersTrack.mockReturnValue(false);
expect(selector(testState)).toEqual({
headingMapper: {
type: 'All',
label: 'All',
hasMastersTrack: false,
breakdown: { getExampleSectionBreakdown: testState },
},
});
@@ -318,10 +325,27 @@ describe('root selectors', () => {
it('maps selected filters into getExampleSectionBreakdown', () => {
selectors.filters.assignmentType.mockReturnValue(mockAssignmentType);
selectors.filters.selectedAssignmentLabel.mockReturnValue(mockAssignmentLabel);
selectors.tracks.stateHasMastersTrack.mockReturnValue(false);
expect(selector(testState)).toEqual({
headingMapper: {
type: mockAssignmentType,
label: mockAssignmentLabel,
hasMastersTrack: false,
breakdown: { getExampleSectionBreakdown: testState },
},
});
});
});
describe('has masters track', () => {
it('maps selected filters into getExampleSectionBreakdown', () => {
selectors.filters.assignmentType.mockReturnValue(undefined);
selectors.filters.selectedAssignmentLabel.mockReturnValue(undefined);
selectors.tracks.stateHasMastersTrack.mockReturnValue(true);
expect(selector(testState)).toEqual({
headingMapper: {
type: 'All',
label: 'All',
hasMastersTrack: true,
breakdown: { getExampleSectionBreakdown: testState },
},
});