feat: release rdb and python certs (#64253)

Co-authored-by: Oliver Eyton-Williams <ojeytonwilliams@gmail.com>
Co-authored-by: moT01 <20648924+moT01@users.noreply.github.com>
This commit is contained in:
Shaun Hamilton
2025-12-09 21:55:36 +02:00
committed by GitHub
parent d9b5f4f8af
commit d28fbdf081
27 changed files with 175 additions and 114 deletions

View File

@@ -124,8 +124,10 @@ model user {
isJsAlgoDataStructCert Boolean? // Undefined isJsAlgoDataStructCert Boolean? // Undefined
isJsAlgoDataStructCertV8 Boolean? // Undefined isJsAlgoDataStructCertV8 Boolean? // Undefined
isMachineLearningPyCertV7 Boolean? // Undefined isMachineLearningPyCertV7 Boolean? // Undefined
isPythonCertV9 Boolean? // Undefined
isQaCertV7 Boolean? // Undefined isQaCertV7 Boolean? // Undefined
isRelationalDatabaseCertV8 Boolean? // Undefined isRelationalDatabaseCertV8 Boolean? // Undefined
isRelationalDatabaseCertV9 Boolean? // Undefined
isRespWebDesignCert Boolean? // Undefined isRespWebDesignCert Boolean? // Undefined
isRespWebDesignCertV9 Boolean? // Undefined isRespWebDesignCertV9 Boolean? // Undefined
isSciCompPyCertV7 Boolean? // Undefined isSciCompPyCertV7 Boolean? // Undefined

View File

@@ -48,8 +48,10 @@ export const newUser = (email: string) => ({
isJsAlgoDataStructCert: false, isJsAlgoDataStructCert: false,
isJsAlgoDataStructCertV8: false, isJsAlgoDataStructCertV8: false,
isMachineLearningPyCertV7: false, isMachineLearningPyCertV7: false,
isPythonCertV9: false,
isQaCertV7: false, isQaCertV7: false,
isRelationalDatabaseCertV8: false, isRelationalDatabaseCertV8: false,
isRelationalDatabaseCertV9: false,
isCollegeAlgebraPyCertV8: false, isCollegeAlgebraPyCertV8: false,
isRespWebDesignCert: false, isRespWebDesignCert: false,
isRespWebDesignCertV9: false, isRespWebDesignCertV9: false,

View File

@@ -26,8 +26,10 @@ const nullableFlags = [
'isJsAlgoDataStructCert', 'isJsAlgoDataStructCert',
'isJsAlgoDataStructCertV8', 'isJsAlgoDataStructCertV8',
'isMachineLearningPyCertV7', 'isMachineLearningPyCertV7',
'isPythonCertV9',
'isQaCertV7', 'isQaCertV7',
'isRelationalDatabaseCertV8', 'isRelationalDatabaseCertV8',
'isRelationalDatabaseCertV9',
'isRespWebDesignCert', 'isRespWebDesignCert',
'isRespWebDesignCertV9', 'isRespWebDesignCertV9',
'isSciCompPyCertV7', 'isSciCompPyCertV7',

View File

@@ -39,23 +39,25 @@ describe('certificate routes', () => {
where: { email: defaultUserEmail }, where: { email: defaultUserEmail },
data: { data: {
completedChallenges: [], completedChallenges: [],
name: 'fcc',
isA2EnglishCert: false,
isRespWebDesignCert: false,
isJsAlgoDataStructCert: false,
isFrontEndLibsCert: false,
is2018DataVisCert: false, is2018DataVisCert: false,
isRelationalDatabaseCertV8: false, isA2EnglishCert: false,
isApisMicroservicesCert: false, isApisMicroservicesCert: false,
isQaCertV7: false,
isSciCompPyCertV7: false,
isDataAnalysisPyCertV7: false,
isInfosecCertV7: false,
isMachineLearningPyCertV7: false,
isCollegeAlgebraPyCertV8: false, isCollegeAlgebraPyCertV8: false,
isDataAnalysisPyCertV7: false,
isFoundationalCSharpCertV8: false, isFoundationalCSharpCertV8: false,
isFrontEndLibsCert: false,
isInfosecCertV7: false,
isJsAlgoDataStructCert: false,
isJavascriptCertV9: false, isJavascriptCertV9: false,
isMachineLearningPyCertV7: false,
isPythonCertV9: false,
isQaCertV7: false,
isRelationalDatabaseCertV8: false,
isRelationalDatabaseCertV9: false,
isRespWebDesignCert: false,
isRespWebDesignCertV9: false, isRespWebDesignCertV9: false,
isSciCompPyCertV7: false,
name: 'fcc',
username: 'fcc' username: 'fcc'
} }
}); });
@@ -154,8 +156,10 @@ describe('certificate routes', () => {
isInfosecQaCert: false, isInfosecQaCert: false,
isJsAlgoDataStructCert: false, isJsAlgoDataStructCert: false,
isMachineLearningPyCertV7: false, isMachineLearningPyCertV7: false,
isPythonCertV9: false,
isQaCertV7: false, isQaCertV7: false,
isRelationalDatabaseCertV8: false, isRelationalDatabaseCertV8: false,
isRelationalDatabaseCertV9: false,
isRespWebDesignCert: false, isRespWebDesignCert: false,
isSciCompPyCertV7: false, isSciCompPyCertV7: false,
isJavascriptCertV9: false, isJavascriptCertV9: false,
@@ -234,22 +238,24 @@ describe('certificate routes', () => {
{ id: '587d78b0367417b2b2512b05', completedDate: 123456789 }, { id: '587d78b0367417b2b2512b05', completedDate: 123456789 },
{ id: 'bd7158d8c242eddfaeb5bd13', completedDate: 123456789 } { id: 'bd7158d8c242eddfaeb5bd13', completedDate: 123456789 }
], ],
isRespWebDesignCert: false,
isJsAlgoDataStructCertV8: true,
isFrontEndLibsCert: true,
is2018DataVisCert: true, is2018DataVisCert: true,
isRelationalDatabaseCertV8: true, isA2EnglishCert: true,
isApisMicroservicesCert: true, isApisMicroservicesCert: true,
isQaCertV7: true,
isSciCompPyCertV7: true,
isDataAnalysisPyCertV7: true,
isInfosecCertV7: true,
isMachineLearningPyCertV7: true,
isCollegeAlgebraPyCertV8: true, isCollegeAlgebraPyCertV8: true,
isDataAnalysisPyCertV7: true,
isFoundationalCSharpCertV8: true, isFoundationalCSharpCertV8: true,
isFrontEndLibsCert: true,
isInfosecCertV7: true,
isJavascriptCertV9: true, isJavascriptCertV9: true,
isJsAlgoDataStructCertV8: true,
isMachineLearningPyCertV7: true,
isPythonCertV9: true,
isQaCertV7: true,
isRelationalDatabaseCertV8: true,
isRelationalDatabaseCertV9: true,
isRespWebDesignCert: false,
isRespWebDesignCertV9: true, isRespWebDesignCertV9: true,
isA2EnglishCert: true isSciCompPyCertV7: true
} }
}); });
@@ -323,7 +329,9 @@ describe('certificate routes', () => {
isMachineLearningPyCertV7: false, isMachineLearningPyCertV7: false,
isRelationalDatabaseCertV8: false, isRelationalDatabaseCertV8: false,
isCollegeAlgebraPyCertV8: false, isCollegeAlgebraPyCertV8: false,
isFoundationalCSharpCertV8: false isFoundationalCSharpCertV8: false,
isPythonCertV9: false,
isRelationalDatabaseCertV9: false
}, },
completedChallenges: [ completedChallenges: [
{ {

View File

@@ -123,78 +123,84 @@ export function createCertLookup(
interface CertI { interface CertI {
isA2EnglishCert?: boolean; isA2EnglishCert?: boolean;
isRespWebDesignCert?: boolean; isApisMicroservicesCert?: boolean;
isBackEndCert?: boolean;
isCollegeAlgebraPyCertV8?: boolean;
isDataAnalysisPyCertV7?: boolean;
isDataVisCert?: boolean;
isFrontEndCert?: boolean;
isFrontEndLibsCert?: boolean;
isFoundationalCSharpCertV8?: boolean;
isFullStackCert?: boolean;
isInfosecCertV7?: boolean;
isInfosecQaCert?: boolean;
isJavascriptCertV9?: boolean;
isJsAlgoDataStructCert?: boolean; isJsAlgoDataStructCert?: boolean;
isJsAlgoDataStructCertV8?: boolean; isJsAlgoDataStructCertV8?: boolean;
isFrontEndLibsCert?: boolean;
is2018DataVisCert?: boolean;
isApisMicroservicesCert?: boolean;
isInfosecQaCert?: boolean;
isQaCertV7?: boolean;
isInfosecCertV7?: boolean;
isFrontEndCert?: boolean;
isBackEndCert?: boolean;
isDataVisCert?: boolean;
isFullStackCert?: boolean;
isSciCompPyCertV7?: boolean;
isDataAnalysisPyCertV7?: boolean;
isMachineLearningPyCertV7?: boolean; isMachineLearningPyCertV7?: boolean;
isPythonCertV9?: boolean;
isQaCertV7?: boolean;
isRelationalDatabaseCertV8?: boolean; isRelationalDatabaseCertV8?: boolean;
isCollegeAlgebraPyCertV8?: boolean; isRelationalDatabaseCertV9?: boolean;
isFoundationalCSharpCertV8?: boolean; isRespWebDesignCert?: boolean;
isJavascriptCertV9?: boolean;
isRespWebDesignCertV9?: boolean; isRespWebDesignCertV9?: boolean;
isSciCompPyCertV7?: boolean;
is2018DataVisCert?: boolean;
} }
function getUserIsCertMap(user: CertI) { function getUserIsCertMap(user: CertI) {
const { const {
isA2EnglishCert = false, isA2EnglishCert = false,
isRespWebDesignCert = false, isApisMicroservicesCert = false,
isBackEndCert = false,
isCollegeAlgebraPyCertV8 = false,
isDataAnalysisPyCertV7 = false,
isDataVisCert = false,
isFrontEndCert = false,
isFrontEndLibsCert = false,
isFoundationalCSharpCertV8 = false,
isFullStackCert = false,
isInfosecCertV7 = false,
isInfosecQaCert = false,
isJavascriptCertV9 = false,
isJsAlgoDataStructCert = false, isJsAlgoDataStructCert = false,
isJsAlgoDataStructCertV8 = false, isJsAlgoDataStructCertV8 = false,
isFrontEndLibsCert = false,
is2018DataVisCert = false,
isApisMicroservicesCert = false,
isInfosecQaCert = false,
isQaCertV7 = false,
isInfosecCertV7 = false,
isFrontEndCert = false,
isBackEndCert = false,
isDataVisCert = false,
isFullStackCert = false,
isSciCompPyCertV7 = false,
isDataAnalysisPyCertV7 = false,
isMachineLearningPyCertV7 = false, isMachineLearningPyCertV7 = false,
isPythonCertV9 = false,
isQaCertV7 = false,
isRelationalDatabaseCertV8 = false, isRelationalDatabaseCertV8 = false,
isCollegeAlgebraPyCertV8 = false, isRelationalDatabaseCertV9 = false,
isFoundationalCSharpCertV8 = false, isRespWebDesignCert = false,
isJavascriptCertV9 = false, isRespWebDesignCertV9 = false,
isRespWebDesignCertV9 = false isSciCompPyCertV7 = false,
is2018DataVisCert = false
} = user; } = user;
return { return {
isA2EnglishCert, isA2EnglishCert,
isRespWebDesignCert, isApisMicroservicesCert,
isBackEndCert,
isCollegeAlgebraPyCertV8,
isDataAnalysisPyCertV7,
isDataVisCert,
isFrontEndCert,
isFrontEndLibsCert,
isFoundationalCSharpCertV8,
isFullStackCert,
isInfosecCertV7,
isInfosecQaCert,
isJavascriptCertV9,
isJsAlgoDataStructCert, isJsAlgoDataStructCert,
isJsAlgoDataStructCertV8, isJsAlgoDataStructCertV8,
isFrontEndLibsCert,
is2018DataVisCert,
isApisMicroservicesCert,
isInfosecQaCert,
isQaCertV7,
isInfosecCertV7,
isFrontEndCert,
isBackEndCert,
isDataVisCert,
isFullStackCert,
isSciCompPyCertV7,
isDataAnalysisPyCertV7,
isMachineLearningPyCertV7, isMachineLearningPyCertV7,
isPythonCertV9,
isQaCertV7,
isRelationalDatabaseCertV8, isRelationalDatabaseCertV8,
isCollegeAlgebraPyCertV8, isRelationalDatabaseCertV9,
isFoundationalCSharpCertV8, isRespWebDesignCert,
isJavascriptCertV9, isRespWebDesignCertV9,
isRespWebDesignCertV9 isSciCompPyCertV7,
is2018DataVisCert
}; };
} }
@@ -335,33 +341,35 @@ export const protectedCertificateRoutes: FastifyPluginCallbackTypebox = (
} }
}, },
select: { select: {
username: true, completedChallenges: true,
email: true, email: true,
name: true, name: true,
completedChallenges: true, username: true,
is2018DataVisCert: true, is2018DataVisCert: true,
is2018FullStackCert: true, is2018FullStackCert: true,
isA2EnglishCert: true, isA2EnglishCert: true,
isApisMicroservicesCert: true, isApisMicroservicesCert: true,
isBackEndCert: true, isBackEndCert: true,
isDataVisCert: true,
isCollegeAlgebraPyCertV8: true, isCollegeAlgebraPyCertV8: true,
isDataAnalysisPyCertV7: true, isDataAnalysisPyCertV7: true,
isDataVisCert: true,
isFoundationalCSharpCertV8: true, isFoundationalCSharpCertV8: true,
isFrontEndCert: true, isFrontEndCert: true,
isFrontEndLibsCert: true, isFrontEndLibsCert: true,
isFullStackCert: true, isFullStackCert: true,
isInfosecCertV7: true, isInfosecCertV7: true,
isInfosecQaCert: true, isInfosecQaCert: true,
isJavascriptCertV9: true,
isJsAlgoDataStructCert: true, isJsAlgoDataStructCert: true,
isJsAlgoDataStructCertV8: true, isJsAlgoDataStructCertV8: true,
isMachineLearningPyCertV7: true, isMachineLearningPyCertV7: true,
isPythonCertV9: true,
isQaCertV7: true, isQaCertV7: true,
isRelationalDatabaseCertV8: true, isRelationalDatabaseCertV8: true,
isRelationalDatabaseCertV9: true,
isRespWebDesignCert: true, isRespWebDesignCert: true,
isSciCompPyCertV7: true, isRespWebDesignCertV9: true,
isJavascriptCertV9: true, isSciCompPyCertV7: true
isRespWebDesignCertV9: true
} }
}); });

