Tabs



Nov 20, 2021

Connecting Azure CosmosDB from SoapUI Opensource using Groovy script

I had made an attempt to connect azure cosmos DB from Soapui Groovy script. this helps building tests on soapui. 1. Create a project in soapUI --> testsuite --> add a testcase. 2. Create a REST requst using the cosmosDB endpoint https://hostname:port/resType 3. Add a properties step and create few variables as mentioned below just to pass on the input data or you can hardcode inside the code. 4. add a groovy script step and paste below code 5. Create Headers with names - Authorization (value will be filled by below code), x-ms-version (value find latest version date on google eg.2018-12-31), x-ms-date (will be filled by below code, Accept (value application/json) Copy below code and paste in your Groovy script step in your soapUI testcase. import java.security.MessageDigest import javax.crypto.Mac import javax.crypto.spec.SecretKeySpec import java.net.URLEncoder import java.security.InvalidKeyException; import com.eviware.soapui.support.types.StringToStringMap //Read all variables from SoapUI properties, you can hardcode constant string too or pass dynamic in someother way def resType = context.expand( '${cosmosProps#resType}' ) def host = context.expand( '${cosmosProps#CosmosDBHost}' ) def cosmosAPIVersion = context.expand( '${cosmosProps#CosmosDBAPIVersion}' ) def access_key = context.expand( '${cosmosProps#CosmosDBMasterKey}' ) def method = context.expand( '${cosmosProps#method}' ) def resourceId = "" TimeZone.setDefault(TimeZone.getTimeZone('GMT')) def String GMTsourceDate = new Date() //RFC_1123_DATE_TIME conversion def String GMTdateString = new Date().parse('EEE MMM d HH:mm:ss z yyyy', GMTsourceDate).format("EEE, d MMM yyyy HH:mm:ss z") log.info "Converted DateTimeString: "+GMTdateString //Method to HAMCSHA256 - pass decoded key and payload text static byte[] HmacSHA256(String payloadText, byte[] key) throws Exception { String algorithm="HmacSHA256" Mac mac = Mac.getInstance(algorithm); mac.init(new SecretKeySpec(key, algorithm)) return mac.doFinal(payloadText.getBytes("UTF-8")) } log.info "masterKey is "+access_key //decode above masterkey since its already base64 encoded byte[] decodedKey = access_key.decodeBase64() //build PayloadString using verb, resType, resourceID and date, you can pass this dynamic if you want def String payLoadString = "get"+"\n"+resType+"\n"+resourceId+"\n"+GMTdateString.toLowerCase()+"\n"+""+"\n" log.info payLoadString //call HMacSha256 by passing payload and key def hash256signed = HmacSHA256(payLoadString, decodedKey) String signature = hash256signed.encodeBase64() log.info("encoded base64 signed: "+signature) //building URI def MasterToken = "master" def TokenVersion = "1.0" def headers = new StringToStringMap() //URL encoding def String toURLEncode = "type=" + MasterToken + "&ver=" + TokenVersion + "&sig=" + signature def AuthHdr = java.net.URLEncoder.encode(toURLEncode, "UTF-8") log.info 'AUTHHDRIS: ' + AuthHdr //putting all caculated headers to soapui request headers.put("Authorization", AuthHdr) headers.put("x-ms-version", cosmosAPIVersion) headers.put("Accept", "application/json") headers.put("x-ms-date", GMTdateString) def testStep = testRunner.testCase.getTestStepByName("CosmosAPIRequest"); testStep.getHttpRequest().setRequestHeaders(headers) log.info ("DONE")