PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Tuesday, September 20, 2022

[FIXED] How to match a parameter value which contains ("${") using Cucumber DataTable in Java

 September 20, 2022     cucumber, datatable, hashmap, java, rest-assured     No comments   

Issue

I have the below Cucumber scenario with data table. I want to set query parameters in REST Assured framework. Here we have key= at and value=${atToken} which I am trying to get runtime value instead of passing hardcoded value through data table. In the below setParams method, I am trying to match the ${atToken} using param.contains("${"), but I am not able to get the desired result. Please let me know what I need to change in this for loop.

for (String param : params.keySet()) {
    if (param.contains("${")) {
        params.replace(param, RUN_TIME_DATA.get(param));
    }
}

Feature file:

  And I set query parameters
  | location     | NY         |
  | at           | ${atToken} |

Stepdefintion:

@And("set {} parameters")
public void set_query_parameters(String query, DataTable params) throws IOException {
    POC.setParams(query, params.asMap());
}

Utils file:

public void setParams (String type, Map < String, String > params) throws IOException {
    for (String param : params.keySet()) {
        if (param.contains("${")) {
            params.replace(param, RUN_TIME_DATA.get(param));
        }
    }
    switch (type.toLowerCase()) {
        case "form":
            request.formParams(params);
            break;
        case "query":
            request.queryParams(params);
            break;
        case "path":
            request.pathParams(params);
            break;

    }
}

Hooks file:

@Before
public void beforeScenario() throws Exception {
    RUN_TIME_DATA.put("atToken", POC.createAuth());
}

Solution

If I understood correctly your quetion, there are a few issues with your implementation.

First of all, you have a gherkin instruction as And I set query parameters but the step definition is @And("set {} parameters")

As you defined "query" in your step definition, I assume that you have a scenario like this.

Scenario Outline: Params scenario
Given ...
When ...
Then ...
    And I set "<queryType>" parameters
      | location | NY         |
      | at       | ${atToken} |
    Examples:
      | queryType |
      | form      |
      | path      |

Second problem is that params.asMap() does not create a mutable map but your setParams method will need a mutable one.

@And("I set {string} parameters")
public void set_query_parameters(String queryType, DataTable params) throws IOException {
    // POC.setParams(queryType, params.asMap()); // not mutable map
    POC.setParams(queryType, new HashMap(params.asMap()));
}

The main issue in your loop was that you were searching $ symbol in key instead of value.

public void setParams (String type, Map<String, String> params) throws IOException {
      for (Map.Entry<String, String> entry : params.entrySet()) {
         final String key = entry.getKey();
         final String value = entry.getValue();

         // if value is parameterized
         if (value.contains("${")) {
            // you are using stripped value as key in your RUN_TIME_DATA
            final String keyInRuntimeMap = getParamKeyFrom(value);                      
            params.replace(key, RUN_TIME_DATA.get(keyInRuntimeMap));
         }
      }

      switch (type.toLowerCase()) {
         case "form":
            request.formParams(params);
            break;
         case "query":
            request.queryParams(params);
            break;
         case "path":
            request.pathParams(params);
            break;
        // what should happen if unknown type given
         default:
            throw new IllegalArgumentException("unknown type=" + type);
      }
   }

     /**
    * Will strip someKey from ${someKey}
    *
    * @param text
    * @return stripped text or the original text
    */
   private String getParamKeyFrom(final String text) {
      // pattern to match -> ${someKey}
      final Pattern pattern = Pattern.compile("\\$\\{(.*)\\}");
      final Matcher matcher = pattern.matcher(text);

      if (matcher.find()) {
         return matcher.group(1);
      }

      // if pattern does not match return the same string
      return text;
   }

Hope it helps.



Answered By - ocos
Answer Checked By - Robin (PHPFixing Admin)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing