From 8238f3ec85ad196da3ac54474862b78fc51f81c4 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Thu, 27 Jul 2023 17:15:23 +0900 Subject: [PATCH 01/33] =?UTF-8?q?User=20->=20Member=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + readme.md | 24 +++++------ .../swger/tddstudy/member/domain/Member.java | 40 +++++++++++++++++++ .../domain/MemberLevel.java} | 4 +- .../tddstudy/member/domain/MemberType.java | 12 ++++++ .../swger/tddstudy/order/domain/Order.java | 6 +-- .../com/swger/tddstudy/user/domain/User.java | 31 -------------- .../swger/tddstudy/user/domain/UserType.java | 12 ------ 8 files changed, 70 insertions(+), 60 deletions(-) create mode 100644 src/main/java/com/swger/tddstudy/member/domain/Member.java rename src/main/java/com/swger/tddstudy/{user/domain/UserLevel.java => member/domain/MemberLevel.java} (70%) create mode 100644 src/main/java/com/swger/tddstudy/member/domain/MemberType.java delete mode 100644 src/main/java/com/swger/tddstudy/user/domain/User.java delete mode 100644 src/main/java/com/swger/tddstudy/user/domain/UserType.java diff --git a/build.gradle b/build.gradle index e5ec1a5..3b55e26 100644 --- a/build.gradle +++ b/build.gradle @@ -27,6 +27,7 @@ dependencies { compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' + implementation 'org.springframework.boot:spring-boot-starter-validation' testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/readme.md b/readme.md index 0e8875a..1fc75a5 100644 --- a/readme.md +++ b/readme.md @@ -28,29 +28,29 @@ #### 패키지 구조 ```text ├── controller -│   └── UserController.java +│   └── MemberController.java ├── domain -│   ├── User.java -│   ├── UserLevel.java -│   └── UserType.java +│   ├── Member.java +│   ├── MemberLevel.java +│   └── MemberType.java ├── repository -│   └── UserRepository.java +│   └── MemberRepository.java └── service - └── UserService.java + └── MemberService.java ``` -* 모든 도메인 패키지 구조는 다음을 따릅니다. (예시 : `user` 도메인) +* 모든 도메인 패키지 구조는 다음을 따릅니다. (예시 : `Member` 도메인) * 각 패키지 내부의 클래스들은 예시일 뿐 얼마든지 클래스를 추가로 생성하셔도 됩니다. ### 유저 도메인을 완성해봅시다. | 변수명 | 필드명 | 설명 | |----------------|----------|--------------------------| | id | 사용자 아이디 | 사용자 엔티티 식별자 | -| username | 사용자 아이디 | 사용자 로그인 아이디 | +| Membername | 사용자 아이디 | 사용자 로그인 아이디 | | password | 사용자 비밀번호 | 사용자 비밀번호 | | nickname | 사용자 닉네임 | 사용자 닉네임 | -| userLevel | 사용자 등급 | 사용자 등급 | -| type | 사용자 유형 | 사용자 유형으로 ADMIN, USER가 존재 | +| MemberLevel | 사용자 등급 | 사용자 등급 | +| type | 사용자 유형 | 사용자 유형으로 ADMIN, Member가 존재 | | createdAt | 생성 일시 | 사용자 최초 생성 일시 | | lastModifiedAt | 최종 수정 일시 | 사용자 최종 수정 일시 | * 사용자는 `회원가입`이 가능합니다. @@ -62,7 +62,7 @@ * BRONZE, SILVER, GOLD가 존재하며 추후 주문 시 결제 금액 할인이 가능합니다. * 5번 구매를 하면 SILVER, 10번 구매를 하면 GOLD로 등급업이 됩니다. * 사용자 별 `타입(type)`이 존재합니다. - * USER : 일반유저로 상품을 구매는 가능하지만 추가할 수 없습니다. + * Member : 일반유저로 상품을 구매는 가능하지만 추가할 수 없습니다. * ADMIN : 관리자로 상품을 구매와 추가 모두 가능합니다.
@@ -93,7 +93,7 @@ | 변수명 | 필드명 | 설명 | |----------------|----------|------------| | id | 주문 아이디 | 주문 엔티티 식별자 | -| userId | 유저 아이디 | 유저 엔티티 식별자 | +| MemberId | 유저 아이디 | 유저 엔티티 식별자 | | orderProducts | 주문 상품 정보 | 주문의 상품의 정보 | | price | 총 주문 가격 | 총 주문 가격 | | orderStatus | 주문 상태 | 주문 상태 | diff --git a/src/main/java/com/swger/tddstudy/member/domain/Member.java b/src/main/java/com/swger/tddstudy/member/domain/Member.java new file mode 100644 index 0000000..63f3fad --- /dev/null +++ b/src/main/java/com/swger/tddstudy/member/domain/Member.java @@ -0,0 +1,40 @@ +package com.swger.tddstudy.member.domain; + +import com.swger.tddstudy.util.BaseEntity; + +import javax.persistence.*; +import javax.validation.constraints.NotBlank; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity +public class Member extends BaseEntity { + + @Id @GeneratedValue + private Long id; + + @NotBlank + private String username; + + @NotBlank + private String password; + + @NotBlank + private String nickname; + + @Enumerated(EnumType.STRING) + private MemberLevel MemberLevel; + + @Enumerated(EnumType.STRING) + private MemberType type; + + public Member(String username, String password, String nickname) { + this.username = username; + this.password = password; + this.nickname = nickname; + } +} diff --git a/src/main/java/com/swger/tddstudy/user/domain/UserLevel.java b/src/main/java/com/swger/tddstudy/member/domain/MemberLevel.java similarity index 70% rename from src/main/java/com/swger/tddstudy/user/domain/UserLevel.java rename to src/main/java/com/swger/tddstudy/member/domain/MemberLevel.java index 4f9e926..9a884b6 100644 --- a/src/main/java/com/swger/tddstudy/user/domain/UserLevel.java +++ b/src/main/java/com/swger/tddstudy/member/domain/MemberLevel.java @@ -1,9 +1,9 @@ -package com.swger.tddstudy.user.domain; +package com.swger.tddstudy.member.domain; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor -public enum UserLevel { +public enum MemberLevel { BRONZE("브론즈"), SILVER("실버"), GOLD("골드"); diff --git a/src/main/java/com/swger/tddstudy/member/domain/MemberType.java b/src/main/java/com/swger/tddstudy/member/domain/MemberType.java new file mode 100644 index 0000000..9e86662 --- /dev/null +++ b/src/main/java/com/swger/tddstudy/member/domain/MemberType.java @@ -0,0 +1,12 @@ +package com.swger.tddstudy.member.domain; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum MemberType { + + Member("일반회원"), ADMIN("관리자"); + + private final String text; + +} diff --git a/src/main/java/com/swger/tddstudy/order/domain/Order.java b/src/main/java/com/swger/tddstudy/order/domain/Order.java index 3267f59..bc978f1 100644 --- a/src/main/java/com/swger/tddstudy/order/domain/Order.java +++ b/src/main/java/com/swger/tddstudy/order/domain/Order.java @@ -2,7 +2,7 @@ import com.swger.tddstudy.orderProduct.domain.OrderProduct; import com.swger.tddstudy.util.BaseEntity; -import com.swger.tddstudy.user.domain.User; +import com.swger.tddstudy.member.domain.Member; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; @@ -26,13 +26,13 @@ public class Order extends BaseEntity { private Long id; @ManyToOne - private User user; + private Member Member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List orderProducts; private int price; - @Enum태erated(EnumType.STRING) + @Enumerated(EnumType.STRING) private OrderStatus orderStatus; } diff --git a/src/main/java/com/swger/tddstudy/user/domain/User.java b/src/main/java/com/swger/tddstudy/user/domain/User.java deleted file mode 100644 index 8df4eaa..0000000 --- a/src/main/java/com/swger/tddstudy/user/domain/User.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.swger.tddstudy.user.domain; - -import com.swger.tddstudy.util.BaseEntity; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.Id; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Entity -public class User extends BaseEntity { - - @Id - private Long id; - - private String username; - - private String password; - - private String nickname; - - @Enumerated(EnumType.STRING) - private UserLevel userLevel; - - @Enumerated(EnumType.STRING) - private UserType type; -} diff --git a/src/main/java/com/swger/tddstudy/user/domain/UserType.java b/src/main/java/com/swger/tddstudy/user/domain/UserType.java deleted file mode 100644 index 73912c7..0000000 --- a/src/main/java/com/swger/tddstudy/user/domain/UserType.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.swger.tddstudy.user.domain; - -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public enum UserType { - - USER("일반회원"), ADMIN("관리자"); - - private final String text; - -} From c8c7952c36cf3089e09aa4389b0f5e7610728f86 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Thu, 27 Jul 2023 17:15:57 +0900 Subject: [PATCH 02/33] =?UTF-8?q?DTO=EB=A1=9C=20=EB=B0=9B=EC=95=84?= =?UTF-8?q?=EC=98=A4=EB=8A=94=20=ED=99=98=EA=B2=BD=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=B4=20MemberDTO=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/swger/tddstudy/member/domain/MemberDTO.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java diff --git a/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java b/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java new file mode 100644 index 0000000..f83ff2f --- /dev/null +++ b/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java @@ -0,0 +1,12 @@ +package com.swger.tddstudy.member.domain; + +import lombok.Getter; +import lombok.Setter; + +@Getter @Setter +public class MemberDTO { + + private String username; + private String password; + private String nickname; +} From 8e00cf09f9e9b30de7ff98ebd9217591bf105194 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Thu, 27 Jul 2023 17:16:41 +0900 Subject: [PATCH 03/33] =?UTF-8?q?=ED=9A=8C=EC=9B=90=20=EA=B0=80=EC=9E=85?= =?UTF-8?q?=20=EC=84=B1=EA=B3=B5=20/=20=EC=8B=A4=ED=8C=A8(=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EB=94=94=EB=A5=BC=20=EC=9E=91=EC=84=B1=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EC=9D=8C)=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tddstudy/member/domain/MemberTest.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/test/java/com/swger/tddstudy/member/domain/MemberTest.java diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java new file mode 100644 index 0000000..7752a17 --- /dev/null +++ b/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java @@ -0,0 +1,61 @@ +package com.swger.tddstudy.member.domain; + + +import com.swger.tddstudy.member.repository.MemberRepository; +import com.swger.tddstudy.member.service.MemberService; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import javax.transaction.Transactional; +import java.util.List; + +@SpringBootTest +@Transactional +class MemberTest { + @Autowired + MemberRepository memberRepository; + @Autowired + MemberService memberService; + /** + * 회원가입 + * */ + /* 회원 가입 성공 */ + /* 사용자 입력: 아이디:testMembername , 비밀번호: testPassword , 닉네임: testNickname*/ + @Test + public void SignUpSuccess() { + //given + MemberDTO memberDTO = new MemberDTO(); + memberDTO.setUsername("testUsername"); + memberDTO.setPassword("testPassword"); + memberDTO.setNickname("testNickname"); + //when + Member member= new Member(memberDTO.getUsername(), memberDTO.getPassword(), memberDTO.getNickname()); + memberService.join(member); + List getMember = memberRepository.findByUsername("testUsername"); + //then + Assertions.assertThat(getMember.get(0)).isEqualTo(member); + } + + /* 회원 가입 실패 - 아이디 */ + /* 사용자 입력: 아이디: , 비밀번호: testPassword , 닉네임: testNickname*/ + @Test + public void SignUpUsernameBlank() { + //given + MemberDTO MemberDTO = new MemberDTO(); + MemberDTO.setPassword("testPassword"); + MemberDTO.setNickname("testNickname"); + //when + Member Member = new Member(MemberDTO.getUsername(), MemberDTO.getPassword(), MemberDTO.getNickname()); + memberService.join(Member); + List getMember = memberRepository.findByUsername(""); + //then + Assertions.assertThat(getMember.get(0)).isEqualTo(Member); + } + /* 회원 가입 실패 - 비밀번호*/ + + /* 회원 가입 실패 - 비밀번호 재확인*/ + + /* 회원 가입 실패 - 닉네임 */ +} \ No newline at end of file From abfd5aefc16bb1c23c55fae62821458b92c4d2d2 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Thu, 27 Jul 2023 17:17:46 +0900 Subject: [PATCH 04/33] =?UTF-8?q?Member=20=EA=B0=9D=EC=B2=B4=EB=A5=BC=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20:=20save,=20Member=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=EB=A5=BC=20username=EC=9C=BC=EB=A1=9C=20=EC=B0=BE?= =?UTF-8?q?=EA=B8=B0=EC=9C=84=ED=95=9C=20=EB=A9=94=EC=86=8C=EB=93=9C:=20fi?= =?UTF-8?q?ndByUsername?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/repository/MemberRepository.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/com/swger/tddstudy/member/repository/MemberRepository.java diff --git a/src/main/java/com/swger/tddstudy/member/repository/MemberRepository.java b/src/main/java/com/swger/tddstudy/member/repository/MemberRepository.java new file mode 100644 index 0000000..2fb64af --- /dev/null +++ b/src/main/java/com/swger/tddstudy/member/repository/MemberRepository.java @@ -0,0 +1,13 @@ +package com.swger.tddstudy.member.repository; + +import com.swger.tddstudy.member.domain.Member; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface MemberRepository extends JpaRepository { + List findByUsername(String username); + + @Override + S save(S entity); +} From fe5a76944bc6e26b8ab766e01cc9c32d4917fa6a Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Thu, 27 Jul 2023 17:18:31 +0900 Subject: [PATCH 05/33] =?UTF-8?q?Transaction=ED=99=98=EA=B2=BD=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EA=B5=AC=ED=98=84:join?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/service/MemberService.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/com/swger/tddstudy/member/service/MemberService.java diff --git a/src/main/java/com/swger/tddstudy/member/service/MemberService.java b/src/main/java/com/swger/tddstudy/member/service/MemberService.java new file mode 100644 index 0000000..b1f7267 --- /dev/null +++ b/src/main/java/com/swger/tddstudy/member/service/MemberService.java @@ -0,0 +1,21 @@ +package com.swger.tddstudy.member.service; + +import com.swger.tddstudy.member.domain.Member; +import com.swger.tddstudy.member.domain.Member; +import com.swger.tddstudy.member.repository.MemberRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; + +@Service +@Transactional +@RequiredArgsConstructor +public class MemberService { + private final MemberRepository memberRepository; + + public Member join(Member member){ + memberRepository.save(member); + return member; + } +} From 9cd2ed1ea768fe38d5862d40a1693bcf5320dce9 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Thu, 27 Jul 2023 17:22:09 +0900 Subject: [PATCH 06/33] username --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 1fc75a5..640e832 100644 --- a/readme.md +++ b/readme.md @@ -46,10 +46,10 @@ | 변수명 | 필드명 | 설명 | |----------------|----------|--------------------------| | id | 사용자 아이디 | 사용자 엔티티 식별자 | -| Membername | 사용자 아이디 | 사용자 로그인 아이디 | +| username | 사용자 아이디 | 사용자 로그인 아이디 | | password | 사용자 비밀번호 | 사용자 비밀번호 | | nickname | 사용자 닉네임 | 사용자 닉네임 | -| MemberLevel | 사용자 등급 | 사용자 등급 | +| MemberLevel | 사용자 등급 | 사용자 등급 | | type | 사용자 유형 | 사용자 유형으로 ADMIN, Member가 존재 | | createdAt | 생성 일시 | 사용자 최초 생성 일시 | | lastModifiedAt | 최종 수정 일시 | 사용자 최종 수정 일시 | From c2d8b75f39608c3622f2c8621113b752ef569820 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Mon, 31 Jul 2023 16:48:27 +0900 Subject: [PATCH 07/33] =?UTF-8?q?Mock=EC=9D=84=20=EC=9D=B4=EC=9A=A9?= =?UTF-8?q?=ED=95=9C=20Controller=20Test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tddstudy/member/domain/MemberDTO.java | 11 ++- .../member/domain/MemberSignUpTest.java | 96 +++++++++++++++++++ 2 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java diff --git a/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java b/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java index f83ff2f..396ad4b 100644 --- a/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java +++ b/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java @@ -1,12 +1,19 @@ package com.swger.tddstudy.member.domain; import lombok.Getter; -import lombok.Setter; -@Getter @Setter +@Getter public class MemberDTO { private String username; private String password; private String nickname; + private String rePassword; + + public MemberDTO(String username, String password, String nickname, String rePassword) { + this.username = username; + this.password = password; + this.nickname = nickname; + this.rePassword = rePassword; + } } diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java new file mode 100644 index 0000000..faec2fc --- /dev/null +++ b/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java @@ -0,0 +1,96 @@ +package com.swger.tddstudy.member.domain; + + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.swger.tddstudy.member.repository.MemberRepository; +import com.swger.tddstudy.member.service.MemberService; +import org.assertj.core.api.Assertions; +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.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import javax.transaction.Transactional; +import java.util.List; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@Transactional +@AutoConfigureMockMvc +class MemberSignUpTest { + @Autowired + MemberRepository memberRepository; + @Autowired + MemberService memberService; + @Autowired + private MockMvc mockMvc; + @Autowired + private ObjectMapper om; + /** + * 회원가입 + * */ + /* 회원 가입 성공 */ + /* 사용자 입력: 아이디:testUsername , 비밀번호: testPassword , 닉네임: testNickname, 비밀번호재확인: testPassword*/ + @Test + public void SignUpSuccess() throws Exception { + //given + MemberDTO signInMember= new MemberDTO("testUsername", + "testPassword", "testNickname", "testPassword"); + String content = om.writeValueAsString(signInMember); + mockMvc.perform(post("/signIn") + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("signInOK")) + .andDo(print()); + //when + List getMember = memberRepository.findByUsername("testUsername"); + //then + /* 아이디, 비밀번호 같은지 확인*/ + /* equals로 진행하려고 했지만 안됨*/ + Assertions.assertThat(getMember.get(0).getUsername()).isEqualTo(signInMember.getUsername()); + Assertions.assertThat(getMember.get(0).getPassword()).isEqualTo(signInMember.getPassword()); + } + + /* 회원 가입 실패 - 비밀번호 재확인*/ + /* 사용자 입력: 아이디:testMembername , 비밀번호: testPassword , 닉네임: testNickname, 비밀번호재확인: test*/ + @Test + public void SignUpRePasswordMismatch() throws Exception { + //given + MemberDTO signInMember= new MemberDTO("testUsername", + "testPassword", "testNickname", "test"); + String content = om.writeValueAsString(signInMember); + mockMvc.perform(post("/signIn") + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("Password Mismatch")) + .andDo(print()); + + } +// /* 회원 가입 실패 - 아이디 */ + /* 사용자 입력: 아이디: , 비밀번호: testPassword , 닉네임: testNickname, 비밀번호재확인: testPassword*/ + @Test + public void SignUpUsernameBlank() throws Exception { + //given + MemberDTO signInMember= new MemberDTO("testUsername", + "testPassword", "", "testPassword"); + String content = om.writeValueAsString(signInMember); + mockMvc.perform(post("/signIn") + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("signInOK")) + .andDo(print()); + // validation이 진행되지 않는 이유... +// List members = memberRepository.findByUsername("testUsername"); + } +} \ No newline at end of file From bc4704d74cb762b052791ca1c3496d21a4d0a48e Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Mon, 31 Jul 2023 16:48:56 +0900 Subject: [PATCH 08/33] =?UTF-8?q?Controller:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberController.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/com/swger/tddstudy/member/controller/MemberController.java diff --git a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java new file mode 100644 index 0000000..ed8dd89 --- /dev/null +++ b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java @@ -0,0 +1,27 @@ +package com.swger.tddstudy.member.controller; + +import com.swger.tddstudy.member.domain.Member; +import com.swger.tddstudy.member.domain.MemberDTO; +import com.swger.tddstudy.member.service.MemberService; +import lombok.RequiredArgsConstructor; +import lombok.experimental.PackagePrivate; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +public class MemberController { + private final MemberService memberService; +// signIn이 아니라 SignUp이 맞는 표현.. 영어 이슈 + @PostMapping("/signIn") + public String signIn(@RequestBody MemberDTO memberDTO) { + /* 비밀번호 재확인 */ + if (!memberDTO.getPassword().equals(memberDTO.getRePassword())) { + return "Password Mismatch"; + } + Member newMember = new Member(memberDTO.getUsername(), + memberDTO.getPassword(), memberDTO.getNickname()); + memberService.join(newMember); + return "signInOK"; + } + +} From dc8819651417cfad859dd7fcf081a72420df3136 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Mon, 31 Jul 2023 16:59:05 +0900 Subject: [PATCH 09/33] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=84=B1=EA=B3=B5=20/=20=EC=8B=A4?= =?UTF-8?q?=ED=8C=A8=20Test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberController.java | 17 ++++ .../member/domain/MemberSignInTest.java | 87 +++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 src/test/java/com/swger/tddstudy/member/domain/MemberSignInTest.java diff --git a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java index ed8dd89..75085e8 100644 --- a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java +++ b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java @@ -2,15 +2,20 @@ import com.swger.tddstudy.member.domain.Member; import com.swger.tddstudy.member.domain.MemberDTO; +import com.swger.tddstudy.member.domain.MemberSignInDTO; +import com.swger.tddstudy.member.repository.MemberRepository; import com.swger.tddstudy.member.service.MemberService; import lombok.RequiredArgsConstructor; import lombok.experimental.PackagePrivate; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @RequiredArgsConstructor public class MemberController { private final MemberService memberService; + private final MemberRepository memberRepository; // signIn이 아니라 SignUp이 맞는 표현.. 영어 이슈 @PostMapping("/signIn") public String signIn(@RequestBody MemberDTO memberDTO) { @@ -24,4 +29,16 @@ public String signIn(@RequestBody MemberDTO memberDTO) { return "signInOK"; } + @PostMapping("/logIn") + public String logIn(@RequestBody MemberSignInDTO memberSignInDTO) { + List byUsername = memberRepository.findByUsername(memberSignInDTO.getUsername()); + if (byUsername.isEmpty()) { + return "Username MisMatch"; + } + if (!byUsername.get(0).getPassword().equals(memberSignInDTO.getPassword())){ + return "Password MisMatch"; + } + return "LogInOK"; + } + } diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberSignInTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberSignInTest.java new file mode 100644 index 0000000..9c8e38f --- /dev/null +++ b/src/test/java/com/swger/tddstudy/member/domain/MemberSignInTest.java @@ -0,0 +1,87 @@ +package com.swger.tddstudy.member.domain; + + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.swger.tddstudy.member.repository.MemberRepository; +import com.swger.tddstudy.member.service.MemberService; +import org.assertj.core.api.Assertions; +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.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import javax.transaction.Transactional; +import java.util.List; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@Transactional +@AutoConfigureMockMvc +class MemberSignInTest { + @Autowired + MemberRepository memberRepository; + @Autowired + MemberService memberService; + @Autowired + private MockMvc mockMvc; + @Autowired + private ObjectMapper om; + /** + * 로그인 + * */ + /* 로그인 성공 */ + /* 사용자 입력: 아이디:testUsername , 비밀번호: testPassword*/ + @Test + public void SignInSuccess() throws Exception { + //given + memberService.join(new Member("testUsername", "testPassword", "testNickName")); + MemberSignInDTO signInMember= new MemberSignInDTO("testUsername","testPassword"); + String content = om.writeValueAsString(signInMember); + mockMvc.perform(post("/logIn") + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("LogInOK")) + .andDo(print()); + } + /* 로그인 실패 - 아이디 틀림 */ + /* 사용자 입력: 아이디:test , 비밀번호: testPassword*/ + @Test + public void SignInFailUsername() throws Exception { + //given + memberService.join(new Member("testUsername", "testPassword", "testNickName")); + MemberSignInDTO signInMember= new MemberSignInDTO("test","testPassword"); + String content = om.writeValueAsString(signInMember); + mockMvc.perform(post("/logIn") + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("Username MisMatch")) + .andDo(print()); + } + /* 로그인 실패 - 비밀번호 틀림 */ + /* 사용자 입력: 아이디:testUsername , 비밀번호: test*/ + @Test + public void SignInFailPassword() throws Exception { + //given + memberService.join(new Member("testUsername", "testPassword", "testNickName")); + MemberSignInDTO signInMember= new MemberSignInDTO("testUsername","test"); + String content = om.writeValueAsString(signInMember); + mockMvc.perform(post("/logIn") + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("Password MisMatch")) + .andDo(print()); + } + +} \ No newline at end of file From 40624610fe9cbe9885ddf4204e011ca9789e233f Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Mon, 31 Jul 2023 16:59:29 +0900 Subject: [PATCH 10/33] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=EC=9A=A9=20DT?= =?UTF-8?q?O=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tddstudy/member/domain/MemberSignInDTO.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/com/swger/tddstudy/member/domain/MemberSignInDTO.java diff --git a/src/main/java/com/swger/tddstudy/member/domain/MemberSignInDTO.java b/src/main/java/com/swger/tddstudy/member/domain/MemberSignInDTO.java new file mode 100644 index 0000000..b453b03 --- /dev/null +++ b/src/main/java/com/swger/tddstudy/member/domain/MemberSignInDTO.java @@ -0,0 +1,16 @@ +package com.swger.tddstudy.member.domain; + +import lombok.Getter; + +@Getter +public class MemberSignInDTO { + + private String username; + private String password; + + public MemberSignInDTO(String username, String password) { + this.username = username; + this.password = password; + + } +} From d58abb953a770278186f4f0edf72a7009a7eef61 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Mon, 31 Jul 2023 16:59:59 +0900 Subject: [PATCH 11/33] =?UTF-8?q?equals=EB=A5=BC=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../swger/tddstudy/member/domain/Member.java | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/swger/tddstudy/member/domain/Member.java b/src/main/java/com/swger/tddstudy/member/domain/Member.java index 63f3fad..d17e71a 100644 --- a/src/main/java/com/swger/tddstudy/member/domain/Member.java +++ b/src/main/java/com/swger/tddstudy/member/domain/Member.java @@ -1,7 +1,7 @@ package com.swger.tddstudy.member.domain; import com.swger.tddstudy.util.BaseEntity; - +import com.swger.tddstudy.member.domain.MemberLevel; import javax.persistence.*; import javax.validation.constraints.NotBlank; @@ -9,8 +9,9 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.util.Objects; + @Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Member extends BaseEntity { @@ -36,5 +37,26 @@ public Member(String username, String password, String nickname) { this.username = username; this.password = password; this.nickname = nickname; + this.MemberLevel = MemberLevel.BRONZE; + } + public Member(){} + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Member)) return false; + Member member = (Member) o; + return Objects.equals(getId(), member.getId()) + && Objects.equals(getUsername(), member.getUsername()) + && Objects.equals(getPassword(), member.getPassword()) + && Objects.equals(getNickname(), member.getNickname()) + && getMemberLevel() == member.getMemberLevel() && getType() == member.getType(); + } + + @Override + public int hashCode() { + return Objects.hash(getId(), getUsername(), getPassword(), + getNickname(), getMemberLevel(), getType()); } } From 0aa291cf7c398d94359ea7e7c91cbe6edcfb466f Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Mon, 31 Jul 2023 18:46:59 +0900 Subject: [PATCH 12/33] =?UTF-8?q?Vaildation=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tddstudy/member/controller/MemberController.java | 3 ++- .../com/swger/tddstudy/member/domain/MemberDTO.java | 7 ++++++- .../tddstudy/member/domain/MemberSignUpTest.java | 11 +++++------ 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java index 75085e8..206d710 100644 --- a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java +++ b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java @@ -9,6 +9,7 @@ import lombok.experimental.PackagePrivate; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; import java.util.List; @RestController @@ -18,7 +19,7 @@ public class MemberController { private final MemberRepository memberRepository; // signIn이 아니라 SignUp이 맞는 표현.. 영어 이슈 @PostMapping("/signIn") - public String signIn(@RequestBody MemberDTO memberDTO) { + public String signIn(@Valid @RequestBody MemberDTO memberDTO) { /* 비밀번호 재확인 */ if (!memberDTO.getPassword().equals(memberDTO.getRePassword())) { return "Password Mismatch"; diff --git a/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java b/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java index 396ad4b..32e330c 100644 --- a/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java +++ b/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java @@ -2,12 +2,17 @@ import lombok.Getter; +import javax.validation.constraints.NotBlank; + @Getter public class MemberDTO { - + @NotBlank private String username; + @NotBlank private String password; + @NotBlank private String nickname; + @NotBlank private String rePassword; public MemberDTO(String username, String password, String nickname, String rePassword) { diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java index faec2fc..5dfc476 100644 --- a/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java +++ b/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java @@ -16,8 +16,7 @@ import java.util.List; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @SpringBootTest @Transactional @@ -53,9 +52,10 @@ public void SignUpSuccess() throws Exception { List getMember = memberRepository.findByUsername("testUsername"); //then /* 아이디, 비밀번호 같은지 확인*/ - /* equals로 진행하려고 했지만 안됨*/ Assertions.assertThat(getMember.get(0).getUsername()).isEqualTo(signInMember.getUsername()); Assertions.assertThat(getMember.get(0).getPassword()).isEqualTo(signInMember.getPassword()); +// equals로 진행하려고 했지만 안됨 +// Assertions.assertThat(getMember.get(0).equals(signInMember)).isTrue(); } /* 회원 가입 실패 - 비밀번호 재확인*/ @@ -81,14 +81,13 @@ public void SignUpRePasswordMismatch() throws Exception { public void SignUpUsernameBlank() throws Exception { //given MemberDTO signInMember= new MemberDTO("testUsername", - "testPassword", "", "testPassword"); + "testPassword", null, "testPassword"); String content = om.writeValueAsString(signInMember); mockMvc.perform(post("/signIn") .content(content) .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().string("signInOK")) + .andExpect(status().isBadRequest()) .andDo(print()); // validation이 진행되지 않는 이유... // List members = memberRepository.findByUsername("testUsername"); From 80a2ab16b481f854b651e36af2dcafbe7a9104dc Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Tue, 1 Aug 2023 13:03:22 +0900 Subject: [PATCH 13/33] =?UTF-8?q?=EA=B8=B0=EC=A1=B4=20Test=20=ED=86=B5?= =?UTF-8?q?=ED=95=A9=20=EB=B0=8F=20Servive=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=99=80=20Controller=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tddstudy/member/MemberControllerTest.java | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 src/test/java/com/swger/tddstudy/member/MemberControllerTest.java diff --git a/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java b/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java new file mode 100644 index 0000000..33a371f --- /dev/null +++ b/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java @@ -0,0 +1,107 @@ +package com.swger.tddstudy.member; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.swger.tddstudy.member.domain.DTO.MemberDTO; +import com.swger.tddstudy.member.domain.DTO.MemberSignInDTO; +import com.swger.tddstudy.member.domain.Member; +import com.swger.tddstudy.member.repository.MemberRepository; +import com.swger.tddstudy.member.service.MemberService; +import org.assertj.core.api.Assertions; +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.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.validation.BindException; + +import javax.transaction.Transactional; + + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@Transactional +@AutoConfigureMockMvc +public class MemberControllerTest { + @Autowired + MemberRepository memberRepository; + @Autowired + MemberService memberService; + @Autowired + private MockMvc mockMvc; + @Autowired + private ObjectMapper om; + + @DisplayName("회원 가입 성공") + @Test + public void SignUpSuccess() throws Exception { + //given + MemberDTO signInMember= new MemberDTO("testUsername", + "testPassword", "testNickname", "testPassword"); + String content = om.writeValueAsString(signInMember); + mockMvc.perform(post("/signUp") + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("signUpOK")) + .andDo(print()); + //when + Optional getMember = memberRepository.findByUsername(signInMember.getUsername()); + //then + /* 아이디, 비밀번호 같은지 확인*/ + Assertions.assertThat(getMember.get().getUsername()).isEqualTo(signInMember.getUsername()); + Assertions.assertThat(getMember.get().getPassword()).isEqualTo(signInMember.getPassword()); + } + + @DisplayName("회원가입 실패 - Validation 실패") + @Test + public void SignUpFail() throws Exception { + MemberDTO signInMember= new MemberDTO("testUsername", + "testPassword", null, "testPassword"); + String content = om.writeValueAsString(signInMember); + mockMvc.perform(post("/signUp") + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(result -> assertTrue(result.getResolvedException().getClass().isAssignableFrom(BindException.class))) + .andDo(print()); + + } + @DisplayName("로그인 성공") + @Test + public void SignInSuccess() throws Exception { + memberService.join(new Member("testUsername", "testPassword", "testNickName")); + MemberSignInDTO signInMember= new MemberSignInDTO("testUsername","testPassword"); + String content = om.writeValueAsString(signInMember); + mockMvc.perform(post("/logIn") + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("LogInOK")) + .andDo(print()); + } + @DisplayName("로그인 실패 - Vaildation 실패") + @Test + public void SignInFail() throws Exception { + memberService.join(new Member("testUsername", "testPassword", "testNickName")); + MemberSignInDTO signInMember= new MemberSignInDTO(null,"testPassword"); + String content = om.writeValueAsString(signInMember); + mockMvc.perform(post("/logIn") + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(result -> assertTrue(result.getResolvedException().getClass().isAssignableFrom(BindException.class))) + .andDo(print()); + } + +} From 99b4655a3f0d2887a5ce06761d0133d6e05a7197 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Tue, 1 Aug 2023 13:03:45 +0900 Subject: [PATCH 14/33] =?UTF-8?q?Default=20Constructor=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../swger/tddstudy/member/domain/{ => DTO}/MemberDTO.java | 3 ++- .../tddstudy/member/domain/{ => DTO}/MemberSignInDTO.java | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) rename src/main/java/com/swger/tddstudy/member/domain/{ => DTO}/MemberDTO.java (87%) rename src/main/java/com/swger/tddstudy/member/domain/{ => DTO}/MemberSignInDTO.java (63%) diff --git a/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java b/src/main/java/com/swger/tddstudy/member/domain/DTO/MemberDTO.java similarity index 87% rename from src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java rename to src/main/java/com/swger/tddstudy/member/domain/DTO/MemberDTO.java index 32e330c..85370e0 100644 --- a/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java +++ b/src/main/java/com/swger/tddstudy/member/domain/DTO/MemberDTO.java @@ -1,4 +1,4 @@ -package com.swger.tddstudy.member.domain; +package com.swger.tddstudy.member.domain.DTO; import lombok.Getter; @@ -21,4 +21,5 @@ public MemberDTO(String username, String password, String nickname, String rePas this.nickname = nickname; this.rePassword = rePassword; } + public MemberDTO(){} } diff --git a/src/main/java/com/swger/tddstudy/member/domain/MemberSignInDTO.java b/src/main/java/com/swger/tddstudy/member/domain/DTO/MemberSignInDTO.java similarity index 63% rename from src/main/java/com/swger/tddstudy/member/domain/MemberSignInDTO.java rename to src/main/java/com/swger/tddstudy/member/domain/DTO/MemberSignInDTO.java index b453b03..2887370 100644 --- a/src/main/java/com/swger/tddstudy/member/domain/MemberSignInDTO.java +++ b/src/main/java/com/swger/tddstudy/member/domain/DTO/MemberSignInDTO.java @@ -1,16 +1,20 @@ -package com.swger.tddstudy.member.domain; +package com.swger.tddstudy.member.domain.DTO; import lombok.Getter; +import javax.validation.constraints.NotBlank; + @Getter public class MemberSignInDTO { + @NotBlank private String username; + @NotBlank private String password; public MemberSignInDTO(String username, String password) { this.username = username; this.password = password; - } + public MemberSignInDTO(){} } From 9a56bad505952457287cb42178ae5daa552f0ff9 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Tue, 1 Aug 2023 13:04:19 +0900 Subject: [PATCH 15/33] =?UTF-8?q?Controller=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20(Service=EC=97=90=EC=84=9C=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=8B=A4=ED=96=89)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberController.java | 36 +++++++------------ 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java index 206d710..574e698 100644 --- a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java +++ b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java @@ -1,15 +1,16 @@ package com.swger.tddstudy.member.controller; import com.swger.tddstudy.member.domain.Member; -import com.swger.tddstudy.member.domain.MemberDTO; -import com.swger.tddstudy.member.domain.MemberSignInDTO; +import com.swger.tddstudy.member.domain.DTO.MemberDTO; +import com.swger.tddstudy.member.domain.DTO.MemberSignInDTO; import com.swger.tddstudy.member.repository.MemberRepository; import com.swger.tddstudy.member.service.MemberService; import lombok.RequiredArgsConstructor; -import lombok.experimental.PackagePrivate; +import org.springframework.validation.BindException; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import javax.validation.Valid; import java.util.List; @RestController @@ -17,28 +18,17 @@ public class MemberController { private final MemberService memberService; private final MemberRepository memberRepository; -// signIn이 아니라 SignUp이 맞는 표현.. 영어 이슈 - @PostMapping("/signIn") - public String signIn(@Valid @RequestBody MemberDTO memberDTO) { - /* 비밀번호 재확인 */ - if (!memberDTO.getPassword().equals(memberDTO.getRePassword())) { - return "Password Mismatch"; - } - Member newMember = new Member(memberDTO.getUsername(), - memberDTO.getPassword(), memberDTO.getNickname()); - memberService.join(newMember); - return "signInOK"; + @PostMapping("/signUp") + public String signUp(@Validated @RequestBody MemberDTO memberDTO, BindingResult bindingResult) throws Exception{ + if (bindingResult.hasErrors()) throw new BindException(bindingResult); + memberService.SignUp(memberDTO); + return "signUpOK"; } @PostMapping("/logIn") - public String logIn(@RequestBody MemberSignInDTO memberSignInDTO) { - List byUsername = memberRepository.findByUsername(memberSignInDTO.getUsername()); - if (byUsername.isEmpty()) { - return "Username MisMatch"; - } - if (!byUsername.get(0).getPassword().equals(memberSignInDTO.getPassword())){ - return "Password MisMatch"; - } + public String logIn(@Validated @RequestBody MemberSignInDTO memberSignInDTO,BindingResult bindingResult) throws Exception{ + if (bindingResult.hasErrors()) throw new BindException(bindingResult); + memberService.SignIn(memberSignInDTO); return "LogInOK"; } From 443c1d5cbcd3bb9faf221b3ab9764cdfc55efcee Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Tue, 1 Aug 2023 13:04:42 +0900 Subject: [PATCH 16/33] =?UTF-8?q?=EB=B9=84=EB=B0=80=EB=B2=88=ED=98=B8=20?= =?UTF-8?q?=EC=9E=AC=ED=99=95=EC=9D=B8,=20=EC=95=84=EC=9D=B4=EB=94=94,?= =?UTF-8?q?=EB=B9=84=EB=B0=80=EB=B2=88=ED=98=B8=20=ED=99=95=EC=9D=B8=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/service/MemberService.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/swger/tddstudy/member/service/MemberService.java b/src/main/java/com/swger/tddstudy/member/service/MemberService.java index b1f7267..fd27d27 100644 --- a/src/main/java/com/swger/tddstudy/member/service/MemberService.java +++ b/src/main/java/com/swger/tddstudy/member/service/MemberService.java @@ -1,7 +1,9 @@ package com.swger.tddstudy.member.service; import com.swger.tddstudy.member.domain.Member; -import com.swger.tddstudy.member.domain.Member; +import com.swger.tddstudy.member.domain.DTO.MemberDTO; +import com.swger.tddstudy.member.domain.DTO.MemberSignInDTO; +import com.swger.tddstudy.member.domain.MemberType; import com.swger.tddstudy.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -13,9 +15,23 @@ @RequiredArgsConstructor public class MemberService { private final MemberRepository memberRepository; - public Member join(Member member){ memberRepository.save(member); return member; } + public Member SignUp(MemberDTO member){ + if(!member.getPassword().equals(member.getRePassword())){ + throw new IllegalArgumentException("RePassword Mismatch"); + } + Member signUpMember = new Member(member.getUsername(), member.getPassword(), member.getNickname()); + join(signUpMember); + return signUpMember; + } + public Member SignIn(MemberSignInDTO member){ + Member signInMember = memberRepository.findByUsername(member.getUsername()).orElseThrow(() -> new IllegalArgumentException("Username Mismatch")); + if (!signInMember.getPassword().equals(member.getPassword())) { + throw new IllegalArgumentException("Password Mismatch"); + } + return signInMember; + } } From da5f9e8426d9a815224d4276240c46d637971d39 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Tue, 1 Aug 2023 13:05:02 +0900 Subject: [PATCH 17/33] =?UTF-8?q?NPE=20=EC=A0=9C=EA=B1=B0=EB=A5=BC=20?= =?UTF-8?q?=EC=9C=84=ED=95=B4=20Optional=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/swger/tddstudy/member/repository/MemberRepository.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/swger/tddstudy/member/repository/MemberRepository.java b/src/main/java/com/swger/tddstudy/member/repository/MemberRepository.java index 2fb64af..9d5d52e 100644 --- a/src/main/java/com/swger/tddstudy/member/repository/MemberRepository.java +++ b/src/main/java/com/swger/tddstudy/member/repository/MemberRepository.java @@ -4,9 +4,10 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; +import java.util.Optional; public interface MemberRepository extends JpaRepository { - List findByUsername(String username); + Optional findByUsername(String username); @Override S save(S entity); From 5e28932344a3127f3877e6a1533e41d5f69ea4e8 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Tue, 1 Aug 2023 14:03:53 +0900 Subject: [PATCH 18/33] =?UTF-8?q?Service=20Test=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../swger/tddstudy/member/domain/Member.java | 41 ++++---- .../member/service/MemberService.java | 2 +- .../tddstudy/member/MemberServiceTest.java | 99 +++++++++++++++++++ 3 files changed, 117 insertions(+), 25 deletions(-) create mode 100644 src/test/java/com/swger/tddstudy/member/MemberServiceTest.java diff --git a/src/main/java/com/swger/tddstudy/member/domain/Member.java b/src/main/java/com/swger/tddstudy/member/domain/Member.java index d17e71a..e472b10 100644 --- a/src/main/java/com/swger/tddstudy/member/domain/Member.java +++ b/src/main/java/com/swger/tddstudy/member/domain/Member.java @@ -1,15 +1,12 @@ package com.swger.tddstudy.member.domain; +import com.swger.tddstudy.member.domain.DTO.MemberDTO; import com.swger.tddstudy.util.BaseEntity; -import com.swger.tddstudy.member.domain.MemberLevel; + import javax.persistence.*; import javax.validation.constraints.NotBlank; -import lombok.AccessLevel; import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.Objects; @Getter @Entity @@ -28,35 +25,31 @@ public class Member extends BaseEntity { private String nickname; @Enumerated(EnumType.STRING) - private MemberLevel MemberLevel; + private MemberLevel memberLevel; @Enumerated(EnumType.STRING) - private MemberType type; + private MemberType memberType; public Member(String username, String password, String nickname) { this.username = username; this.password = password; this.nickname = nickname; - this.MemberLevel = MemberLevel.BRONZE; + this.memberLevel = MemberLevel.BRONZE; + this.memberType = MemberType.Member; } public Member(){} - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Member)) return false; - Member member = (Member) o; - return Objects.equals(getId(), member.getId()) - && Objects.equals(getUsername(), member.getUsername()) - && Objects.equals(getPassword(), member.getPassword()) - && Objects.equals(getNickname(), member.getNickname()) - && getMemberLevel() == member.getMemberLevel() && getType() == member.getType(); + public Member(MemberDTO memberDTO){ + this.username = memberDTO.getUsername(); + this.password = memberDTO.getPassword(); + this.nickname = memberDTO.getNickname(); + this.memberLevel = MemberLevel.BRONZE; + this.memberType = MemberType.Member; } - - @Override - public int hashCode() { - return Objects.hash(getId(), getUsername(), getPassword(), - getNickname(), getMemberLevel(), getType()); + public Member AdminMember(MemberDTO memberDTO){ + Member member = new Member(memberDTO); + member.memberType = MemberType.ADMIN; + return member; } + } diff --git a/src/main/java/com/swger/tddstudy/member/service/MemberService.java b/src/main/java/com/swger/tddstudy/member/service/MemberService.java index fd27d27..dc9ffe0 100644 --- a/src/main/java/com/swger/tddstudy/member/service/MemberService.java +++ b/src/main/java/com/swger/tddstudy/member/service/MemberService.java @@ -23,7 +23,7 @@ public Member SignUp(MemberDTO member){ if(!member.getPassword().equals(member.getRePassword())){ throw new IllegalArgumentException("RePassword Mismatch"); } - Member signUpMember = new Member(member.getUsername(), member.getPassword(), member.getNickname()); + Member signUpMember = new Member(member); join(signUpMember); return signUpMember; } diff --git a/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java b/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java new file mode 100644 index 0000000..df08c79 --- /dev/null +++ b/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java @@ -0,0 +1,99 @@ +package com.swger.tddstudy.member; + +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; +import com.swger.tddstudy.member.domain.DTO.MemberDTO; +import com.swger.tddstudy.member.domain.DTO.MemberSignInDTO; +import com.swger.tddstudy.member.domain.Member; +import com.swger.tddstudy.member.repository.MemberRepository; +import com.swger.tddstudy.member.service.MemberService; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import javax.transaction.Transactional; + +@SpringBootTest +@Transactional +public class MemberServiceTest { + @Autowired + MemberService memberService; + @Autowired + MemberRepository memberRepository; + + @DisplayName("회원가입 성공") + @Test + public void SignUpSuccessInService(){ + //given + MemberDTO memberDTO = new MemberDTO("testUsername", + "testPassword", "testNickname", "testPassword"); + //when + Member member = memberService.SignUp(memberDTO); + Member memberInRepos = memberRepository.findById(member.getId()).get(); + //then + Assertions.assertThat(member).extracting( + "id", "username", "nickname", "memberLevel", "memberType") + .containsExactly(memberInRepos.getId(), + memberInRepos.getUsername(), + memberInRepos.getNickname(), + memberInRepos.getMemberLevel(), + memberInRepos.getMemberType()); + } + @DisplayName("회원가입 실패-비밀번호 재확인") + @Test + public void SignUpFailRePassword(){ + //given + MemberDTO memberDTO = new MemberDTO("testUsername", + "testPassword", "testNickname", "test"); + //when + //then + Assertions.assertThatThrownBy(() -> memberService.SignUp(memberDTO)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("RePassword Mismatch"); + } + @DisplayName("로그인 성공") + @Test + public void SignInSuccessInService(){ + //given + Member member = memberService.join(new Member("testUsername", "testPassword", "testNickName")); + MemberSignInDTO signInMemberDTO= new MemberSignInDTO("testUsername","testPassword"); + //when + Member signInMember = memberService.SignIn(signInMemberDTO); + //then + Assertions.assertThat(member).extracting( + "id", "username", "nickname", "memberLevel", "memberType") + .containsExactly(signInMember.getId(), + signInMember.getUsername(), + signInMember.getNickname(), + signInMember.getMemberLevel(), + signInMember.getMemberType()); + } + @DisplayName("로그인 실패 - 아이디 틀림") + @Test + public void SignInFailUsername(){ + //given + Member member = memberService.join(new Member("testUsername", "testPassword", "testNickName")); + MemberSignInDTO signInMemberDTO= new MemberSignInDTO("test","testPassword"); + //when + //then + Assertions.assertThatThrownBy(() -> memberService.SignIn(signInMemberDTO)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Username Mismatch"); + } + @DisplayName("로그인 실패 - 비밀번호 틀림") + @Test + public void SignInFailPassword(){ + //given + Member member = memberService.join(new Member("testUsername", "testPassword", "testNickName")); + MemberSignInDTO signInMemberDTO= new MemberSignInDTO("testUsername","test"); + //when + //then + Assertions.assertThatThrownBy(() -> memberService.SignIn(signInMemberDTO)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Password Mismatch"); + } + + + +} From 9820479e1c2237a31e38d13f944c1b62aab74373 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Tue, 1 Aug 2023 14:27:37 +0900 Subject: [PATCH 19/33] =?UTF-8?q?=EB=93=B1=EA=B8=89=20=EC=97=85=20Test=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../swger/tddstudy/member/domain/Member.java | 8 +++ .../member/service/MemberService.java | 2 + .../tddstudy/member/MemberServiceTest.java | 3 +- .../tddstudy/member/domain/MemberTest.java | 50 ++++--------------- 4 files changed, 21 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/swger/tddstudy/member/domain/Member.java b/src/main/java/com/swger/tddstudy/member/domain/Member.java index e472b10..98159e0 100644 --- a/src/main/java/com/swger/tddstudy/member/domain/Member.java +++ b/src/main/java/com/swger/tddstudy/member/domain/Member.java @@ -51,5 +51,13 @@ public Member AdminMember(MemberDTO memberDTO){ member.memberType = MemberType.ADMIN; return member; } + public void LevelUp() { + if (this.getMemberLevel().equals(MemberLevel.SILVER)) { + this.memberLevel = MemberLevel.GOLD; + } + if (this.getMemberLevel().equals(MemberLevel.BRONZE)) { + this.memberLevel = MemberLevel.SILVER; + } + } } diff --git a/src/main/java/com/swger/tddstudy/member/service/MemberService.java b/src/main/java/com/swger/tddstudy/member/service/MemberService.java index dc9ffe0..faccbf3 100644 --- a/src/main/java/com/swger/tddstudy/member/service/MemberService.java +++ b/src/main/java/com/swger/tddstudy/member/service/MemberService.java @@ -3,6 +3,7 @@ import com.swger.tddstudy.member.domain.Member; import com.swger.tddstudy.member.domain.DTO.MemberDTO; import com.swger.tddstudy.member.domain.DTO.MemberSignInDTO; +import com.swger.tddstudy.member.domain.MemberLevel; import com.swger.tddstudy.member.domain.MemberType; import com.swger.tddstudy.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @@ -34,4 +35,5 @@ public Member SignIn(MemberSignInDTO member){ } return signInMember; } + } diff --git a/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java b/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java index df08c79..fe4fe61 100644 --- a/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java +++ b/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java @@ -4,6 +4,7 @@ import com.swger.tddstudy.member.domain.DTO.MemberDTO; import com.swger.tddstudy.member.domain.DTO.MemberSignInDTO; import com.swger.tddstudy.member.domain.Member; +import com.swger.tddstudy.member.domain.MemberLevel; import com.swger.tddstudy.member.repository.MemberRepository; import com.swger.tddstudy.member.service.MemberService; import org.assertj.core.api.Assertions; @@ -94,6 +95,4 @@ public void SignInFailPassword(){ .hasMessage("Password Mismatch"); } - - } diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java index 7752a17..9868edc 100644 --- a/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java +++ b/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java @@ -1,61 +1,31 @@ package com.swger.tddstudy.member.domain; - import com.swger.tddstudy.member.repository.MemberRepository; import com.swger.tddstudy.member.service.MemberService; import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import javax.transaction.Transactional; -import java.util.List; @SpringBootTest @Transactional -class MemberTest { - @Autowired - MemberRepository memberRepository; +public class MemberTest { @Autowired MemberService memberService; - /** - * 회원가입 - * */ - /* 회원 가입 성공 */ - /* 사용자 입력: 아이디:testMembername , 비밀번호: testPassword , 닉네임: testNickname*/ - @Test - public void SignUpSuccess() { - //given - MemberDTO memberDTO = new MemberDTO(); - memberDTO.setUsername("testUsername"); - memberDTO.setPassword("testPassword"); - memberDTO.setNickname("testNickname"); - //when - Member member= new Member(memberDTO.getUsername(), memberDTO.getPassword(), memberDTO.getNickname()); - memberService.join(member); - List getMember = memberRepository.findByUsername("testUsername"); - //then - Assertions.assertThat(getMember.get(0)).isEqualTo(member); - } + @Autowired + MemberRepository memberRepository; - /* 회원 가입 실패 - 아이디 */ - /* 사용자 입력: 아이디: , 비밀번호: testPassword , 닉네임: testNickname*/ + @DisplayName("등급 업") @Test - public void SignUpUsernameBlank() { + public void LevelUp(){ //given - MemberDTO MemberDTO = new MemberDTO(); - MemberDTO.setPassword("testPassword"); - MemberDTO.setNickname("testNickname"); + Member member = memberService.join(new Member("testUsername", "testPassword", "testNickName")); //when - Member Member = new Member(MemberDTO.getUsername(), MemberDTO.getPassword(), MemberDTO.getNickname()); - memberService.join(Member); - List getMember = memberRepository.findByUsername(""); + member.LevelUp(); //then - Assertions.assertThat(getMember.get(0)).isEqualTo(Member); + Assertions.assertThat(member.getMemberLevel()).isEqualTo(MemberLevel.SILVER); } - /* 회원 가입 실패 - 비밀번호*/ - - /* 회원 가입 실패 - 비밀번호 재확인*/ - - /* 회원 가입 실패 - 닉네임 */ -} \ No newline at end of file +} From 1a7c45e269eda954dde940c2f6b21865b3c05d65 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Tue, 1 Aug 2023 14:36:15 +0900 Subject: [PATCH 20/33] =?UTF-8?q?Admin=20=EA=B3=84=EC=A0=95=20=EB=A7=8C?= =?UTF-8?q?=EB=93=A4=EA=B8=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/swger/tddstudy/member/domain/Member.java | 6 ++---- .../swger/tddstudy/member/service/MemberService.java | 9 +++++++++ .../com/swger/tddstudy/member/domain/MemberTest.java | 12 ++++++++++++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/swger/tddstudy/member/domain/Member.java b/src/main/java/com/swger/tddstudy/member/domain/Member.java index 98159e0..3555636 100644 --- a/src/main/java/com/swger/tddstudy/member/domain/Member.java +++ b/src/main/java/com/swger/tddstudy/member/domain/Member.java @@ -46,10 +46,8 @@ public Member(MemberDTO memberDTO){ this.memberLevel = MemberLevel.BRONZE; this.memberType = MemberType.Member; } - public Member AdminMember(MemberDTO memberDTO){ - Member member = new Member(memberDTO); - member.memberType = MemberType.ADMIN; - return member; + public void AdminMember(){ + this.memberType = MemberType.ADMIN; } public void LevelUp() { if (this.getMemberLevel().equals(MemberLevel.SILVER)) { diff --git a/src/main/java/com/swger/tddstudy/member/service/MemberService.java b/src/main/java/com/swger/tddstudy/member/service/MemberService.java index faccbf3..8864ed5 100644 --- a/src/main/java/com/swger/tddstudy/member/service/MemberService.java +++ b/src/main/java/com/swger/tddstudy/member/service/MemberService.java @@ -28,6 +28,15 @@ public Member SignUp(MemberDTO member){ join(signUpMember); return signUpMember; } + public Member SignUpAdmin(MemberDTO member){ + if(!member.getPassword().equals(member.getRePassword())){ + throw new IllegalArgumentException("RePassword Mismatch"); + } + Member signUpMember = new Member(member); + signUpMember.AdminMember(); + join(signUpMember); + return signUpMember; + } public Member SignIn(MemberSignInDTO member){ Member signInMember = memberRepository.findByUsername(member.getUsername()).orElseThrow(() -> new IllegalArgumentException("Username Mismatch")); if (!signInMember.getPassword().equals(member.getPassword())) { diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java index 9868edc..5ce1cbf 100644 --- a/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java +++ b/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java @@ -1,5 +1,6 @@ package com.swger.tddstudy.member.domain; +import com.swger.tddstudy.member.domain.DTO.MemberDTO; import com.swger.tddstudy.member.repository.MemberRepository; import com.swger.tddstudy.member.service.MemberService; import org.assertj.core.api.Assertions; @@ -28,4 +29,15 @@ public void LevelUp(){ //then Assertions.assertThat(member.getMemberLevel()).isEqualTo(MemberLevel.SILVER); } + @DisplayName("Admin 타입으로 회원가입") + @Test + public void SignUpAdmin(){ + //given + MemberDTO signUpMember= new MemberDTO("testUsername", + "testPassword", "testNickname", "testPassword"); + //when + Member adminMember = memberService.SignUpAdmin(signUpMember); + //then + Assertions.assertThat(adminMember.getMemberType()).isEqualTo(MemberType.ADMIN); + } } From 5cd9521dfbf3c95d0fed0ca2e8ccc3eac5ef9d71 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Tue, 1 Aug 2023 14:37:05 +0900 Subject: [PATCH 21/33] =?UTF-8?q?=EA=B8=B0=EC=A1=B4=20Test=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/domain/MemberSignInTest.java | 87 ----------------- .../member/domain/MemberSignUpTest.java | 95 ------------------- 2 files changed, 182 deletions(-) delete mode 100644 src/test/java/com/swger/tddstudy/member/domain/MemberSignInTest.java delete mode 100644 src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberSignInTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberSignInTest.java deleted file mode 100644 index 9c8e38f..0000000 --- a/src/test/java/com/swger/tddstudy/member/domain/MemberSignInTest.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.swger.tddstudy.member.domain; - - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.swger.tddstudy.member.repository.MemberRepository; -import com.swger.tddstudy.member.service.MemberService; -import org.assertj.core.api.Assertions; -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.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; - -import javax.transaction.Transactional; -import java.util.List; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@SpringBootTest -@Transactional -@AutoConfigureMockMvc -class MemberSignInTest { - @Autowired - MemberRepository memberRepository; - @Autowired - MemberService memberService; - @Autowired - private MockMvc mockMvc; - @Autowired - private ObjectMapper om; - /** - * 로그인 - * */ - /* 로그인 성공 */ - /* 사용자 입력: 아이디:testUsername , 비밀번호: testPassword*/ - @Test - public void SignInSuccess() throws Exception { - //given - memberService.join(new Member("testUsername", "testPassword", "testNickName")); - MemberSignInDTO signInMember= new MemberSignInDTO("testUsername","testPassword"); - String content = om.writeValueAsString(signInMember); - mockMvc.perform(post("/logIn") - .content(content) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().string("LogInOK")) - .andDo(print()); - } - /* 로그인 실패 - 아이디 틀림 */ - /* 사용자 입력: 아이디:test , 비밀번호: testPassword*/ - @Test - public void SignInFailUsername() throws Exception { - //given - memberService.join(new Member("testUsername", "testPassword", "testNickName")); - MemberSignInDTO signInMember= new MemberSignInDTO("test","testPassword"); - String content = om.writeValueAsString(signInMember); - mockMvc.perform(post("/logIn") - .content(content) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().string("Username MisMatch")) - .andDo(print()); - } - /* 로그인 실패 - 비밀번호 틀림 */ - /* 사용자 입력: 아이디:testUsername , 비밀번호: test*/ - @Test - public void SignInFailPassword() throws Exception { - //given - memberService.join(new Member("testUsername", "testPassword", "testNickName")); - MemberSignInDTO signInMember= new MemberSignInDTO("testUsername","test"); - String content = om.writeValueAsString(signInMember); - mockMvc.perform(post("/logIn") - .content(content) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().string("Password MisMatch")) - .andDo(print()); - } - -} \ No newline at end of file diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java deleted file mode 100644 index 5dfc476..0000000 --- a/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.swger.tddstudy.member.domain; - - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.swger.tddstudy.member.repository.MemberRepository; -import com.swger.tddstudy.member.service.MemberService; -import org.assertj.core.api.Assertions; -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.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; - -import javax.transaction.Transactional; -import java.util.List; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -@SpringBootTest -@Transactional -@AutoConfigureMockMvc -class MemberSignUpTest { - @Autowired - MemberRepository memberRepository; - @Autowired - MemberService memberService; - @Autowired - private MockMvc mockMvc; - @Autowired - private ObjectMapper om; - /** - * 회원가입 - * */ - /* 회원 가입 성공 */ - /* 사용자 입력: 아이디:testUsername , 비밀번호: testPassword , 닉네임: testNickname, 비밀번호재확인: testPassword*/ - @Test - public void SignUpSuccess() throws Exception { - //given - MemberDTO signInMember= new MemberDTO("testUsername", - "testPassword", "testNickname", "testPassword"); - String content = om.writeValueAsString(signInMember); - mockMvc.perform(post("/signIn") - .content(content) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().string("signInOK")) - .andDo(print()); - //when - List getMember = memberRepository.findByUsername("testUsername"); - //then - /* 아이디, 비밀번호 같은지 확인*/ - Assertions.assertThat(getMember.get(0).getUsername()).isEqualTo(signInMember.getUsername()); - Assertions.assertThat(getMember.get(0).getPassword()).isEqualTo(signInMember.getPassword()); -// equals로 진행하려고 했지만 안됨 -// Assertions.assertThat(getMember.get(0).equals(signInMember)).isTrue(); - } - - /* 회원 가입 실패 - 비밀번호 재확인*/ - /* 사용자 입력: 아이디:testMembername , 비밀번호: testPassword , 닉네임: testNickname, 비밀번호재확인: test*/ - @Test - public void SignUpRePasswordMismatch() throws Exception { - //given - MemberDTO signInMember= new MemberDTO("testUsername", - "testPassword", "testNickname", "test"); - String content = om.writeValueAsString(signInMember); - mockMvc.perform(post("/signIn") - .content(content) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().string("Password Mismatch")) - .andDo(print()); - - } -// /* 회원 가입 실패 - 아이디 */ - /* 사용자 입력: 아이디: , 비밀번호: testPassword , 닉네임: testNickname, 비밀번호재확인: testPassword*/ - @Test - public void SignUpUsernameBlank() throws Exception { - //given - MemberDTO signInMember= new MemberDTO("testUsername", - "testPassword", null, "testPassword"); - String content = om.writeValueAsString(signInMember); - mockMvc.perform(post("/signIn") - .content(content) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isBadRequest()) - .andDo(print()); - // validation이 진행되지 않는 이유... -// List members = memberRepository.findByUsername("testUsername"); - } -} \ No newline at end of file From b4f779c53f87533de5132974d301145ae65ca064 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Wed, 2 Aug 2023 15:49:39 +0900 Subject: [PATCH 22/33] =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80?= =?UTF-8?q?=EC=95=8A=EC=9D=80=20Autowired=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/swger/tddstudy/member/controller/MemberController.java | 1 - src/test/java/com/swger/tddstudy/member/MemberServiceTest.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java index 574e698..4d432ae 100644 --- a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java +++ b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java @@ -17,7 +17,6 @@ @RequiredArgsConstructor public class MemberController { private final MemberService memberService; - private final MemberRepository memberRepository; @PostMapping("/signUp") public String signUp(@Validated @RequestBody MemberDTO memberDTO, BindingResult bindingResult) throws Exception{ if (bindingResult.hasErrors()) throw new BindException(bindingResult); diff --git a/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java b/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java index fe4fe61..3e2cd9c 100644 --- a/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java +++ b/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java @@ -94,5 +94,4 @@ public void SignInFailPassword(){ .isInstanceOf(IllegalArgumentException.class) .hasMessage("Password Mismatch"); } - } From 7d82f93f6bef1924b4ca7abd0049f80472184917 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Wed, 2 Aug 2023 15:50:31 +0900 Subject: [PATCH 23/33] =?UTF-8?q?[Day=203-4]=20=EC=83=81=ED=92=88=20?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tddstudy/product/productServiceTest.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/test/java/com/swger/tddstudy/product/productServiceTest.java diff --git a/src/test/java/com/swger/tddstudy/product/productServiceTest.java b/src/test/java/com/swger/tddstudy/product/productServiceTest.java new file mode 100644 index 0000000..3159ca5 --- /dev/null +++ b/src/test/java/com/swger/tddstudy/product/productServiceTest.java @@ -0,0 +1,69 @@ +package com.swger.tddstudy.product; + +import com.swger.tddstudy.product.domain.DTO.ProductRegisterDTO; +import com.swger.tddstudy.product.domain.Product; +import com.swger.tddstudy.product.domain.SellingStatus; +import com.swger.tddstudy.product.repository.ProductRepository; +import com.swger.tddstudy.product.service.ProductService; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import javax.transaction.Transactional; +import java.util.Optional; + + +@SpringBootTest +@Transactional +public class productServiceTest { + + @Autowired + ProductService productService; + @Autowired + ProductRepository productRepository; + + @DisplayName("상품 등록이 가능합니다") + @Test + public void productRegisterSuccess(){ + //given + ProductRegisterDTO product = new ProductRegisterDTO("testName", 1000, 10); + //when + Product registeredProduct = productService.register(product); + Optional productOptional = productRepository.findById(registeredProduct.getId()); + //then + Assertions.assertThat(registeredProduct.getId()) + .isEqualTo(productOptional.get().getId()); + } + + + @DisplayName("상품 주문이 가능합니다") + @Test + public void sellingSuccess(){ + //given + Product product = new Product("testName", 1000, 10); + //when, then + Assertions.assertThat(productService.sellingOrNo(product)).isTrue(); + } + @DisplayName("상품 주문이 불가능합니다 - 재고 부족1") + @Test + public void sellingFailAmount1(){ + //given + Product product = new Product("testName", 1000, 0); + //when, then + Assertions.assertThat(productService.sellingOrNo(product)).isFalse(); + } + @DisplayName("상품 주문이 불가능합니다 - 재고 부족2") + @Test + public void sellingFailAmount2(){ + //given + Product product = new Product("testName", 1000, 1); + //when + product.sellProduct(); + //then + Assertions.assertThat(productService.sellingOrNo(product)).isFalse(); + } + + +} From 0f684c5865d390f252bdd0d87a881c24ac6c3a2a Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Wed, 2 Aug 2023 15:50:50 +0900 Subject: [PATCH 24/33] =?UTF-8?q?[Day=203-4]=20=EC=83=81=ED=92=88=20?= =?UTF-8?q?=EB=A6=AC=ED=8F=AC=EC=A7=80=ED=86=A0=EB=A6=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tddstudy/product/repository/ProductRepository.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/com/swger/tddstudy/product/repository/ProductRepository.java diff --git a/src/main/java/com/swger/tddstudy/product/repository/ProductRepository.java b/src/main/java/com/swger/tddstudy/product/repository/ProductRepository.java new file mode 100644 index 0000000..d1fd632 --- /dev/null +++ b/src/main/java/com/swger/tddstudy/product/repository/ProductRepository.java @@ -0,0 +1,8 @@ +package com.swger.tddstudy.product.repository; + +import com.swger.tddstudy.product.domain.Product; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProductRepository extends JpaRepository { + +} From 0be9d21c4410fa98ba3898e75b1b099fa2589c24 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Wed, 2 Aug 2023 15:51:07 +0900 Subject: [PATCH 25/33] =?UTF-8?q?[Day=203-4]=20=EC=83=81=ED=92=88=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20DTO=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/DTO/ProductRegisterDTO.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/com/swger/tddstudy/product/domain/DTO/ProductRegisterDTO.java diff --git a/src/main/java/com/swger/tddstudy/product/domain/DTO/ProductRegisterDTO.java b/src/main/java/com/swger/tddstudy/product/domain/DTO/ProductRegisterDTO.java new file mode 100644 index 0000000..49f2e10 --- /dev/null +++ b/src/main/java/com/swger/tddstudy/product/domain/DTO/ProductRegisterDTO.java @@ -0,0 +1,19 @@ +package com.swger.tddstudy.product.domain.DTO; + +import lombok.Getter; + +@Getter +public class ProductRegisterDTO { + private String name; + + private int price; + + private int amount; + + public ProductRegisterDTO(String name, int price, int amount) { + this.name = name; + this.price = price; + this.amount = amount; + } + +} From 24b6ca68e47d623b5eea1d494a0fd19757a325f3 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Wed, 2 Aug 2023 15:51:35 +0900 Subject: [PATCH 26/33] =?UTF-8?q?[Day=203-4]=20=EC=83=81=ED=92=88=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20=EB=A9=94=EC=86=8C=EB=93=9C,=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EC=A3=BC=EB=AC=B8=20=EA=B0=80=EB=8A=A5=20=EC=97=AC?= =?UTF-8?q?=EB=B6=80=20=ED=8C=90=EB=8B=A8=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/service/ProductService.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/main/java/com/swger/tddstudy/product/service/ProductService.java diff --git a/src/main/java/com/swger/tddstudy/product/service/ProductService.java b/src/main/java/com/swger/tddstudy/product/service/ProductService.java new file mode 100644 index 0000000..09e3d1e --- /dev/null +++ b/src/main/java/com/swger/tddstudy/product/service/ProductService.java @@ -0,0 +1,40 @@ +package com.swger.tddstudy.product.service; + +import com.swger.tddstudy.product.domain.DTO.ProductRegisterDTO; +import com.swger.tddstudy.product.domain.Product; +import com.swger.tddstudy.product.domain.SellingStatus; +import com.swger.tddstudy.product.repository.ProductRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import javax.swing.text.TableView; + +@Service +@RequiredArgsConstructor +public class ProductService { + private final ProductRepository productRepository; + + public Product register(ProductRegisterDTO product) { + Product save = productRepository.save(new Product(product.getName() + , product.getPrice(), product.getAmount())); + return save; + } + + public boolean sellingOrNo(Product product) { + /* 처음부터 재고 수량 = 0 */ + if (product.getSellingStatus()== SellingStatus.STOP_SELLING) return false; + else { + /* 구매 가능 */ + if (product.getAmount() > 0 && product.getSellingStatus()== SellingStatus.SELLING){ + return true; + } + else { + /* 재고수량이 처음으로 0이 되었을 때 */ + product.sellStop(); + return false; + } + } + } + + +} From f98dc6d567cd2317cdc267c04a492aeec7470371 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Wed, 2 Aug 2023 15:53:18 +0900 Subject: [PATCH 27/33] =?UTF-8?q?[Day=203-4]=20=EC=83=81=ED=92=88=20?= =?UTF-8?q?=EA=B5=AC=EB=A7=A4->=20=EC=9E=AC=EA=B3=A0=20-1=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80=20,=20SellingStatus?= =?UTF-8?q?=EB=A5=BC=20=EB=B0=94=EA=BE=B8=EB=8A=94=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tddstudy/product/domain/Product.java | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/swger/tddstudy/product/domain/Product.java b/src/main/java/com/swger/tddstudy/product/domain/Product.java index e71ebd9..55cd586 100644 --- a/src/main/java/com/swger/tddstudy/product/domain/Product.java +++ b/src/main/java/com/swger/tddstudy/product/domain/Product.java @@ -1,10 +1,10 @@ package com.swger.tddstudy.product.domain; import com.swger.tddstudy.util.BaseEntity; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.Id; + +import javax.persistence.*; +import javax.validation.constraints.NotBlank; + import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -15,14 +15,36 @@ public class Product extends BaseEntity { @Id + @GeneratedValue private Long id; + @NotBlank private String name; + @NotBlank private int price; + @NotBlank private int amount; @Enumerated(EnumType.STRING) private SellingStatus sellingStatus; + + public Product(String name, int price, int amount) { + this.name = name; + this.price = price; + this.amount = amount; + if(amount >0) this.sellingStatus = SellingStatus.SELLING; + else this.sellingStatus = SellingStatus.STOP_SELLING; + } + public void sellProduct(){ + this.amount -= 1; + } + public void sellStop(){ + this.sellingStatus = SellingStatus.STOP_SELLING; + } + public void sellStart(){ + this.sellingStatus = SellingStatus.SELLING; + } + } From 557eb5d5631b7831970da1ed0e8d47b4170a5a48 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Wed, 2 Aug 2023 16:32:03 +0900 Subject: [PATCH 28/33] =?UTF-8?q?[Day=203-4]=20=EC=83=81=ED=92=88=20?= =?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/productControllerTest.java | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/test/java/com/swger/tddstudy/product/productControllerTest.java diff --git a/src/test/java/com/swger/tddstudy/product/productControllerTest.java b/src/test/java/com/swger/tddstudy/product/productControllerTest.java new file mode 100644 index 0000000..6d42acb --- /dev/null +++ b/src/test/java/com/swger/tddstudy/product/productControllerTest.java @@ -0,0 +1,84 @@ +package com.swger.tddstudy.product; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.swger.tddstudy.product.domain.DTO.ProductRegisterDTO; +import com.swger.tddstudy.product.repository.ProductRepository; +import com.swger.tddstudy.product.service.ProductService; +import static org.junit.jupiter.api.Assertions.assertTrue; +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.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.validation.BindException; + +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.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import javax.transaction.Transactional; + +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +public class productControllerTest { + @Autowired + ProductRepository productRepository; + @Autowired + ProductService productService; + @Autowired + MockMvc mockMvc; + @Autowired + ObjectMapper om; + + @DisplayName("상품 등록이 가능합니다") + @Test + public void registerSuccess() throws Exception { + //given + ProductRegisterDTO product = new ProductRegisterDTO("testName", 1000, 10); + //when, then + String content = om.writeValueAsString(product); + mockMvc.perform(post("/productRegister") + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("Register OK")) + .andDo(print()); + } + + @DisplayName("상품 등록이 불가능합니다 - NotBlank") + @Test + public void registerFailNotBlank() throws Exception { + //given + ProductRegisterDTO product = new ProductRegisterDTO(null, 1000, 10); + //when, then + String content = om.writeValueAsString(product); + mockMvc.perform(post("/productRegister") + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(result -> assertTrue(result.getResolvedException() + .getClass().isAssignableFrom(BindException.class))) + .andDo(print()); + } + @DisplayName("상품 등록이 불가능합니다 - Min") + @Test + public void registerFailMin() throws Exception { + //given + ProductRegisterDTO product = new ProductRegisterDTO("testname", 10000, 0); + //when, then + String content = om.writeValueAsString(product); + mockMvc.perform(post("/productRegister") + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(result -> assertTrue(result.getResolvedException() + .getClass().isAssignableFrom(BindException.class))) + .andDo(print()); + + } +} From 82cc88fe56242d9bd5db7af02d2b1a6cb6ae2de2 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Wed, 2 Aug 2023 16:32:28 +0900 Subject: [PATCH 29/33] =?UTF-8?q?[Day=203-4]=20=EC=83=81=ED=92=88=20?= =?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/controller/ProductController.java | 26 +++++++++++++++++++ .../tddstudy/member/MemberControllerTest.java | 3 ++- 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/swger/tddstudy/product/controller/ProductController.java diff --git a/src/main/java/com/swger/tddstudy/product/controller/ProductController.java b/src/main/java/com/swger/tddstudy/product/controller/ProductController.java new file mode 100644 index 0000000..81327ef --- /dev/null +++ b/src/main/java/com/swger/tddstudy/product/controller/ProductController.java @@ -0,0 +1,26 @@ +package com.swger.tddstudy.product.controller; + +import com.swger.tddstudy.product.domain.DTO.ProductRegisterDTO; +import com.swger.tddstudy.product.service.ProductService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.BindException; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class ProductController { + @Autowired + ProductService productService; + + @PostMapping("/productRegister") + public String productRegister(@Validated @RequestBody ProductRegisterDTO DTO, BindingResult br) throws BindException { + if (br.hasErrors()) throw new BindException(br); + productService.register(DTO); + return "Register OK"; + } +} diff --git a/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java b/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java index 33a371f..3614dc0 100644 --- a/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java +++ b/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java @@ -72,7 +72,8 @@ public void SignUpFail() throws Exception { .content(content) .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON)) - .andExpect(result -> assertTrue(result.getResolvedException().getClass().isAssignableFrom(BindException.class))) + .andExpect(result -> assertTrue(result.getResolvedException() + .getClass().isAssignableFrom(BindException.class))) .andDo(print()); } From 3e779dc2cec06751997174401b6346a4031ece4e Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Wed, 2 Aug 2023 16:32:43 +0900 Subject: [PATCH 30/33] =?UTF-8?q?[Day=203-4]=20=EC=83=81=ED=92=88=20Valida?= =?UTF-8?q?tion=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tddstudy/product/domain/DTO/ProductRegisterDTO.java | 7 +++++++ .../java/com/swger/tddstudy/product/domain/Product.java | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/swger/tddstudy/product/domain/DTO/ProductRegisterDTO.java b/src/main/java/com/swger/tddstudy/product/domain/DTO/ProductRegisterDTO.java index 49f2e10..9a53ce1 100644 --- a/src/main/java/com/swger/tddstudy/product/domain/DTO/ProductRegisterDTO.java +++ b/src/main/java/com/swger/tddstudy/product/domain/DTO/ProductRegisterDTO.java @@ -2,12 +2,18 @@ import lombok.Getter; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; + @Getter public class ProductRegisterDTO { + @NotBlank private String name; + @Min(1000) private int price; + @Min(1) private int amount; public ProductRegisterDTO(String name, int price, int amount) { @@ -15,5 +21,6 @@ public ProductRegisterDTO(String name, int price, int amount) { this.price = price; this.amount = amount; } + public ProductRegisterDTO(){} } diff --git a/src/main/java/com/swger/tddstudy/product/domain/Product.java b/src/main/java/com/swger/tddstudy/product/domain/Product.java index 55cd586..c751b20 100644 --- a/src/main/java/com/swger/tddstudy/product/domain/Product.java +++ b/src/main/java/com/swger/tddstudy/product/domain/Product.java @@ -3,6 +3,7 @@ import com.swger.tddstudy.util.BaseEntity; import javax.persistence.*; +import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import lombok.AccessLevel; @@ -21,10 +22,10 @@ public class Product extends BaseEntity { @NotBlank private String name; - @NotBlank + @Min(1000) private int price; - @NotBlank + @Min(1) private int amount; @Enumerated(EnumType.STRING) @@ -34,8 +35,7 @@ public Product(String name, int price, int amount) { this.name = name; this.price = price; this.amount = amount; - if(amount >0) this.sellingStatus = SellingStatus.SELLING; - else this.sellingStatus = SellingStatus.STOP_SELLING; + this.sellingStatus = SellingStatus.SELLING; } public void sellProduct(){ this.amount -= 1; From 747627cd4f726c7ae931e98ba7d02de2468a7e05 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Mon, 7 Aug 2023 16:12:31 +0900 Subject: [PATCH 31/33] =?UTF-8?q?[Day=203-4]=20=ED=8C=80=EC=9B=90=EB=B6=84?= =?UTF-8?q?=EB=93=A4=EC=9D=98=20=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=B0=98?= =?UTF-8?q?=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberController.java | 20 ++- .../product/controller/ProductController.java | 23 ++- .../controller/ProductControllerAdvice.java | 26 ++++ .../tddstudy/product/domain/Product.java | 25 +++- .../product/service/ProductService.java | 20 +-- .../tddstudy/member/MemberServiceTest.java | 12 ++ .../tddstudy/member/domain/MemberTest.java | 12 +- .../product/ProductControllerTest.java | 140 ++++++++++++++++++ ...rviceTest.java => ProductServiceTest.java} | 23 +-- .../product/productControllerTest.java | 84 ----------- 10 files changed, 251 insertions(+), 134 deletions(-) create mode 100644 src/main/java/com/swger/tddstudy/product/controller/ProductControllerAdvice.java create mode 100644 src/test/java/com/swger/tddstudy/product/ProductControllerTest.java rename src/test/java/com/swger/tddstudy/product/{productServiceTest.java => ProductServiceTest.java} (75%) delete mode 100644 src/test/java/com/swger/tddstudy/product/productControllerTest.java diff --git a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java index 4d432ae..ff02db2 100644 --- a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java +++ b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java @@ -5,6 +5,7 @@ import com.swger.tddstudy.member.domain.DTO.MemberSignInDTO; import com.swger.tddstudy.member.repository.MemberRepository; import com.swger.tddstudy.member.service.MemberService; +import javax.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import org.springframework.validation.BindException; import org.springframework.validation.BindingResult; @@ -16,18 +17,27 @@ @RestController @RequiredArgsConstructor public class MemberController { + private final MemberService memberService; + @PostMapping("/signUp") - public String signUp(@Validated @RequestBody MemberDTO memberDTO, BindingResult bindingResult) throws Exception{ - if (bindingResult.hasErrors()) throw new BindException(bindingResult); + public String signUp(@Validated @RequestBody MemberDTO memberDTO, BindingResult bindingResult) + throws Exception { + if (bindingResult.hasErrors()) { + throw new BindException(bindingResult); + } memberService.SignUp(memberDTO); return "signUpOK"; } @PostMapping("/logIn") - public String logIn(@Validated @RequestBody MemberSignInDTO memberSignInDTO,BindingResult bindingResult) throws Exception{ - if (bindingResult.hasErrors()) throw new BindException(bindingResult); - memberService.SignIn(memberSignInDTO); + public String logIn(@Validated @RequestBody MemberSignInDTO memberSignInDTO, + BindingResult bindingResult, HttpSession session) throws Exception { + if (bindingResult.hasErrors()) { + throw new BindException(bindingResult); + } + Member member = memberService.SignIn(memberSignInDTO); + session.setAttribute("id", member.getId()); return "LogInOK"; } diff --git a/src/main/java/com/swger/tddstudy/product/controller/ProductController.java b/src/main/java/com/swger/tddstudy/product/controller/ProductController.java index 81327ef..acaa73f 100644 --- a/src/main/java/com/swger/tddstudy/product/controller/ProductController.java +++ b/src/main/java/com/swger/tddstudy/product/controller/ProductController.java @@ -1,8 +1,14 @@ package com.swger.tddstudy.product.controller; +import com.swger.tddstudy.member.domain.MemberType; +import com.swger.tddstudy.member.repository.MemberRepository; +import com.swger.tddstudy.member.service.MemberService; import com.swger.tddstudy.product.domain.DTO.ProductRegisterDTO; import com.swger.tddstudy.product.service.ProductService; +import javax.naming.AuthenticationException; +import javax.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; +import org.hibernate.engine.spi.ManagedEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.BindException; import org.springframework.validation.BindingResult; @@ -14,13 +20,24 @@ @RestController @RequiredArgsConstructor public class ProductController { - @Autowired - ProductService productService; + + private final ProductService productService; + private final MemberRepository memberRepository; @PostMapping("/productRegister") - public String productRegister(@Validated @RequestBody ProductRegisterDTO DTO, BindingResult br) throws BindException { + public String productRegister(@Validated @RequestBody ProductRegisterDTO DTO, BindingResult br, + HttpSession httpSession) throws BindException, AuthenticationException { if (br.hasErrors()) throw new BindException(br); productService.register(DTO); + + if (httpSession.getAttribute("id") == null) { + throw new AuthenticationException("You must SignIn"); + } + + if(!memberRepository.findById((Long) httpSession.getAttribute("id")) + .get().getMemberType().equals(MemberType.ADMIN)){ + throw new AuthenticationException("You are not Admin"); + } return "Register OK"; } } diff --git a/src/main/java/com/swger/tddstudy/product/controller/ProductControllerAdvice.java b/src/main/java/com/swger/tddstudy/product/controller/ProductControllerAdvice.java new file mode 100644 index 0000000..4820d06 --- /dev/null +++ b/src/main/java/com/swger/tddstudy/product/controller/ProductControllerAdvice.java @@ -0,0 +1,26 @@ +package com.swger.tddstudy.product.controller; + +import javax.naming.AuthenticationException; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +public class ProductControllerAdvice { + + @ExceptionHandler + public ResponseEntity bindException(BindException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .contentType(MediaType.APPLICATION_JSON) + .body(e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); + } + @ExceptionHandler + public ResponseEntity authenticationException(AuthenticationException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .contentType(MediaType.APPLICATION_JSON) + .body(e.getMessage()); + } +} diff --git a/src/main/java/com/swger/tddstudy/product/domain/Product.java b/src/main/java/com/swger/tddstudy/product/domain/Product.java index c751b20..3729658 100644 --- a/src/main/java/com/swger/tddstudy/product/domain/Product.java +++ b/src/main/java/com/swger/tddstudy/product/domain/Product.java @@ -37,8 +37,14 @@ public Product(String name, int price, int amount) { this.amount = amount; this.sellingStatus = SellingStatus.SELLING; } - public void sellProduct(){ - this.amount -= 1; + public boolean sellProduct(int cnt){ + /* 사용자가 재고 이상으로 주문 */ + if (cnt > this.amount) { + return false; + } + /* 사용자가 재고에 맞게 주문 */ + this.amount -= cnt; + return true; } public void sellStop(){ this.sellingStatus = SellingStatus.STOP_SELLING; @@ -47,4 +53,19 @@ public void sellStart(){ this.sellingStatus = SellingStatus.SELLING; } + public boolean sellingOrNo() { + /* 처음부터 재고 수량 = 0 */ + if (this.getSellingStatus() == SellingStatus.STOP_SELLING) { + return false; + } + /* 구매 가능 */ + if (this.getAmount() > 0 && this.getSellingStatus() == SellingStatus.SELLING) { + return true;} + else { + /* 재고수량이 처음으로 0이 되었을 때 */ + this.sellStop(); + return false; + } + } + } diff --git a/src/main/java/com/swger/tddstudy/product/service/ProductService.java b/src/main/java/com/swger/tddstudy/product/service/ProductService.java index 09e3d1e..e4c0938 100644 --- a/src/main/java/com/swger/tddstudy/product/service/ProductService.java +++ b/src/main/java/com/swger/tddstudy/product/service/ProductService.java @@ -12,29 +12,13 @@ @Service @RequiredArgsConstructor public class ProductService { + private final ProductRepository productRepository; public Product register(ProductRegisterDTO product) { Product save = productRepository.save(new Product(product.getName() - , product.getPrice(), product.getAmount())); + , product.getPrice(), product.getAmount())); return save; } - public boolean sellingOrNo(Product product) { - /* 처음부터 재고 수량 = 0 */ - if (product.getSellingStatus()== SellingStatus.STOP_SELLING) return false; - else { - /* 구매 가능 */ - if (product.getAmount() > 0 && product.getSellingStatus()== SellingStatus.SELLING){ - return true; - } - else { - /* 재고수량이 처음으로 0이 되었을 때 */ - product.sellStop(); - return false; - } - } - } - - } diff --git a/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java b/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java index 3e2cd9c..7d410c5 100644 --- a/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java +++ b/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java @@ -5,6 +5,7 @@ import com.swger.tddstudy.member.domain.DTO.MemberSignInDTO; import com.swger.tddstudy.member.domain.Member; import com.swger.tddstudy.member.domain.MemberLevel; +import com.swger.tddstudy.member.domain.MemberType; import com.swger.tddstudy.member.repository.MemberRepository; import com.swger.tddstudy.member.service.MemberService; import org.assertj.core.api.Assertions; @@ -41,6 +42,17 @@ public void SignUpSuccessInService(){ memberInRepos.getMemberLevel(), memberInRepos.getMemberType()); } + @DisplayName("Admin 타입으로 회원가입") + @Test + public void SignUpAdmin(){ + //given + MemberDTO signUpMember= new MemberDTO("testUsername", + "testPassword", "testNickname", "testPassword"); + //when + Member adminMember = memberService.SignUpAdmin(signUpMember); + //then + Assertions.assertThat(adminMember.getMemberType()).isEqualTo(MemberType.ADMIN); + } @DisplayName("회원가입 실패-비밀번호 재확인") @Test public void SignUpFailRePassword(){ diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java index 5ce1cbf..be2742c 100644 --- a/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java +++ b/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java @@ -29,15 +29,5 @@ public void LevelUp(){ //then Assertions.assertThat(member.getMemberLevel()).isEqualTo(MemberLevel.SILVER); } - @DisplayName("Admin 타입으로 회원가입") - @Test - public void SignUpAdmin(){ - //given - MemberDTO signUpMember= new MemberDTO("testUsername", - "testPassword", "testNickname", "testPassword"); - //when - Member adminMember = memberService.SignUpAdmin(signUpMember); - //then - Assertions.assertThat(adminMember.getMemberType()).isEqualTo(MemberType.ADMIN); - } + } diff --git a/src/test/java/com/swger/tddstudy/product/ProductControllerTest.java b/src/test/java/com/swger/tddstudy/product/ProductControllerTest.java new file mode 100644 index 0000000..e6e7e98 --- /dev/null +++ b/src/test/java/com/swger/tddstudy/product/ProductControllerTest.java @@ -0,0 +1,140 @@ +package com.swger.tddstudy.product; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.swger.tddstudy.member.domain.DTO.MemberDTO; +import com.swger.tddstudy.member.domain.Member; +import com.swger.tddstudy.member.service.MemberService; +import com.swger.tddstudy.product.domain.DTO.ProductRegisterDTO; +import com.swger.tddstudy.product.repository.ProductRepository; +import com.swger.tddstudy.product.service.ProductService; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +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.http.MediaType; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.validation.BindException; + +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.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import javax.transaction.Transactional; + +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +public class ProductControllerTest { + + @Autowired + ProductRepository productRepository; + @Autowired + ProductService productService; + @Autowired + MemberService memberService; + @Autowired + MockMvc mockMvc; + @Autowired + ObjectMapper om; + + @DisplayName("상품 등록이 가능합니다") + @Test + public void registerSuccess() throws Exception { + //given + ProductRegisterDTO product = new ProductRegisterDTO("testName", 1000, 10); + Member member = memberService.SignUpAdmin(new MemberDTO("testUsername", + "testPassword", "testNickname", "testPassword")); + MockHttpSession session = new MockHttpSession(); + session.setAttribute("id", member.getId()); + //when, then + String content = om.writeValueAsString(product); + mockMvc.perform(post("/productRegister") + .session(session) + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("Register OK")) + .andDo(print()); + + } + @DisplayName("상품 등록이 불가능합니다- 로그인을 하지 않음") + @Test + public void registerFailNotLogin() throws Exception { + //given + ProductRegisterDTO product = new ProductRegisterDTO("testName", 1000, 10); + MockHttpSession session = new MockHttpSession(); + //when, then + String content = om.writeValueAsString(product); + mockMvc.perform(post("/productRegister") + .session(session) + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(content().string("You must SignIn")) + .andDo(print()); + + } + @DisplayName("상품 등록이 불가능합니다- Admin 계정이 아님") + @Test + public void registerFailNotAdmin() throws Exception { + //given + ProductRegisterDTO product = new ProductRegisterDTO("testName", 1000, 10); + Member member = memberService.SignUp(new MemberDTO("testUsername", + "testPassword", "testNickname", "testPassword")); + MockHttpSession session = new MockHttpSession(); + session.setAttribute("id", member.getId()); + //when, then + String content = om.writeValueAsString(product); + mockMvc.perform(post("/productRegister") + .session(session) + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(content().string("You are not Admin")) + .andDo(print()); + + } + + + @DisplayName("상품 등록이 불가능합니다 - NotBlank") + @Test + public void registerFailNotBlank() throws Exception { + //given + ProductRegisterDTO product = new ProductRegisterDTO(null, 1000, 10); + //when, then + String content = om.writeValueAsString(product); + mockMvc.perform(post("/productRegister") + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(result -> assertTrue(result.getResolvedException() + .getClass().isAssignableFrom(BindException.class))) + .andDo(print()); + } + + @DisplayName("상품 등록이 불가능합니다 - Min") + @Test + public void registerFailMin() throws Exception { + //given + ProductRegisterDTO product = new ProductRegisterDTO("testname", 10000, 0); + //when, then + String content = om.writeValueAsString(product); + mockMvc.perform(post("/productRegister") + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(result -> assertTrue(result.getResolvedException() + .getClass().isAssignableFrom(BindException.class))) + .andDo(print()); + } + +} diff --git a/src/test/java/com/swger/tddstudy/product/productServiceTest.java b/src/test/java/com/swger/tddstudy/product/ProductServiceTest.java similarity index 75% rename from src/test/java/com/swger/tddstudy/product/productServiceTest.java rename to src/test/java/com/swger/tddstudy/product/ProductServiceTest.java index 3159ca5..a30b992 100644 --- a/src/test/java/com/swger/tddstudy/product/productServiceTest.java +++ b/src/test/java/com/swger/tddstudy/product/ProductServiceTest.java @@ -2,7 +2,6 @@ import com.swger.tddstudy.product.domain.DTO.ProductRegisterDTO; import com.swger.tddstudy.product.domain.Product; -import com.swger.tddstudy.product.domain.SellingStatus; import com.swger.tddstudy.product.repository.ProductRepository; import com.swger.tddstudy.product.service.ProductService; import org.assertj.core.api.Assertions; @@ -17,7 +16,7 @@ @SpringBootTest @Transactional -public class productServiceTest { +public class ProductServiceTest { @Autowired ProductService productService; @@ -26,7 +25,7 @@ public class productServiceTest { @DisplayName("상품 등록이 가능합니다") @Test - public void productRegisterSuccess(){ + public void productRegisterSuccess() { //given ProductRegisterDTO product = new ProductRegisterDTO("testName", 1000, 10); //when @@ -34,35 +33,37 @@ public void productRegisterSuccess(){ Optional productOptional = productRepository.findById(registeredProduct.getId()); //then Assertions.assertThat(registeredProduct.getId()) - .isEqualTo(productOptional.get().getId()); + .isEqualTo(productOptional.get().getId()); } @DisplayName("상품 주문이 가능합니다") @Test - public void sellingSuccess(){ + public void sellingSuccess() { //given Product product = new Product("testName", 1000, 10); //when, then - Assertions.assertThat(productService.sellingOrNo(product)).isTrue(); + Assertions.assertThat(product.sellingOrNo()).isTrue(); } + @DisplayName("상품 주문이 불가능합니다 - 재고 부족1") @Test - public void sellingFailAmount1(){ + public void sellingFailAmount1() { //given Product product = new Product("testName", 1000, 0); //when, then - Assertions.assertThat(productService.sellingOrNo(product)).isFalse(); + Assertions.assertThat(product.sellingOrNo()).isFalse(); } + @DisplayName("상품 주문이 불가능합니다 - 재고 부족2") @Test - public void sellingFailAmount2(){ + public void sellingFailAmount2() { //given Product product = new Product("testName", 1000, 1); //when - product.sellProduct(); + product.sellProduct(1); //then - Assertions.assertThat(productService.sellingOrNo(product)).isFalse(); + Assertions.assertThat(product.sellingOrNo()).isFalse(); } diff --git a/src/test/java/com/swger/tddstudy/product/productControllerTest.java b/src/test/java/com/swger/tddstudy/product/productControllerTest.java deleted file mode 100644 index 6d42acb..0000000 --- a/src/test/java/com/swger/tddstudy/product/productControllerTest.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.swger.tddstudy.product; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.swger.tddstudy.product.domain.DTO.ProductRegisterDTO; -import com.swger.tddstudy.product.repository.ProductRepository; -import com.swger.tddstudy.product.service.ProductService; -import static org.junit.jupiter.api.Assertions.assertTrue; -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.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.validation.BindException; - -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.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import javax.transaction.Transactional; - -@SpringBootTest -@AutoConfigureMockMvc -@Transactional -public class productControllerTest { - @Autowired - ProductRepository productRepository; - @Autowired - ProductService productService; - @Autowired - MockMvc mockMvc; - @Autowired - ObjectMapper om; - - @DisplayName("상품 등록이 가능합니다") - @Test - public void registerSuccess() throws Exception { - //given - ProductRegisterDTO product = new ProductRegisterDTO("testName", 1000, 10); - //when, then - String content = om.writeValueAsString(product); - mockMvc.perform(post("/productRegister") - .content(content) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().string("Register OK")) - .andDo(print()); - } - - @DisplayName("상품 등록이 불가능합니다 - NotBlank") - @Test - public void registerFailNotBlank() throws Exception { - //given - ProductRegisterDTO product = new ProductRegisterDTO(null, 1000, 10); - //when, then - String content = om.writeValueAsString(product); - mockMvc.perform(post("/productRegister") - .content(content) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(result -> assertTrue(result.getResolvedException() - .getClass().isAssignableFrom(BindException.class))) - .andDo(print()); - } - @DisplayName("상품 등록이 불가능합니다 - Min") - @Test - public void registerFailMin() throws Exception { - //given - ProductRegisterDTO product = new ProductRegisterDTO("testname", 10000, 0); - //when, then - String content = om.writeValueAsString(product); - mockMvc.perform(post("/productRegister") - .content(content) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(result -> assertTrue(result.getResolvedException() - .getClass().isAssignableFrom(BindException.class))) - .andDo(print()); - - } -} From 61ec120c7b90e41f46fcedb958a1d492e6d53280 Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Mon, 7 Aug 2023 16:18:19 +0900 Subject: [PATCH 32/33] =?UTF-8?q?[Day=203-4]=20=ED=8C=80=EC=9B=90=EB=B6=84?= =?UTF-8?q?=EB=93=A4=EC=9D=98=20=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=B0=98?= =?UTF-8?q?=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tddstudy/member/domain/MemberTest.java | 33 ------------------- 1 file changed, 33 deletions(-) delete mode 100644 src/test/java/com/swger/tddstudy/member/domain/MemberTest.java diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java deleted file mode 100644 index be2742c..0000000 --- a/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.swger.tddstudy.member.domain; - -import com.swger.tddstudy.member.domain.DTO.MemberDTO; -import com.swger.tddstudy.member.repository.MemberRepository; -import com.swger.tddstudy.member.service.MemberService; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import javax.transaction.Transactional; - -@SpringBootTest -@Transactional -public class MemberTest { - @Autowired - MemberService memberService; - @Autowired - MemberRepository memberRepository; - - @DisplayName("등급 업") - @Test - public void LevelUp(){ - //given - Member member = memberService.join(new Member("testUsername", "testPassword", "testNickName")); - //when - member.LevelUp(); - //then - Assertions.assertThat(member.getMemberLevel()).isEqualTo(MemberLevel.SILVER); - } - -} From 1012a3de876eedceace2af734fd3bdf9c6cf53ac Mon Sep 17 00:00:00 2001 From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com> Date: Mon, 7 Aug 2023 16:40:10 +0900 Subject: [PATCH 33/33] =?UTF-8?q?[Day=203-4]=20=ED=8C=80=EC=9B=90=EB=B6=84?= =?UTF-8?q?=EB=93=A4=EC=9D=98=20=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=B0=98?= =?UTF-8?q?=EC=98=81=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tddstudy/member/MemberControllerTest.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java b/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java index 3614dc0..bf48280 100644 --- a/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java +++ b/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java @@ -47,14 +47,14 @@ public void SignUpSuccess() throws Exception { MemberDTO signInMember= new MemberDTO("testUsername", "testPassword", "testNickname", "testPassword"); String content = om.writeValueAsString(signInMember); - mockMvc.perform(post("/signUp") - .content(content) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().string("signUpOK")) - .andDo(print()); //when + mockMvc.perform(post("/signUp") + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("signUpOK")) + .andDo(print()); Optional getMember = memberRepository.findByUsername(signInMember.getUsername()); //then /* 아이디, 비밀번호 같은지 확인*/