Cata
Cata

Reputation: 51

Groovy: Date and Time comparisons with a slight delay

So I have the following script:

import groovy.time.TimeCategory

def dueDate = context.expand( '${Test 4 - create user task#Response#$[\'_embedded\'][\'userTaskDtoList\'][0][\'dueDate\']}' )

def date = new Date(messageExchange.getTimestamp())

use(groovy.time.TimeCategory){
    after24Hours = (date + 24.hours).format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone('UTC')) }

assert dueDate == after24Hours

What I'm trying to do with this is take the date and time from a REST request (dueDate - which comes in UTC format and with a 24h delay) and create a new date and time from the timestamp of the moment when that request has been sent, which is registered from my system. I then convert that time to UTC to accommodate the format from dueDate and add 24h to it. At the end I verify that the date and time from dueDate and after24Hours is the same.

The output does return the same time but in certain cases if there is a delay between the time the request is being sent and the time is received then the assertion will fail. This depends on the server, usually there is a difference of like 1 millisecond but I'm thinking that if the server will be slower at some point this will definitely be bigger.

What could I do to allow some margin of error in the assertion, maybe like a few seconds or even a couple of minutes?

Ok, so I managed to do this:

import groovy.time.*

def dueDate = context.expand( '${Test 4 - create user task#Response#$[\'_embedded\'][\'userTaskDtoList\'][0][\'dueDate\']}' )
def date = new Date(messageExchange.getTimestamp())

use(groovy.time.TimeCategory){
    after24Hours = (date + 24.hours).format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone('UTC'))
     def date1 = Date.parse("yyyy-MM-dd'T'HH:mm:ss'Z'", dueDate)
     def date2 = Date.parse("yyyy-MM-dd'T'HH:mm:ss'Z'", after24Hours)
     TimeDuration difference = TimeCategory.minus(date2, date1) 
     log.info date1
     log.info date2
     assert difference < 2.minutes
     }

The script seems to work and it does return an error only if the time is longer than the one I've set in the assertion. Unfortunately I have another issue now. For some reason, my date output looks like this:

Fri Oct 01 16:24:10 EEST 2021: INFO: Sat Oct 02 13:24:10 EEST 2021

Which is not the correct format. That date should appear in the Zulu format, after all when I parsed the dates that was the format that I used. Am I missing something?

Upvotes: 0

Views: 461

Answers (2)

Erik Pragt
Erik Pragt

Reputation: 14657

If you use something like AssertJ, and I'd recommend you do, then you can do something like the following:

assertThat(dueDate).isCloseTo(after24Hours, within(1, ChronoUnit.MINUTE));

This will give a small margin to the comparison of the dates, and should fix your issue.

Upvotes: 2

Jeff Scott Brown
Jeff Scott Brown

Reputation: 27245

What could I do to allow some margin of error in the assertion, maybe like a few seconds or even a couple of minutes?

Instead of asserting that they are equal, you could assert that the difference between them is less than a threshold that you get to define.

Upvotes: 2

Related Questions