From 01825848f697433e7f395379059e6cb3d29d4802 Mon Sep 17 00:00:00 2001 From: Peter Thomas Date: Sun, 8 Jan 2023 18:35:41 +0530 Subject: [PATCH] also resolve karate.filterKeys #2224 --- .../com/intuit/karate/core/ScenarioBridge.java | 17 +++++++++-------- .../intuit/karate/core/ScenarioRuntimeTest.java | 11 ++++++++++- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/karate-core/src/main/java/com/intuit/karate/core/ScenarioBridge.java b/karate-core/src/main/java/com/intuit/karate/core/ScenarioBridge.java index 12c4dc7ae..9c914397a 100644 --- a/karate-core/src/main/java/com/intuit/karate/core/ScenarioBridge.java +++ b/karate-core/src/main/java/com/intuit/karate/core/ScenarioBridge.java @@ -397,7 +397,8 @@ public Object filter(Value o, Value f) { } public Object filterKeys(Value o, Value... args) { - if (!o.hasMembers() || args.length == 0) { + Variable v = new Variable(o); + if (!v.isMap()) { return JsMap.EMPTY; } List keys = new ArrayList(); @@ -415,21 +416,21 @@ public Object filterKeys(Value o, Value... args) { } } } else { - for (Value v : args) { - keys.add(v.toString()); + for (Value key : args) { + keys.add(key.toString()); } } - Map map = new LinkedHashMap(keys.size()); + Map map = v.getValue(); + Map result = new LinkedHashMap(keys.size()); for (String key : keys) { if (key == null) { continue; } - Value v = o.getMember(key); - if (v != null) { - map.put(key, v.as(Object.class)); + if (map.containsKey(key)) { + result.put(key, map.get(key)); } } - return new JsMap(map); + return new JsMap(result); } public void forEach(Value o, Value f) { diff --git a/karate-core/src/test/java/com/intuit/karate/core/ScenarioRuntimeTest.java b/karate-core/src/test/java/com/intuit/karate/core/ScenarioRuntimeTest.java index 11b8ec577..e17365e61 100644 --- a/karate-core/src/test/java/com/intuit/karate/core/ScenarioRuntimeTest.java +++ b/karate-core/src/test/java/com/intuit/karate/core/ScenarioRuntimeTest.java @@ -358,11 +358,20 @@ void testCollectionsInFunctions() { "def fun2 = function(arg){ return karate.keysOf(arg) }", "def fooKeys = fun2(foo)", "def fun3 = function(arg){ return karate.valuesOf(arg) }", - "def fooVals = fun3(foo)" + "def fooVals = fun3(foo)", + "def fun4 = function(arg){ return karate.filterKeys(arg, 'a')}", + "def filt1 = fun4(foo)", + "def fun5 = function(arg){ return karate.filterKeys(arg, 'a', 'b')}", + "def filt2 = fun5(foo)", + "def fun6 = function(arg){ return karate.filterKeys(arg, ['a', 'b'])}", + "def filt3 = fun6(foo)" ); assertEquals(get("fooSize"), 3); matchVar("fooKeys", "['a', 'b', 'c']"); matchVar("fooVals", "[1, 2, 3]"); + matchVar("filt1", "{ a: 1 }"); + matchVar("filt2", "{ a: 1, b: 2 }"); + matchVar("filt3", "{ a: 1, b: 2 }"); } @Test