Feat(challenges): Adds the ability to test with async methods
This commit is contained in:
@ -3,6 +3,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
var frameId = window.__frameId;
|
var frameId = window.__frameId;
|
||||||
var frameReady = common[frameId + 'Ready$'] || { onNext() {} };
|
var frameReady = common[frameId + 'Ready$'] || { onNext() {} };
|
||||||
var Rx = document.Rx;
|
var Rx = document.Rx;
|
||||||
|
var helpers = Rx.helpers;
|
||||||
var chai = parent.chai;
|
var chai = parent.chai;
|
||||||
var source = document.__source;
|
var source = document.__source;
|
||||||
|
|
||||||
@ -37,33 +38,69 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
// add delay here for firefox to catch up
|
// add delay here for firefox to catch up
|
||||||
.delay(200)
|
.delay(200)
|
||||||
/* eslint-disable no-unused-vars */
|
/* eslint-disable no-unused-vars */
|
||||||
.map(({ text, testString }) => {
|
.flatMap(({ text, testString }) => {
|
||||||
const assert = chai.assert;
|
const assert = chai.assert;
|
||||||
/* eslint-enable no-unused-vars */
|
/* eslint-enable no-unused-vars */
|
||||||
const newTest = { text, testString };
|
const newTest = { text, testString };
|
||||||
let test;
|
let test;
|
||||||
|
let __result;
|
||||||
try {
|
try {
|
||||||
/* eslint-disable no-eval */
|
/* 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);
|
test = eval(testString);
|
||||||
/* eslint-enable no-eval */
|
/* eslint-enable no-eval */
|
||||||
if (typeof test === 'function') {
|
if (typeof test === 'function') {
|
||||||
// maybe sync/promise/observable
|
|
||||||
|
// we know that the test eval'ed to a function
|
||||||
|
// the function could expect a callback
|
||||||
|
// or it could return a promise/observable
|
||||||
|
// or it could still be sync
|
||||||
if (test.length === 0) {
|
if (test.length === 0) {
|
||||||
test();
|
// a function with length 0 means it expects 0 args
|
||||||
|
// We call it and store the result
|
||||||
|
// This result may be a promise or an observable or undefined
|
||||||
|
__result = test();
|
||||||
|
} else {
|
||||||
|
// if function takes arguments
|
||||||
|
// we expect it to be of the form
|
||||||
|
// function(cb) { /* ... */ }
|
||||||
|
// and callback has the following signature
|
||||||
|
// function(err) { /* ... */ }
|
||||||
|
__result = Rx.Observable.fromNodeCallback(test)();
|
||||||
}
|
}
|
||||||
// callback test
|
|
||||||
if (test.length === 1) {
|
if (helpers.isPromise(__result)) {
|
||||||
console.log('callback test');
|
// turn promise into an observable
|
||||||
|
__result = Rx.Observable.fromPromise(__result);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// test is not a function
|
||||||
|
// fill result with for compatibility
|
||||||
|
__result = Rx.Observable.of(null);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
newTest.err = e.message + '\n' + e.stack;
|
// something threw an uncaught error
|
||||||
|
// we catch here and wrap it in an observable
|
||||||
|
__result = Rx.Observable.throw(e);
|
||||||
}
|
}
|
||||||
if (!newTest.err) {
|
return __result
|
||||||
|
.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;
|
newTest.pass = true;
|
||||||
}
|
|
||||||
return newTest;
|
return newTest;
|
||||||
})
|
})
|
||||||
|
.catch(err => {
|
||||||
|
// we catch the error here to prevent the error from bubbling up
|
||||||
|
// and collapsing the pipe
|
||||||
|
newTest.err = err.message + '\n' + err.stack;
|
||||||
|
// RxJS catch expects an observable as a return
|
||||||
|
return Rx.Observable.of(err);
|
||||||
|
});
|
||||||
|
})
|
||||||
// gather tests back into an array
|
// gather tests back into an array
|
||||||
.toArray();
|
.toArray();
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user