From 31a204fdab58814905c3d1d1b6e623845d0a55ef Mon Sep 17 00:00:00 2001 From: Harkamal Randhawa Date: Fri, 17 Apr 2026 13:02:00 -0600 Subject: [PATCH] fix tests and silent failures --- .../backend/controller/AuthController.java | 1 + .../backend/service/AppointmentService.java | 24 ++++++++++++------- .../petshop/backend/service/CartService.java | 2 +- .../backend/service/ProductService.java | 7 +++++- .../petshop/backend/service/SaleService.java | 7 ++++-- .../backend/service/UserServiceTest.java | 9 +++---- 6 files changed, 34 insertions(+), 16 deletions(-) diff --git a/backend/src/main/java/com/petshop/backend/controller/AuthController.java b/backend/src/main/java/com/petshop/backend/controller/AuthController.java index 1b4ed0bf..58ac9d06 100644 --- a/backend/src/main/java/com/petshop/backend/controller/AuthController.java +++ b/backend/src/main/java/com/petshop/backend/controller/AuthController.java @@ -410,6 +410,7 @@ public class AuthController { try { avatarStorageService.deleteAvatar(user); } catch (IOException e) { + log.warn("Failed to delete avatar for user {}: {}", user.getId(), e.getMessage()); } user.setAvatarUrl(null); userRepository.save(user); diff --git a/backend/src/main/java/com/petshop/backend/service/AppointmentService.java b/backend/src/main/java/com/petshop/backend/service/AppointmentService.java index ad29a08c..bc8ece99 100644 --- a/backend/src/main/java/com/petshop/backend/service/AppointmentService.java +++ b/backend/src/main/java/com/petshop/backend/service/AppointmentService.java @@ -326,17 +326,25 @@ public class AppointmentService { AppointmentResponse response = new AppointmentResponse(); response.setAppointmentId(appointment.getAppointmentId()); - response.setCustomerId(appointment.getCustomer().getId()); - response.setCustomerName(appointment.getCustomer().getFirstName() + " " + appointment.getCustomer().getLastName()); - response.setStoreId(appointment.getStore().getStoreId()); - response.setStoreName(appointment.getStore().getStoreName()); - response.setServiceId(appointment.getService().getServiceId()); - response.setServiceName(appointment.getService().getServiceName()); + if (appointment.getCustomer() != null) { + response.setCustomerId(appointment.getCustomer().getId()); + response.setCustomerName(appointment.getCustomer().getFirstName() + " " + appointment.getCustomer().getLastName()); + } + if (appointment.getStore() != null) { + response.setStoreId(appointment.getStore().getStoreId()); + response.setStoreName(appointment.getStore().getStoreName()); + } + if (appointment.getService() != null) { + response.setServiceId(appointment.getService().getServiceId()); + response.setServiceName(appointment.getService().getServiceName()); + } response.setAppointmentDate(appointment.getAppointmentDate()); response.setAppointmentTime(appointment.getAppointmentTime()); response.setAppointmentStatus(appointment.getAppointmentStatus()); - response.setEmployeeId(appointment.getEmployee().getId()); - response.setEmployeeName(appointment.getEmployee().getFirstName() + " " + appointment.getEmployee().getLastName()); + if (appointment.getEmployee() != null) { + response.setEmployeeId(appointment.getEmployee().getId()); + response.setEmployeeName(appointment.getEmployee().getFirstName() + " " + appointment.getEmployee().getLastName()); + } response.setPetName(pet != null ? pet.getPetName() : null); response.setPetId(pet != null ? pet.getPetId() : null); response.setCreatedAt(appointment.getCreatedAt()); diff --git a/backend/src/main/java/com/petshop/backend/service/CartService.java b/backend/src/main/java/com/petshop/backend/service/CartService.java index 54844dc3..200698f0 100644 --- a/backend/src/main/java/com/petshop/backend/service/CartService.java +++ b/backend/src/main/java/com/petshop/backend/service/CartService.java @@ -12,7 +12,7 @@ import com.stripe.exception.StripeException; import com.stripe.model.PaymentIntent; import com.stripe.param.PaymentIntentCreateParams; import jakarta.annotation.PostConstruct; -import jakarta.transaction.Transactional; +import org.springframework.transaction.annotation.Transactional; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; diff --git a/backend/src/main/java/com/petshop/backend/service/ProductService.java b/backend/src/main/java/com/petshop/backend/service/ProductService.java index 38f30e84..0b71d5b2 100644 --- a/backend/src/main/java/com/petshop/backend/service/ProductService.java +++ b/backend/src/main/java/com/petshop/backend/service/ProductService.java @@ -9,6 +9,8 @@ import com.petshop.backend.exception.BusinessException; import com.petshop.backend.exception.ResourceNotFoundException; import com.petshop.backend.repository.CategoryRepository; import com.petshop.backend.repository.ProductRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.core.io.Resource; import org.springframework.http.MediaType; import org.springframework.data.domain.Page; @@ -23,6 +25,8 @@ import java.util.Locale; @Service public class ProductService { + private static final Logger log = LoggerFactory.getLogger(ProductService.class); + private final ProductRepository productRepository; private final CategoryRepository categoryRepository; private final CatalogImageStorageService catalogImageStorageService; @@ -152,7 +156,8 @@ public class ProductService { } try { catalogImageStorageService.deleteProductImage(storedImagePath); - } catch (IOException | IllegalArgumentException ignored) { + } catch (IOException | IllegalArgumentException e) { + log.warn("Failed to delete stored image {}: {}", storedImagePath, e.getMessage()); } } diff --git a/backend/src/main/java/com/petshop/backend/service/SaleService.java b/backend/src/main/java/com/petshop/backend/service/SaleService.java index 20dc324d..d43919bc 100644 --- a/backend/src/main/java/com/petshop/backend/service/SaleService.java +++ b/backend/src/main/java/com/petshop/backend/service/SaleService.java @@ -367,8 +367,11 @@ public class SaleService { SaleResponse response = new SaleResponse(); response.setSaleId(sale.getSaleId()); response.setSaleDate(sale.getSaleDate()); - response.setEmployeeId(sale.getEmployee().getId()); - response.setEmployeeName(sale.getEmployee().getFirstName() + " " + sale.getEmployee().getLastName()); + + if (sale.getEmployee() != null) { + response.setEmployeeId(sale.getEmployee().getId()); + response.setEmployeeName(sale.getEmployee().getFirstName() + " " + sale.getEmployee().getLastName()); + } if (sale.getStore() != null) { response.setStoreId(sale.getStore().getStoreId()); diff --git a/backend/src/test/java/com/petshop/backend/service/UserServiceTest.java b/backend/src/test/java/com/petshop/backend/service/UserServiceTest.java index 165c869b..66782200 100644 --- a/backend/src/test/java/com/petshop/backend/service/UserServiceTest.java +++ b/backend/src/test/java/com/petshop/backend/service/UserServiceTest.java @@ -59,7 +59,7 @@ class UserServiceTest { User target = user(2L, User.Role.ADMIN); authenticate(actor); - when(userRepository.findById(2L)).thenReturn(Optional.of(target)); + when(userRepository.findByIdForUpdate(2L)).thenReturn(Optional.of(target)); when(userRepository.findById(1L)).thenReturn(Optional.of(actor)); UserRequest request = request(User.Role.ADMIN); @@ -74,7 +74,7 @@ class UserServiceTest { User target = user(2L, User.Role.ADMIN); authenticate(actor); - when(userRepository.findById(2L)).thenReturn(Optional.of(target)); + when(userRepository.findByIdForUpdate(2L)).thenReturn(Optional.of(target)); UserRequest request = request(User.Role.CUSTOMER); @@ -145,6 +145,7 @@ class UserServiceTest { User actor = user(1L, User.Role.ADMIN); authenticate(actor); + when(userRepository.findByIdForUpdate(1L)).thenReturn(Optional.of(actor)); when(userRepository.findById(1L)).thenReturn(Optional.of(actor)); when(userRepository.save(any(User.class))).thenAnswer(invocation -> invocation.getArgument(0)); @@ -161,7 +162,7 @@ class UserServiceTest { User target = user(2L, User.Role.CUSTOMER); authenticate(actor); - when(userRepository.findById(2L)).thenReturn(Optional.of(target)); + when(userRepository.findByIdForUpdate(2L)).thenReturn(Optional.of(target)); when(userRepository.findById(1L)).thenReturn(Optional.of(actor)); UserRequest request = request(User.Role.ADMIN); @@ -176,7 +177,7 @@ class UserServiceTest { User target = user(2L, User.Role.CUSTOMER); authenticate(actor); - when(userRepository.findById(2L)).thenReturn(Optional.of(target)); + when(userRepository.findByIdForUpdate(2L)).thenReturn(Optional.of(target)); UserRequest request = request(User.Role.ADMIN);