diff --git a/karate-core/src/main/java/com/intuit/karate/core/ScenarioEngine.java b/karate-core/src/main/java/com/intuit/karate/core/ScenarioEngine.java index 6fc31b2a1..cedcb576f 100644 --- a/karate-core/src/main/java/com/intuit/karate/core/ScenarioEngine.java +++ b/karate-core/src/main/java/com/intuit/karate/core/ScenarioEngine.java @@ -116,6 +116,14 @@ public class ScenarioEngine { protected JsEngine JS; + /** + * Return current JsEngine + * @return Js engine + */ + public JsEngine getJS() { + return JS; + } + public ScenarioEngine(Config config, ScenarioRuntime runtime, Map vars, Logger logger) { this.config = config; this.runtime = runtime; diff --git a/karate-core/src/main/java/com/intuit/karate/graal/JsFunction.java b/karate-core/src/main/java/com/intuit/karate/graal/JsFunction.java index c50f837ff..fead4cd69 100644 --- a/karate-core/src/main/java/com/intuit/karate/graal/JsFunction.java +++ b/karate-core/src/main/java/com/intuit/karate/graal/JsFunction.java @@ -138,7 +138,13 @@ public Object newInstance(Value... args) { for (int i = 0; i < newArgs.length; i++) { newArgs[i] = JsValue.fromJava(args[i]); } - return new JsValue(value.execute(newArgs)).value; + JsEngine je = ScenarioEngine.get().getJS(); // get JsEngine + Value wrappedWithParentheses = je.evalForValue( + "(" + + value.getSourceLocation().getCharacters() + + ")"); // Evaluate '(function)' to get function value + // execute the function with arguments + return new JsValue(wrappedWithParentheses.execute(newArgs)).value; } } diff --git a/karate-e2e-tests/src/test/java/responseStatus/ExamplesTest.java b/karate-e2e-tests/src/test/java/responseStatus/ExamplesTest.java new file mode 100644 index 000000000..4b9f1d36c --- /dev/null +++ b/karate-e2e-tests/src/test/java/responseStatus/ExamplesTest.java @@ -0,0 +1,18 @@ +package responseStatus; + +import com.intuit.karate.Results; +import com.intuit.karate.Runner; +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + +public class ExamplesTest { + @Test + void testParallel() { + Results results = Runner.path("classpath:responseStatus") + .outputCucumberJson(true) + .outputHtmlReport(true) + .configDir("src/test/java/responseStatus") + .parallel(1); + assertEquals(0, results.getFailCount(), results.getErrorMessages()); + } +} diff --git a/karate-e2e-tests/src/test/java/responseStatus/all.feature b/karate-e2e-tests/src/test/java/responseStatus/all.feature new file mode 100644 index 000000000..ae2ffffba --- /dev/null +++ b/karate-e2e-tests/src/test/java/responseStatus/all.feature @@ -0,0 +1,16 @@ +Feature: responseStatus variable tests + Scenario: config js test + Given url 'https://www.baidu.com' + When method GET + Then status 200 + + * print 'responseStatus: ' + responseStatus + * assert isResponseStatus200_config() + + Scenario: call test + Given url 'https://www.baidu.com' + When method GET + Then status 200 + + * print 'responseStatus: ' + responseStatus + * assert isResponseStatus200_call() \ No newline at end of file diff --git a/karate-e2e-tests/src/test/java/responseStatus/call-once.feature b/karate-e2e-tests/src/test/java/responseStatus/call-once.feature new file mode 100644 index 000000000..f45b8401c --- /dev/null +++ b/karate-e2e-tests/src/test/java/responseStatus/call-once.feature @@ -0,0 +1,15 @@ +#@ignore +Feature:: common setup + + Scenario: common setup + + * def isResponseStatus200_callOnce = + """ + function() { + if( responseStatus != 200){ + karate.log("Retry since expectedStatus 200 != actual responseStatus: " + responseStatus); + return false; + } + return true; + } + """ \ No newline at end of file diff --git a/karate-e2e-tests/src/test/java/responseStatus/call-single.feature b/karate-e2e-tests/src/test/java/responseStatus/call-single.feature new file mode 100644 index 000000000..671abd613 --- /dev/null +++ b/karate-e2e-tests/src/test/java/responseStatus/call-single.feature @@ -0,0 +1,16 @@ + +#@ignore +Feature:: common setup + + Scenario: common setup + + * def isResponseStatus200_callSingle = + """ + function() { + if( responseStatus != 200){ + karate.log("Retry since expectedStatus 200 != actual responseStatus: " + responseStatus); + return false; + } + return true; + } + """ \ No newline at end of file diff --git a/karate-e2e-tests/src/test/java/responseStatus/call.feature b/karate-e2e-tests/src/test/java/responseStatus/call.feature new file mode 100644 index 000000000..5cf81d1a9 --- /dev/null +++ b/karate-e2e-tests/src/test/java/responseStatus/call.feature @@ -0,0 +1,15 @@ +#@ignore +Feature:: common setup + + Scenario: common setup + + * def isResponseStatus200_call = + """ + function() { + if( responseStatus != 200){ + karate.log("Retry since expectedStatus 200 != actual responseStatus: " + responseStatus); + return false; + } + return true; + } + """ \ No newline at end of file diff --git a/karate-e2e-tests/src/test/java/responseStatus/karate-config.js b/karate-e2e-tests/src/test/java/responseStatus/karate-config.js new file mode 100644 index 000000000..76697e3f8 --- /dev/null +++ b/karate-e2e-tests/src/test/java/responseStatus/karate-config.js @@ -0,0 +1,33 @@ +function fn() { + var env = karate.env; // get system property 'karate.env' + karate.log('karate.env system property was:', env); + if (!env) { + env = 'dev'; + } + var config = { + env: env, + myVarName: 'someValue' + } + if (env == 'dev') { + // customize + // e.g. config.foo = 'bar'; + } else if (env == 'e2e') { + // customize + } + + console.log("HELLO WORLD"); + + config = karate.callSingle('classpath:responseStatus/call-single.feature', config); + config = karate.call('classpath:responseStatus/call.feature', config); + + config.isResponseStatus200_config = function () { + console.log(Object.keys(this)); + if (responseStatus != 200) { + karate.log("Retry since expectedStatus 200 != actual responseStatus: " + responseStatus); + return false; + } + return true; + } + + return config; +} \ No newline at end of file diff --git a/karate-e2e-tests/src/test/java/responseStatus/local.feature b/karate-e2e-tests/src/test/java/responseStatus/local.feature new file mode 100644 index 000000000..083945205 --- /dev/null +++ b/karate-e2e-tests/src/test/java/responseStatus/local.feature @@ -0,0 +1,48 @@ +#This example is in its own file since it prevents all tests from reading responseStatus +Feature: responseStatus callOnce test + + Background: + + * def isResponseStatus200 = + """ + function() { + if( responseStatus != 200){ + karate.log("Retry since expectedStatus 200 != actual responseStatus: " + responseStatus); + return false; + } + return true; + } + """ + + # if comment out callOnce the local js test will pass + + * callonce read('classpath:responseStatus/call-once.feature') + + + + + ######################### + ##### failing ##### + ######################### + + Scenario: callOnce test + + + Given url 'https://www.google.com' + When method GET + Then status 200 + + * print 'responseStatus: ' + responseStatus + * assert isResponseStatus200_callOnce() + + + #fails from callOnce + Scenario: local js test + + + Given url 'https://www.google.com' + When method GET + Then status 200 + + * print 'responseStatus: ' + responseStatus + * assert isResponseStatus200() \ No newline at end of file