From a4728a90630f7c2f80d09951d8cce69fda100ec1 Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 14 Nov 2021 16:07:58 -0500 Subject: [PATCH] [easy] Delete AP/IB override code They will be replaced by the new opt-in/opt-out infra. --- .../__test__/override-apib.test.ts | 463 ------------------ src/global-firestore-data/index.ts | 4 - src/global-firestore-data/onboarding-data.ts | 30 +- .../overridden-fulfillment-choices.ts | 74 --- src/user-data.d.ts | 6 - 5 files changed, 10 insertions(+), 567 deletions(-) delete mode 100644 src/global-firestore-data/__test__/override-apib.test.ts delete mode 100644 src/global-firestore-data/overridden-fulfillment-choices.ts diff --git a/src/global-firestore-data/__test__/override-apib.test.ts b/src/global-firestore-data/__test__/override-apib.test.ts deleted file mode 100644 index 1e67c8624..000000000 --- a/src/global-firestore-data/__test__/override-apib.test.ts +++ /dev/null @@ -1,463 +0,0 @@ -import { - addOverriddenFulfillmentAPIBUpdater, - clearOverriddenFulfillmentsAPIBUpdater, -} from '../overridden-fulfillment-choices'; - -/** - * Tests for addOverriddenFulfillmentAPIBUpdater - */ -it('Exam name not found', () => { - let oldAPIBExams: FirestoreAPIBExam[] = []; - let newAPIBExams = addOverriddenFulfillmentAPIBUpdater( - oldAPIBExams, - 'examName', - true, - 'reqName', - 'slotName' - ); - expect(newAPIBExams).toEqual(oldAPIBExams); - - oldAPIBExams = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - }, - ]; - newAPIBExams = addOverriddenFulfillmentAPIBUpdater( - oldAPIBExams, - 'examName', - true, - 'reqName', - 'slotName' - ); - expect(newAPIBExams).toEqual(oldAPIBExams); -}); - -it('Override with missing data', () => { - const oldAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - }, - ]; - - let expectedAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: { reqName: ['slotName'] }, - optOut: {}, - }, - ]; - let newAPIBExams = addOverriddenFulfillmentAPIBUpdater( - oldAPIBExams, - 'AP Biology', - true, - 'reqName', - 'slotName' - ); - expect(newAPIBExams).toEqual(expectedAPIBExams); - - expectedAPIBExams = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: {}, - optOut: { reqName: ['slotName'] }, - }, - ]; - newAPIBExams = addOverriddenFulfillmentAPIBUpdater( - oldAPIBExams, - 'AP Biology', - false, - 'reqName', - 'slotName' - ); - expect(newAPIBExams).toEqual(expectedAPIBExams); -}); - -it('Override with no initial data', () => { - const oldAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - }, - ]; - - let expectedAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: { reqName: ['slotName'] }, - optOut: {}, - }, - ]; - let newAPIBExams = addOverriddenFulfillmentAPIBUpdater( - oldAPIBExams, - 'AP Biology', - true, - 'reqName', - 'slotName' - ); - expect(newAPIBExams).toEqual(expectedAPIBExams); - - expectedAPIBExams = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: {}, - optOut: { reqName: ['slotName'] }, - }, - ]; - newAPIBExams = addOverriddenFulfillmentAPIBUpdater( - oldAPIBExams, - 'AP Biology', - false, - 'reqName', - 'slotName' - ); - expect(newAPIBExams).toEqual(expectedAPIBExams); -}); - -it('Override with duplicate data', () => { - const oldAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: { reqName: ['slotName'] }, - optOut: { reqName1: ['slotName1'] }, - }, - ]; - - let newAPIBExams = addOverriddenFulfillmentAPIBUpdater( - oldAPIBExams, - 'AP Biology', - true, - 'reqName', - 'slotName' - ); - expect(newAPIBExams).toEqual(oldAPIBExams); - - newAPIBExams = addOverriddenFulfillmentAPIBUpdater( - oldAPIBExams, - 'AP Biology', - false, - 'reqName1', - 'slotName1' - ); - expect(newAPIBExams).toEqual(oldAPIBExams); -}); - -it('Opt in with new data', () => { - const oldAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: { reqName: ['slotName1'] }, - }, - ]; - const expectedAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: { reqName: ['slotName1', 'slotName'] }, - optOut: {}, - }, - ]; - const newAPIBExams = addOverriddenFulfillmentAPIBUpdater( - oldAPIBExams, - 'AP Biology', - true, - 'reqName', - 'slotName' - ); - expect(newAPIBExams).toEqual(expectedAPIBExams); -}); - -it('Opt out with new data', () => { - const oldAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optOut: { reqName: ['slotName1'] }, - }, - ]; - const expectedAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: {}, - optOut: { reqName: ['slotName1', 'slotName'] }, - }, - ]; - const newAPIBExams = addOverriddenFulfillmentAPIBUpdater( - oldAPIBExams, - 'AP Biology', - false, - 'reqName', - 'slotName' - ); - expect(newAPIBExams).toEqual(expectedAPIBExams); -}); - -it('Opt in with opt out data', () => { - const oldAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optOut: { reqName: ['slotName'] }, - }, - ]; - const expectedAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: { reqName: ['slotName'] }, - optOut: {}, - }, - ]; - const newAPIBExams = addOverriddenFulfillmentAPIBUpdater( - oldAPIBExams, - 'AP Biology', - true, - 'reqName', - 'slotName' - ); - expect(newAPIBExams).toEqual(expectedAPIBExams); -}); - -it('Opt out with opt in data', () => { - const oldAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: { reqName: ['slotName'] }, - }, - ]; - const expectedAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: {}, - optOut: { reqName: ['slotName'] }, - }, - ]; - const newAPIBExams = addOverriddenFulfillmentAPIBUpdater( - oldAPIBExams, - 'AP Biology', - false, - 'reqName', - 'slotName' - ); - expect(newAPIBExams).toEqual(expectedAPIBExams); -}); - -it('Opt in with opt in data', () => { - const oldAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: { reqName: ['slotName1'] }, - }, - ]; - const expectedAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: { reqName: ['slotName1', 'slotName'] }, - optOut: {}, - }, - ]; - const newAPIBExams = addOverriddenFulfillmentAPIBUpdater( - oldAPIBExams, - 'AP Biology', - true, - 'reqName', - 'slotName' - ); - expect(newAPIBExams).toEqual(expectedAPIBExams); -}); - -it('Opt out with opt out data', () => { - const oldAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optOut: { reqName: ['slotName1'] }, - }, - ]; - const expectedAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: {}, - optOut: { reqName: ['slotName1', 'slotName'] }, - }, - ]; - const newAPIBExams = addOverriddenFulfillmentAPIBUpdater( - oldAPIBExams, - 'AP Biology', - false, - 'reqName', - 'slotName' - ); - expect(newAPIBExams).toEqual(expectedAPIBExams); -}); - -it('Override with different reqName', () => { - const oldAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: { reqName1: ['slotName1'] }, - optOut: { reqName2: ['slotName2'] }, - }, - ]; - - let expectedAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: { reqName1: ['slotName1'], reqName: ['slotName'] }, - optOut: { reqName2: ['slotName2'] }, - }, - ]; - let newAPIBExams = addOverriddenFulfillmentAPIBUpdater( - oldAPIBExams, - 'AP Biology', - true, - 'reqName', - 'slotName' - ); - expect(newAPIBExams).toEqual(expectedAPIBExams); - - expectedAPIBExams = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: { reqName1: ['slotName1'] }, - optOut: { reqName2: ['slotName2'], reqName: ['slotName'] }, - }, - ]; - newAPIBExams = addOverriddenFulfillmentAPIBUpdater( - oldAPIBExams, - 'AP Biology', - false, - 'reqName', - 'slotName' - ); - expect(newAPIBExams).toEqual(expectedAPIBExams); -}); - -/** - * Tests for clearOverriddenFulfillmentsAPIBUpdater - */ -it('No exams to clear', () => { - const oldAPIBExams: FirestoreAPIBExam[] = []; - const newAPIBExams = clearOverriddenFulfillmentsAPIBUpdater(oldAPIBExams); - expect(newAPIBExams).toEqual(oldAPIBExams); -}); - -it('Exams are already cleared', () => { - const oldAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - }, - ]; - const expectedAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: {}, - optOut: {}, - }, - ]; - const newAPIBExams = clearOverriddenFulfillmentsAPIBUpdater(oldAPIBExams); - expect(newAPIBExams).toEqual(expectedAPIBExams); -}); - -it('Clear for one exam', () => { - const oldAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: { reqName: ['slotName'] }, - optOut: { reqName: ['slotName'] }, - }, - ]; - const expectedAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: {}, - optOut: {}, - }, - ]; - const newAPIBExams = clearOverriddenFulfillmentsAPIBUpdater(oldAPIBExams); - expect(newAPIBExams).toEqual(expectedAPIBExams); -}); - -it('Clear for multiple exams', () => { - const oldAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: { reqName: ['slotName'] }, - optOut: { reqName: ['slotName'] }, - }, - { - type: 'AP', - score: 5, - subject: 'Computer Science', - optIn: { reqName1: ['slotName1', 'slotName2'], reqName: ['slotName'] }, - optOut: { reqName1: ['slotName1', 'slotName2'], reqName: ['slotName'] }, - }, - ]; - const expectedAPIBExams: FirestoreAPIBExam[] = [ - { - type: 'AP', - score: 5, - subject: 'Biology', - optIn: {}, - optOut: {}, - }, - { - type: 'AP', - score: 5, - subject: 'Computer Science', - optIn: {}, - optOut: {}, - }, - ]; - const newAPIBExams = clearOverriddenFulfillmentsAPIBUpdater(oldAPIBExams); - expect(newAPIBExams).toEqual(expectedAPIBExams); -}); diff --git a/src/global-firestore-data/index.ts b/src/global-firestore-data/index.ts index 6f8813048..2b1a94c38 100644 --- a/src/global-firestore-data/index.ts +++ b/src/global-firestore-data/index.ts @@ -30,7 +30,3 @@ export { addCoursesToSelectableRequirements, deleteCourseFromSelectableRequirements, } from './selectable-requirement-choices'; -export { - addOverriddenFulfillmentAPIB, - clearOverriddenFulfillmentsAPIB, -} from './overridden-fulfillment-choices'; diff --git a/src/global-firestore-data/onboarding-data.ts b/src/global-firestore-data/onboarding-data.ts index 7b8dd278c..b0d141a7d 100644 --- a/src/global-firestore-data/onboarding-data.ts +++ b/src/global-firestore-data/onboarding-data.ts @@ -1,29 +1,19 @@ import { onboardingDataCollection } from '../firebase-frontend-config'; import store from '../store'; import setUsernameData from './username-data'; -import { clearOverriddenFulfillmentsAPIB } from './overridden-fulfillment-choices'; const setOnboardingData = (name: FirestoreUserName, onboarding: AppOnboardingData): void => { setUsernameData(name); - const oldCollege = store.state.onboardingData.college; - onboardingDataCollection - .doc(store.state.currentFirebaseUser.email) - .set({ - gradYear: onboarding.gradYear, - entranceYear: onboarding.entranceYear, - colleges: onboarding.college ? [{ acronym: onboarding.college }] : [], - majors: onboarding.major.map(acronym => ({ acronym })), - minors: onboarding.minor.map(acronym => ({ acronym })), - gradPrograms: onboarding.grad ? [{ acronym: onboarding.grad }] : [], - exam: onboarding.exam, - tookSwim: onboarding.tookSwim, - }) - .then(() => { - const newCollege = store.state.onboardingData.college; - if (oldCollege !== newCollege) { - clearOverriddenFulfillmentsAPIB(); - } - }); + onboardingDataCollection.doc(store.state.currentFirebaseUser.email).set({ + gradYear: onboarding.gradYear, + entranceYear: onboarding.entranceYear, + colleges: onboarding.college ? [{ acronym: onboarding.college }] : [], + majors: onboarding.major.map(acronym => ({ acronym })), + minors: onboarding.minor.map(acronym => ({ acronym })), + gradPrograms: onboarding.grad ? [{ acronym: onboarding.grad }] : [], + exam: onboarding.exam, + tookSwim: onboarding.tookSwim, + }); }; export default setOnboardingData; diff --git a/src/global-firestore-data/overridden-fulfillment-choices.ts b/src/global-firestore-data/overridden-fulfillment-choices.ts deleted file mode 100644 index 7fb716827..000000000 --- a/src/global-firestore-data/overridden-fulfillment-choices.ts +++ /dev/null @@ -1,74 +0,0 @@ -/** - * AP/IB override code temporarily uses the onboarding data collection - */ -import { onboardingDataCollection } from '../firebase-frontend-config'; -import store from '../store'; - -const editAPIBExams = ( - updater: (oldAPIBExams: readonly FirestoreAPIBExam[]) => readonly FirestoreAPIBExam[] -): void => { - const oldAPIBExams = store.state.onboardingData.exam; - const newAPIBExams = updater(oldAPIBExams); - onboardingDataCollection - .doc(store.state.currentFirebaseUser.email) - .update({ exam: newAPIBExams }); -}; - -// split and exposed for testing -export const addOverriddenFulfillmentAPIBUpdater = ( - oldAPIBExams: readonly FirestoreAPIBExam[], - examName: string, - optIn: boolean, - requirementName: string, - slotName: string -): readonly FirestoreAPIBExam[] => - oldAPIBExams.map(exam => { - if (`${exam.type} ${exam.subject}` === examName) { - const overriddenFulfillments = optIn ? { ...exam.optIn } : { ...exam.optOut }; - if (requirementName in overriddenFulfillments) { - if (overriddenFulfillments[requirementName].indexOf(slotName) === -1) { - overriddenFulfillments[requirementName] = [ - ...overriddenFulfillments[requirementName], - slotName, - ]; - } - } else { - overriddenFulfillments[requirementName] = [slotName]; - } - const otherOverriddenFulfillments = optIn ? { ...exam.optOut } : { ...exam.optIn }; - if (requirementName in otherOverriddenFulfillments) { - otherOverriddenFulfillments[requirementName] = otherOverriddenFulfillments[ - requirementName - ].filter(slot => slot !== slotName); - if (otherOverriddenFulfillments[requirementName].length === 0) { - delete otherOverriddenFulfillments[requirementName]; - } - } - return optIn - ? { ...exam, optIn: overriddenFulfillments, optOut: otherOverriddenFulfillments } - : { ...exam, optIn: otherOverriddenFulfillments, optOut: overriddenFulfillments }; - } - return exam; - }); - -export const addOverriddenFulfillmentAPIB = ( - examName: string, - optIn: boolean, - requirementName: string, - slotName: string -): void => - editAPIBExams(oldAPIBExams => - addOverriddenFulfillmentAPIBUpdater(oldAPIBExams, examName, optIn, requirementName, slotName) - ); - -// split and exposed for testing -export const clearOverriddenFulfillmentsAPIBUpdater = ( - oldAPIBExams: readonly FirestoreAPIBExam[] -): readonly FirestoreAPIBExam[] => - oldAPIBExams.map(exam => { - const { optIn, optOut, ...rest } = exam; - return { optIn: {}, optOut: {}, ...rest }; - }); - -export const clearOverriddenFulfillmentsAPIB = (): void => - editAPIBExams(oldAPIBExams => clearOverriddenFulfillmentsAPIBUpdater(oldAPIBExams)); diff --git a/src/user-data.d.ts b/src/user-data.d.ts index 7ceffab51..cd0bf2f1f 100644 --- a/src/user-data.d.ts +++ b/src/user-data.d.ts @@ -34,16 +34,10 @@ type FirestoreSemester = { }; type FirestoreCollegeOrMajorOrMinor = { readonly acronym: string }; -type FirestoreAPIBOverriddenFulfillments = { - // Values are slot names - readonly [requirementName: string]: readonly string[]; -}; type FirestoreAPIBExam = { readonly type: 'AP' | 'IB'; readonly score: number; readonly subject: string; - readonly optIn?: FirestoreAPIBOverriddenFulfillments; - readonly optOut?: FirestoreAPIBOverriddenFulfillments; }; /** Represents the name of an exam a student can take for transfer credit */