chore: import upstream snapshot with attribution
i18n - Build Validation / Validate i18n Builds (24) (push) Has been cancelled
CI - Node.js / Lint (24) (push) Has been cancelled
CI - Node.js / Build (24) (push) Has been cancelled
CI - Node.js / Test (24) (push) Has been cancelled
CI - Node.js / Test - Upcoming Changes (24) (push) Has been cancelled
CI - Node.js / Test - i18n (italian, 24) (push) Has been cancelled
CI - Node.js / Test - i18n (portuguese, 24) (push) Has been cancelled
CD - Docker - GHCR Images / Build and Push Images (push) Has been cancelled
i18n - Build Validation / Validate i18n Builds (24) (push) Has been cancelled
CI - Node.js / Lint (24) (push) Has been cancelled
CI - Node.js / Build (24) (push) Has been cancelled
CI - Node.js / Test (24) (push) Has been cancelled
CI - Node.js / Test - Upcoming Changes (24) (push) Has been cancelled
CI - Node.js / Test - i18n (italian, 24) (push) Has been cancelled
CI - Node.js / Test - i18n (portuguese, 24) (push) Has been cancelled
CD - Docker - GHCR Images / Build and Push Images (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
export const prodAnalyticsId = 'GTM-57R6KJM';
|
||||
export const devAnalyticsId = 'GTM-WSS47LM';
|
||||
@@ -0,0 +1,77 @@
|
||||
import path from 'node:path';
|
||||
import fs from 'node:fs';
|
||||
import { describe, test, expect } from 'vitest';
|
||||
|
||||
import { getContentDir } from '@freecodecamp/curriculum/file-handler';
|
||||
import { buildCertification } from '@freecodecamp/curriculum/build-certification';
|
||||
|
||||
import { allCerts } from './cert-and-project-map';
|
||||
|
||||
describe('certifications', () => {
|
||||
const certificationsDir = path.resolve(
|
||||
getContentDir('english'),
|
||||
'certifications'
|
||||
);
|
||||
|
||||
const certificationFiles = fs.readdirSync(certificationsDir);
|
||||
|
||||
certificationFiles.forEach(filename => {
|
||||
test(`${filename} should have matching items in cert-and-project-map`, () => {
|
||||
const filePath = path.join(certificationsDir, filename);
|
||||
const result = buildCertification(filePath);
|
||||
|
||||
const certData = result.challenges[0];
|
||||
const certTests = certData.tests;
|
||||
|
||||
const matchingCert = allCerts.find(cert => cert.id === certData.id);
|
||||
|
||||
expect(
|
||||
matchingCert,
|
||||
`Cert ID ${certData.id} not found in allCerts.`
|
||||
).toBeDefined();
|
||||
expect(
|
||||
matchingCert,
|
||||
`Matching cert has no 'projects' property`
|
||||
).toHaveProperty('projects');
|
||||
|
||||
// skip legacy-full-stack as it has no projects
|
||||
if (filename === 'legacy-full-stack.yml') {
|
||||
return;
|
||||
}
|
||||
|
||||
expect(
|
||||
Array.isArray(matchingCert?.projects),
|
||||
`Matching cert 'projects' is not an array`
|
||||
).toBe(true);
|
||||
|
||||
const certProjects = matchingCert?.projects;
|
||||
|
||||
expect(
|
||||
certProjects?.length,
|
||||
`Project count mismatch: allCerts has ${certProjects?.length} projects, YAML has ${certTests.length} tests`
|
||||
).toBe(certTests.length);
|
||||
|
||||
certTests.forEach((test, i) => {
|
||||
expect(
|
||||
test,
|
||||
`Test at index ${i} in missing id property`
|
||||
).toHaveProperty('id');
|
||||
expect(
|
||||
test,
|
||||
`Test at index ${i} missing title property`
|
||||
).toHaveProperty('title');
|
||||
|
||||
const matchingProject = certProjects?.[i];
|
||||
|
||||
expect(
|
||||
matchingProject,
|
||||
`No project found at index ${i} for test ${test.id}`
|
||||
).toBeDefined();
|
||||
expect(
|
||||
matchingProject?.id,
|
||||
`Project ID mismatch at index ${i}: allCerts has "${matchingProject?.id}", YAML has "${test.id}"`
|
||||
).toBe(test.id);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,130 @@
|
||||
{
|
||||
"aa-test": {
|
||||
"defaultValue": false
|
||||
},
|
||||
"aa-test-in-component": {
|
||||
"defaultValue": false
|
||||
},
|
||||
"rdb-codespaces-instructions": {
|
||||
"defaultValue": true
|
||||
},
|
||||
"rdb-local-instructions": {
|
||||
"defaultValue": true
|
||||
},
|
||||
"rdb-ona-instructions": {
|
||||
"defaultValue": true
|
||||
},
|
||||
"landing-top-skill-focused": {
|
||||
"defaultValue": false,
|
||||
"rules": [
|
||||
{
|
||||
"coverage": 1,
|
||||
"hashAttribute": "id",
|
||||
"seed": "landing-top-skill-focused",
|
||||
"hashVersion": 2,
|
||||
"variations": [false, true],
|
||||
"weights": [0.5, 0.5],
|
||||
"key": "landing-top-skill-focused",
|
||||
"meta": [
|
||||
{
|
||||
"key": "0",
|
||||
"name": "Control"
|
||||
},
|
||||
{
|
||||
"key": "1",
|
||||
"name": "Variation 1"
|
||||
}
|
||||
],
|
||||
"phase": "0",
|
||||
"name": "tests the conversion rate of the new design comparing to the old one"
|
||||
}
|
||||
]
|
||||
},
|
||||
"replace-20-with-25": {
|
||||
"defaultValue": false,
|
||||
"rules": [
|
||||
{
|
||||
"coverage": 1,
|
||||
"hashAttribute": "id",
|
||||
"seed": "replace-20-with-25",
|
||||
"hashVersion": 2,
|
||||
"variations": [false, true],
|
||||
"weights": [0.5, 0.5],
|
||||
"key": "replace-20-with-25",
|
||||
"meta": [
|
||||
{
|
||||
"key": "0",
|
||||
"name": "Control"
|
||||
},
|
||||
{
|
||||
"key": "1",
|
||||
"name": "Variation 1"
|
||||
}
|
||||
],
|
||||
"phase": "0",
|
||||
"name": "stg replace 20 with 25"
|
||||
}
|
||||
]
|
||||
},
|
||||
"show-modal-randomly": {
|
||||
"defaultValue": false,
|
||||
"rules": [
|
||||
{
|
||||
"coverage": 1,
|
||||
"hashAttribute": "id",
|
||||
"seed": "show-modal-randomly",
|
||||
"hashVersion": 2,
|
||||
"variations": [false, true],
|
||||
"weights": [0.5, 0.5],
|
||||
"key": "show-modal-randomly",
|
||||
"meta": [
|
||||
{
|
||||
"key": "0",
|
||||
"name": "Control"
|
||||
},
|
||||
{
|
||||
"key": "1",
|
||||
"name": "Variation 1"
|
||||
}
|
||||
],
|
||||
"phase": "0",
|
||||
"name": "stg show modal randomly"
|
||||
}
|
||||
]
|
||||
},
|
||||
"landing-two-button-cta": {
|
||||
"defaultValue": false,
|
||||
"rules": [
|
||||
{
|
||||
"coverage": 1,
|
||||
"hashAttribute": "id",
|
||||
"seed": "landing-two-button-cta",
|
||||
"hashVersion": 2,
|
||||
"variations": [false, true],
|
||||
"weights": [0.5, 0.5],
|
||||
"key": "landing-two-button-cta",
|
||||
"meta": [
|
||||
{
|
||||
"key": "0",
|
||||
"name": "Control"
|
||||
},
|
||||
{
|
||||
"key": "1",
|
||||
"name": "Variation 1"
|
||||
}
|
||||
],
|
||||
"phase": "0",
|
||||
"name": "prod-landing-two-button-cta"
|
||||
}
|
||||
]
|
||||
},
|
||||
"classroom-mode": {
|
||||
"defaultValue": false
|
||||
},
|
||||
"disabled_blocks": {
|
||||
"defaultValue": []
|
||||
},
|
||||
"show-socrates": {
|
||||
"defaultValue": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
export const MAX_MOBILE_WIDTH = 767;
|
||||
export const EX_SMALL_VIEWPORT_HEIGHT = 300;
|
||||
export const TOOL_PANEL_HEIGHT = 37;
|
||||
export const SEARCH_EXPOSED_WIDTH = 980;
|
||||
export const GITHUB_LOCATION = 'https://github.com/freeCodeCamp';
|
||||
Reference in New Issue
Block a user