diff --git a/README.md b/README.md
index daf467e014..58d167ab85 100644
--- a/README.md
+++ b/README.md
@@ -107,11 +107,12 @@ Once you have earned all 6 of these certifications, you'll be able to claim your
#### Legacy Certifications
-We also have 3 legacy certifications from our 2015 curriculum, which are still available. All of the required projects for these legacy certifications will remain available on freeCodeCamp.org.
+We also have 4 legacy certifications dating back to our 2015 curriculum, which are still available. All of the required projects for these legacy certifications will remain available on freeCodeCamp.org.
- Legacy Front End Development Certification
- Legacy Data Visualization Certification
- Legacy Back End Development Certification
+- Legacy Information Security and Quality Assurance Certification
### The Learning Platform
diff --git a/api-server/common/utils/legacyProjectData.js b/api-server/common/utils/legacyProjectData.js
index 0d7d77dd93..17c84c58bc 100644
--- a/api-server/common/utils/legacyProjectData.js
+++ b/api-server/common/utils/legacyProjectData.js
@@ -79,10 +79,28 @@ const legacyDataVisProjects = {
superBlock: 'legacy-data-visualization'
};
+const legacyInfosecQaProjects = {
+ challenges: [
+ // metric-imperial-converter
+ '587d8249367417b2b2512c41',
+ // issue-tracker
+ '587d8249367417b2b2512c42',
+ // personal-library
+ '587d824a367417b2b2512c43',
+ // stock-price-checker
+ '587d824a367417b2b2512c44',
+ // anonymous-message-board
+ '587d824a367417b2b2512c45'
+ ],
+ title: 'Legacy Information Security and Quality Assurance Projects',
+ superBlock: 'legacy-information-security-and-quality-assurance'
+};
+
const legacyProjects = [
legacyFrontEndProjects,
legacyBackEndProjects,
- legacyDataVisProjects
+ legacyDataVisProjects,
+ legacyInfosecQaProjects
];
export default legacyProjects;
diff --git a/api-server/server/boot/certificate.js b/api-server/server/boot/certificate.js
index 5c722cf0b3..af0965bd87 100644
--- a/api-server/server/boot/certificate.js
+++ b/api-server/server/boot/certificate.js
@@ -13,12 +13,12 @@ import {
legacyFrontEndChallengeId,
legacyBackEndChallengeId,
legacyDataVisId,
+ legacyInfosecQaId,
respWebDesignId,
frontEndLibsId,
jsAlgoDataStructId,
dataVis2018Id,
apisMicroservicesId,
- infosecQaId,
infosecId,
qaId,
fullStackId,
@@ -98,6 +98,7 @@ function createCertTypeIds(app) {
[certTypes.frontEnd]: getIdsForCert$(legacyFrontEndChallengeId, Challenge),
[certTypes.backEnd]: getIdsForCert$(legacyBackEndChallengeId, Challenge),
[certTypes.dataVis]: getIdsForCert$(legacyDataVisId, Challenge),
+ [certTypes.infosecQa]: getIdsForCert$(legacyInfosecQaId, Challenge),
// modern
[certTypes.respWebDesign]: getIdsForCert$(respWebDesignId, Challenge),
@@ -108,7 +109,6 @@ function createCertTypeIds(app) {
apisMicroservicesId,
Challenge
),
- [certTypes.infosecQa]: getIdsForCert$(infosecQaId, Challenge),
[certTypes.qa]: getIdsForCert$(qaId, Challenge),
[certTypes.infosec]: getIdsForCert$(infosecId, Challenge),
[certTypes.fullStack]: getIdsForCert$(fullStackId, Challenge),
@@ -131,12 +131,12 @@ const certIds = {
[certTypes.frontEnd]: legacyFrontEndChallengeId,
[certTypes.backEnd]: legacyBackEndChallengeId,
[certTypes.dataVis]: legacyDataVisId,
+ [certTypes.infosecQa]: legacyInfosecQaId,
[certTypes.respWebDesign]: respWebDesignId,
[certTypes.frontEndLibs]: frontEndLibsId,
[certTypes.jsAlgoDataStruct]: jsAlgoDataStructId,
[certTypes.dataVis2018]: dataVis2018Id,
[certTypes.apisMicroservices]: apisMicroservicesId,
- [certTypes.infosecQa]: infosecQaId,
[certTypes.qa]: qaId,
[certTypes.infosec]: infosecId,
[certTypes.fullStack]: fullStackId,
@@ -149,13 +149,13 @@ const certText = {
[certTypes.frontEnd]: 'Legacy Front End',
[certTypes.backEnd]: 'Legacy Back End',
[certTypes.dataVis]: 'Legacy Data Visualization',
+ [certTypes.infosecQa]: 'Legacy Information Security and Quality Assurance',
[certTypes.fullStack]: 'Full Stack',
[certTypes.respWebDesign]: 'Responsive Web Design',
[certTypes.frontEndLibs]: 'Front End Libraries',
[certTypes.jsAlgoDataStruct]: 'JavaScript Algorithms and Data Structures',
[certTypes.dataVis2018]: 'Data Visualization',
[certTypes.apisMicroservices]: 'APIs and Microservices',
- [certTypes.infosecQa]: 'Information Security and Quality Assurance',
[certTypes.qa]: 'Quality Assurance',
[certTypes.infosec]: 'Information Security',
[certTypes.sciCompPy]: 'Scientific Computing with Python',
@@ -167,13 +167,13 @@ const completionHours = {
[certTypes.frontEnd]: 400,
[certTypes.backEnd]: 400,
[certTypes.dataVis]: 400,
+ [certTypes.infosecQa]: 300,
[certTypes.fullStack]: 1800,
[certTypes.respWebDesign]: 300,
[certTypes.frontEndLibs]: 300,
[certTypes.jsAlgoDataStruct]: 300,
[certTypes.dataVis2018]: 300,
[certTypes.apisMicroservices]: 300,
- [certTypes.infosecQa]: 300,
[certTypes.qa]: 300,
[certTypes.infosec]: 300,
[certTypes.sciCompPy]: 400,
@@ -202,7 +202,6 @@ function sendCertifiedEmail(
isJsAlgoDataStructCert,
isDataVisCert,
isApisMicroservicesCert,
- isInfosecQaCert,
isQaCert,
isInfosecCert,
isSciCompPyCert,
@@ -218,7 +217,6 @@ function sendCertifiedEmail(
!isJsAlgoDataStructCert ||
!isDataVisCert ||
!isApisMicroservicesCert ||
- !isInfosecQaCert ||
!isQaCert ||
!isInfosecCert ||
!isSciCompPyCert ||
diff --git a/api-server/server/utils/constantStrings.json b/api-server/server/utils/constantStrings.json
index b69f3e5a64..841ec89951 100644
--- a/api-server/server/utils/constantStrings.json
+++ b/api-server/server/utils/constantStrings.json
@@ -4,13 +4,13 @@
"legacyFrontEndChallengeId": "561add10cb82ac38a17513be",
"legacyBackEndChallengeId": "660add10cb82ac38a17513be",
"legacyDataVisId": "561add10cb82ac39a17513bc",
+ "legacyInfosecQaId": "561add10cb82ac38a17213bc",
"respWebDesignId": "561add10cb82ac38a17513bc",
"frontEndLibsId": "561acd10cb82ac38a17513bc",
"dataVis2018Id": "5a553ca864b52e1d8bceea14",
"jsAlgoDataStructId": "561abd10cb81ac38a17513bc",
"apisMicroservicesId": "561add10cb82ac38a17523bc",
- "infosecQaId": "561add10cb82ac38a17213bc",
"qaId": "5e611829481575a52dc59c0e",
"infosecId": "5e6021435ac9d0ecd8b94b00",
"fullStackId": "561add10cb82ac38a17213bd",
diff --git a/api-server/server/utils/getDynamicPropsForUser.js b/api-server/server/utils/getDynamicPropsForUser.js
index 4a2f844de6..262c5f535f 100644
--- a/api-server/server/utils/getDynamicPropsForUser.js
+++ b/api-server/server/utils/getDynamicPropsForUser.js
@@ -3,7 +3,6 @@ function getCompletedCertCount(user) {
'isApisMicroservicesCert',
'is2018DataVisCert',
'isFrontEndLibsCert',
- 'isInfosecQaCert',
'isQaCert',
'isInfosecCert',
'isJsAlgoDataStructCert',
@@ -15,10 +14,12 @@ function getCompletedCertCount(user) {
}
function getLegacyCertCount(user) {
- return ['isFrontEndCert', 'isBackEndCert', 'isDataVisCert'].reduce(
- (sum, key) => (user[key] ? sum + 1 : sum),
- 0
- );
+ return [
+ 'isFrontEndCert',
+ 'isBackEndCert',
+ 'isDataVisCert',
+ 'isInfosecQaCert'
+ ].reduce((sum, key) => (user[key] ? sum + 1 : sum), 0);
}
export default function populateUser(db, user) {
diff --git a/api-server/server/utils/superBlockCertTypeMap.js b/api-server/server/utils/superBlockCertTypeMap.js
index 43825f51c0..6180755686 100644
--- a/api-server/server/utils/superBlockCertTypeMap.js
+++ b/api-server/server/utils/superBlockCertTypeMap.js
@@ -5,6 +5,7 @@ const superBlockCertTypeMap = {
'legacy-front-end': certTypes.frontEnd,
'legacy-back-end': certTypes.backEnd,
'legacy-data-visualization': certTypes.dataVis,
+ 'legacy-information-security-and-quality-assurance': certTypes.infosecQa,
// modern
'responsive-web-design': certTypes.respWebDesign,
@@ -12,7 +13,6 @@ const superBlockCertTypeMap = {
'front-end-libraries': certTypes.frontEndLibs,
'data-visualization': certTypes.dataVis2018,
'apis-and-microservices': certTypes.apisMicroservices,
- 'information-security-and-quality-assurance': certTypes.infosecQa,
'quality-assurance': certTypes.qa,
'information-security': certTypes.infosec,
'full-stack': certTypes.fullStack,
diff --git a/api-server/server/utils/user-stats.js b/api-server/server/utils/user-stats.js
index 08027cf8b3..3879aac6a1 100644
--- a/api-server/server/utils/user-stats.js
+++ b/api-server/server/utils/user-stats.js
@@ -142,7 +142,6 @@ function getCompletedCertCount(user) {
'isApisMicroservicesCert',
'is2018DataVisCert',
'isFrontEndLibsCert',
- 'isInfosecQaCert',
'isQaCert',
'isInfosecCert',
'isJsAlgoDataStructCert',
@@ -154,8 +153,10 @@ function getCompletedCertCount(user) {
}
function getLegacyCertCount(user) {
- return ['isFrontEndCert', 'isBackEndCert', 'isDataVisCert'].reduce(
- (sum, key) => (user[key] ? sum + 1 : sum),
- 0
- );
+ return [
+ 'isFrontEndCert',
+ 'isBackEndCert',
+ 'isDataVisCert',
+ 'isInfosecQaCert'
+ ].reduce((sum, key) => (user[key] ? sum + 1 : sum), 0);
}
diff --git a/client/src/components/settings/Certification.js b/client/src/components/settings/Certification.js
index d7b2242df8..72e1247c4c 100644
--- a/client/src/components/settings/Certification.js
+++ b/client/src/components/settings/Certification.js
@@ -121,7 +121,6 @@ const isCertMapSelector = createSelector(
'Front End Libraries': isFrontEndLibsCert,
'Data Visualization': is2018DataVisCert,
"API's and Microservices": isApisMicroservicesCert,
- 'Information Security And Quality Assurance': isInfosecQaCert,
'Quality Assurance': isQaCert,
'Information Security': isInfosecCert,
'Scientific Computing with Python': isSciCompPyCert,
@@ -129,7 +128,8 @@ const isCertMapSelector = createSelector(
'Machine Learning with Python': isMachineLearningPyCert,
'Legacy Front End': isFrontEndCert,
'Legacy Data Visualization': isDataVisCert,
- 'Legacy Back End': isBackEndCert
+ 'Legacy Back End': isBackEndCert,
+ 'Legacy Information Security And Quality Assurance': isInfosecQaCert
})
);
@@ -473,6 +473,7 @@ export class CertificationSettings extends Component {
isApisMicroservicesCert,
isFrontEndLibsCert,
isQaCert,
+ isInfosecCert,
isJsAlgoDataStructCert,
isRespWebDesignCert
} = this.props;
@@ -482,6 +483,7 @@ export class CertificationSettings extends Component {
isApisMicroservicesCert &&
isFrontEndLibsCert &&
isQaCert &&
+ isInfosecCert &&
isJsAlgoDataStructCert &&
isRespWebDesignCert;
diff --git a/client/src/redux/index.js b/client/src/redux/index.js
index f7729b40ef..911c78901b 100644
--- a/client/src/redux/index.js
+++ b/client/src/redux/index.js
@@ -230,14 +230,14 @@ export const certificatesByNameSelector = username => state => {
isFrontEndLibsCert ||
isJsAlgoDataStructCert ||
isApisMicroservicesCert ||
- isInfosecQaCert ||
isQaCert ||
isInfosecCert ||
isFullStackCert ||
isSciCompPyCert ||
isDataAnalysisPyCert ||
isMachineLearningPyCert,
- hasLegacyCert: isFrontEndCert || isBackEndCert || isDataVisCert,
+ hasLegacyCert:
+ isFrontEndCert || isBackEndCert || isDataVisCert || isInfosecQaCert,
currentCerts: [
{
show: isFullStackCert,
@@ -269,11 +269,6 @@ export const certificatesByNameSelector = username => state => {
title: 'APIs and Microservices Certification',
showURL: 'apis-and-microservices'
},
- {
- show: isInfosecQaCert,
- title: 'Information Security and Quality Assurance Certification',
- showURL: 'information-security-and-quality-assurance'
- },
{
show: isQaCert,
title: ' Quality Assurance Certification',
@@ -315,6 +310,11 @@ export const certificatesByNameSelector = username => state => {
show: isDataVisCert,
title: 'Data Visualization Certification',
showURL: 'legacy-data-visualization'
+ },
+ {
+ show: isInfosecQaCert,
+ title: 'Information Security and Quality Assurance Certification',
+ showURL: 'legacy-information-security-and-quality-assurance'
}
]
};
diff --git a/client/src/resources/certProjectMap.js b/client/src/resources/certProjectMap.js
index 946dc6a16f..21d76e6300 100644
--- a/client/src/resources/certProjectMap.js
+++ b/client/src/resources/certProjectMap.js
@@ -19,6 +19,7 @@ const machineLearningPyBase =
const legacyFrontEndBase = '';
const legacyBackEndBase = '';
const legacyDataVisBase = '';
+const legacyInfosecQaBase = '';
export const legacyProjectMap = {
'Legacy Front End': [
@@ -206,6 +207,38 @@ export const legacyProjectMap = {
link: `${legacyDataVisBase}/map-data-across-the-globe`,
superBlock: 'legacy-data-visualization'
}
+ ],
+ 'Legacy Information Security and Quality Assurance': [
+ {
+ id: '587d8249367417b2b2512c41',
+ title: 'Metric-Imperial Converter',
+ link: `${legacyInfosecQaBase}/metric-imperial-converter`,
+ superBlock: 'legacy-information-security-and-quality-assurance'
+ },
+ {
+ id: '587d8249367417b2b2512c42',
+ title: 'Issue Tracker',
+ link: `${legacyInfosecQaBase}/issue-tracker`,
+ superBlock: 'legacy-information-security-and-quality-assurance'
+ },
+ {
+ id: '587d824a367417b2b2512c43',
+ title: 'Personal Library',
+ link: `${legacyInfosecQaBase}/personal-library`,
+ superBlock: 'legacy-information-security-and-quality-assurance'
+ },
+ {
+ id: '587d824a367417b2b2512c44',
+ title: 'Stock Price Checker',
+ link: `${legacyInfosecQaBase}/stock-price-checker`,
+ superBlock: 'legacy-information-security-and-quality-assurance'
+ },
+ {
+ id: '587d824a367417b2b2512c45',
+ title: 'Anonymous Message Board',
+ link: `${legacyInfosecQaBase}/anonymous-message-board`,
+ superBlock: 'legacy-information-security-and-quality-assurance'
+ }
]
};
@@ -429,8 +462,8 @@ export const projectMap = {
},
{
id: '5e601c775ac9d0ecd8b94aff',
- title: 'Real Time Multiplayer Game',
- link: `${infoSecBase}/real-time-multiplayer-game`,
+ title: 'Secure Real Time Multiplayer Game',
+ link: `${infoSecBase}/secure-real-time-multiplayer-game`,
superBlock: 'information-security'
}
],
diff --git a/client/utils/blockNameify.js b/client/utils/blockNameify.js
index cc17641f7d..bb4e0c6969 100644
--- a/client/utils/blockNameify.js
+++ b/client/utils/blockNameify.js
@@ -14,12 +14,8 @@ const preFormattedBlockNames = {
'apis-and-microservices': 'APIs and Microservices',
'apis-and-microservices-projects': 'APIs and Microservices Projects',
'scientific-computing-with-python': 'Scientific Computing with Python',
- 'scientific-computing-with-python-projects': 'Certification Projects',
'data-analysis-with-python': 'Data Analysis with Python',
- 'data-analysis-with-python-projects': 'Certification Projects',
- 'machine-learning-with-python': 'Machine Learning with Python',
- 'machine-learning-with-python-projects': 'Certification Projects',
- 'information-security-projects': 'Certification Projects'
+ 'machine-learning-with-python': 'Machine Learning with Python'
};
const noFormatting = ['and', 'for', 'of', 'the', 'up', 'with'];
diff --git a/client/utils/validCertNames.js b/client/utils/validCertNames.js
index 46dc421a4e..d751ecfdbc 100644
--- a/client/utils/validCertNames.js
+++ b/client/utils/validCertNames.js
@@ -4,12 +4,14 @@ export default [
'front-end-libraries',
'data-visualization',
'apis-and-microservices',
- 'information-security-and-quality-assurance',
'full-stack',
'scientific-computing-with-python',
'data-analysis-with-python',
'machine-learning-with-python',
+ 'information-security',
+ 'quality-assurance',
'legacy-front-end',
'legacy-back-end',
- 'legacy-data-visualization'
+ 'legacy-data-visualization',
+ 'legacy-information-security-and-quality-assurance'
];
diff --git a/curriculum/challenges/_meta/information-security-and-quality-assurance-projects/meta.json b/curriculum/challenges/_meta/information-security-and-quality-assurance-projects/meta.json
deleted file mode 100644
index 448557a6dd..0000000000
--- a/curriculum/challenges/_meta/information-security-and-quality-assurance-projects/meta.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "name": "Information Security and Quality Assurance Projects",
- "dashedName": "information-security-and-quality-assurance-projects",
- "order": 0,
- "time": "150 hours",
- "template": "",
- "required": [],
- "superBlock": "information-security-and-quality-assurance",
- "superOrder": 13,
- "challengeOrder": [
- [
- "587d8249367417b2b2512c41",
- "Metric-Imperial Converter"
- ],
- [
- "587d8249367417b2b2512c42",
- "Issue Tracker"
- ],
- [
- "587d824a367417b2b2512c43",
- "Personal Library"
- ],
- [
- "587d824a367417b2b2512c44",
- "Stock Price Checker"
- ],
- [
- "587d824a367417b2b2512c45",
- "Anonymous Message Board"
- ]
- ],
- "helpRoom": "HelpBackend",
- "fileName": "12-information-security-and-quality-assurance/quality-assurance-and-information-security-projects.json"
-}
\ No newline at end of file
diff --git a/curriculum/challenges/_meta/information-security-projects/meta.json b/curriculum/challenges/_meta/information-security-projects/meta.json
index b2d9def043..bdd47de496 100644
--- a/curriculum/challenges/_meta/information-security-projects/meta.json
+++ b/curriculum/challenges/_meta/information-security-projects/meta.json
@@ -18,7 +18,7 @@
],
[
"5e601c775ac9d0ecd8b94aff",
- "Real Time Multiplayer Game"
+ "Secure Real Time Multiplayer Game"
],
[
"5e46f979ac417301a38fb932",
diff --git a/curriculum/challenges/_meta/information-securtiy-and-quality-assurance-certificate/meta.json b/curriculum/challenges/_meta/information-securtiy-and-quality-assurance-certificate/meta.json
deleted file mode 100644
index a7178f8bb9..0000000000
--- a/curriculum/challenges/_meta/information-securtiy-and-quality-assurance-certificate/meta.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "name": "Information, Securtiy and Quality Assurance Certificate",
- "dashedName": "information-securtiy-and-quality-assurance-certificate",
- "order": 6,
- "time": "",
- "template": "",
- "required": [],
- "superBlock": "certificates",
- "superOrder": 12,
- "challengeOrder": [
- [
- "561add10cb82ac38a17213bc",
- "Information, Securtiy and Quality Assurance Certificate"
- ]
- ],
- "isPrivate": true,
- "fileName": "12-certificates/information-security-and-quality-assurance-certificate.json"
-}
\ No newline at end of file
diff --git a/curriculum/challenges/_meta/legacy-information-security-and-quality-assurance-certificate/meta.json b/curriculum/challenges/_meta/legacy-information-security-and-quality-assurance-certificate/meta.json
new file mode 100644
index 0000000000..8c4c188945
--- /dev/null
+++ b/curriculum/challenges/_meta/legacy-information-security-and-quality-assurance-certificate/meta.json
@@ -0,0 +1,18 @@
+{
+ "name": "Legacy Information Security and Quality Assurance Certificate",
+ "dashedName": "legacy-information-security-and-quality-assurance-certificate",
+ "order": 1,
+ "time": "",
+ "template": "",
+ "required": [],
+ "superBlock": "certificates",
+ "superOrder": 12,
+ "challengeOrder": [
+ [
+ "561add10cb82ac38a17213bc",
+ "Legacy Information Security and Quality Assurance Certificate"
+ ]
+ ],
+ "isPrivate": true,
+ "fileName": "12-certificates/legacy-information-security-and-quality-assurance-certificate.json"
+}
\ No newline at end of file
diff --git a/curriculum/challenges/english/06-quality-assurance/quality-assurance-projects/american-british-translator.english.md b/curriculum/challenges/english/06-quality-assurance/quality-assurance-projects/american-british-translator.english.md
index 5f4f6b6cd2..6fd16eee21 100644
--- a/curriculum/challenges/english/06-quality-assurance/quality-assurance-projects/american-british-translator.english.md
+++ b/curriculum/challenges/english/06-quality-assurance/quality-assurance-projects/american-british-translator.english.md
@@ -3,13 +3,15 @@ id: 5e601c0d5ac9d0ecd8b94afe
title: American British Translator
challengeType: 4
isRequired: true
-forumTopicId: 301571
---
## Description
-COMING SOON
+Build a full stack JavaScript app that is functionally similar to this: add-glitch-link.
+Working on this project will involve you writing your code on Glitch on our starter project. After completing this project you can copy your public glitch url (to the homepage of your app) into this screen to test it! Optionally you may choose to write your project on another platform but it must be publicly visible for our testing.
+
+Start this project on Glitch using this link or clone this repository on GitHub! If you use Glitch, remember to save the link to your project somewhere safe!
## Instructions
@@ -22,8 +24,23 @@ COMING SOON
```yml
tests:
- - text: test
- testString: 'test'
+ - text: I can enter a simple sentence into the text area and select whether to translate to British or American English from the dropdown menu.
+ testString: ''
+ - text: When the "Translate" button is pressed, append the translated sentence to the translated-sentence
div
. See the JavaScript files in /public
for the different spelling and terms your application should translate.
+ testString: ''
+ - text: Wrap any translated spelling or terms with <span class="highlight">...</span>
tags so they appear in green.
+ testString: ''
+ - text: If the sentence in the text area has no spelling or terms that should be translated, append the message "Everything looks good to me!" to the translated-sentence
div
.
+ testString: ''
+ - text: |
+ If there is no text in the text area, append the message "Error: No text to translate." to the error-msg
div
so the text appears in red.
+ testString: ''
+ - text: I can press the "Clear Input" button to remove all text from the text area and the translated-sentence
div
.
+ testString: ''
+ - text: All 12 unit tests are complete and passing.
+ testString: ''
+ - text: All 4 functional tests are complete and passing.
+ testString: ''
```
diff --git a/curriculum/challenges/english/06-quality-assurance/quality-assurance-projects/sudoku-solver.english.md b/curriculum/challenges/english/06-quality-assurance/quality-assurance-projects/sudoku-solver.english.md
index 77fd171b2b..a7847e566d 100644
--- a/curriculum/challenges/english/06-quality-assurance/quality-assurance-projects/sudoku-solver.english.md
+++ b/curriculum/challenges/english/06-quality-assurance/quality-assurance-projects/sudoku-solver.english.md
@@ -3,12 +3,15 @@ id: 5e601bf95ac9d0ecd8b94afd
title: Sudoku Solver
challengeType: 4
isRequired: true
-forumTopicId: 301571
---
## Description
-COMING SOON
+Build a full stack JavaScript app that is functionally similar to this: add-glitch-link.
+
+Working on this project will involve you writing your code on Glitch on our starter project. After completing this project you can copy your public glitch url (to the homepage of your app) into this screen to test it! Optionally you may choose to write your project on another platform but it must be publicly visible for our testing.
+
+Start this project on Glitch using this link or clone this repository on GitHub! If you use Glitch, remember to save the link to your project somewhere safe!
## Instructions
@@ -21,8 +24,18 @@ COMING SOON
```yml
tests:
- - text: test
- testString: 'test'
+ - text: I can enter a sudoku puzzle by filling in the text area with either a number or period (".") to represent an empty cell. When a valid number is entered in the text area, the same number is applied to the correct cell of the sudoku grid.
+ testString: ''
+ - text: I can enter a sudoku puzzle by adding numbers directly to the sudoku grid. When a valid number is entered in the sudoku grid, the same number appears in the correct position in the text area.
+ testString: ''
+ - text: I can solve an incomplete puzzle by clicking the "Solve" button. When a solution is found, the sudoku grid is automatically populated with the correct numbers for each cell.
+ testString: ''
+ - text: I can clear the text area and sudoku grid by clicking the "Clear" button.
+ testString: ''
+ - text: All 6 unit tests are complete and passing.
+ testString: ''
+ - text: All 4 functional tests are complete and passing.
+ testString: ''
```
diff --git a/curriculum/challenges/english/09-information-security/information-security-projects/real-time-multiplayer-game.english.md b/curriculum/challenges/english/09-information-security/information-security-projects/real-time-multiplayer-game.english.md
deleted file mode 100644
index b67a46cd70..0000000000
--- a/curriculum/challenges/english/09-information-security/information-security-projects/real-time-multiplayer-game.english.md
+++ /dev/null
@@ -1,47 +0,0 @@
----
-id: 5e601c775ac9d0ecd8b94aff
-title: Real Time Multiplayer Game
-challengeType: 4
-isRequired: true
-forumTopicId: 301572
----
-
-## Description
-
-
-## Instructions
-
-
-## Tests
-
-
-```yml
-tests:
- - text: test
- testString: 'test'
-
-```
-
-
-
-## Challenge Seed
-
-
-## Solution
-
-
-```js
-/**
- Backend challenges don't need solutions,
- because they would need to be tested against a full working project.
- Please check our contributing guidelines to learn more.
-*/
-```
-
-
diff --git a/curriculum/challenges/english/09-information-security/information-security-projects/secure-real-time-multiplayer-game.english.md b/curriculum/challenges/english/09-information-security/information-security-projects/secure-real-time-multiplayer-game.english.md
new file mode 100644
index 0000000000..58002c1595
--- /dev/null
+++ b/curriculum/challenges/english/09-information-security/information-security-projects/secure-real-time-multiplayer-game.english.md
@@ -0,0 +1,86 @@
+---
+id: 5e601c775ac9d0ecd8b94aff
+title: Secure Real Time Multiplayer Game
+challengeType: 4
+isRequired: true
+---
+
+## Description
+
+Develop a 2D real time multiplayer game using the HTML Canvas API and Socket.io that is functionally similar to this: add-glitch-url.
+
+Working on this project will involve you writing your code on Glitch on our starter project. After completing this project you can copy your public glitch url (to the homepage of your app) into this screen to test it! Optionally you may choose to write your project on another platform but it must be publicly visible for our testing.
+
+Start this project on Glitch using this link or clone this repository on GitHub! If you use Glitch, remember to save the link to your project somewhere safe!
+
+
+## Instructions
+
+
+## Tests
+
+
+```yml
+tests:
+ - text: Multiple players can connect to a server and play.
+ testString: ''
+ - text: Each player has an avatar.
+ testString: ''
+ - text: Each player is represented by an object created by the Player
class in Player.mjs
.
+ testString: ''
+ - text: At a minimum, each player object should contain a unique id
, a score
, and x
and y
coordinates representing the player's current position.
+ testString: ''
+ - text: The game has at least one type of collectible item. Complete the Collectible
class in Collectible.mjs
to implement this.
+ testString: ''
+ - text: At a minimum, each collectible item object created by the Collectible
class should contain a unique id
, a value
, and x
and y
coordinates representing the item's current position.
+ testString: ''
+ - text: Players can use the WASD and/or arrow keys to move their avatar. Complete the movePlayer
method in Player.mjs
to implement this.
+ testString: ''
+ - text: |
+ The movePlayer
method should accept two arguments: a string of "up", "down", "left", or "right", and a number for the amount of pixels the player's position should change. movePlayer
should adjust the x
and y
coordinates of the player object it's called from.
+ testString: ''
+ - text: The player's score should be used to calculate their rank among the other players. Complete the calculateRank
method in the Player
class.
+ testString: ''
+ - text: |
+ The calculateRank
method should accept an array of objects representing all connected players and return the string Rank: currentRanking/totalPlayers
.
+ testString: ''
+ - text: Players can collide with a collectible item. Complete the collision
method in Player.mjs
to implement this.
+ testString: ''
+ - text: The collision
method should accept a collectible item's object as an argument. If the player's avatar intersects with the item, the collision
method should return true
.
+ testString: ''
+ - text: All players are kept in sync.
+ testString: ''
+ - text: Players can disconnect from the game at any time.
+ testString: ''
+ - text: Prevent the client from trying to guess / sniff the MIME type.
+ testString: ''
+ - text: Prevent cross-site scripting (XSS) attacks.
+ testString: ''
+ - text: Nothing from the website is cached in the client.
+ testString: ''
+ - text: The headers say that the site is powered by 'PHP 7.4.3' even though it isn't (as a security measure).
+ testString: ''
+
+```
+
+
+
+## Challenge Seed
+
+
+## Solution
+
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
+
+
diff --git a/curriculum/challenges/english/12-certificates/information-security-certificate/information-security-certificate.english.md b/curriculum/challenges/english/12-certificates/information-security-certificate/information-security-certificate.english.md
index 824cd9f64a..b217e7dea0 100644
--- a/curriculum/challenges/english/12-certificates/information-security-certificate/information-security-certificate.english.md
+++ b/curriculum/challenges/english/12-certificates/information-security-certificate/information-security-certificate.english.md
@@ -27,7 +27,7 @@ tests:
- id: 5e46f979ac417301a38fb932
title: Port Scanner
- id: 5e601c775ac9d0ecd8b94aff
- title: Real Time Multiplayer Game
+ title: Secure Real Time Multiplayer Game
- id: 5e46f983ac417301a38fb933
title: SHA-1 Password Cracker
```
diff --git a/curriculum/challenges/english/12-certificates/information-securtiy-and-quality-assurance-certificate/information-securtiy-and-quality-assurance-certificate.english.md b/curriculum/challenges/english/12-certificates/legacy-information-security-and-quality-assurance-certificate/legacy-information-security-and-quality-assurance-certificate.md
similarity index 91%
rename from curriculum/challenges/english/12-certificates/information-securtiy-and-quality-assurance-certificate/information-securtiy-and-quality-assurance-certificate.english.md
rename to curriculum/challenges/english/12-certificates/legacy-information-security-and-quality-assurance-certificate/legacy-information-security-and-quality-assurance-certificate.md
index dbc35f1a1e..6934b2795a 100644
--- a/curriculum/challenges/english/12-certificates/information-securtiy-and-quality-assurance-certificate/information-securtiy-and-quality-assurance-certificate.english.md
+++ b/curriculum/challenges/english/12-certificates/legacy-information-security-and-quality-assurance-certificate/legacy-information-security-and-quality-assurance-certificate.md
@@ -1,6 +1,6 @@
---
id: 561add10cb82ac38a17213bc
-title: 'Information Security and Quality Assurance Certificate'
+title: Legacy Information Security and Quality Assurance Certificate
challengeType: 7
isHidden: false
isPrivate: true
@@ -21,16 +21,17 @@ isPrivate: true
```yml
tests:
- - id: 587d8249367417b2b2512c42
- title: Issue Tracker
- id: 587d8249367417b2b2512c41
title: Metric-Imperial Converter
+ - id: 587d8249367417b2b2512c42
+ title: Issue Tracker
- id: 587d824a367417b2b2512c43
title: Personal Library
- id: 587d824a367417b2b2512c44
title: Stock Price Checker
- id: 587d824a367417b2b2512c45
title: Anonymous Message Board
+
```
diff --git a/tools/scripts/build/__snapshots__/create-redirects.test.js.snap b/tools/scripts/build/__snapshots__/create-redirects.test.js.snap
index 57b660152b..fbaf15ba0a 100644
--- a/tools/scripts/build/__snapshots__/create-redirects.test.js.snap
+++ b/tools/scripts/build/__snapshots__/create-redirects.test.js.snap
@@ -40,10 +40,11 @@ https://freecodecamp-org.netlify.com/* https://www.freecodecamp.org/:spla
/signup https://api.example.com/signin 200!
# certification redirects
-/:username/front-end-certification /certification/:username/legacy-front-end 301
-/:username/data-visualization-certification /certification/:username/legacy-data-visualization 301
-/:username/back-end-certification /certification/:username/legacy-back-end 301
-/:username/full-stack-certification /certification/:username/full-stack 301
+/:username/front-end-certification /certification/:username/legacy-front-end 301
+/:username/data-visualization-certification /certification/:username/legacy-data-visualization 301
+/:username/back-end-certification /certification/:username/legacy-back-end 301
+/:username/information-security-and-quality-assurance /certification/:username/legacy-information-security-and-quality-assurance 301
+/:username/full-stack-certification /certification/:username/full-stack 301
# unsubscribe redirects
/u/* https://api.example.com/u/:splat 200!
diff --git a/tools/scripts/build/create-redirects.js b/tools/scripts/build/create-redirects.js
index 8739694bca..f3d2dc3cc1 100644
--- a/tools/scripts/build/create-redirects.js
+++ b/tools/scripts/build/create-redirects.js
@@ -61,10 +61,11 @@ https://freecodecamp-org.netlify.com/* https://www.freecodecamp.org/:spla
/signup #{{API}}/signin 200!
# certification redirects
-/:username/front-end-certification /certification/:username/legacy-front-end 301
-/:username/data-visualization-certification /certification/:username/legacy-data-visualization 301
-/:username/back-end-certification /certification/:username/legacy-back-end 301
-/:username/full-stack-certification /certification/:username/full-stack 301
+/:username/front-end-certification /certification/:username/legacy-front-end 301
+/:username/data-visualization-certification /certification/:username/legacy-data-visualization 301
+/:username/back-end-certification /certification/:username/legacy-back-end 301
+/:username/information-security-and-quality-assurance /certification/:username/legacy-information-security-and-quality-assurance 301
+/:username/full-stack-certification /certification/:username/full-stack 301
# unsubscribe redirects
/u/* #{{API}}/u/:splat 200!
diff --git a/utils/index.js b/utils/index.js
index f25aee60db..6365d9e39d 100644
--- a/utils/index.js
+++ b/utils/index.js
@@ -5,7 +5,6 @@ const idToTitle = new Map(
'561add10cb82ac38a17523bc': 'APIs and Microservices',
'5a553ca864b52e1d8bceea14': 'Data Visualization',
'561acd10cb82ac38a17513bc': 'Front End Libraries',
- '561add10cb82ac38a17213bc': 'Information Security and Quality Assurance',
'5e611829481575a52dc59c0e': 'Quality Assurance',
'5e6021435ac9d0ecd8b94b00': 'Information Security',
'561abd10cb81ac38a17513bc': 'JavaScript Algorithms and Data Structures',
@@ -13,6 +12,8 @@ const idToTitle = new Map(
'660add10cb82ac38a17513be': 'Legacy Back End',
'561add10cb82ac39a17513bc': 'Legacy Data Visualization',
'561add10cb82ac38a17513be': 'Legacy Front End',
+ '561add10cb82ac38a17213bc':
+ 'Legacy Information Security and Quality Assurance',
'561add10cb82ac38a17213bd': 'Full Stack',
'5e44431b903586ffb414c951': 'Scientific Computing with Python',
'5e46fc95ac417301a38fb934': 'Data Analysis with Python',