Skip to content

Commit 6d0880a

Browse files
authored
Merge pull request #104 from hmcts/feat/amp-182-update-timestamp
amp-182 update timestamp
2 parents 9d08255 + 92e9b99 commit 6d0880a

3 files changed

Lines changed: 37 additions & 16 deletions

File tree

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ springBoot {
4040
}
4141

4242
dependencies {
43-
implementation("uk.gov.hmcts.cp:api-hmcts-crime-template:2.0.0")
43+
implementation("uk.gov.hmcts.cp:api-hmcts-crime-template:2.0.1")
4444

4545
// --- Observability / Actuator / OTEL / Prometheus ---
4646
implementation 'org.springframework.boot:spring-boot-starter-actuator'

src/main/java/uk/gov/hmcts/cp/controllers/GlobalExceptionHandler.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77
import org.springframework.web.server.ResponseStatusException;
88
import uk.gov.hmcts.cp.openapi.model.ErrorResponse;
99

10-
import java.time.OffsetDateTime;
11-
import java.time.ZoneOffset;
10+
import java.time.Instant;
1211
import java.util.Objects;
1312

1413
@RestControllerAdvice
@@ -21,16 +20,20 @@ public GlobalExceptionHandler(final Tracer tracer) {
2120
}
2221

2322
@ExceptionHandler(ResponseStatusException.class)
24-
public ResponseEntity<ErrorResponse> handleResponseStatusException(final ResponseStatusException responseStatusException) {
23+
public ResponseEntity<ErrorResponse> handleResponseStatusException(
24+
final ResponseStatusException responseStatusException) {
25+
2526
final ErrorResponse error = ErrorResponse.builder()
2627
.error(String.valueOf(responseStatusException.getStatusCode().value()))
27-
.message(responseStatusException.getReason() != null ? responseStatusException.getReason() : responseStatusException.getMessage())
28-
.timestamp(OffsetDateTime.now(ZoneOffset.UTC))
28+
.message(responseStatusException.getReason() != null
29+
? responseStatusException.getReason()
30+
: responseStatusException.getMessage())
31+
.timestamp(Instant.now())
2932
.traceId(Objects.requireNonNull(tracer.currentSpan()).context().traceId())
3033
.build();
3134

3235
return ResponseEntity
3336
.status(responseStatusException.getStatusCode())
3437
.body(error);
3538
}
36-
}
39+
}

src/test/java/uk/gov/hmcts/cp/controllers/GlobalExceptionHandlerTest.java

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,25 @@
22

33
import io.micrometer.tracing.Span;
44
import io.micrometer.tracing.Tracer;
5+
import io.micrometer.tracing.TraceContext;
56
import org.junit.jupiter.api.Test;
67
import org.springframework.http.HttpStatus;
78
import org.springframework.http.ResponseEntity;
89
import org.springframework.web.server.ResponseStatusException;
9-
1010
import uk.gov.hmcts.cp.openapi.model.ErrorResponse;
11-
import io.micrometer.tracing.TraceContext;
1211

13-
import static org.junit.jupiter.api.Assertions.*;
14-
import static org.mockito.Mockito.*;
12+
import java.time.Instant;
13+
14+
import static org.junit.jupiter.api.Assertions.assertEquals;
15+
import static org.junit.jupiter.api.Assertions.assertNotNull;
16+
import static org.junit.jupiter.api.Assertions.assertTrue;
17+
import static org.mockito.Mockito.mock;
18+
import static org.mockito.Mockito.when;
1519

1620
class GlobalExceptionHandlerTest {
1721

1822
@Test
19-
void handleResponseStatusExceptionShouldReturnErrorResponseWithCorrectFields() {
23+
void handle_response_status_exception_should_return_error_response_with_correct_fields() {
2024
// Arrange
2125
final Tracer tracer = mock(Tracer.class);
2226
final Span span = mock(Span.class);
@@ -29,18 +33,32 @@ void handleResponseStatusExceptionShouldReturnErrorResponseWithCorrectFields() {
2933
final GlobalExceptionHandler handler = new GlobalExceptionHandler(tracer);
3034

3135
final String reason = "Test error";
32-
final ResponseStatusException exception = new ResponseStatusException(HttpStatus.NOT_FOUND, reason);
36+
final ResponseStatusException exception =
37+
new ResponseStatusException(HttpStatus.NOT_FOUND, reason);
38+
39+
final Instant beforeCall = Instant.now();
3340

3441
// Act
35-
final ResponseEntity<ErrorResponse> response = handler.handleResponseStatusException(exception);
42+
final ResponseEntity<ErrorResponse> response =
43+
handler.handleResponseStatusException(exception);
44+
45+
final Instant afterCall = Instant.now();
3646

3747
// Assert
3848
assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
49+
3950
final ErrorResponse error = response.getBody();
4051
assertNotNull(error);
52+
4153
assertEquals("404", error.getError());
4254
assertEquals(reason, error.getMessage());
43-
assertNotNull(error.getTimestamp());
4455
assertEquals("test-trace-id", error.getTraceId());
56+
57+
assertNotNull(error.getTimestamp());
58+
assertTrue(
59+
!error.getTimestamp().isBefore(beforeCall)
60+
&& !error.getTimestamp().isAfter(afterCall),
61+
"Timestamp should be between beforeCall and afterCall"
62+
);
4563
}
46-
}
64+
}

0 commit comments

Comments
 (0)