From c43dfe1eb7678d04dc9a6f5b29335efb957fdbe2 Mon Sep 17 00:00:00 2001 From: Valeriy S Date: Mon, 10 Dec 2018 10:00:26 +0300 Subject: [PATCH] feat(client): execute backend challenge saga --- .../redux/execute-challenge-saga.js | 39 +++++++++++++++---- .../src/templates/Challenges/utils/build.js | 8 ++-- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/client/src/templates/Challenges/redux/execute-challenge-saga.js b/client/src/templates/Challenges/redux/execute-challenge-saga.js index d3ab38b39a..b2e38edc97 100644 --- a/client/src/templates/Challenges/redux/execute-challenge-saga.js +++ b/client/src/templates/Challenges/redux/execute-challenge-saga.js @@ -20,7 +20,11 @@ import { challengeFilesSelector } from './'; -import { buildJSFromFiles, buildFromFiles } from '../utils/build'; +import { + buildJSFromFiles, + buildFromFiles, + buildBackendChallenge +} from '../utils/build'; import { challengeTypes } from '../../../../utils/challengeTypes'; @@ -39,11 +43,6 @@ function* ExecuteChallengeSaga() { const { js, bonfire, backend } = challengeTypes; const { challengeType } = yield select(challengeMetaSelector); - // TODO: ExecuteBackendChallengeSaga - if (challengeType === backend) { - return; - } - yield put(initLogs()); yield put(initConsole('// running tests')); @@ -54,7 +53,7 @@ function* ExecuteChallengeSaga() { testResults = yield ExecuteJSChallengeSaga(); break; case backend: - // yield ExecuteBackendChallengeSaga(); + testResults = yield ExecuteBackendChallengeSaga(); break; default: testResults = yield ExecuteDOMChallengeSaga(); @@ -119,6 +118,32 @@ function* ExecuteDOMChallengeSaga() { return testResults; } +// TODO: use a web worker +function* ExecuteBackendChallengeSaga() { + const state = yield select(); + const ctx = yield call(buildBackendChallenge, state); + const consoleProxy = yield channel(); + + yield call(createTestFrame, state, ctx, consoleProxy); + + const testResults = yield call(executeTests, { + testRunner: { + execute({ script }, testTimeout) { + return Promise.race([ + runTestInTestFrame(document, script), + new Promise((_, reject) => + setTimeout(() => reject('timeout'), testTimeout) + ) + ]); + }, + killWorker() {} + } + }); + + consoleProxy.close(); + return testResults; +} + function* updateMainSaga() { try { const { html, modern } = challengeTypes; diff --git a/client/src/templates/Challenges/utils/build.js b/client/src/templates/Challenges/utils/build.js index c744eb6bdc..80abd12b55 100644 --- a/client/src/templates/Challenges/utils/build.js +++ b/client/src/templates/Challenges/utils/build.js @@ -1,4 +1,3 @@ -import { of } from 'rxjs'; import { flow } from 'lodash'; import { throwers } from '../rechallenge/throwers'; @@ -111,9 +110,8 @@ export function buildBackendChallenge(state) { const { solution: { value: url } } = backendFormValuesSelector(state); - return of({ + return { build: frameRunner, - sources: { url }, - checkChallengePayload: { solution: url } - }); + sources: { url } + }; }