feat(client/curriclum): make C# live (#51354)

This commit is contained in:
Tom
2023-08-27 08:00:57 -05:00
committed by GitHub
parent f1ccccfee6
commit 4ed95973d2
35 changed files with 158 additions and 106 deletions

View File

@@ -41,7 +41,7 @@ const {
machineLearningPyV7Id,
relationalDatabaseV8Id,
collegeAlgebraPyV8Id,
foundationalCSharpId
foundationalCSharpV8Id
} = certIds;
const log = debug('fcc:certification');
@@ -134,8 +134,8 @@ function createCertTypeIds(allChallenges) {
collegeAlgebraPyV8Id,
allChallenges
),
[certTypes.foundationalCSharp]: getCertById(
foundationalCSharpId,
[certTypes.foundationalCSharpV8]: getCertById(
foundationalCSharpV8Id,
allChallenges
)
};
@@ -174,7 +174,8 @@ function sendCertifiedEmail(
isDataAnalysisPyCertV7,
isMachineLearningPyCertV7,
isRelationalDatabaseCertV8,
isCollegeAlgebraPyCertV8
isCollegeAlgebraPyCertV8,
isFoundationalCSharpCertV8
},
send$
) {
@@ -191,7 +192,8 @@ function sendCertifiedEmail(
!isDataAnalysisPyCertV7 ||
!isMachineLearningPyCertV7 ||
!isRelationalDatabaseCertV8 ||
!isCollegeAlgebraPyCertV8
!isCollegeAlgebraPyCertV8 ||
!isFoundationalCSharpCertV8
) {
return Observable.just(false);
}

View File

@@ -366,6 +366,7 @@ function postResetProgress(req, res, next) {
isMachineLearningPyCertV7: false,
isRelationalDatabaseCertV8: false,
isCollegeAlgebraPyCertV8: false,
isFoundationalCSharpCertV8: false,
completedChallenges: [],
completedExams: [],
savedChallenges: [],

View File

@@ -15,5 +15,6 @@
"machineLearningPyV7": "isMachineLearningPyCertV7",
"fullStack": "isFullStackCert",
"relationalDatabaseV8": "isRelationalDatabaseV8",
"collegeAlgebraPyV8": "isCollegeAlgebraPyCertV8"
"collegeAlgebraPyV8": "isCollegeAlgebraPyCertV8",
"foundationalCSharpV8": "isFoundationalCSharpCertV8"
}

View File

@@ -747,7 +747,6 @@ const allStandardCerts = [
}
]
},
// Upcoming Certifications
{
id: '647e3159823e0ef219c7359b',
title: 'Foundational C# with Microsoft',
@@ -761,6 +760,7 @@ const allStandardCerts = [
}
]
},
// Upcoming Certifications
{
id: '64514fda6c245de4d11eb7bb',
title: 'Example Certification',

View File

@@ -1017,7 +1017,7 @@
}
},
"foundational-c-sharp-with-microsoft": {
"title": "Foundational C# with Microsoft",
"title": "(New) Foundational C# with Microsoft",
"intro": [
"This course offers a comprehensive introduction to C# programming, covering its core concepts, syntax, and practical application in software development.",
"Through hands-on exercises and projects, you will learn the fundamentals of C#, including variables, data types, control structures, and object-oriented programming principles.",

View File

@@ -116,6 +116,9 @@
}
},
"certification-heading": "Earn free verified certifications in:",
"core-certs-heading": "Earn free verified certifications with freeCodeCamp's core curriculum:",
"professional-certs-heading": "Earn free professional certifications:",
"interview-prep-heading": "Prepare for the developer interview job search:",
"faq": "Frequently asked questions:",
"faqs": [
{

View File

@@ -303,7 +303,7 @@ const ShowCertification = (props: ShowCertificationProps): JSX.Element => {
);
const isMicrosoftCert =
certTitle === certTypeTitleMap[certTypes.foundationalCSharp];
certTitle === certTypeTitleMap[certTypes.foundationalCSharpV8];
return (
<Container className='certificate-outer-wrapper'>

View File

@@ -213,6 +213,7 @@ export function ShowSettings(props: ShowSettingsProps): JSX.Element {
isDataAnalysisPyCertV7={isDataAnalysisPyCertV7}
isDataVisCert={isDataVisCert}
isCollegeAlgebraPyCertV8={isCollegeAlgebraPyCertV8}
isFoundationalCSharpCertV8={isFoundationalCSharpCertV8}
isFrontEndCert={isFrontEndCert}
isFrontEndLibsCert={isFrontEndLibsCert}
isFullStackCert={isFullStackCert}
@@ -225,7 +226,6 @@ export function ShowSettings(props: ShowSettingsProps): JSX.Element {
isRelationalDatabaseCertV8={isRelationalDatabaseCertV8}
isRespWebDesignCert={isRespWebDesignCert}
isSciCompPyCertV7={isSciCompPyCertV7}
isFoundationalCSharpCertV8={isFoundationalCSharpCertV8}
username={username}
verifyCert={verifyCert}
/>

View File

@@ -1,10 +1,12 @@
import i18next from 'i18next';
import React from 'react';
import { useTranslation } from 'react-i18next';
import {
SuperBlockStages,
SuperBlocks,
createFlatSuperBlockMap,
getFirstNotAuditedSuperBlock
getFirstNotAuditedSuperBlock,
superBlockOrder
} from '../../../../config/superblocks';
import { generateIconComponent } from '../../assets/icons';
import LinkButton from '../../assets/icons/link-button';
@@ -29,16 +31,18 @@ const linkSpacingStyle = {
gap: '15px'
};
const flatSuperBlockMap = createFlatSuperBlockMap({
showNewCurriculum,
showUpcomingChanges
});
const firstNotAuditedSuperBlock = getFirstNotAuditedSuperBlock({
language: curriculumLocale,
showNewCurriculum,
showUpcomingChanges
});
const coreCurriculum = [
...superBlockOrder[SuperBlockStages.FrontEnd],
...superBlockOrder[SuperBlockStages.Backend],
...superBlockOrder[SuperBlockStages.Python]
];
function MapLi({
superBlock,
landing = false
@@ -81,10 +85,33 @@ function MapLi({
}
function Map({ forLanding = false }: MapProps): React.ReactElement {
const { t } = useTranslation();
return (
<div className='map-ui' data-test-label='curriculum-map'>
<h1 className={forLanding ? 'big-heading' : ''}>
{t('landing.core-certs-heading')}
</h1>
<ul>
{flatSuperBlockMap.map((superBlock, i) => (
{coreCurriculum.map((superBlock, i) => (
<MapLi key={i} superBlock={superBlock} landing={forLanding} />
))}
</ul>
<Spacer size='medium' />
<h1 className={forLanding ? 'big-heading' : ''}>
{t('landing.professional-certs-heading')}
</h1>
<ul>
{superBlockOrder[SuperBlockStages.Professional].map((superBlock, i) => (
<MapLi key={i} superBlock={superBlock} landing={forLanding} />
))}
</ul>
<Spacer size='medium' />
<h1 className={forLanding ? 'big-heading' : ''}>
{t('landing.interview-prep-heading')}
</h1>
<ul>
{superBlockOrder[SuperBlockStages.Extra].map((superBlock, i) => (
<MapLi key={i} superBlock={superBlock} landing={forLanding} />
))}
</ul>

View File

@@ -1,13 +1,10 @@
import { Col } from '@freecodecamp/react-bootstrap';
import React from 'react';
import { useTranslation } from 'react-i18next';
import Map from '../../Map/index';
import { Spacer } from '../../helpers';
import BigCallToAction from './big-call-to-action';
const Certifications = (): JSX.Element => {
const { t } = useTranslation();
return (
<Col
className='certification-section'
@@ -17,7 +14,6 @@ const Certifications = (): JSX.Element => {
smOffset={1}
xs={12}
>
<h1 className='big-heading'>{t('landing.certification-heading')}</h1>
<Map forLanding={true} />
<Spacer size='medium' />
<BigCallToAction />

View File

@@ -66,7 +66,8 @@ const userProps = {
isDataAnalysisPyCertV7: true,
isMachineLearningPyCertV7: true,
isRelationalDatabaseCertV8: true,
isCollegeAlgebraPyCertV8: true
isCollegeAlgebraPyCertV8: true,
isFoundationalCSharpVertV8: true
},
// eslint-disable-next-line @typescript-eslint/no-empty-function
navigate: () => {}

View File

@@ -276,6 +276,7 @@ const defaultTestProps = {
isMachineLearningPyCertV7: false,
isRelationalDatabaseCertV8: false,
isCollegeAlgebraPyCertV8: false,
isFoundationalCSharpCertV8: false,
username: 'developmentuser',
verifyCert: verifyCert,
isEmailVerified: false

View File

@@ -122,11 +122,11 @@ const isCertMapSelector = createSelector(
'Machine Learning with Python': isMachineLearningPyCertV7,
'Relational Database': isRelationalDatabaseCertV8,
'College Algebra with Python': isCollegeAlgebraPyCertV8,
'Foundational C# with Microsoft': isFoundationalCSharpCertV8,
'Legacy Front End': isFrontEndCert,
'Legacy Data Visualization': isDataVisCert,
'Legacy Back End': isBackEndCert,
'Legacy Information Security and Quality Assurance': isInfosecQaCert,
'Foundational C# with Microsoft': isFoundationalCSharpCertV8,
// TODO: remove Example Certification? Also, include Upcoming Python
// Certification.
'Example Certification': false,

View File

@@ -125,14 +125,15 @@
.certification-namespace .dual-logo svg {
max-width: 70%;
height: auto;
}
.certification-namespace .fcc-logo svg {
max-width: 350px;
width: 350px;
}
.certification-namespace .ms-logo svg {
max-width: 300px;
width: 300px;
}
.certification-namespace .information {

View File

@@ -317,26 +317,38 @@ export const reducer = handleActions(
submittedchallenges = submittedChallenge.challArray;
}
const { appUsername } = state;
return {
...state,
completionCount: state.completionCount + 1,
user: {
...state.user,
[appUsername]: {
...state.user[appUsername],
completedChallenges: uniqBy(
[
...submittedchallenges,
...state.user[appUsername].completedChallenges
],
'id'
),
savedChallenges:
savedChallenges ?? savedChallengesSelector(state[MainApp]),
examResults
return examResults && !examResults.passed
? {
...state,
user: {
...state.user,
[appUsername]: {
...state.user[appUsername],
examResults
}
}
}
}
};
: {
...state,
completionCount: state.completionCount + 1,
user: {
...state.user,
[appUsername]: {
...state.user[appUsername],
completedChallenges: uniqBy(
[
...submittedchallenges,
...state.user[appUsername].completedChallenges
],
'id'
),
savedChallenges:
savedChallenges ?? savedChallengesSelector(state[MainApp]),
examResults
}
}
};
},
[actionTypes.setMsUsername]: (state, { payload }) => {
const { appUsername } = state;

View File

@@ -253,6 +253,7 @@ export type ClaimedCertifications = {
isDataVisCert: boolean;
isEmailVerified: boolean;
isCollegeAlgebraPyCertV8: boolean;
isFoundationalCSharpCertV8: boolean;
isFrontEndCert: boolean;
isFrontEndLibsCert: boolean;
isFullStackCert: boolean;
@@ -265,7 +266,6 @@ export type ClaimedCertifications = {
isSciCompPyCertV7: boolean;
isDataAnalysisPyCertV7: boolean;
isMachineLearningPyCertV7: boolean;
isFoundationalCSharpCertV8: boolean;
};
type SavedChallenges = SavedChallenge[];

View File

@@ -124,7 +124,8 @@ export const certificatesByNameSelector = username => state => {
isDataAnalysisPyCertV7,
isMachineLearningPyCertV7,
isRelationalDatabaseCertV8,
isCollegeAlgebraPyCertV8
isCollegeAlgebraPyCertV8,
isFoundationalCSharpCertV8
} = userByNameSelector(username)(state);
return {
hasModernCert:
@@ -140,7 +141,8 @@ export const certificatesByNameSelector = username => state => {
isDataAnalysisPyCertV7 ||
isMachineLearningPyCertV7 ||
isRelationalDatabaseCertV8 ||
isCollegeAlgebraPyCertV8,
isCollegeAlgebraPyCertV8 ||
isFoundationalCSharpCertV8,
hasLegacyCert:
isFrontEndCert || isBackEndCert || isDataVisCert || isInfosecQaCert,
isFullStackCert,
@@ -204,6 +206,11 @@ export const certificatesByNameSelector = username => state => {
show: isCollegeAlgebraPyCertV8,
title: 'College Algebra with Python Certification',
certSlug: Certification.CollegeAlgebraPy
},
{
show: isFoundationalCSharpCertV8,
title: 'Foundational C# with Microsoft Certification',
certSlug: Certification.FoundationalCSharp
}
],
legacyCerts: [

View File

@@ -24,8 +24,8 @@ export enum Certification {
InfoSec = 'information-security-v7',
MachineLearningPy = 'machine-learning-with-python-v7',
CollegeAlgebraPy = 'college-algebra-with-python-v8',
// Upcoming certifications
FoundationalCSharp = 'foundational-c-sharp-with-microsoft',
// Upcoming certifications
UpcomingPython = 'upcoming-python-v8',
// Legacy certifications
LegacyFrontEnd = 'legacy-front-end',
@@ -49,7 +49,8 @@ export const currentCertifications = [
Certification.DataAnalysisPy,
Certification.InfoSec,
Certification.MachineLearningPy,
Certification.CollegeAlgebraPy
Certification.CollegeAlgebraPy,
Certification.FoundationalCSharp
] as const;
// "Legacy" certifications are another class of standard certifications. They're
@@ -63,10 +64,7 @@ export const legacyCertifications = [
// "Upcoming" certifications are standard certifications that are not live unless
// showUpcomingChanges is true.
export const upcomingCertifications = [
Certification.UpcomingPython,
Certification.FoundationalCSharp
] as const;
export const upcomingCertifications = [Certification.UpcomingPython] as const;
export const certTypes = {
frontEnd: 'isFrontEndCert',
@@ -86,7 +84,7 @@ export const certTypes = {
fullStack: 'isFullStackCert',
relationalDatabaseV8: 'isRelationalDatabaseCertV8',
collegeAlgebraPyV8: 'isCollegeAlgebraPyCertV8',
foundationalCSharp: 'isFoundationalCSharpCertV8'
foundationalCSharpV8: 'isFoundationalCSharpCertV8'
} as const;
export const certIds = {
@@ -107,7 +105,7 @@ export const certIds = {
machineLearningPyV7Id: '5e46fc95ac417301a38fb935',
relationalDatabaseV8Id: '606243f50267e718b1e755f4',
collegeAlgebraPyV8Id: '61531b20cc9dfa2741a5b800',
foundationalCSharpId: '647f7da207d29547b3bee1ba'
foundationalCSharpV8Id: '647f7da207d29547b3bee1ba'
};
export const completionHours = {
@@ -128,7 +126,7 @@ export const completionHours = {
[certTypes.machineLearningPyV7]: 300,
[certTypes.relationalDatabaseV8]: 300,
[certTypes.collegeAlgebraPyV8]: 300,
[certTypes.foundationalCSharp]: 300
[certTypes.foundationalCSharpV8]: 300
};
export const certSlugTypeMap = {
@@ -152,7 +150,7 @@ export const certSlugTypeMap = {
[Certification.MachineLearningPy]: certTypes.machineLearningPyV7,
[Certification.RelationalDb]: certTypes.relationalDatabaseV8,
[Certification.CollegeAlgebraPy]: certTypes.collegeAlgebraPyV8,
[Certification.FoundationalCSharp]: certTypes.foundationalCSharp
[Certification.FoundationalCSharp]: certTypes.foundationalCSharpV8
};
export const superBlockCertTypeMap = {
@@ -176,7 +174,7 @@ export const superBlockCertTypeMap = {
[SuperBlocks.MachineLearningPy]: certTypes.machineLearningPyV7,
[SuperBlocks.RelationalDb]: certTypes.relationalDatabaseV8,
[SuperBlocks.CollegeAlgebraPy]: certTypes.collegeAlgebraPyV8,
[SuperBlocks.FoundationalCSharp]: certTypes.foundationalCSharp,
[SuperBlocks.FoundationalCSharp]: certTypes.foundationalCSharpV8,
// post-modern
// TODO: use enum
@@ -202,7 +200,7 @@ export const certTypeIdMap = {
[certTypes.machineLearningPyV7]: certIds.machineLearningPyV7Id,
[certTypes.relationalDatabaseV8]: certIds.relationalDatabaseV8Id,
[certTypes.collegeAlgebraPyV8]: certIds.collegeAlgebraPyV8Id,
[certTypes.foundationalCSharp]: certIds.foundationalCSharpId
[certTypes.foundationalCSharpV8]: certIds.foundationalCSharpV8Id
};
export const certTypeTitleMap = {
@@ -223,7 +221,7 @@ export const certTypeTitleMap = {
[certTypes.machineLearningPyV7]: 'Machine Learning with Python',
[certTypes.relationalDatabaseV8]: 'Relational Database',
[certTypes.collegeAlgebraPyV8]: 'College Algebra with Python',
[certTypes.foundationalCSharp]: 'Foundational C# with Microsoft'
[certTypes.foundationalCSharpV8]: 'Foundational C# with Microsoft'
};
export const oldDataVizId = '561add10cb82ac38a17513b3';

View File

@@ -35,6 +35,7 @@ export enum SuperBlockStages {
FrontEnd,
Backend,
Python,
Professional,
Extra,
Legacy,
New,
@@ -66,6 +67,7 @@ export const superBlockOrder: SuperBlockOrder = {
SuperBlocks.MachineLearningPy,
SuperBlocks.CollegeAlgebraPy
],
[SuperBlockStages.Professional]: [SuperBlocks.FoundationalCSharp],
[SuperBlockStages.Extra]: [
SuperBlocks.CodingInterviewPrep,
SuperBlocks.ProjectEuler
@@ -75,7 +77,6 @@ export const superBlockOrder: SuperBlockOrder = {
[SuperBlockStages.Upcoming]: [
SuperBlocks.JsAlgoDataStructNew,
SuperBlocks.TheOdinProject,
SuperBlocks.FoundationalCSharp,
SuperBlocks.ExampleCertification,
SuperBlocks.UpcomingPython
]
@@ -95,55 +96,55 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy,
SuperBlocks.CollegeAlgebraPy,
SuperBlocks.FoundationalCSharp,
SuperBlocks.CodingInterviewPrep,
SuperBlocks.ProjectEuler,
SuperBlocks.JsAlgoDataStructNew,
SuperBlocks.TheOdinProject,
SuperBlocks.FoundationalCSharp,
SuperBlocks.UpcomingPython
],
[Languages.Chinese]: [
SuperBlocks.CollegeAlgebraPy,
SuperBlocks.FoundationalCSharp,
SuperBlocks.CodingInterviewPrep,
SuperBlocks.ProjectEuler,
SuperBlocks.JsAlgoDataStructNew,
SuperBlocks.TheOdinProject,
SuperBlocks.FoundationalCSharp,
SuperBlocks.UpcomingPython
],
[Languages.ChineseTraditional]: [
SuperBlocks.CollegeAlgebraPy,
SuperBlocks.FoundationalCSharp,
SuperBlocks.CodingInterviewPrep,
SuperBlocks.ProjectEuler,
SuperBlocks.JsAlgoDataStructNew,
SuperBlocks.TheOdinProject,
SuperBlocks.FoundationalCSharp,
SuperBlocks.UpcomingPython
],
[Languages.Italian]: [
SuperBlocks.FoundationalCSharp,
SuperBlocks.JsAlgoDataStructNew,
SuperBlocks.TheOdinProject,
SuperBlocks.FoundationalCSharp,
SuperBlocks.UpcomingPython
],
[Languages.Portuguese]: [
SuperBlocks.JsAlgoDataStructNew,
SuperBlocks.FoundationalCSharp,
SuperBlocks.JsAlgoDataStructNew,
SuperBlocks.UpcomingPython
],
[Languages.Ukrainian]: [
SuperBlocks.FoundationalCSharp,
SuperBlocks.CodingInterviewPrep,
SuperBlocks.ProjectEuler,
SuperBlocks.JsAlgoDataStructNew,
SuperBlocks.FoundationalCSharp,
SuperBlocks.UpcomingPython
],
[Languages.Japanese]: [
SuperBlocks.CollegeAlgebraPy,
SuperBlocks.FoundationalCSharp,
SuperBlocks.ProjectEuler,
SuperBlocks.JsAlgoDataStructNew,
SuperBlocks.TheOdinProject,
SuperBlocks.FoundationalCSharp,
SuperBlocks.UpcomingPython
],
[Languages.German]: [
@@ -157,11 +158,11 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy,
SuperBlocks.CollegeAlgebraPy,
SuperBlocks.FoundationalCSharp,
SuperBlocks.CodingInterviewPrep,
SuperBlocks.ProjectEuler,
SuperBlocks.JsAlgoDataStructNew,
SuperBlocks.TheOdinProject,
SuperBlocks.FoundationalCSharp,
SuperBlocks.UpcomingPython
],
[Languages.Arabic]: [
@@ -174,11 +175,11 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy,
SuperBlocks.CollegeAlgebraPy,
SuperBlocks.FoundationalCSharp,
SuperBlocks.CodingInterviewPrep,
SuperBlocks.ProjectEuler,
SuperBlocks.JsAlgoDataStructNew,
SuperBlocks.TheOdinProject,
SuperBlocks.FoundationalCSharp,
SuperBlocks.UpcomingPython
],
[Languages.Swahili]: [
@@ -191,10 +192,10 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy,
SuperBlocks.CollegeAlgebraPy,
SuperBlocks.FoundationalCSharp,
SuperBlocks.CodingInterviewPrep,
SuperBlocks.ProjectEuler,
SuperBlocks.TheOdinProject,
SuperBlocks.FoundationalCSharp,
SuperBlocks.RespWebDesign,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.JsAlgoDataStructNew,

View File

@@ -1,6 +1,6 @@
{
"name": "Add Logic to C# Console Applications",
"isUpcomingChange": true,
"isUpcomingChange": false,
"dashedName": "add-logic-to-c-sharp-console-applications",
"helpCategory": "HTML-CSS",
"order": 2,

View File

@@ -1,6 +1,6 @@
{
"name": "Create and Run Simple C# Console Applications",
"isUpcomingChange": true,
"isUpcomingChange": false,
"dashedName": "create-and-run-simple-c-sharp-console-applications",
"helpCategory": "HTML-CSS",
"order": 1,

View File

@@ -1,6 +1,6 @@
{
"name": "Create Methods in C# Console Applications",
"isUpcomingChange": true,
"isUpcomingChange": false,
"dashedName": "create-methods-in-c-sharp-console-applications",
"helpCategory": "HTML-CSS",
"order": 4,

View File

@@ -1,6 +1,6 @@
{
"name": "Debug C# Console Applications",
"isUpcomingChange": true,
"isUpcomingChange": false,
"dashedName": "debug-c-sharp-console-applications",
"helpCategory": "HTML-CSS",
"order": 5,

View File

@@ -1,6 +1,6 @@
{
"name": "Foundational C# with Microsoft Certification Exam",
"isUpcomingChange": true,
"isUpcomingChange": false,
"dashedName": "foundational-c-sharp-with-microsoft-certification-exam",
"helpCategory": "HTML-CSS",
"order": 6,

View File

@@ -1,6 +1,6 @@
{
"name": "Work with Variable Data in C# Console Applications",
"isUpcomingChange": true,
"isUpcomingChange": false,
"dashedName": "work-with-variable-data-in-c-sharp-console-applications",
"helpCategory": "HTML-CSS",
"order": 3,

View File

@@ -1,6 +1,6 @@
{
"name": "Write Your First Code Using C#",
"isUpcomingChange": true,
"isUpcomingChange": false,
"dashedName": "write-your-first-code-using-c-sharp",
"helpCategory": "HTML-CSS",
"order": 0,

View File

@@ -22,12 +22,12 @@ const mockSuperBlocks = [
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy,
SuperBlocks.CollegeAlgebraPy,
SuperBlocks.FoundationalCSharp,
SuperBlocks.CodingInterviewPrep,
SuperBlocks.ProjectEuler,
SuperBlocks.RespWebDesign,
SuperBlocks.JsAlgoDataStructNew,
SuperBlocks.TheOdinProject,
SuperBlocks.FoundationalCSharp,
SuperBlocks.ExampleCertification
];
@@ -44,12 +44,12 @@ const fullSuperOrder = {
[SuperBlocks.InfoSec]: 9,
[SuperBlocks.MachineLearningPy]: 10,
[SuperBlocks.CollegeAlgebraPy]: 11,
[SuperBlocks.CodingInterviewPrep]: 12,
[SuperBlocks.ProjectEuler]: 13,
[SuperBlocks.RespWebDesign]: 14,
[SuperBlocks.JsAlgoDataStructNew]: 15,
[SuperBlocks.TheOdinProject]: 16,
[SuperBlocks.FoundationalCSharp]: 17,
[SuperBlocks.FoundationalCSharp]: 12,
[SuperBlocks.CodingInterviewPrep]: 13,
[SuperBlocks.ProjectEuler]: 14,
[SuperBlocks.RespWebDesign]: 15,
[SuperBlocks.JsAlgoDataStructNew]: 16,
[SuperBlocks.TheOdinProject]: 17,
[SuperBlocks.ExampleCertification]: 18
};
@@ -93,11 +93,11 @@ describe('getSuperOrder', () => {
process.env.SHOW_NEW_CURRICULUM !== 'true' &&
process.env.SHOW_UPCOMING_CHANGES !== 'true'
) {
expect.assertions(15);
expect.assertions(16);
} else if (process.env.SHOW_NEW_CURRICULUM !== 'true') {
expect.assertions(15);
expect.assertions(16);
} else if (process.env.SHOW_UPCOMING_CHANGES !== 'true') {
expect.assertions(15);
expect.assertions(16);
} else {
expect.assertions(19);
}
@@ -114,24 +114,23 @@ describe('getSuperOrder', () => {
expect(getSuperOrder(SuperBlocks.InfoSec)).toBe(9);
expect(getSuperOrder(SuperBlocks.MachineLearningPy)).toBe(10);
expect(getSuperOrder(SuperBlocks.CollegeAlgebraPy)).toBe(11);
expect(getSuperOrder(SuperBlocks.CodingInterviewPrep)).toBe(12);
expect(getSuperOrder(SuperBlocks.ProjectEuler)).toBe(13);
expect(getSuperOrder(SuperBlocks.RespWebDesign)).toBe(14);
expect(getSuperOrder(SuperBlocks.FoundationalCSharp)).toBe(12);
expect(getSuperOrder(SuperBlocks.CodingInterviewPrep)).toBe(13);
expect(getSuperOrder(SuperBlocks.ProjectEuler)).toBe(14);
expect(getSuperOrder(SuperBlocks.RespWebDesign)).toBe(15);
if (
process.env.SHOW_NEW_CURRICULUM === 'true' &&
process.env.SHOW_UPCOMING_CHANGES === 'true'
) {
expect(getSuperOrder(SuperBlocks.JsAlgoDataStructNew)).toBe(15);
expect(getSuperOrder(SuperBlocks.TheOdinProject)).toBe(16);
expect(getSuperOrder(SuperBlocks.FoundationalCSharp)).toBe(17);
expect(getSuperOrder(SuperBlocks.JsAlgoDataStructNew)).toBe(16);
expect(getSuperOrder(SuperBlocks.TheOdinProject)).toBe(17);
expect(getSuperOrder(SuperBlocks.ExampleCertification)).toBe(18);
} else if (process.env.SHOW_NEW_CURRICULUM === 'true') {
return;
} else if (process.env.SHOW_UPCOMING_CHANGES === 'true') {
expect(getSuperOrder(SuperBlocks.JsAlgoDataStructNew)).toBe(15);
expect(getSuperOrder(SuperBlocks.TheOdinProject)).toBe(16);
expect(getSuperOrder(SuperBlocks.FoundationalCSharp)).toBe(17);
expect(getSuperOrder(SuperBlocks.JsAlgoDataStructNew)).toBe(16);
expect(getSuperOrder(SuperBlocks.TheOdinProject)).toBe(17);
expect(getSuperOrder(SuperBlocks.ExampleCertification)).toBe(18);
}
});

View File

@@ -25,9 +25,9 @@ const superBlocks = [
'Information Security',
'Machine Learning with Python',
'College Algebra with Python',
'(New) Foundational C# with Microsoft',
'Coding Interview Prep',
'Project Euler',
'Legacy Responsive Web Design'
'Project Euler'
];
describe('Landing page', () => {

View File

@@ -19,9 +19,9 @@ const superBlockNames = [
'Information Security Certification',
'Machine Learning with Python Certification',
'College Algebra with Python Certification',
'(New) Foundational C# with Microsoft Certification',
'Coding Interview Prep',
'Project Euler',
'Legacy Responsive Web Design Challenges'
'Project Euler'
];
describe('Learn Landing page (not logged in)', () => {

View File

@@ -10,7 +10,7 @@ describe('Settings certifications area', () => {
it('Should render the default settings page', () => {
cy.visit('/settings/');
cy.findAllByText('Claim Certification').should($btns => {
expect($btns).to.have.length(17);
expect($btns).to.have.length(18);
});
cy.findByText('Show Certification').should('not.exist');
cy.contains(`I agree to freeCodeCamp's Academic Honesty Policy.`);

View File

@@ -14,7 +14,7 @@ describe('Public profile certifications', () => {
// The following line is only required if you want to test it in development
//cy.contains('Preview custom 404 page').click();
cy.get('[data-cy=claimed-certification]').should('have.length', 17);
cy.get('[data-cy=claimed-certification]').should('have.length', 18);
});
it('Should show claimed certifications if the username includes uppercase characters', () => {
@@ -32,7 +32,7 @@ describe('Public profile certifications', () => {
// The following line is only required if you want to test it in development
//cy.contains('Preview custom 404 page').click();
cy.get('[data-cy=claimed-certification]').should('have.length', 17);
cy.get('[data-cy=claimed-certification]').should('have.length', 18);
});
});

View File

@@ -159,6 +159,7 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy,
SuperBlocks.CollegeAlgebraPy,
SuperBlocks.FoundationalCSharp,
SuperBlocks.CodingInterviewPrep,
SuperBlocks.ProjectEuler,
SuperBlocks.JsAlgoDataStructNew,

View File

@@ -25,6 +25,7 @@ const superBlocks = [
'Information Security',
'Machine Learning with Python',
'College Algebra with Python',
'Foundational C# with Microsoft',
'Coding Interview Prep',
'Project Euler',
'Legacy Responsive Web Design'

View File

@@ -68,7 +68,7 @@ export const superBlockList = [
path: '18-project-euler'
},
{
name: 'Foundational C# with Microsoft',
name: '(New) Foundational C# with Microsoft',
path: '19-foundational-c-sharp-with-microsoft'
},
{

View File

@@ -90,8 +90,8 @@ if (envData.clientLocale == 'english' && !envData.showUpcomingChanges) {
const isUpcoming = [
'2022/javascript-algorithms-and-data-structures',
'college-algebra-with-python',
'the-odin-project',
'foundational-c-sharp-with-microsoft',
'the-odin-project',
'upcoming-python',
'example-certification'
];