From 44c45ac83ba267af33b0fe63f2f90b9a189bbc56 Mon Sep 17 00:00:00 2001 From: jcilacad Date: Thu, 30 May 2024 17:58:56 +0800 Subject: [PATCH] Implemented builder pattern in Passenger and Payment IT classes. #23 --- .../dto/request/PaymentRequest.java | 6 +- .../aeroplannerrestapi/entity/Payment.java | 6 +- .../entity/Reservation.java | 1 + .../controller/PassengerControllerIT.java | 80 +++++----- .../controller/PaymentControllerIT.java | 142 ++++++++++-------- .../util/TestConstants.java | 20 ++- 6 files changed, 146 insertions(+), 109 deletions(-) diff --git a/src/main/java/com/projects/aeroplannerrestapi/dto/request/PaymentRequest.java b/src/main/java/com/projects/aeroplannerrestapi/dto/request/PaymentRequest.java index 5218111..54ad555 100644 --- a/src/main/java/com/projects/aeroplannerrestapi/dto/request/PaymentRequest.java +++ b/src/main/java/com/projects/aeroplannerrestapi/dto/request/PaymentRequest.java @@ -1,16 +1,14 @@ package com.projects.aeroplannerrestapi.dto.request; import jakarta.validation.constraints.*; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; import org.hibernate.validator.constraints.CreditCardNumber; import java.math.BigDecimal; @Getter @Setter +@Builder @AllArgsConstructor @NoArgsConstructor public class PaymentRequest { diff --git a/src/main/java/com/projects/aeroplannerrestapi/entity/Payment.java b/src/main/java/com/projects/aeroplannerrestapi/entity/Payment.java index 09392c0..3635c40 100644 --- a/src/main/java/com/projects/aeroplannerrestapi/entity/Payment.java +++ b/src/main/java/com/projects/aeroplannerrestapi/entity/Payment.java @@ -2,15 +2,13 @@ import com.projects.aeroplannerrestapi.enums.PaymentStatusEnum; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; import java.math.BigDecimal; @Getter @Setter +@Builder @AllArgsConstructor @NoArgsConstructor @Entity diff --git a/src/main/java/com/projects/aeroplannerrestapi/entity/Reservation.java b/src/main/java/com/projects/aeroplannerrestapi/entity/Reservation.java index 5d4820b..a87afff 100644 --- a/src/main/java/com/projects/aeroplannerrestapi/entity/Reservation.java +++ b/src/main/java/com/projects/aeroplannerrestapi/entity/Reservation.java @@ -6,6 +6,7 @@ @Getter @Setter +@Builder @AllArgsConstructor @NoArgsConstructor @Entity diff --git a/src/test/java/com/projects/aeroplannerrestapi/controller/PassengerControllerIT.java b/src/test/java/com/projects/aeroplannerrestapi/controller/PassengerControllerIT.java index 6e22890..dd6eaea 100644 --- a/src/test/java/com/projects/aeroplannerrestapi/controller/PassengerControllerIT.java +++ b/src/test/java/com/projects/aeroplannerrestapi/controller/PassengerControllerIT.java @@ -21,14 +21,19 @@ import java.util.List; import java.util.Set; +import static com.projects.aeroplannerrestapi.constants.PathConstants.API_V1_PASSENGERS; +import static com.projects.aeroplannerrestapi.constants.PathConstants.ID; +import static com.projects.aeroplannerrestapi.constants.SecurityRoleConstants.ADMIN; +import static com.projects.aeroplannerrestapi.constants.SortingAndPaginationConstants.*; +import static com.projects.aeroplannerrestapi.util.TestConstants.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @AutoConfigureMockMvc -@ActiveProfiles("integration") -@WithMockUser(roles = "ADMIN") +@ActiveProfiles(INTEGRATION) +@WithMockUser(roles = ADMIN) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class PassengerControllerIT extends AbstractContainerBaseTest { @@ -54,35 +59,38 @@ public void setup() { userRepository.deleteAll(); roleRepository.deleteAll(); - Role role = new Role(); - role.setName(RoleEnum.USER); - role.setDescription("Default user role"); + Role role = Role.builder() + .name(RoleEnum.USER) + .description(DEFAULT_USER_ROLE) + .build(); savedRole = roleRepository.save(role); } @Test public void givenListOfPassengers_whenGetPassengers_thenReturnPaginatedAndSortedPassengers() throws Exception { // given - User user1 = new User(); - user1.setFullName("Full Name 1"); - user1.setEmail("sample1@email.com"); - user1.setPassword(passwordEncoder.encode("password1")); - user1.setRoles(Set.of(savedRole)); - - User user2 = new User(); - user2.setFullName("Full Name 2"); - user2.setEmail("sample2@email.com"); - user2.setPassword(passwordEncoder.encode("password 2")); - user2.setRoles(Set.of(savedRole)); + User user1 = User.builder() + .fullName(FULL_NAME.concat(ONE)) + .email(VALID_EMAIL_ADDRESS.concat(ONE)) + .password(passwordEncoder.encode(VALID_PASSWORD.concat(ONE))) + .roles(Set.of(savedRole)) + .build(); + + User user2 = User.builder() + .fullName(FULL_NAME.concat(TWO)) + .email(VALID_EMAIL_ADDRESS.concat(TWO)) + .password(passwordEncoder.encode(VALID_PASSWORD.concat(TWO))) + .roles(Set.of(savedRole)) + .build(); List savedUsers = userRepository.saveAll(List.of(user1, user2)); // when - ResultActions resultActions = mockMvc.perform(get("/api/v1/passengers") - .param("pageNum", "1") - .param("pageSize", "10") - .param("sortBy", "id") - .param("sortDir", "asc")); + ResultActions resultActions = mockMvc.perform(get(API_V1_PASSENGERS) + .param(PAGE_NUM, DEFAULT_PAGE_NUM) + .param(PAGE_SIZE, DEFAULT_PAGE_SIZE) + .param(SORT_BY, DEFAULT_SORT_BY) + .param(SORT_DIR, DEFAULT_SORT_DIR)); // then resultActions.andDo(print()) @@ -98,37 +106,39 @@ public void givenListOfPassengers_whenGetPassengers_thenReturnPaginatedAndSorted @Test public void givenPassengerId_whenGetPassenger_thenReturnPassenger() throws Exception { // given - User user = new User(); - user.setFullName("Full Name"); - user.setEmail("sample@email.com"); - user.setPassword(passwordEncoder.encode("password")); - user.setRoles(Set.of(savedRole)); + User user = User.builder() + .fullName(FULL_NAME) + .email(VALID_EMAIL_ADDRESS) + .password(passwordEncoder.encode(VALID_PASSWORD)) + .roles(Set.of(savedRole)) + .build(); User savedUser = userRepository.save(user); // when - ResultActions resultActions = mockMvc.perform(get("/api/v1/passengers/{id}", savedUser.getId())); + ResultActions resultActions = mockMvc.perform(get(API_V1_PASSENGERS.concat(ID), savedUser.getId())); // then resultActions.andDo(print()) .andExpect(status().isOk()) - .andExpect(jsonPath("$.fullName").value(user.getFullName())) - .andExpect(jsonPath("$.email").value(user.getEmail())); + .andExpect(jsonPath(FULL_NAME_PATH).value(user.getFullName())) + .andExpect(jsonPath(EMAIL_PATH).value(user.getEmail())); } @Test public void givenPassengerId_whenDeletePassenger_thenReturnNothing() throws Exception { // given - User user = new User(); - user.setFullName("Full Name"); - user.setEmail("sample@email.com"); - user.setPassword(passwordEncoder.encode("password")); - user.setRoles(Set.of(savedRole)); + User user = User.builder() + .fullName(FULL_NAME) + .email(VALID_EMAIL_ADDRESS) + .password(passwordEncoder.encode(VALID_PASSWORD)) + .roles(Set.of(savedRole)) + .build(); User savedUser = userRepository.save(user); // when - ResultActions resultActions = mockMvc.perform(delete("/api/v1/passengers/{id}", savedUser.getId())); + ResultActions resultActions = mockMvc.perform(delete(API_V1_PASSENGERS.concat(ID), savedUser.getId())); // then resultActions.andDo(print()) diff --git a/src/test/java/com/projects/aeroplannerrestapi/controller/PaymentControllerIT.java b/src/test/java/com/projects/aeroplannerrestapi/controller/PaymentControllerIT.java index 146e5d3..1dfee25 100644 --- a/src/test/java/com/projects/aeroplannerrestapi/controller/PaymentControllerIT.java +++ b/src/test/java/com/projects/aeroplannerrestapi/controller/PaymentControllerIT.java @@ -18,18 +18,21 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; -import java.math.BigDecimal; import java.time.Duration; import java.time.LocalDateTime; import java.util.Set; +import static com.projects.aeroplannerrestapi.constants.PathConstants.*; +import static com.projects.aeroplannerrestapi.constants.SecurityRoleConstants.ADMIN; +import static com.projects.aeroplannerrestapi.constants.SecurityRoleConstants.USER; +import static com.projects.aeroplannerrestapi.util.TestConstants.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @AutoConfigureMockMvc -@ActiveProfiles("integration") +@ActiveProfiles(INTEGRATION) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class PaymentControllerIT extends AbstractContainerBaseTest { @@ -67,96 +70,107 @@ public void setup() { } @Test - @WithMockUser(roles = "USER") + @WithMockUser(roles = USER) public void givenPaymentRequest_whenMakePayment_thenReturnPaymentResponse() throws Exception { // given - User user = new User(); - user.setFullName("Full Name"); - user.setEmail("sample@email.com"); - user.setPassword(passwordEncoder.encode("password")); - Role role = new Role(); - role.setName(RoleEnum.USER); - role.setDescription("Default user role"); + Role role = Role.builder() + .name(RoleEnum.USER) + .description(DEFAULT_USER_ROLE) + .build(); + Role savedRole = roleRepository.save(role); - user.setRoles(Set.of(savedRole)); + + User user = User.builder() + .fullName(FULL_NAME) + .email(VALID_EMAIL_ADDRESS) + .password(passwordEncoder.encode(VALID_PASSWORD)) + .roles(Set.of(savedRole)) + .build(); + User savedUser = userRepository.save(user); - Flight flight = new Flight(); - flight.setAirline("Airline"); - flight.setFlightNumber("Flight Number"); - flight.setDepartureTime("2023-04-19T15:30:00"); - flight.setArrivalTime("2024-04-19T15:30:00"); - flight.setDuration(Duration.between(LocalDateTime.parse("2023-04-19T15:30:00"), - LocalDateTime.parse("2024-04-19T15:30:00"))); - flight.setPrice(BigDecimal.valueOf(100.00)); - flight.setAircraftType("Aircraft Type"); - flight.setSeatAvailability(0); - flight.setCurrentAvailableSeat(0); - flight.setStatus(FlightStatusEnum.UNKNOWN); + Flight flight = Flight.builder() + .airline(AIRLINE) + .flightNumber(FLIGHT_NUMBER) + .departureTime(VALID_DEPARTURE_TIME) + .arrivalTime(VALID_ARRIVAL_TIME) + .duration(Duration.between(LocalDateTime.parse(VALID_DEPARTURE_TIME), LocalDateTime.parse(VALID_ARRIVAL_TIME))) + .price(VALID_AMOUNT) + .aircraftType(AIRCRAFT_TYPE) + .seatAvailability(ZERO) + .currentAvailableSeat(ZERO) + .status(FlightStatusEnum.UNKNOWN) + .build(); + Flight savedFlight = flightRepository.save(flight); - Reservation reservation = new Reservation(); - reservation.setPassengerId(savedUser.getId()); - reservation.setFlightId(savedFlight.getId()); - reservation.setSeatNumber(1); - reservation.setReservationDate("2024-05-19T15:30:00"); - reservation.setReservationStatus(ReservationStatusEnum.CONFIRMED); + Reservation reservation = Reservation.builder() + .passengerId(savedUser.getId()) + .flightId(savedFlight.getId()) + .seatNumber(Integer.parseInt(ONE)) + .reservationDate(VALID_RESERVATION_DATE) + .reservationStatus(ReservationStatusEnum.CONFIRMED) + .build(); + Reservation savedReservation = reservationRepository.save(reservation); - PaymentRequest paymentRequest = new PaymentRequest(); - paymentRequest.setPassengerId(savedUser.getId()); - paymentRequest.setFlightId(savedFlight.getId()); - paymentRequest.setSeatNumber(savedReservation.getSeatNumber()); - paymentRequest.setCardNumber("4532280979380570"); - paymentRequest.setCardHolderName("Card Holder Name"); - paymentRequest.setExpiryDate("11/30"); - paymentRequest.setCvv("4431"); - paymentRequest.setAmount(savedFlight.getPrice()); + PaymentRequest paymentRequest = PaymentRequest.builder() + .passengerId(savedUser.getId()) + .flightId(savedFlight.getId()) + .seatNumber(savedReservation.getSeatNumber()) + .cardNumber(VALID_CARD_NUMBER) + .cardHolderName(CARD_HOLDER_NAME) + .expiryDate(VALID_EXPIRY_DATE) + .cvv(VALID_CVV) + .amount(savedFlight.getPrice()) + .build(); // when - ResultActions resultActions = mockMvc.perform(post("/api/v1/payments/payment") + ResultActions resultActions = mockMvc.perform(post(API_V1_PAYMENTS.concat(PAYMENT)) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(paymentRequest))); // then resultActions.andDo(print()) .andExpect(status().isCreated()) - .andExpect(jsonPath("$.amount").value(paymentRequest.getAmount())) - .andExpect(jsonPath("$.status").value(PaymentStatusEnum.PAID.name())) - .andExpect(jsonPath("$.message").value(PaymentStatusEnum.PAID.name())); + .andExpect(jsonPath(AMOUNT_PATH).value(paymentRequest.getAmount().intValue())) + .andExpect(jsonPath(STATUS_PATH).value(PaymentStatusEnum.PAID.name())) + .andExpect(jsonPath(MESSAGE_PATH).value(PaymentStatusEnum.PAID.name())); } @Test - @WithMockUser(roles = {"USER", "ADMIN"}) + @WithMockUser(roles = {USER, ADMIN}) public void givenPaymentId_whenGetPaymentDetails_thenReturnPaymentObject() throws Exception { // given - Payment payment = new Payment(); - payment.setPassengerId(1L); - payment.setFlightId(1L); - payment.setStatus(PaymentStatusEnum.PAID); - payment.setTransactionId("transaction id"); - payment.setCvv("4431"); - payment.setAmount(BigDecimal.valueOf(100.00)); - payment.setCardNumber("4532280979380570"); - payment.setCardHolderName("Card Holder Name"); - payment.setExpiryDate("11/30"); + Payment payment = Payment.builder() + .passengerId(VALID_PASSENGER_ID) + .flightId(VALID_FLIGHT_ID) + .status(PaymentStatusEnum.PAID) + .transactionId(TRANSACTION_ID) + .cvv(VALID_CVV) + .amount(VALID_AMOUNT) + .cardNumber(VALID_CARD_NUMBER) + .cardHolderName(CARD_HOLDER_NAME) + .expiryDate(VALID_EXPIRY_DATE) + .build(); + Payment savedPayment = paymentRepository.save(payment); // when - ResultActions resultActions = mockMvc.perform(get("/api/v1/payments/{id}", savedPayment.getId())); + ResultActions resultActions = mockMvc.perform(get(API_V1_PAYMENTS.concat(ID), savedPayment.getId())); // then resultActions.andDo(print()) .andExpect(status().isOk()) - .andExpect(jsonPath("$.id").value(savedPayment.getId())) - .andExpect(jsonPath("$.passengerId").value(savedPayment.getPassengerId())) - .andExpect(jsonPath("$.flightId").value(savedPayment.getFlightId())) - .andExpect(jsonPath("$.status").value(savedPayment.getStatus().name())) - .andExpect(jsonPath("$.transactionId").value(savedPayment.getTransactionId())) - .andExpect(jsonPath("$.cvv").value(savedPayment.getCvv())) - .andExpect(jsonPath("$.amount").value(savedPayment.getAmount())) - .andExpect(jsonPath("$.cardNumber").value(savedPayment.getCardNumber())) - .andExpect(jsonPath("$.cardHolderName").value(savedPayment.getCardHolderName())) - .andExpect(jsonPath("$.expiryDate").value(savedPayment.getExpiryDate())); + .andExpect(jsonPath(ID_PATH).value(savedPayment.getId())) + .andExpect(jsonPath(PASSENGER_ID_PATH).value(savedPayment.getPassengerId())) + .andExpect(jsonPath(FLIGHT_ID_PATH).value(savedPayment.getFlightId())) + .andExpect(jsonPath(STATUS_PATH).value(savedPayment.getStatus().name())) + .andExpect(jsonPath(TRANSACTION_ID_PATH).value(savedPayment.getTransactionId())) + .andExpect(jsonPath(CVV_PATH).value(savedPayment.getCvv())) + .andExpect(jsonPath(AMOUNT_PATH).value(savedPayment.getAmount().intValue())) + .andExpect(jsonPath(CARD_NUMBER_PATH).value(savedPayment.getCardNumber())) + .andExpect(jsonPath(CARD_HOLDER_NAME_PATH).value(savedPayment.getCardHolderName())) + .andExpect(jsonPath(EXPIRY_DATE_PATH).value(savedPayment.getExpiryDate())); } } diff --git a/src/test/java/com/projects/aeroplannerrestapi/util/TestConstants.java b/src/test/java/com/projects/aeroplannerrestapi/util/TestConstants.java index 3da6452..0caa1e1 100644 --- a/src/test/java/com/projects/aeroplannerrestapi/util/TestConstants.java +++ b/src/test/java/com/projects/aeroplannerrestapi/util/TestConstants.java @@ -39,15 +39,21 @@ private TestConstants(){ public static final String VALID_PASSWORD = "Password@123!"; public static final String VALID_DEPARTURE_TIME = "2023-04-19T15:30:00"; public static final String VALID_ARRIVAL_TIME = "2024-04-19T15:30:00"; + public static final String VALID_RESERVATION_DATE = "2024-05-19T15:30:00"; + public static final String VALID_CARD_NUMBER = "4532280979380570"; + public static final BigDecimal VALID_AMOUNT = BigDecimal.valueOf(100); + public static final String VALID_EXPIRY_DATE = "11/30"; + public static final String VALID_CVV = "4431"; + public static final Long VALID_PASSENGER_ID = 1L; + public static final Long VALID_FLIGHT_ID = 1L; public static final BigDecimal VALID_PRICE = BigDecimal.valueOf(0.0); - public static final String DEFAULT_USER_ROLE = "Default user role"; public static final String EMAIL_PATH = "$.email"; public static final String FULL_NAME_PATH = "$.fullName"; public static final String TOKEN_PATH = "$.token"; - public static final String AIRLINE_PATH = "$.token"; + public static final String AIRLINE_PATH = "$.airline"; public static final String FLIGHT_NUMBER_PATH = "$.flightNumber"; public static final String DEPARTURE_TIME_PATH = "$.departureTime"; public static final String ARRIVAL_TIME_PATH = "$.arrivalTime"; @@ -55,7 +61,17 @@ private TestConstants(){ public static final String AIRCRAFT_TYPE_PATH = "$.aircraftType"; public static final String SEAT_AVAILABILITY_PATH = "$.seatAvailability"; public static final String CURRENT_SEAT_AVAILABILITY_PATH = "$.currentAvailableSeat"; + public static final String AMOUNT_PATH = "$.amount"; public static final String STATUS_PATH = "$.status"; + public static final String MESSAGE_PATH = "$.message"; public static final String EXPIRED_IN_PATH = "$.expiredIn"; + public static final String ID_PATH = "$.id"; + public static final String PASSENGER_ID_PATH = "$.passengerId"; + public static final String FLIGHT_ID_PATH = "$.flightId"; + public static final String TRANSACTION_ID_PATH = "$.transactionId"; + public static final String CVV_PATH = "$.cvv"; + public static final String CARD_NUMBER_PATH = "$.cardNumber"; + public static final String CARD_HOLDER_NAME_PATH = "$.cardHolderName"; + public static final String EXPIRY_DATE_PATH = "$.expiryDate"; public static final String SIZE_PATH = "$.size()"; }