'Karate environment value not getting set in config json

I have config-base.js which is loading the 'env_data.json' file. The java script in config-base.js is not setting the values in config as expected. I am trying to collect list of fields under common and appA parentElement and setting under config Json. This I could not achieve it.

I am passing appName as 'appA' and env as 'uat' via CLI command as like below java -cp karate:. -Dkarate.config.dir=. -Dkarate.appName=appA -jar karate.jar myFeature.feature -T 1 -t @smoke -e uat

I am trying to build config JSON as like below via JS.

config {
    baseUrl : 'http://uat.someurl.com'
    parameterX : 'x2',
    parameterY :'y2'
    someOtherBackendUrlA : 'http://uat.appA.com'
    parameterA : 'a2',
    parameterB :'b2'
}

My env_data.js is look like this

    [{
    appName : 'common',
    data: {
        uat: {
            baseUrl : 'http://uat.someurl.com'
            parameterX : 'x2',
            parameterY :'y2'
        }
    },{
    appName : 'appA',
    data: {
        uat: {
            someOtherBackendUrlA : 'http://uat.appA.com'
            parameterA : 'a2',
            parameterB :'b2'
        }
    }}]

My karate-base.js is written like below

function fn() {
  var env = karate.env;
  karate.log('karate.env system property was :', env);
  if (!env) {
    env = 'dev';
  }
  var listOfApplications = read('./env_data.json');
  var config = {};
  switch (env) {
    case "uat":
      for (var i = 0; i < listOfApplications.lenght; i++) {
        var appObject = listOfApplications[i];
        if (karate.properties['karate.appName'] == appObject.appName) {
          config = appObject.data[env];
        } else if ('common' == appObject.appName) {
          config.map(element => {
              element.baseUrl = appObject.data[env].baseUrl;
            }
          }
          break;
    }
karate.configure('connectTimeout', 5000);
karate.configure('readTimeout', 5000);
return config;
}

I can understand that, I am not mapping config values properly in else condition. I have tried map and foreach. but for these both functions, I got error saying org.graalvm.polyglotException:TypeError: config.map is not a funtion

I like to construct my config JSON along with common parameters on each application values. Please show some light on how can I fix this.



Solution 1:[1]

I have fixed the issue by below snippet.

fn();

function fn() {
  const env = 'uat';
  const userInput = 'appA';
  var listOfApplications = [
   {
      "appName":"common",
      "data":{
         "uat":{
            "baseUrl":"http://commonurl.com",
            "parameterX":"x",
            "parameterY":"y"
         }
      }
   },
   {
      "appName":"appA",
      "data":{
         "uat":{
            "baseUrl":"http://uat.appA.com",
            "parameterA":"a",
            "parameterB":"b"
         }
      }
   }
];
  
  var config={};
      for (var i = 0; i < listOfApplications.length; i++) {
          if (userInput == listOfApplications[i].appName) {
              config[userInput] = {...listOfApplications[i].data[env]};
          }else if ('common' == listOfApplications[i].appName) {
              config = {...listOfApplications[i].data[env]};
          }
      }
  
  //console.log(config);
  console.log(JSON.stringify(config));
  return config;
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Simbu