View File

@@ -293,8 +293,10 @@ const publicUserData = {
isJsAlgoDataStructCert: testUserData.isJsAlgoDataStructCert, isJsAlgoDataStructCert: testUserData.isJsAlgoDataStructCert,
isJsAlgoDataStructCertV8: testUserData.isJsAlgoDataStructCertV8, isJsAlgoDataStructCertV8: testUserData.isJsAlgoDataStructCertV8,
isMachineLearningPyCertV7: testUserData.isMachineLearningPyCertV7, isMachineLearningPyCertV7: testUserData.isMachineLearningPyCertV7,
isPythonCertV9: testUserData.isPythonCertV9,
isQaCertV7: testUserData.isQaCertV7, isQaCertV7: testUserData.isQaCertV7,
isRelationalDatabaseCertV8: testUserData.isRelationalDatabaseCertV8, isRelationalDatabaseCertV8: testUserData.isRelationalDatabaseCertV8,
isRelationalDatabaseCertV9: testUserData.isRelationalDatabaseCertV9,
isRespWebDesignCert: testUserData.isRespWebDesignCert, isRespWebDesignCert: testUserData.isRespWebDesignCert,
isRespWebDesignCertV9: testUserData.isRespWebDesignCertV9, isRespWebDesignCertV9: testUserData.isRespWebDesignCertV9,
isSciCompPyCertV7: testUserData.isSciCompPyCertV7, isSciCompPyCertV7: testUserData.isSciCompPyCertV7,
@@ -345,7 +347,9 @@ const baseProgressData = {
isSciCompPyCertV7: false, isSciCompPyCertV7: false,
isDataAnalysisPyCertV7: false, isDataAnalysisPyCertV7: false,
isMachineLearningPyCertV7: false, isMachineLearningPyCertV7: false,
isPythonCertV9: false,
isRelationalDatabaseCertV8: false, isRelationalDatabaseCertV8: false,
isRelationalDatabaseCertV9: false,
isRespWebDesignCertV9: false, isRespWebDesignCertV9: false,
isCollegeAlgebraPyCertV8: false, isCollegeAlgebraPyCertV8: false,
completedChallenges: [], completedChallenges: [],
@@ -1018,8 +1022,10 @@ describe('userRoutes', () => {
isJsAlgoDataStructCert: false, isJsAlgoDataStructCert: false,
isJsAlgoDataStructCertV8: false, isJsAlgoDataStructCertV8: false,
isMachineLearningPyCertV7: false, isMachineLearningPyCertV7: false,
isPythonCertV9: false,
isQaCertV7: false, isQaCertV7: false,
isRelationalDatabaseCertV8: false, isRelationalDatabaseCertV8: false,
isRelationalDatabaseCertV9: false,
isRespWebDesignCert: false, isRespWebDesignCert: false,
isRespWebDesignCertV9: false, isRespWebDesignCertV9: false,
isSciCompPyCertV7: false, isSciCompPyCertV7: false,

View File

@@ -701,8 +701,10 @@ export const userGetRoutes: FastifyPluginCallbackTypebox = (
isJsAlgoDataStructCert: true, isJsAlgoDataStructCert: true,
isJsAlgoDataStructCertV8: true, isJsAlgoDataStructCertV8: true,
isMachineLearningPyCertV7: true, isMachineLearningPyCertV7: true,
isPythonCertV9: true,
isQaCertV7: true, isQaCertV7: true,
isRelationalDatabaseCertV8: true, isRelationalDatabaseCertV8: true,
isRelationalDatabaseCertV9: true,
isRespWebDesignCert: true, isRespWebDesignCert: true,
isRespWebDesignCertV9: true, isRespWebDesignCertV9: true,
isSciCompPyCertV7: true, isSciCompPyCertV7: true,

View File

@@ -74,12 +74,14 @@ export const unprotectedCertificateRoutes: FastifyPluginCallbackTypebox = (
is2018DataVisCert: true, is2018DataVisCert: true,
isApisMicroservicesCert: true, isApisMicroservicesCert: true,
isInfosecQaCert: true, isInfosecQaCert: true,
isPythonCertV9: true,
isQaCertV7: true, isQaCertV7: true,
isInfosecCertV7: true, isInfosecCertV7: true,
isSciCompPyCertV7: true, isSciCompPyCertV7: true,
isDataAnalysisPyCertV7: true, isDataAnalysisPyCertV7: true,
isMachineLearningPyCertV7: true, isMachineLearningPyCertV7: true,
isRelationalDatabaseCertV8: true, isRelationalDatabaseCertV8: true,
isRelationalDatabaseCertV9: true,
isCollegeAlgebraPyCertV8: true, isCollegeAlgebraPyCertV8: true,
isFoundationalCSharpCertV8: true, isFoundationalCSharpCertV8: true,
isHonest: true, isHonest: true,

View File

@@ -206,8 +206,10 @@ const publicUserData = {
isJsAlgoDataStructCert: testUserData.isJsAlgoDataStructCert, isJsAlgoDataStructCert: testUserData.isJsAlgoDataStructCert,
isJsAlgoDataStructCertV8: testUserData.isJsAlgoDataStructCertV8, isJsAlgoDataStructCertV8: testUserData.isJsAlgoDataStructCertV8,
isMachineLearningPyCertV7: testUserData.isMachineLearningPyCertV7, isMachineLearningPyCertV7: testUserData.isMachineLearningPyCertV7,
isPythonCertV9: testUserData.isPythonCertV9,
isQaCertV7: testUserData.isQaCertV7, isQaCertV7: testUserData.isQaCertV7,
isRelationalDatabaseCertV8: testUserData.isRelationalDatabaseCertV8, isRelationalDatabaseCertV8: testUserData.isRelationalDatabaseCertV8,
isRelationalDatabaseCertV9: testUserData.isRelationalDatabaseCertV9,
isRespWebDesignCert: testUserData.isRespWebDesignCert, isRespWebDesignCert: testUserData.isRespWebDesignCert,
isRespWebDesignCertV9: testUserData.isRespWebDesignCertV9, isRespWebDesignCertV9: testUserData.isRespWebDesignCertV9,
isSciCompPyCertV7: testUserData.isSciCompPyCertV7, isSciCompPyCertV7: testUserData.isSciCompPyCertV7,

View File

@@ -15,6 +15,7 @@ export const isCertMap = Type.Object({
is2018DataVisCert: Type.Boolean(), is2018DataVisCert: Type.Boolean(),
isApisMicroservicesCert: Type.Boolean(), isApisMicroservicesCert: Type.Boolean(),
isInfosecQaCert: Type.Boolean(), isInfosecQaCert: Type.Boolean(),
isPythonCertV9: Type.Boolean(),
isQaCertV7: Type.Boolean(), isQaCertV7: Type.Boolean(),
isInfosecCertV7: Type.Boolean(), isInfosecCertV7: Type.Boolean(),
isFrontEndCert: Type.Boolean(), isFrontEndCert: Type.Boolean(),
@@ -25,6 +26,7 @@ export const isCertMap = Type.Object({
isDataAnalysisPyCertV7: Type.Boolean(), isDataAnalysisPyCertV7: Type.Boolean(),
isMachineLearningPyCertV7: Type.Boolean(), isMachineLearningPyCertV7: Type.Boolean(),
isRelationalDatabaseCertV8: Type.Boolean(), isRelationalDatabaseCertV8: Type.Boolean(),
isRelationalDatabaseCertV9: Type.Boolean(),
isCollegeAlgebraPyCertV8: Type.Boolean(), isCollegeAlgebraPyCertV8: Type.Boolean(),
isFoundationalCSharpCertV8: Type.Boolean() isFoundationalCSharpCertV8: Type.Boolean()
}); });

View File

@@ -86,8 +86,10 @@ export const getSessionUser = {
isJsAlgoDataStructCert: Type.Boolean(), isJsAlgoDataStructCert: Type.Boolean(),
isJsAlgoDataStructCertV8: Type.Boolean(), isJsAlgoDataStructCertV8: Type.Boolean(),
isMachineLearningPyCertV7: Type.Boolean(), isMachineLearningPyCertV7: Type.Boolean(),
isPythonCertV9: Type.Boolean(),
isQaCertV7: Type.Boolean(), isQaCertV7: Type.Boolean(),
isRelationalDatabaseCertV8: Type.Boolean(), isRelationalDatabaseCertV8: Type.Boolean(),
isRelationalDatabaseCertV9: Type.Boolean(),
isRespWebDesignCert: Type.Boolean(), isRespWebDesignCert: Type.Boolean(),
isRespWebDesignCertV9: Type.Boolean(), isRespWebDesignCertV9: Type.Boolean(),
isSciCompPyCertV7: Type.Boolean(), isSciCompPyCertV7: Type.Boolean(),

View File

@@ -72,8 +72,10 @@ export const getPublicProfile = {
isJsAlgoDataStructCert: Type.Boolean(), isJsAlgoDataStructCert: Type.Boolean(),
isJsAlgoDataStructCertV8: Type.Boolean(), isJsAlgoDataStructCertV8: Type.Boolean(),
isMachineLearningPyCertV7: Type.Boolean(), isMachineLearningPyCertV7: Type.Boolean(),
isPythonCertV9: Type.Boolean(),
isQaCertV7: Type.Boolean(), isQaCertV7: Type.Boolean(),
isRelationalDatabaseCertV8: Type.Boolean(), isRelationalDatabaseCertV8: Type.Boolean(),
isRelationalDatabaseCertV9: Type.Boolean(),
isRespWebDesignCert: Type.Boolean(), isRespWebDesignCert: Type.Boolean(),
isRespWebDesignCertV9: Type.Boolean(), isRespWebDesignCertV9: Type.Boolean(),
isSciCompPyCertV7: Type.Boolean(), isSciCompPyCertV7: Type.Boolean(),

View File

@@ -32,8 +32,10 @@ export const createResetProperties = () => ({
isJsAlgoDataStructCert: false, isJsAlgoDataStructCert: false,
isJsAlgoDataStructCertV8: false, isJsAlgoDataStructCertV8: false,
isMachineLearningPyCertV7: false, isMachineLearningPyCertV7: false,
isPythonCertV9: false,
isQaCertV7: false, isQaCertV7: false,
isRelationalDatabaseCertV8: false, isRelationalDatabaseCertV8: false,
isRelationalDatabaseCertV9: false,
isRespWebDesignCert: false, isRespWebDesignCert: false,
isRespWebDesignCertV9: false, isRespWebDesignCertV9: false,
isSciCompPyCertV7: false, isSciCompPyCertV7: false,

View File

@@ -5089,13 +5089,9 @@
"title": "JavaScript Certification", "title": "JavaScript Certification",
"intro": [ "intro": [
"This course teaches you core JavaScript programming concepts such as working with variables, functions, objects, arrays, and control flow. You'll also learn how to manipulate the DOM, handle events, and apply techniques like asynchronous programming, functional programming, and accessibility best practices.", "This course teaches you core JavaScript programming concepts such as working with variables, functions, objects, arrays, and control flow. You'll also learn how to manipulate the DOM, handle events, and apply techniques like asynchronous programming, functional programming, and accessibility best practices.",
"To qualify for the exam, you must complete the following projects:", "To earn your JavaScript Certification:",
"- Build a Markdown to HTML Converter", "- Complete the five required projects to qualify for the certification exam.",
"- Build a Drum Machine", "- Pass the JavaScript Certification exam."
"- Build a Voting System",
"- Build a Bank Account Management Program",
"- Build a Weather App",
"Pass the exam to earn your JavaScript Certification."
], ],
"chapters": { "chapters": {
"javascript": "JavaScript", "javascript": "JavaScript",
@@ -6666,7 +6662,6 @@
}, },
"python-v9": { "python-v9": {
"title": "Python Certification", "title": "Python Certification",
"note": "This certification is currently in development and will be available soon. We recommend completing the available courses below to prepare for the certification exam once it is released.",
"intro": [ "intro": [
"This course teaches you the fundamentals of Python programming.", "This course teaches you the fundamentals of Python programming.",
"To earn your Python Certification:", "To earn your Python Certification:",
@@ -7142,7 +7137,6 @@
}, },
"relational-databases-v9": { "relational-databases-v9": {
"title": "Relational Databases Certification", "title": "Relational Databases Certification",
"note": "This certification is currently in development and will be available soon. We recommend completing the available courses below to prepare for the certification exam once it is released.",
"intro": [ "intro": [
"This course teaches you the fundamentals of relational databases.", "This course teaches you the fundamentals of relational databases.",
"To earn your Relational Databases Certification:", "To earn your Relational Databases Certification:",
@@ -7734,13 +7728,9 @@
"title": "Responsive Web Design Certification", "title": "Responsive Web Design Certification",
"intro": [ "intro": [
"This course teaches the fundamentals of HTML and CSS, including modern layout, design, accessibility, and responsive web development. You'll build practical projects and gain the skills to create professional, user-friendly webpages.", "This course teaches the fundamentals of HTML and CSS, including modern layout, design, accessibility, and responsive web development. You'll build practical projects and gain the skills to create professional, user-friendly webpages.",
"To qualify for the exam, you must complete the following projects:", "To earn your Responsive Web Design Certification:",
"- Build a Survey Form", "- Complete the five required projects to qualify for the certification exam.",
"- Build a Page of Playing Cards", "- Pass the Responsive Web Design Certification exam."
"- Build a Book Inventory App",
"- Build a Technical Documentation Page",
"- Build a Product Landing Page",
"Pass the exam to earn your Responsive Web Design Certification."
], ],
"chapters": { "chapters": {
"html": "HTML", "html": "HTML",

View File

@@ -154,6 +154,8 @@ export function ShowSettings(props: ShowSettingsProps): JSX.Element {
isFullStackCert, isFullStackCert,
isRespWebDesignCert, isRespWebDesignCert,
isRespWebDesignCertV9, isRespWebDesignCertV9,
isPythonCertV9,
isRelationalDatabaseCertV9,
isSciCompPyCertV7, isSciCompPyCertV7,
isDataAnalysisPyCertV7, isDataAnalysisPyCertV7,
isMachineLearningPyCertV7, isMachineLearningPyCertV7,
@@ -241,8 +243,10 @@ export function ShowSettings(props: ShowSettingsProps): JSX.Element {
isInfosecQaCert={isInfosecQaCert} isInfosecQaCert={isInfosecQaCert}
isJsAlgoDataStructCert={isJsAlgoDataStructCert} isJsAlgoDataStructCert={isJsAlgoDataStructCert}
isMachineLearningPyCertV7={isMachineLearningPyCertV7} isMachineLearningPyCertV7={isMachineLearningPyCertV7}
isPythonCertV9={isPythonCertV9}
isQaCertV7={isQaCertV7} isQaCertV7={isQaCertV7}
isRelationalDatabaseCertV8={isRelationalDatabaseCertV8} isRelationalDatabaseCertV8={isRelationalDatabaseCertV8}
isRelationalDatabaseCertV9={isRelationalDatabaseCertV9}
isRespWebDesignCert={isRespWebDesignCert} isRespWebDesignCert={isRespWebDesignCert}
isRespWebDesignCertV9={isRespWebDesignCertV9} isRespWebDesignCertV9={isRespWebDesignCertV9}
isSciCompPyCertV7={isSciCompPyCertV7} isSciCompPyCertV7={isSciCompPyCertV7}

View File

@@ -12,6 +12,7 @@ export const getCertifications = (user: User) => {
isJsAlgoDataStructCert, isJsAlgoDataStructCert,
isApisMicroservicesCert, isApisMicroservicesCert,
isInfosecQaCert, isInfosecQaCert,
isPythonCertV9,
isQaCertV7, isQaCertV7,
isInfosecCertV7, isInfosecCertV7,
isFrontEndCert, isFrontEndCert,
@@ -22,6 +23,7 @@ export const getCertifications = (user: User) => {
isDataAnalysisPyCertV7, isDataAnalysisPyCertV7,
isMachineLearningPyCertV7, isMachineLearningPyCertV7,
isRelationalDatabaseCertV8, isRelationalDatabaseCertV8,
isRelationalDatabaseCertV9,
isCollegeAlgebraPyCertV8, isCollegeAlgebraPyCertV8,
isFoundationalCSharpCertV8, isFoundationalCSharpCertV8,
isJsAlgoDataStructCertV8 isJsAlgoDataStructCertV8
@@ -32,7 +34,9 @@ export const getCertifications = (user: User) => {
isA2EnglishCert || isA2EnglishCert ||
isRespWebDesignCertV9 || isRespWebDesignCertV9 ||
isJavascriptCertV9 || isJavascriptCertV9 ||
isFoundationalCSharpCertV8, isFoundationalCSharpCertV8 ||
isPythonCertV9 ||
isRelationalDatabaseCertV9,
hasLegacyCert: hasLegacyCert:
isFrontEndCert || isFrontEndCert ||
isJsAlgoDataStructCert || isJsAlgoDataStructCert ||
@@ -73,6 +77,16 @@ export const getCertifications = (user: User) => {
show: isFoundationalCSharpCertV8, show: isFoundationalCSharpCertV8,
title: 'Foundational C# with Microsoft Certification', title: 'Foundational C# with Microsoft Certification',
certSlug: Certification.FoundationalCSharp certSlug: Certification.FoundationalCSharp
},
{
show: isPythonCertV9,
title: 'Python Certification',
certSlug: Certification.PythonV9
},
{
show: isRelationalDatabaseCertV9,
title: 'Relational Database Certification',
certSlug: Certification.RelationalDbV9
} }
], ],
legacyCerts: [ legacyCerts: [

View File

@@ -63,6 +63,7 @@ const userProps = {
isFrontEndLibsCert: true, isFrontEndLibsCert: true,
isFullStackCert: true, isFullStackCert: true,
isInfosecQaCert: true, isInfosecQaCert: true,
isPythonCertV9: true,
isQaCertV7: true, isQaCertV7: true,
isInfosecCertV7: true, isInfosecCertV7: true,
isJavascriptCertV9: true, isJavascriptCertV9: true,
@@ -73,6 +74,7 @@ const userProps = {
isDataAnalysisPyCertV7: true, isDataAnalysisPyCertV7: true,
isMachineLearningPyCertV7: true, isMachineLearningPyCertV7: true,
isRelationalDatabaseCertV8: true, isRelationalDatabaseCertV8: true,
isRelationalDatabaseCertV9: true,
isCollegeAlgebraPyCertV8: true, isCollegeAlgebraPyCertV8: true,
isFoundationalCSharpVertV8: true isFoundationalCSharpVertV8: true
}, },

View File

@@ -271,6 +271,7 @@ const defaultTestProps = {
isFullStackCert: false, isFullStackCert: false,
isHonest: false, isHonest: false,
isInfosecQaCert: false, isInfosecQaCert: false,
isPythonCertV9: false,
isQaCertV7: false, isQaCertV7: false,
isInfosecCertV7: false, isInfosecCertV7: false,
isJavascriptCertV9: false, isJavascriptCertV9: false,
@@ -282,6 +283,7 @@ const defaultTestProps = {
isDataAnalysisPyCertV7: false, isDataAnalysisPyCertV7: false,
isMachineLearningPyCertV7: false, isMachineLearningPyCertV7: false,
isRelationalDatabaseCertV8: false, isRelationalDatabaseCertV8: false,
isRelationalDatabaseCertV9: false,
isCollegeAlgebraPyCertV8: false, isCollegeAlgebraPyCertV8: false,
isFoundationalCSharpCertV8: false, isFoundationalCSharpCertV8: false,
username: 'developmentuser', username: 'developmentuser',

View File

@@ -49,6 +49,7 @@ const createCertifiedMap = ({
isJavascriptCertV9, isJavascriptCertV9,
isJsAlgoDataStructCert, isJsAlgoDataStructCert,
isInfosecQaCert, isInfosecQaCert,
isPythonCertV9,
isQaCertV7, isQaCertV7,
isInfosecCertV7, isInfosecCertV7,
isFrontEndLibsCert, isFrontEndLibsCert,
@@ -61,6 +62,7 @@ const createCertifiedMap = ({
isDataAnalysisPyCertV7, isDataAnalysisPyCertV7,
isMachineLearningPyCertV7, isMachineLearningPyCertV7,
isRelationalDatabaseCertV8, isRelationalDatabaseCertV8,
isRelationalDatabaseCertV9,
isCollegeAlgebraPyCertV8, isCollegeAlgebraPyCertV8,
isFoundationalCSharpCertV8, isFoundationalCSharpCertV8,
isJsAlgoDataStructCertV8 isJsAlgoDataStructCertV8
@@ -91,8 +93,8 @@ const createCertifiedMap = ({
[Certification.RespWebDesignV9]: isRespWebDesignCertV9, [Certification.RespWebDesignV9]: isRespWebDesignCertV9,
[Certification.JsV9]: isJavascriptCertV9, [Certification.JsV9]: isJavascriptCertV9,
[Certification.FrontEndDevLibsV9]: false, [Certification.FrontEndDevLibsV9]: false,
[Certification.PythonV9]: false, [Certification.PythonV9]: isPythonCertV9,
[Certification.RelationalDbV9]: false, [Certification.RelationalDbV9]: isRelationalDatabaseCertV9,
[Certification.BackEndDevApisV9]: false, [Certification.BackEndDevApisV9]: false,
[Certification.FullStackDeveloperV9]: false, [Certification.FullStackDeveloperV9]: false,
[Certification.A2English]: isA2EnglishCert, [Certification.A2English]: isA2EnglishCert,

View File

@@ -474,10 +474,12 @@ export type ClaimedCertifications = {
isFullStackCert: boolean; isFullStackCert: boolean;
isInfosecQaCert: boolean; isInfosecQaCert: boolean;
isJavascriptCertV9: boolean; isJavascriptCertV9: boolean;
isPythonCertV9: boolean;
isQaCertV7: boolean; isQaCertV7: boolean;
isInfosecCertV7: boolean; isInfosecCertV7: boolean;
isJsAlgoDataStructCert: boolean; isJsAlgoDataStructCert: boolean;
isRelationalDatabaseCertV8: boolean; isRelationalDatabaseCertV8: boolean;
isRelationalDatabaseCertV9: boolean;
isRespWebDesignCert: boolean; isRespWebDesignCert: boolean;
isRespWebDesignCertV9: boolean; isRespWebDesignCertV9: boolean;
isSciCompPyCertV7: boolean; isSciCompPyCertV7: boolean;

View File

@@ -2,7 +2,7 @@
"name": "Python Certification Exam", "name": "Python Certification Exam",
"blockLabel": "exam", "blockLabel": "exam",
"blockLayout": "link", "blockLayout": "link",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "exam-python-certification", "dashedName": "exam-python-certification",
"helpCategory": "Python", "helpCategory": "Python",
"challengeOrder": [ "challengeOrder": [

View File

@@ -2,7 +2,7 @@
"name": "Relational Databases Certification Exam", "name": "Relational Databases Certification Exam",
"blockLabel": "exam", "blockLabel": "exam",
"blockLayout": "link", "blockLayout": "link",
"isUpcomingChange": true, "isUpcomingChange": false,
"dashedName": "exam-relational-databases-certification", "dashedName": "exam-relational-databases-certification",
"helpCategory": "Backend Development", "helpCategory": "Backend Development",
"challengeOrder": [ "challengeOrder": [

View File

@@ -148,10 +148,10 @@
{ {
"chapterType": "exam", "chapterType": "exam",
"dashedName": "python-certification-exam", "dashedName": "python-certification-exam",
"comingSoon": true, "comingSoon": false,
"modules": [ "modules": [
{ {
"comingSoon": true, "comingSoon": false,
"dashedName": "python-certification-exam", "dashedName": "python-certification-exam",
"blocks": ["exam-python-certification"] "blocks": ["exam-python-certification"]
} }

View File

@@ -93,10 +93,10 @@
{ {
"chapterType": "exam", "chapterType": "exam",
"dashedName": "relational-databases-certification-exam", "dashedName": "relational-databases-certification-exam",
"comingSoon": true, "comingSoon": false,
"modules": [ "modules": [
{ {
"comingSoon": true, "comingSoon": false,
"dashedName": "relational-databases-certification-exam", "dashedName": "relational-databases-certification-exam",
"blocks": ["exam-relational-databases-certification"] "blocks": ["exam-relational-databases-certification"]
} }

View File

@@ -16,7 +16,7 @@ test.describe('Public profile certifications', () => {
await expect( await expect(
page.getByRole('link', { name: /View.+Certification/ }) page.getByRole('link', { name: /View.+Certification/ })
).toHaveCount(22); ).toHaveCount(24);
}); });
test('Should show claimed certifications if the username includes uppercase characters', async ({ test('Should show claimed certifications if the username includes uppercase characters', async ({
@@ -48,7 +48,7 @@ test.describe('Public profile certifications', () => {
await page.waitForURL('/certifiedboozer'); await page.waitForURL('/certifiedboozer');
await expect( await expect(
page.getByRole('link', { name: /View.+Certification/ }) page.getByRole('link', { name: /View.+Certification/ })
).toHaveCount(22); ).toHaveCount(24);
}); });
test.afterAll(() => { test.afterAll(() => {

View File

@@ -25,12 +25,12 @@ export enum Certification {
MachineLearningPy = 'machine-learning-with-python-v7', MachineLearningPy = 'machine-learning-with-python-v7',
CollegeAlgebraPy = 'college-algebra-with-python-v8', CollegeAlgebraPy = 'college-algebra-with-python-v8',
FoundationalCSharp = 'foundational-c-sharp-with-microsoft', FoundationalCSharp = 'foundational-c-sharp-with-microsoft',
PythonV9 = 'python-v9',
RelationalDbV9 = 'relational-databases-v9',
// Upcoming certifications // Upcoming certifications
RespWebDesignV9 = 'responsive-web-design-v9', RespWebDesignV9 = 'responsive-web-design-v9',
JsV9 = 'javascript-v9', JsV9 = 'javascript-v9',
FrontEndDevLibsV9 = 'front-end-development-libraries-v9', FrontEndDevLibsV9 = 'front-end-development-libraries-v9',
PythonV9 = 'python-v9',
RelationalDbV9 = 'relational-databases-v9',
BackEndDevApisV9 = 'back-end-development-and-apis-v9', BackEndDevApisV9 = 'back-end-development-and-apis-v9',
A2English = 'a2-english-for-developers', A2English = 'a2-english-for-developers',
FullStackDeveloperV9 = 'full-stack-developer-v9', FullStackDeveloperV9 = 'full-stack-developer-v9',
@@ -54,10 +54,12 @@ export function isCertification(x: string): x is Certification {
// "Current" certifications are the subset of standard certifications that are // "Current" certifications are the subset of standard certifications that are
// live and not legacy. // live and not legacy.
export const currentCertifications = [ export const currentCertifications = [
Certification.RespWebDesignV9,
Certification.JsV9,
Certification.A2English, Certification.A2English,
Certification.FoundationalCSharp Certification.FoundationalCSharp,
Certification.JsV9,
Certification.PythonV9,
Certification.RelationalDbV9,
Certification.RespWebDesignV9
] as const; ] as const;
// "Legacy" certifications are another class of standard certifications. They're // "Legacy" certifications are another class of standard certifications. They're
@@ -92,8 +94,6 @@ export const legacyFullStackCertification = [
// showUpcomingChanges is true. // showUpcomingChanges is true.
export const upcomingCertifications = [ export const upcomingCertifications = [
Certification.FrontEndDevLibsV9, Certification.FrontEndDevLibsV9,
Certification.PythonV9,
Certification.RelationalDbV9,
Certification.BackEndDevApisV9, Certification.BackEndDevApisV9,
Certification.FullStackDeveloperV9, Certification.FullStackDeveloperV9,
Certification.B1English, Certification.B1English,
@@ -199,10 +199,11 @@ export const certSlugTypeMap = {
[Certification.CollegeAlgebraPy]: 'isCollegeAlgebraPyCertV8', [Certification.CollegeAlgebraPy]: 'isCollegeAlgebraPyCertV8',
[Certification.FoundationalCSharp]: 'isFoundationalCSharpCertV8', [Certification.FoundationalCSharp]: 'isFoundationalCSharpCertV8',
[Certification.A2English]: 'isA2EnglishCert', [Certification.A2English]: 'isA2EnglishCert',
[Certification.PythonV9]: 'isPythonCertV9',
// upcoming [Certification.RelationalDbV9]: 'isRelationalDatabaseCertV9',
[Certification.RespWebDesignV9]: 'isRespWebDesignCertV9', [Certification.RespWebDesignV9]: 'isRespWebDesignCertV9',
[Certification.JsV9]: 'isJavascriptCertV9' [Certification.JsV9]: 'isJavascriptCertV9'
// upcoming
} as const; } as const;
// TODO: use i18n keys instead of hardcoded titles // TODO: use i18n keys instead of hardcoded titles

View File

@@ -234,6 +234,7 @@ module.exports.fullyCertifiedUser = {
isJsAlgoDataStructCertV8: true, isJsAlgoDataStructCertV8: true,
isApisMicroservicesCert: true, isApisMicroservicesCert: true,
isInfosecQaCert: true, isInfosecQaCert: true,
isPythonCertV9: true,
isQaCertV7: true, isQaCertV7: true,
isInfosecCertV7: true, isInfosecCertV7: true,
is2018FullStackCert: true, is2018FullStackCert: true,
@@ -241,6 +242,7 @@ module.exports.fullyCertifiedUser = {
isDataAnalysisPyCertV7: true, isDataAnalysisPyCertV7: true,
isMachineLearningPyCertV7: true, isMachineLearningPyCertV7: true,
isRelationalDatabaseCertV8: true, isRelationalDatabaseCertV8: true,
isRelationalDatabaseCertV9: true,
isCollegeAlgebraPyCertV8: true, isCollegeAlgebraPyCertV8: true,
isFoundationalCSharpCertV8: true, isFoundationalCSharpCertV8: true,
completedChallenges: [ completedChallenges: [