From 41c433dd3e9f5508c5da87930d953adfd23957c0 Mon Sep 17 00:00:00 2001 From: DH CHOI Date: Tue, 20 Jun 2023 22:45:26 +0900 Subject: [PATCH 1/6] =?UTF-8?q?Test:=20RegisterService=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- instagram-application/build.gradle | 1 + .../member/service/RegisterServiceTest.java | 72 +++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 instagram-application/src/test/java/clone/instagram/member/service/RegisterServiceTest.java diff --git a/instagram-application/build.gradle b/instagram-application/build.gradle index 98603ff..f77a784 100644 --- a/instagram-application/build.gradle +++ b/instagram-application/build.gradle @@ -3,6 +3,7 @@ dependencies { api project(':instagram-domain') implementation 'org.springframework.boot:spring-boot-starter-websocket' + testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.bootJar { enabled = false } diff --git a/instagram-application/src/test/java/clone/instagram/member/service/RegisterServiceTest.java b/instagram-application/src/test/java/clone/instagram/member/service/RegisterServiceTest.java new file mode 100644 index 0000000..281fb03 --- /dev/null +++ b/instagram-application/src/test/java/clone/instagram/member/service/RegisterServiceTest.java @@ -0,0 +1,72 @@ +package clone.instagram.member.service; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.BDDMockito.*; + +import org.assertj.core.api.Assertions; +import org.assertj.core.api.ThrowableAssert; +import org.assertj.core.api.ThrowableAssert.ThrowingCallable; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.BDDMockito; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import clone.instagram.error.exception.member.UsernameAlreadyExistException; +import clone.instagram.member.BaseMemberImageProperty; +import clone.instagram.member.port.in.RegisterUseCase; +import clone.instagram.member.port.out.LoadMemberByUsernamePort; +import clone.instagram.member.port.out.SaveMemberPort; +import clone.instagram.member.service.RegisterService; + +@ExtendWith(MockitoExtension.class) +public class RegisterServiceTest { + + @InjectMocks + private RegisterService registerService; + + @Mock + private LoadMemberByUsernamePort loadMemberPort; + + @Mock + private SaveMemberPort saveMemberPort; + + @Mock + private BaseMemberImageProperty baseMemberImageProperty; + + @Test + void validArguments_CallSaveMember() { + // given + final String username = "username"; + final RegisterUseCase.Command.ToRegisterInfo command + = new RegisterUseCase.Command.ToRegisterInfo( + username, "password", "name", "email", baseMemberImageProperty + ); + + // when + final boolean result = registerService.invoke(command); + + // then + then(saveMemberPort).should().saveMember(any()); + assertThat(result).isTrue(); + } + + @Test + void usernameExists_ThrowException() { + // given + final String username = "username"; + final RegisterUseCase.Command.ToRegisterInfo command + = new RegisterUseCase.Command.ToRegisterInfo( + username, "password", "name", "email", baseMemberImageProperty + ); + given(loadMemberPort.existsMemberByUsername(username)).willReturn(true); + + // when + final ThrowingCallable executable = () -> registerService.invoke(command); + + // then + assertThatThrownBy(executable).isInstanceOf(UsernameAlreadyExistException.class); + } + +} From 4aca3b5a111b8fb8776c7a81fdd8c509b6268e46 Mon Sep 17 00:00:00 2001 From: DH CHOI Date: Wed, 21 Jun 2023 15:38:41 +0900 Subject: [PATCH 2/6] =?UTF-8?q?Chore:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20Import=20=EB=AC=B8=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clone/instagram/member/service/RegisterServiceTest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/instagram-application/src/test/java/clone/instagram/member/service/RegisterServiceTest.java b/instagram-application/src/test/java/clone/instagram/member/service/RegisterServiceTest.java index 281fb03..151797f 100644 --- a/instagram-application/src/test/java/clone/instagram/member/service/RegisterServiceTest.java +++ b/instagram-application/src/test/java/clone/instagram/member/service/RegisterServiceTest.java @@ -3,12 +3,9 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.BDDMockito.*; -import org.assertj.core.api.Assertions; -import org.assertj.core.api.ThrowableAssert; import org.assertj.core.api.ThrowableAssert.ThrowingCallable; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.BDDMockito; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -18,7 +15,6 @@ import clone.instagram.member.port.in.RegisterUseCase; import clone.instagram.member.port.out.LoadMemberByUsernamePort; import clone.instagram.member.port.out.SaveMemberPort; -import clone.instagram.member.service.RegisterService; @ExtendWith(MockitoExtension.class) public class RegisterServiceTest { From 56c2e25b32e52fbe785203d4231fbe615eb514ad Mon Sep 17 00:00:00 2001 From: DH CHOI Date: Wed, 21 Jun 2023 15:39:40 +0900 Subject: [PATCH 3/6] =?UTF-8?q?Chore:=20gradle=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- instagram-adapter/build.gradle | 3 ++- instagram-api/build.gradle | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/instagram-adapter/build.gradle b/instagram-adapter/build.gradle index cd7eb08..e46b45e 100644 --- a/instagram-adapter/build.gradle +++ b/instagram-adapter/build.gradle @@ -1,11 +1,12 @@ dependencies { - implementation project(':instagram-data') + api project(':instagram-data') api project(':instagram-application') implementation group: 'com.maxmind.geoip2', name: 'geoip2', version: '2.3.1' implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-aws', version: '2.0.1.RELEASE' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '1.2.0.RELEASE' + testImplementation 'com.h2database:h2' testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/instagram-api/build.gradle b/instagram-api/build.gradle index d29aeac..55d14ed 100644 --- a/instagram-api/build.gradle +++ b/instagram-api/build.gradle @@ -10,4 +10,9 @@ dependencies { implementation group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.2' implementation group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.2' implementation 'org.springframework.boot:spring-boot-starter-websocket' + + testImplementation 'com.h2database:h2' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testCompileOnly 'org.projectlombok:lombok' + testAnnotationProcessor 'org.projectlombok:lombok' } From 59bf7855e274da8da8c0ae1234c7c307da3bca87 Mon Sep 17 00:00:00 2001 From: DH CHOI Date: Wed, 21 Jun 2023 15:41:07 +0900 Subject: [PATCH 4/6] =?UTF-8?q?Test:=20Register=20=EC=96=B4=EB=8C=91?= =?UTF-8?q?=ED=84=B0,=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/MemberPersistentAdapterTest.java | 57 +++++++++++++++++++ .../controller/RegisterControllerTest.java | 47 +++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 instagram-adapter/src/test/java/clone/instagram/member/out/adapter/MemberPersistentAdapterTest.java create mode 100644 instagram-api/src/test/java/clone/instagram/member/controller/RegisterControllerTest.java diff --git a/instagram-adapter/src/test/java/clone/instagram/member/out/adapter/MemberPersistentAdapterTest.java b/instagram-adapter/src/test/java/clone/instagram/member/out/adapter/MemberPersistentAdapterTest.java new file mode 100644 index 0000000..ede58cd --- /dev/null +++ b/instagram-adapter/src/test/java/clone/instagram/member/out/adapter/MemberPersistentAdapterTest.java @@ -0,0 +1,57 @@ +package clone.instagram.member.out.adapter; + +import static org.assertj.core.api.Assertions.*; + +import org.assertj.core.api.ThrowableAssert; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.jdbc.Sql; + +import clone.instagram.error.exception.member.MemberNotFoundException; +import clone.instagram.jpa.mapper.ImageMapper; +import clone.instagram.jpa.mapper.MemberMapper; +import clone.instagram.member.Member; + +@DataJpaTest +@Import({ImageMapper.class, MemberMapper.class, MemberPersistentAdapter.class}) +public class MemberPersistentAdapterTest { + + @Autowired + private MemberPersistentAdapter memberPersistentAdapter; + + @Nested + @DisplayName("loadMemberByUsername()") + class LoadMemberByUsername { + + @Test + @Sql("classpath:BaseMember.sql") + void validArguments_ReturnMember() { + // given + + // when + final Member member = memberPersistentAdapter.loadMemberByUsername("agent_username"); + + // then + assertThat(member.getUsername()).isEqualTo("agent_username"); + } + + @Test + @Sql("classpath:BaseMember.sql") + void usernameNotFound_ThrowException() { + // given + + // when + final ThrowableAssert.ThrowingCallable executable = + () -> memberPersistentAdapter.loadMemberByUsername("no_username"); + + // then + assertThatThrownBy(executable).isInstanceOf(MemberNotFoundException.class); + } + + } + +} diff --git a/instagram-api/src/test/java/clone/instagram/member/controller/RegisterControllerTest.java b/instagram-api/src/test/java/clone/instagram/member/controller/RegisterControllerTest.java new file mode 100644 index 0000000..eb6656c --- /dev/null +++ b/instagram-api/src/test/java/clone/instagram/member/controller/RegisterControllerTest.java @@ -0,0 +1,47 @@ +package clone.instagram.member.controller; + +import static org.mockito.BDDMockito.*; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; + +import clone.instagram.member.BaseMemberImageProperty; +import clone.instagram.member.port.in.RegisterUseCase; + +@WebMvcTest(controllers = RegisterController.class) +public class RegisterControllerTest { + + @Autowired + private MockMvc mockMvc; + + @MockBean + private RegisterUseCase registerUseCase; + + @MockBean + private BaseMemberImageProperty baseMemberImageProperty; + + @Test + void validArguments_Invoke() throws Exception { + // given + final String request = "{" + + "\"username\":\"agent\", \"name\":\"name\", \"password\":\"password\", \"email\":\"agent@email.com\"" + + "}"; + given(registerUseCase.invoke(any())).willReturn(true); + + // when + mockMvc.perform(MockMvcRequestBuilders.post("/accounts") + .content(request) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(MockMvcResultMatchers.status().isCreated()); + + // then + then(registerUseCase).should().invoke(any()); + } + +} From a83e4cb8326b1b23fba5878ea0ce8ccb370027fd Mon Sep 17 00:00:00 2001 From: DH CHOI Date: Wed, 21 Jun 2023 15:43:03 +0900 Subject: [PATCH 5/6] =?UTF-8?q?Chore:=20=EC=9D=B4=EC=A0=84=EC=9D=98=20?= =?UTF-8?q?=EC=9D=98=EB=AF=B8=EC=97=86=EB=8A=94=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EB=A1=A4=EB=B0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- instagram-adapter/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instagram-adapter/build.gradle b/instagram-adapter/build.gradle index e46b45e..1ea7c2e 100644 --- a/instagram-adapter/build.gradle +++ b/instagram-adapter/build.gradle @@ -1,5 +1,5 @@ dependencies { - api project(':instagram-data') + implementation project(':instagram-data') api project(':instagram-application') implementation group: 'com.maxmind.geoip2', name: 'geoip2', version: '2.3.1' From 790b58ce4861050cd13cacdd49a7f606e0d6a5e7 Mon Sep 17 00:00:00 2001 From: DH CHOI Date: Wed, 21 Jun 2023 15:56:16 +0900 Subject: [PATCH 6/6] =?UTF-8?q?Fix:=20=EB=88=84=EB=9D=BD=EB=90=9C=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- instagram-adapter/build.gradle | 2 +- .../src/test/java/clone/instagram/TestApplication.java | 8 ++++++++ instagram-adapter/src/test/resources/BaseMember.sql | 5 +++++ 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 instagram-adapter/src/test/java/clone/instagram/TestApplication.java create mode 100644 instagram-adapter/src/test/resources/BaseMember.sql diff --git a/instagram-adapter/build.gradle b/instagram-adapter/build.gradle index 1ea7c2e..e46b45e 100644 --- a/instagram-adapter/build.gradle +++ b/instagram-adapter/build.gradle @@ -1,5 +1,5 @@ dependencies { - implementation project(':instagram-data') + api project(':instagram-data') api project(':instagram-application') implementation group: 'com.maxmind.geoip2', name: 'geoip2', version: '2.3.1' diff --git a/instagram-adapter/src/test/java/clone/instagram/TestApplication.java b/instagram-adapter/src/test/java/clone/instagram/TestApplication.java new file mode 100644 index 0000000..20cace0 --- /dev/null +++ b/instagram-adapter/src/test/java/clone/instagram/TestApplication.java @@ -0,0 +1,8 @@ +package clone.instagram; + +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class TestApplication { + +} diff --git a/instagram-adapter/src/test/resources/BaseMember.sql b/instagram-adapter/src/test/resources/BaseMember.sql new file mode 100644 index 0000000..b858a4c --- /dev/null +++ b/instagram-adapter/src/test/resources/BaseMember.sql @@ -0,0 +1,5 @@ +insert into members(username, password, name, email, gender, introduce, phone, website, image_name, image_type, image_uuid, image_url) + values('agent_username', 'password', 'agent_name', 'agent@email.com', 'PRIVATE', 'introduce', 'phone', 'website', 'image_name', 'PNG', 'image_uuid', 'image_url'); + +insert into members(username, password, name, email, gender, introduce, phone, website, image_name, image_type, image_uuid, image_url) +values('target_username', 'password', 'target_name', 'target@email.com', 'PRIVATE', 'introduce', 'phone', 'website', 'image_name', 'PNG', 'image_uuid', 'image_url'); \ No newline at end of file