fix: simplify language specific testing

Prevents multiple languages' challenges from being tested at once.
This commit is contained in:
Oliver Eyton-Williams
2020-08-13 17:05:52 +02:00
committed by Mrugesh Mohapatra
parent 45e4a770a2
commit 7055211959
6 changed files with 41 additions and 60 deletions

View File

@ -4,7 +4,7 @@ const through2 = require('through2');
const { locale } = require('../config/env.json');
const { getChallengesForLang } = require('./getChallenges');
const { testedLangs } = require('./utils');
const { testedLang } = require('./utils');
const lintMarkdown = require('../tools/scripts/lint');
/**
@ -28,7 +28,7 @@ function watchFiles() {
}
function lint() {
return gulp.src(globLangs(testedLangs()), { read: false }).pipe(
return gulp.src(globLang(testedLang()), { read: false }).pipe(
through2.obj(function obj(file, enc, next) {
lintMarkdown(file, next);
})
@ -41,8 +41,8 @@ const defaultTask = gulp.series(generateCurriculum, watchFiles);
* Helper functions
**/
function globLangs(langs) {
return langs.map(lang => `./challenges/${lang}/**/*.md`);
function globLang(lang) {
return `./challenges/${lang}/**/*.md`;
}
gulp.task('default', defaultTask);

View File

@ -46,7 +46,7 @@ const {
const { dasherize } = require('../../utils/slugs');
const { testedLangs } = require('../utils');
const { testedLang } = require('../utils');
const {
buildDOMChallenge,
@ -124,22 +124,15 @@ async function setup() {
global.Worker = createPseudoWorker(await newPageContext(browser));
page = await newPageContext(browser);
await page.setViewport({ width: 300, height: 150 });
const testLangs = testedLangs();
if (testLangs.length > 1)
throw Error(
`Testing more than one language at once is not currently supported
please change the TEST_CHALLENGES_FOR_LANGS env variable to a single language`
);
const challengesForLang = await Promise.all(
testLangs.map(lang => getChallenges(lang))
);
const lang = testedLang();
let challenges = await getChallenges(lang);
// the next few statements create a list of all blocks and superblocks
// as they appear in the list of challenges
const blocks = challengesForLang[0].challenges.map(({ block }) => block);
const superBlocks = challengesForLang[0].challenges.map(
({ superBlock }) => superBlock
);
const blocks = challenges.map(({ block }) => block);
const superBlocks = challenges.map(({ superBlock }) => superBlock);
const targetBlockStrings = [...new Set(blocks)];
const targetSuperBlockStrings = [...new Set(superBlocks)];
@ -151,11 +144,11 @@ please change the TEST_CHALLENGES_FOR_LANGS env variable to a single language`
).bestMatch.target;
console.log(`\nsuperBlock being tested: ${filter}`);
challengesForLang[0].challenges = challengesForLang[0].challenges.filter(
challenges = challenges.filter(
challenge => challenge.superBlock === filter
);
if (!challengesForLang[0].challenges.length) {
if (!challenges.length) {
throw new Error(`No challenges found with superBlock "${filter}"`);
}
}
@ -167,30 +160,26 @@ please change the TEST_CHALLENGES_FOR_LANGS env variable to a single language`
).bestMatch.target;
console.log(`\nblock being tested: ${filter}`);
challengesForLang[0].challenges = challengesForLang[0].challenges.filter(
challenge => challenge.block === filter
);
challenges = challenges.filter(challenge => challenge.block === filter);
if (!challengesForLang[0].challenges.length) {
if (!challenges.length) {
throw new Error(`No challenges found with block "${filter}"`);
}
}
const meta = {};
for (const { lang, challenges } of challengesForLang) {
meta[lang] = {};
for (const challenge of challenges) {
const dashedBlockName = dasherize(challenge.block);
if (!meta[dashedBlockName]) {
meta[lang][dashedBlockName] = (await getMetaForBlock(
meta[dashedBlockName] = (await getMetaForBlock(
dashedBlockName
)).challengeOrder;
}
}
}
return {
meta,
challengesForLang
challenges,
lang
};
}
@ -204,7 +193,7 @@ function cleanup() {
spinner.stop();
}
function runTests({ challengesForLang, meta }) {
function runTests(challengeData) {
// rethrow unhandled rejections to make sure the tests exit with -1
process.on('unhandledRejection', err => {
throw err;
@ -214,9 +203,7 @@ function runTests({ challengesForLang, meta }) {
after(function() {
cleanup();
});
for (const challenge of challengesForLang) {
populateTestsForLang(challenge, meta);
}
populateTestsForLang(challengeData);
});
spinner.text = 'Testing';
run();
@ -233,7 +220,7 @@ async function getChallenges(lang) {
return [...challengeArray, ...flatten(challengesForBlock)];
}, [])
);
return { lang, challenges };
return challenges;
}
function validateBlock(challenge) {
@ -245,7 +232,7 @@ function validateBlock(challenge) {
}
}
function populateTestsForLang({ lang, challenges }, meta) {
function populateTestsForLang({ lang, challenges, meta }) {
const mongoIds = new MongoIds();
const challengeTitles = new ChallengeTitles();
const validateChallenge = challengeSchemaValidator(lang);
@ -257,7 +244,7 @@ function populateTestsForLang({ lang, challenges }, meta) {
describe(challenge.block || 'No block', function() {
describe(challenge.title || 'No title', function() {
it('Matches a title in meta.json', function() {
const index = meta[lang][dashedBlockName].findIndex(
const index = meta[dashedBlockName].findIndex(
arr => arr[1] === challenge.title
);
@ -269,7 +256,7 @@ function populateTestsForLang({ lang, challenges }, meta) {
});
it('Matches an ID in meta.json', function() {
const index = meta[lang][dashedBlockName].findIndex(
const index = meta[dashedBlockName].findIndex(
arr => arr[0] === challenge.id
);

View File

@ -1,23 +1,18 @@
const path = require('path');
require('dotenv').config({ path: path.resolve(__dirname, '../.env') });
const supportedLangs = [
'arabic',
'chinese',
'english',
'portuguese',
'russian',
'spanish'
];
const supportedLangs = ['chinese', 'english'];
exports.testedLangs = function testedLangs() {
if (process.env.TEST_CHALLENGES_FOR_LANGS) {
const filterLangs = process.env.TEST_CHALLENGES_FOR_LANGS.split(',').map(
lang => lang.trim().toLowerCase()
);
return supportedLangs.filter(lang => filterLangs.includes(lang));
exports.testedLang = function testedLang() {
if (process.env.LOCALE) {
if (supportedLangs.includes(process.env.LOCALE)) {
return process.env.LOCALE;
} else {
return [...supportedLangs];
throw Error(`${process.env.LOCALE} is not a supported language.
Before the site can be built, this language needs to be manually approved`);
}
} else {
throw Error('LOCALE must be set for testing');
}
};

View File

@ -357,7 +357,7 @@ You are also able to test one challenge individually by performing the following
Once you have verified that each challenge you've worked on passes the tests, [please create a pull request](https://github.com/freeCodeCamp/freeCodeCamp/blob/master/docs/how-to-open-a-pull-request.md).
> [!TIP]
> You can set the environment variable `TEST_CHALLENGES_FOR_LANGS` in the `.env` to the language of the challenge(s) you need to test.
> You can set the environment variable `LOCALE` in the `.env` to the language of the challenge(s) you need to test.
>
> The currently accepted values are `english` and `chinese`, with `english` being set by default.

View File

@ -311,7 +311,7 @@ function myFunc() {
Przed utworzeniem [prośby o wyciągnięcie](how-to-open-a-pull-request.md) dla Twoich zmian, musisz sprawdzić, czy wprowadzone zmiany nie powodują nieumyślnie problemów z wyzwaniem. Aby przetestować wszystkie wyzwania, należy wykonać "test npm run test:curriculum". Aby zaoszczędzić czas możesz ograniczyć testy do jednego wyzwania wykonując następujące kroki:
1. W pliku `.env` ustaw zmienną środowiskową `TEST_CHALLENGES_FOR_LANGS` na język wyzwania (wyzwań), które musisz przetestować. Obecnie akceptowane wartości to `angielski`, `arabski`, `chiński`, `portugalski`, `rosyjski` i `hiszpański`.
1. W pliku `.env` ustaw zmienną środowiskową `LOCALE` na język wyzwania (wyzwań), które musisz przetestować. Obecnie akceptowane wartości to `angielski`, `arabski`, `chiński`, `portugalski`, `rosyjski` i `hiszpański`.
2. Przełączyć do katalogu `curriculum`:

View File

@ -46,7 +46,6 @@ WEBHOOK_PROXY_URL=''
LOCALE=english
TEST_CHALLENGES_FOR_LANGS=english
DOCKER_HOST_LOCATION=localhost
GHOST_CLIENT_KEY=123abc