Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Set;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Builder
public class OrderResponseDto {
private Long id;
private Long userId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
import com.origin.bookstore.validation.FieldMatch;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Builder
@FieldMatch(
field = "password",
fieldToMatch = "repeatPassword"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package com.origin.bookstore.dto.user;

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Builder
public class UserResponseDto {
private Long id;
private String email;
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/com/origin/bookstore/model/CartItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,19 @@
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Table(name = "cart_items")
@Builder
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class CartItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/com/origin/bookstore/model/Order.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,11 @@
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Set;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.annotations.SQLDelete;
Expand All @@ -29,7 +32,10 @@
@SQLRestriction("is_deleted=false")
@Getter
@Setter
@Builder
@Table(name = "orders")
@NoArgsConstructor
@AllArgsConstructor
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/com/origin/bookstore/model/OrderItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import java.math.BigDecimal;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.SQLRestriction;
Expand All @@ -20,7 +23,10 @@
@SQLRestriction("is_deleted=false")
@Getter
@Setter
@Builder
@Table(name = "order_items")
@NoArgsConstructor
@AllArgsConstructor
public class OrderItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/com/origin/bookstore/model/ShoppingCart.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,11 @@
import jakarta.persistence.Table;
import java.util.HashSet;
import java.util.Set;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.annotations.SQLDelete;
Expand All @@ -23,8 +26,11 @@
@SQLDelete(sql = "UPDATE shopping_carts SET is_deleted = true WHERE id = ?")
@SQLRestriction("is_deleted=false")
@Getter
@Builder
@Setter
@Table(name = "shopping_carts")
@NoArgsConstructor
@AllArgsConstructor
public class ShoppingCart {
@Id
private Long id;
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/com/origin/bookstore/model/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.SQLRestriction;
Expand All @@ -23,9 +26,12 @@
@Entity
@Getter
@Setter
@Builder
@SQLDelete(sql = "UPDATE users SET is_deleted = true WHERE id = ?")
@SQLRestriction("is_deleted=false")
@Table(name = "users")
@NoArgsConstructor
@AllArgsConstructor
public class User implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.origin.bookstore.model.Order;
import com.origin.bookstore.model.User;
import java.util.Optional;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.EntityGraph;
Expand All @@ -10,4 +11,7 @@
public interface OrderRepository extends JpaRepository<Order, Long> {
@EntityGraph(attributePaths = "orderItems")
Page<Order> getOrdersByUser(User user, Pageable pageable);

@EntityGraph(attributePaths = "orderItems")
Optional<Order> findByIdAndUser(Long id, User user);
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import jakarta.transaction.Transactional;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
Expand Down Expand Up @@ -50,6 +51,7 @@ public OrderResponseDto save(User user, OrderRequestDto orderRequestDto) {
order.setStatus(Order.Status.PENDING);
order.setUser(user);
order.setTotal(BigDecimal.ZERO);
order.setOrderItems(new HashSet<>());
order.getOrderItems()
.addAll(shoppingCart
.getCartItems().stream()
Expand Down Expand Up @@ -77,6 +79,11 @@ public Page<OrderResponseDto> getAllOrders(User user, Pageable pageable) {

@Override
public List<OrderItemResponseDto> getAllOrderItems(User user, Long orderId) {
orderRepository.findByIdAndUser(orderId, user)
.orElseThrow(() -> new EntityNotFoundException(
"Can't find order by id: " + orderId + " for user: " + user.getId()
));

return orderItemRepository
.findAllByOrderIdAndOrderUser(orderId, user).stream()
.map(orderItemMapper::toDto)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ databaseChangeLog:
constraints:
nullable: false
primaryKey: true
- column:
name: user_id
type: bigint
constraints:
nullable: false
- column:
name: status
type: varchar(255)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package com.origin.bookstore.controller;

import com.origin.bookstore.dto.user.UserLoginRequestDto;
import com.origin.bookstore.dto.user.UserRegistrationRequestDto;
import com.origin.bookstore.util.TestUtil;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.jdbc.Sql;
import org.springframework.test.web.servlet.MockMvc;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.http.MediaType;
import static org.hamcrest.Matchers.notNullValue;
import static com.origin.bookstore.util.TestConstants.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;

@SpringBootTest
@AutoConfigureMockMvc
class AuthenticationControllerTest {
private static final String EMAIL_JSON_PATH =
"$.email";

@Autowired
private MockMvc mockMvc;

@Autowired
private ObjectMapper objectMapper;

@Test
@DisplayName("Register a new user successfully")
@Sql(scripts = CLEANUP_DB_PATH, executionPhase =
Sql.ExecutionPhase.BEFORE_TEST_METHOD)
void register_ValidRequest_ReturnsUserResponse() throws Exception {
UserRegistrationRequestDto request = TestUtil.createUserRegistrationRequestDto();

mockMvc.perform(post(REGISTRATION_PATH)
.content(objectMapper.writeValueAsString(request))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath(EMAIL_JSON_PATH).value(request.getEmail())
);
}

@Test
@DisplayName("Should login user successfully and return token")
@Sql(scripts = CLEANUP_DB_PATH, executionPhase =
Sql.ExecutionPhase.BEFORE_TEST_METHOD)
@Sql(scripts = ADD_USER_PATH, executionPhase =
Sql.ExecutionPhase.BEFORE_TEST_METHOD
)
void login_ValidRequest_ReturnsToken() throws Exception {
UserLoginRequestDto request = new UserLoginRequestDto("rudycooper@gmail.com", "example");

mockMvc.perform(post(LOGIN_PATH)
.content(objectMapper.writeValueAsString(request))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.token").value(notNullValue())
);
}

@Test
@DisplayName("Register with invalid data should return bad request")
@Sql(scripts = CLEANUP_DB_PATH, executionPhase =
Sql.ExecutionPhase.BEFORE_TEST_METHOD)
void register_InvalidRequest_ReturnsBadRequest() throws Exception {
UserRegistrationRequestDto invalidRequest = TestUtil.createUserRegistrationRequestDto();
invalidRequest.setEmail("not an email");
invalidRequest.setPassword("");

mockMvc.perform(post(REGISTRATION_PATH)
.content(objectMapper.writeValueAsString(invalidRequest))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isBadRequest());
}

@Test
@DisplayName("Register with existing email should return conflict")
@Sql(scripts = CLEANUP_DB_PATH, executionPhase =
Sql.ExecutionPhase.BEFORE_TEST_METHOD)
@Sql(scripts = ADD_USER_PATH, executionPhase =
Sql.ExecutionPhase.BEFORE_TEST_METHOD
)
void register_DuplicateEmail_ReturnsConflict() throws Exception {
UserRegistrationRequestDto request = TestUtil.createUserRegistrationRequestDto();
request.setEmail("rudycooper@gmail.com");

mockMvc.perform(post(REGISTRATION_PATH)
.content(objectMapper.writeValueAsString(request))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isConflict());
}
}
Loading
Loading