|
6 | 6 | import lt.satsyuk.dto.RequestAcceptedResponse; |
7 | 7 | import lt.satsyuk.dto.RequestStatusResponse; |
8 | 8 | import lt.satsyuk.api.util.TestTime; |
| 9 | +import lt.satsyuk.exception.IdempotencyKeyConflictException; |
9 | 10 | import lt.satsyuk.model.Request; |
10 | 11 | import lt.satsyuk.model.RequestStatus; |
11 | 12 | import lt.satsyuk.model.RequestType; |
|
27 | 28 | import static org.assertj.core.api.Assertions.assertThatThrownBy; |
28 | 29 | import static org.mockito.ArgumentMatchers.any; |
29 | 30 | import static org.mockito.Mockito.doThrow; |
| 31 | +import static org.mockito.Mockito.never; |
30 | 32 | import static org.mockito.Mockito.verify; |
31 | 33 | import static org.mockito.Mockito.when; |
32 | 34 |
|
@@ -95,6 +97,50 @@ void submitClientCreateRequestUsesIdempotencyKeyAsRequestId() throws Exception { |
95 | 97 | assertThat(response.requestId()).isEqualTo(idempotencyKey); |
96 | 98 | } |
97 | 99 |
|
| 100 | + @Test |
| 101 | + void submitClientCreateRequestReturnsExistingRequestForSameIdempotencyKeyAndPayload() throws Exception { |
| 102 | + UUID idempotencyKey = UUID.randomUUID(); |
| 103 | + CreateClientRequest createClientRequest = new CreateClientRequest(idempotencyKey, "John", "Doe", "+37061234567"); |
| 104 | + OffsetDateTime now = OffsetDateTime.now(); |
| 105 | + Request existingRequest = Request.builder() |
| 106 | + .id(idempotencyKey) |
| 107 | + .type(RequestType.CLIENT_CREATE) |
| 108 | + .status(RequestStatus.COMPLETED) |
| 109 | + .createdAt(now) |
| 110 | + .statusChangedAt(now) |
| 111 | + .requestData(objectMapper.writeValueAsString(createClientRequest)) |
| 112 | + .build(); |
| 113 | + when(requestRepository.findById(idempotencyKey)).thenReturn(Optional.of(existingRequest)); |
| 114 | + |
| 115 | + RequestAcceptedResponse response = requestService.submitClientCreateRequest(createClientRequest); |
| 116 | + |
| 117 | + assertThat(response.requestId()).isEqualTo(idempotencyKey); |
| 118 | + assertThat(response.status()).isEqualTo(RequestStatus.COMPLETED); |
| 119 | + verify(requestRepository, never()).save(any(Request.class)); |
| 120 | + verify(requestSchedulerService, never()).scheduleClientCreateRequest(any(UUID.class)); |
| 121 | + } |
| 122 | + |
| 123 | + @Test |
| 124 | + void submitClientCreateRequestThrowsConflictForSameIdempotencyKeyDifferentPayload() throws Exception { |
| 125 | + UUID idempotencyKey = UUID.randomUUID(); |
| 126 | + CreateClientRequest incoming = new CreateClientRequest(idempotencyKey, "John", "Doe", "+37061234567"); |
| 127 | + CreateClientRequest existingPayload = new CreateClientRequest(idempotencyKey, "Jane", "Roe", "+37069999999"); |
| 128 | + OffsetDateTime now = OffsetDateTime.now(); |
| 129 | + Request existingRequest = Request.builder() |
| 130 | + .id(idempotencyKey) |
| 131 | + .type(RequestType.CLIENT_CREATE) |
| 132 | + .status(RequestStatus.COMPLETED) |
| 133 | + .createdAt(now) |
| 134 | + .statusChangedAt(now) |
| 135 | + .requestData(objectMapper.writeValueAsString(existingPayload)) |
| 136 | + .build(); |
| 137 | + when(requestRepository.findById(idempotencyKey)).thenReturn(Optional.of(existingRequest)); |
| 138 | + |
| 139 | + assertThatThrownBy(() -> requestService.submitClientCreateRequest(incoming)) |
| 140 | + .isInstanceOf(IdempotencyKeyConflictException.class) |
| 141 | + .hasMessageContaining(idempotencyKey.toString()); |
| 142 | + } |
| 143 | + |
98 | 144 | @Test |
99 | 145 | void getRequestStatusReturnsNestedJsonResponse() { |
100 | 146 | UUID requestId = UUID.randomUUID(); |
|
0 commit comments