diff --git a/merchant-service/src/main/java/com/mert/merchantservice/controller/MerchantController.java b/merchant-service/src/main/java/com/mert/merchantservice/controller/MerchantController.java index eb4d038..dba3458 100644 --- a/merchant-service/src/main/java/com/mert/merchantservice/controller/MerchantController.java +++ b/merchant-service/src/main/java/com/mert/merchantservice/controller/MerchantController.java @@ -48,7 +48,7 @@ public ResponseEntity updateMerchant(@PathVariable UUID id, @DeleteMapping("/{id}") @Operation(summary = "Delete a Merchant") public ResponseEntity deleteMerchant(@PathVariable UUID id) { - merchantService.deleMerchant(id); + merchantService.deleteMerchant(id); return ResponseEntity.noContent().build(); } } diff --git a/merchant-service/src/main/java/com/mert/merchantservice/dto/MerchantRequestDTO.java b/merchant-service/src/main/java/com/mert/merchantservice/dto/MerchantRequestDTO.java index 09da46e..256cf83 100644 --- a/merchant-service/src/main/java/com/mert/merchantservice/dto/MerchantRequestDTO.java +++ b/merchant-service/src/main/java/com/mert/merchantservice/dto/MerchantRequestDTO.java @@ -3,6 +3,7 @@ import com.mert.merchantservice.dto.validators.CreateMerchantValidationGroup; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Size; public class MerchantRequestDTO { @@ -17,13 +18,24 @@ public class MerchantRequestDTO { @Email(message = "Email should be valid") private String email; - @NotBlank(groups = CreateMerchantValidationGroup.class, message = "Registered date is required") + @NotBlank( + groups = CreateMerchantValidationGroup.class, + message = "Registered date is required" + ) + @Pattern( + regexp = "^\\d{4}-\\d{2}-\\d{2}$", + message = "Registered date must be in yyyy-MM-dd format" + ) private String registeredDate; @NotBlank(message = "Address is required") private String address; @NotBlank(message = "Phone Number is required") + @Pattern( + regexp = "^\\+?[0-9]{10,15}$", + message = "Phone number must contain 10 to 15 digits" + ) private String phoneNumber; public String getMerchantName() { diff --git a/merchant-service/src/main/java/com/mert/merchantservice/exception/GlobalExceptionHandler.java b/merchant-service/src/main/java/com/mert/merchantservice/exception/GlobalExceptionHandler.java index 340f04b..11c5043 100644 --- a/merchant-service/src/main/java/com/mert/merchantservice/exception/GlobalExceptionHandler.java +++ b/merchant-service/src/main/java/com/mert/merchantservice/exception/GlobalExceptionHandler.java @@ -6,7 +6,9 @@ import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; +import java.time.format.DateTimeParseException; import java.util.HashMap; import java.util.Map; @@ -15,6 +17,14 @@ public class GlobalExceptionHandler { private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public ResponseEntity> handleTypeMismatch(MethodArgumentTypeMismatchException ex) { + Map response = new HashMap<>(); + response.put("message", "Invalid merchant ID format. Expected UUID"); + + return ResponseEntity.badRequest().body(response); + } + @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity> handleValidationException(MethodArgumentNotValidException exception) { Map errors = new HashMap<>(); @@ -24,6 +34,14 @@ public ResponseEntity> handleValidationException(MethodArgum return ResponseEntity.badRequest().body(errors); } + @ExceptionHandler(DateTimeParseException.class) + public ResponseEntity> handleDateTimeParseException(DateTimeParseException ex) { + Map error = new HashMap<>(); + error.put("registeredDate", "Invalid date. Use a valid date in YYYY-MM-DD format"); + + return ResponseEntity.badRequest().body(error); + } + @ExceptionHandler(EmailAlreadyExistsException.class) public ResponseEntity> handleEmailAlreadyExistsException(EmailAlreadyExistsException exception) { log.warn("Email address already exists {}", exception.getMessage()); diff --git a/merchant-service/src/main/java/com/mert/merchantservice/service/MerchantService.java b/merchant-service/src/main/java/com/mert/merchantservice/service/MerchantService.java index 004c8e0..39f66b0 100644 --- a/merchant-service/src/main/java/com/mert/merchantservice/service/MerchantService.java +++ b/merchant-service/src/main/java/com/mert/merchantservice/service/MerchantService.java @@ -73,7 +73,12 @@ public MerchantResponseDTO updateMerchant(UUID id, MerchantRequestDTO merchantRe return MerchantMapper.toMerchantResponseDTO(updatedMerchant); } - public void deleMerchant(UUID id) { - merchantRepository.deleteById(id); + public void deleteMerchant(UUID id) { + Merchant merchant = merchantRepository.findById(id) + .orElseThrow(() -> + new MerchantNotFoundException( + "Merchant not found with ID: " + id + )); + merchantRepository.delete(merchant); } } diff --git a/merchant-service/src/test/java/com/mert/merchantservice/service/MerchantServiceTest.java b/merchant-service/src/test/java/com/mert/merchantservice/service/MerchantServiceTest.java new file mode 100644 index 0000000..8a81d2a --- /dev/null +++ b/merchant-service/src/test/java/com/mert/merchantservice/service/MerchantServiceTest.java @@ -0,0 +1,49 @@ +package com.mert.merchantservice.service; + +import com.mert.merchantservice.exception.MerchantNotFoundException; +import com.mert.merchantservice.model.Merchant; +import com.mert.merchantservice.repository.MerchantRepository; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +public class MerchantServiceTest { + @Mock + private MerchantRepository merchantRepository; + + @InjectMocks + private MerchantService merchantService; + + @Test + void testMerchantService_validIdProvided_shouldDeleteMerchant() { + UUID id = UUID.randomUUID(); + + Merchant merchant = new Merchant(); + merchant.setId(id); + + when(merchantRepository.findById(id)).thenReturn(Optional.of(merchant)); + merchantService.deleteMerchant(id); + verify(merchantRepository).delete(merchant); + } + + @Test + void testMerchantService_invalidIdProvided_shouldThrowMerchantNotFoundException() { + UUID id = UUID.randomUUID(); + + when(merchantRepository.findById(id)).thenReturn(Optional.empty()); + assertThrows( + MerchantNotFoundException.class, + () -> merchantService.deleteMerchant(id) + ); + verify(merchantRepository, never()).delete(any()); + } +}