gervais.b
gervais.b

Reputation: 2347

Dynamic file in request body

I am playing with Karate to test one resource that accepts a date that cannot be in the past.

Scenario: Schedule one
    Given path '/schedules'
    And request read('today_at_19h30.json')
    When method post
    Then status 201

I have created some JSON files (mostly duplicates but with subtle changes) for each scenario. But I cannot seriously imagine changing the date in all of them each time I want to run my tests.

Using a date in the far future is not a good idea because there is some manual verification and that will force us to click (on next) too many times.

Is there a way to include a variable or an expression in a file?

Thanks

Upvotes: 2

Views: 514

Answers (1)

Peter Thomas
Peter Thomas

Reputation: 58058

There are multiple ways to "clobber" JSON data in Karate. One way is to just use a JS expression. For example:

* def foo = { a: 1 }
* foo.a = 2
* match foo == { a: 2 }

For your specific use case, I suspect embedded expressions will be the more elegant way to do it. The great thing about embedded expressions is that they work in combination with the read() API.

For example where the contents of the file test.json is { "today": "#(today)" }

Background:
* def getToday =
"""
function() {
  var SimpleDateFormat = Java.type('java.text.SimpleDateFormat');
  var sdf = new SimpleDateFormat('yyyy/MM/dd');
  var date = new java.util.Date();
  return sdf.format(date);
}
"""

Scenario:
* def today = getToday()
* def foo = read('test.json')
* print foo

Which results in:

Running com.intuit.karate.junit4.dev.TestRunner
20:19:20.957 [main] INFO  com.intuit.karate - [print] {
  "today": "2020/01/22"
}

By the way if the getToday function has been defined, you can even do this: { "today": "#(getToday())" }. Which may give you more ideas.

Upvotes: 1

Related Questions