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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion instagram-adapter/build.gradle
Original file line number Diff line number Diff line change
@@ -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'
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package clone.instagram;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TestApplication {

}
Original file line number Diff line number Diff line change
@@ -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);
}

}

}
5 changes: 5 additions & 0 deletions instagram-adapter/src/test/resources/BaseMember.sql
Original file line number Diff line number Diff line change
@@ -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', '[email protected]', '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', '[email protected]', 'PRIVATE', 'introduce', 'phone', 'website', 'image_name', 'PNG', 'image_uuid', 'image_url');
5 changes: 5 additions & 0 deletions instagram-api/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'
}
Original file line number Diff line number Diff line change
@@ -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\":\"[email protected]\""
+ "}";
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());
}

}
1 change: 1 addition & 0 deletions instagram-application/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package clone.instagram.member.service;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.BDDMockito.*;

import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
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;

@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);
}

}