* feat: crudely enables test to run solution code against React challenge (and passes!)
* feat: Updates comment
* feat: Adds React 2 and 3, validates challenges in app
* feat: Adds React 4, validates tests
* feat: Adds Peter's migrated challenge seed files for all challenges
* feat: Adds redux, react-redux imports, adds tests for React 7,
* feat: Adds tests for React 08
* fix(challenges): wrap reserved words in <code> and add tests
* feat: complete first two tests for React 9
* feat: modifies tests in React 09
* feat: Adds working tests for React 37, including async setState tests
* feat: Escape hatch to avoid async tests in automated test suite
* feat: Updates React 15 with working tests
* feat: build passes, yay
* feat: Provisions original code string in challenges and adds tests for React Redux 01
* fix(tests): add self-closing tags challenge, other small fixes
* fix(challenge): add react_10, some other stuff
* fix(challenges): update react 22, add react 23
* fix(challenges): react 5 and react 8
* feat: removes dependencies that will break in browser, will replace later
* feat: fix build
* feat: add redux 1
* fix(challenge): add react 24 tests
* feat: partial implemented Redux 2
* feat: migrate redux 3
* feat: Adds React-Redux 04 with working tests under npm test
* feat: Updates automated test runner, just provide all the dependencies. Adds Redux-Thunk.
* feat: Adds working tests for React Redux 07
* feat: redux challenge 4
* feat: migrate redux 5
* feat: redux 6
* feat: migrate Redux test 7
* fix(challenge): add react 25 tests
* feat: Adds tests for React 48, npm test does not pass...
* feat: Migrate Redux test 8
* fix(challenges): skip 26, add react 27 tests
* fix(challenges): add react 28 tests, replace function w/ => throughout, fix linter warnings
* feat: fixes (patches) hard to understand problem with automated test suite
* feat: updates async tests patch
* feat: adds converted tests for React 47
* feat: adds converted tests for React 46
* feat: Partially adds tests for React 43
* docs: adds TO-DO tests for React 43
* feat: migrates tests for React 42
* feat: migrates tests for React 41
* feat: migrates tests for React 39
* feat: Migrates tests for React 38, automated test script fails again!
* feat: migrates tests for React 32
* feat: QAs more React Redux challenge in FCC UI
* feat: Updates tests for React 7
* feat: Migrates React-Redux 3 tests and hardcodes deep-freeze dependency
* feat: migrates React Redux 05 tests
* feat: migrates React Redux 06 tests
* feat: Migrates React Redux 10
* feat: Migrates tests for React 16
* feat: Migrates React 17 tests
* feat: Migrates React 18 tests
* feat: Migrates React 19 tests
* feat: Migrates React 19 tests
* feat: fixing usage of code, replace with editor.getOriginalCode
* feat: Migrates React 21 tests
* feat: Finishes migration of React 09
* fix(challenges): add react 45 tests 💀
* feat: Adds React 11 tests
* feat: Migrates React 50 tests
* feat: Re-enables original code in FCC editor, QAs challenges blocked by original code
* feat: hacks head tail code in editor test environment
* feat: updates React 20 head code
* feat: QAs React Redux 07 in UI
* fix(challenges): add React 29 tests
* fix(challenges): add React 30 tests
* feat: updates async tests
* feat: Migrates React 12, gets ReactDOM challenges working and QAs them
* feat: Migrates React 13 tests
* feat: Migrates tests for React 14 and updates challenge description formatting
* feat: Refactors 2nd test for Redux 02
* feat: Migrates React 33
* feat: Removes React 26 and 43
* feat: Adds React 34 from Kevin
* fix(challenges): add React 31 & 35 tests (thanks Kevin)
* feat: Migrate Redux challenge 10 - pass both UI QA and terminal test
* fix(challenge): add react 40 tests
* feat: Migrates React Redux 02 tests
* feat: Migrates React Redux 08 and fixes async syntax in React challenge
* fix(challenge): add react 49 tests with caveat
* feat: fixes React 49 tests and adds first tests for React Redux 09
* feat: Migrate Redux 11 - pass both terminal test and UI test
* feat: Migrate Redux 12 - passing both UI test and terminal test
* feat: Migrate Redux 13 - passing both terminal and UI tests
* feat: Adding in code tags for previous redux challenges - terminal and UI tests pass
* feat: Migrates React Redux 09 and React 44 (thanks Kevin)
* feat: fix code tag issues - passed UI and terminal tests
* feat: Migrates Redux 14 tests
* feat: Migrates Redux 14
* feat: Migrates Redux 15
* feat: Migrates Redux 17
* feat: Final migration and QA of Redux, except for Redux 9
* feat: migrates React 36 and QAs
* feat: Rewrites Redux 09 and migrates
* feat: refactors pull request and cleans up code
* style(challenges): QA React challenges
* style(challenges): QA react challenges
* fix(challenges): fix react 41 and 45 tests
* style(challenges): QA redux challenges
* style(challenges): QA react and redux challenges
* fix(seed/react): Move head/tail to files
* fix(seed/redux): Move head/tail to file level
* chore(packages): Move jsdom to dev deps
* fix(seed/react/redux): Async funcs
make async func defined
* fix(seed): %s/editor.getUserCode/getUserInput/gc
* fix(Challenges/build): Make sure head/tail is bundled and transformed
* feat(Challenges.react): Add tail to render component
* chore(seed): Disable modern challenge testing for now
We will put these on beta while we update the auto testing framework
151 lines
4.7 KiB
JavaScript
151 lines
4.7 KiB
JavaScript
document.addEventListener('DOMContentLoaded', function() {
|
|
var testTimeout = 5000;
|
|
var Rx = document.Rx;
|
|
var frameReady = document.__frameReady;
|
|
var helpers = Rx.helpers;
|
|
var chai = parent.chai;
|
|
var source = document.__source;
|
|
var __getUserInput = document.__getUserInput || (x => x);
|
|
var checkChallengePayload = document.__checkChallengePayload;
|
|
|
|
// Fake Deep Equal dependency
|
|
/* eslint-disable no-unused-vars */
|
|
const DeepEqual = (a, b) => JSON.stringify(a) === JSON.stringify(b);
|
|
|
|
// Hardcode Deep Freeze dependency
|
|
var DeepFreeze = (o) => {
|
|
Object.freeze(o);
|
|
Object.getOwnPropertyNames(o).forEach(function(prop) {
|
|
if (o.hasOwnProperty(prop)
|
|
&& o[prop] !== null
|
|
&& (
|
|
typeof o[prop] === 'object' ||
|
|
typeof o[prop] === 'function'
|
|
)
|
|
&& !Object.isFrozen(o[prop])) {
|
|
DeepFreeze(o[prop]);
|
|
}
|
|
});
|
|
return o;
|
|
};
|
|
|
|
if (document.Enzyme) {
|
|
window.Enzyme = document.Enzyme;
|
|
}
|
|
|
|
document.__getJsOutput = function getJsOutput() {
|
|
if (window.__err) {
|
|
return window.__err;
|
|
}
|
|
let output;
|
|
try {
|
|
/* eslint-disable no-eval */
|
|
output = eval(source);
|
|
/* eslint-enable no-eval */
|
|
} catch (e) {
|
|
output = e.message + '\n' + e.stack;
|
|
window.__err = e;
|
|
}
|
|
return output;
|
|
};
|
|
|
|
document.__runTests = function runTests(tests = []) {
|
|
/* eslint-disable no-unused-vars */
|
|
const code = source;
|
|
const editor = {
|
|
getValue() { return source; }
|
|
};
|
|
/* eslint-enable no-unused-vars */
|
|
if (window.__err) {
|
|
return Rx.Observable.from(tests)
|
|
.map(test => {
|
|
return {
|
|
...test,
|
|
err: window.__err.message + '\n' + window.__err.stack,
|
|
message: window.__err.message,
|
|
stack: window.__err.stack
|
|
};
|
|
})
|
|
.toArray()
|
|
.do(() => { window.__err = null; });
|
|
}
|
|
|
|
// Iterate through the test one at a time
|
|
// on new stacks
|
|
return Rx.Observable.from(tests, null, null, Rx.Scheduler.default)
|
|
// add delay here for firefox to catch up
|
|
.delay(200)
|
|
/* eslint-disable no-unused-vars */
|
|
.flatMap(({ text, testString }) => {
|
|
const assert = chai.assert;
|
|
const getUserInput = __getUserInput;
|
|
/* eslint-enable no-unused-vars */
|
|
const newTest = { text, testString };
|
|
let test;
|
|
let __result;
|
|
|
|
// uncomment the following line to inspect
|
|
// the framerunner as it runs tests
|
|
// make sure the dev tools console is open
|
|
// debugger;
|
|
try {
|
|
/* eslint-disable no-eval */
|
|
// eval test string to actual JavaScript
|
|
// This return can be a function
|
|
// i.e. function() { assert(true, 'happy coding'); }
|
|
test = eval(testString);
|
|
/* eslint-enable no-eval */
|
|
if (typeof test === 'function') {
|
|
|
|
// all async tests must return a promise or observable
|
|
// sync tests can return Any type
|
|
__result = test(getUserInput);
|
|
|
|
if (helpers.isPromise(__result)) {
|
|
// turn promise into an observable
|
|
__result = Rx.Observable.fromPromise(__result);
|
|
}
|
|
}
|
|
|
|
if (!__result || typeof __result.subscribe !== 'function') {
|
|
// make sure result is an observable
|
|
__result = Rx.Observable.of(null);
|
|
}
|
|
} catch (e) {
|
|
// something threw an uncaught error
|
|
// we catch here and wrap it in an observable
|
|
__result = Rx.Observable.throw(e);
|
|
}
|
|
return __result
|
|
.timeout(testTimeout)
|
|
.map(() => {
|
|
// we don't need the result of a promise/observable/cb here
|
|
// all data asserts should happen further up the chain
|
|
// mark test as passing
|
|
newTest.pass = true;
|
|
return newTest;
|
|
})
|
|
.catch(err => {
|
|
// we catch the error here to prevent the error from bubbling up
|
|
// and collapsing the pipe
|
|
let message = (err.message || '');
|
|
const assertIndex = message.indexOf(': expected');
|
|
if (assertIndex !== -1) {
|
|
message = message.slice(0, assertIndex);
|
|
}
|
|
message = message.replace(/<code>(.*?)<\/code>/g, '$1');
|
|
newTest.err = err.message + '\n' + err.stack;
|
|
newTest.stack = err.stack;
|
|
newTest.message = message;
|
|
// RxJS catch expects an observable as a return
|
|
return Rx.Observable.of(newTest);
|
|
});
|
|
})
|
|
// gather tests back into an array
|
|
.toArray();
|
|
};
|
|
|
|
// notify that the window methods are ready to run
|
|
frameReady.onNext({ checkChallengePayload });
|
|
});
|