Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

7주차 - 김정호 #73

Merged
merged 5 commits into from
Feb 10, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.hou27.chap07;

public interface AutoDebitInfoRepository {
AutoDebitInfo findOne(String userId);
void save(AutoDebitInfo info);
}
31 changes: 31 additions & 0 deletions 김정호/src/test/java/com/hou27/chap07/AutoDebitRegister.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.hou27.chap07;

import java.time.LocalDateTime;

public class AutoDebitRegister {
private CardNumberValidator validator;
private AutoDebitInfoRepository repository;

public AutoDebitRegister(CardNumberValidator validator, AutoDebitInfoRepository repository) {
this.validator = validator;
this.repository = repository;
}

public RegisterResult register(AutoDebitReq req) {
CardValidity validity = validator.validate(req.getCardNumber());
if (validity != CardValidity.VALID) {
return RegisterResult.error(validity);
}

AutoDebitInfo info = repository.findOne(req.getUserId());
if(info != null) {
info.changeCardNumber(req.getCardNumber());
} else {
AutoDebitInfo newInfo = new AutoDebitInfo(req.getUserId(), req.getCardNumber(), LocalDateTime.now());
repository.save(newInfo);
}

return RegisterResult.success();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.hou27.chap07;

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class AutoDebitRegisterTest {
private AutoDebitRegister register;

@BeforeEach
void setUp() {
CardNumberValidator validator = new CardNumberValidator();
AutoDebitInfoRepository repository = new JpaAutoDebitInfoRepository();
register = new AutoDebitRegister(validator, repository);
}

@Test
void validCard() {
// 업체에서 받은 테스트용 유효한 카드번호 사용
AutoDebitReq req = new AutoDebitReq("user1", "1234123412341234");
RegisterResult result = register.register(req);

// 검증
assertEquals(CardValidity.VALID, result.getValidity());
}

@Test
void theftCard() {
// 업체에서 받은 도난 테스트용 카드번호
AutoDebitReq req = new AutoDebitReq("user1", "1234123412341235");
RegisterResult result = register.register(req);

// 검증
assertEquals(CardValidity.THEFT, result.getValidity());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.hou27.chap07;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.time.LocalDateTime;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class AutoDebitRegister_Fake_Test {
private AutoDebitRegister register;
private StubCardNumberValidator stubValidator;
private AutoDebitInfoRepository repository;

@BeforeEach
void setUp() {
stubValidator = new StubCardNumberValidator();
repository = new MemoryAutoDebitInfoRepository();
register = new AutoDebitRegister(stubValidator, repository);
}

@Test
void alreadyRegistered_InfoUpdated() {
repository.save(new AutoDebitInfo("user1", "123412349876", LocalDateTime.now()));

AutoDebitReq req = new AutoDebitReq("user1", "123412349999");
RegisterResult result = register.register(req);

AutoDebitInfo saved = repository.findOne("user1");
assertEquals("1234123412341235", saved.getCardNumber());
}

@Test
void notYetRegistered_newInfoRegistered() {
AutoDebitReq req = new AutoDebitReq("user1", "1234123412341234");
RegisterResult result = register.register(req);

AutoDebitInfo saved = repository.findOne("user1");
assertEquals("1234123412341234", saved.getCardNumber());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.hou27.chap07;

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class AutoDebitRegister_Stub_Test {
private AutoDebitRegister register;
private StubCardNumberValidator stubValidator;
private AutoDebitInfoRepository repository;

@BeforeEach
void setUp() {
stubValidator = new StubCardNumberValidator();
repository = new JpaAutoDebitInfoRepository();
register = new AutoDebitRegister(stubValidator, repository);
}

@Test
void invalidCard() {
stubValidator.setInvalidNo("1234123412341234");

// 설정한 유효하지 않은 카드번호 사용
AutoDebitReq req = new AutoDebitReq("user1", "1234123412341234");
RegisterResult result = register.register(req);

// 검증
assertEquals(CardValidity.INVALID, result.getValidity());
}

@Test
void theftCard() {
stubValidator.setTheftNo("1234123412341235");

// 설정한 도난당한 카드번호 사용
AutoDebitReq req = new AutoDebitReq("user1", "1234123412341235");
RegisterResult result = register.register(req);

// 검증
assertEquals(CardValidity.THEFT, result.getValidity());
}
}
40 changes: 40 additions & 0 deletions 김정호/src/test/java/com/hou27/chap07/CardNumberValidator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.hou27.chap07;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;

public class CardNumberValidator {

public CardValidity validate(String cardNumber) {
HttpClient httpClient = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://some-external-pg.com/card"))
.header("Content-Type", "text/plain")
.POST(BodyPublishers.ofString(cardNumber))
.build();

try {
HttpResponse<String> response = httpClient.send(request, BodyHandlers.ofString());
switch (response.body()) {
case "ok":
return CardValidity.VALID;
case "bad":
return CardValidity.INVALID;
case "expired":
return CardValidity.EXPIRED;
case "theft":
return CardValidity.THEFT;
default:
return CardValidity.UNKNOWN;
}
} catch (IOException | InterruptedException e) {
return CardValidity.ERROR;
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.hou27.chap07;

import java.util.HashMap;
import java.util.Map;

public class MemoryAutoDebitInfoRepository implements AutoDebitInfoRepository {
private Map<String, AutoDebitInfo> infos = new HashMap<>();

@Override
public AutoDebitInfo findOne(String userId) {
return infos.get(userId);
}

@Override
public void save(AutoDebitInfo info) {
infos.put(info.getUserId(), info);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.hou27.chap07;

public class StubCardNumberValidator extends CardNumberValidator {
private String invalidNo;
private String theftNo;

public void setInvalidNo(String invalidNo) {
this.invalidNo = invalidNo;
}

public void setTheftNo(String theftNo) {
this.theftNo = theftNo;
}

@Override
public CardValidity validate(String cardNumber) {
if(invalidNo != null && invalidNo.equals(cardNumber)) {
return CardValidity.INVALID;
}
if(theftNo != null && theftNo.equals(cardNumber)) {
return CardValidity.THEFT;
}
return CardValidity.VALID;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.hou27.chap07.mock;

public interface EmailNotifier {
void sendRegisterEmail(String email);
}
27 changes: 27 additions & 0 deletions 김정호/src/test/java/com/hou27/chap07/mock/UserRegister.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.hou27.chap07.mock;

public class UserRegister {
private WeakPasswordChecker passwordChecker;
private UserRepository userRepository;
private EmailNotifier emailNotifier;

public UserRegister(WeakPasswordChecker passwordChecker,
EmailNotifier emailNotifier,
UserRepository userRepository) {
this.passwordChecker = passwordChecker;
this.emailNotifier = emailNotifier;
this.userRepository = userRepository;
}

public void register(String id, String pw, String email) {
if(passwordChecker.checkPasswordWeak(pw)) {
throw new WeakPasswordException();
}

User user = new User(id, pw, email);
userRepository.save(user);

emailNotifier.sendRegisterEmail(email);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.hou27.chap07.mock;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

public class UserRegisterMockTest {

private UserRegister userRegister;
private WeakPasswordChecker mockPasswordChecker
= Mockito.mock(WeakPasswordChecker.class);
private EmailNotifier mockEmailNotifier
= Mockito.mock(EmailNotifier.class);
private UserRepository fakeRepository
= new MemoryUserRepository();

@BeforeEach
void setUp() {
userRegister = new UserRegister(
mockPasswordChecker,
mockEmailNotifier,
fakeRepository
);
}

@Test
@DisplayName("약한 암호면 가입 실패")
void whenWeakPassword_thenFailRegister() {
BDDMockito.given(mockPasswordChecker.checkPasswordWeak("pw"))
.willReturn(true);

assertThrows(WeakPasswordException.class, () -> {
userRegister.register("id", "pw", "email");
});
}

@Test
@DisplayName("회원 가입 시 암호 검사 수행")
void whenRegister_thenCheckPassword() {
userRegister.register("id", "pw", "email");

BDDMockito.then(mockPasswordChecker)
.should()
.checkPasswordWeak("pw");
}

@Test
@DisplayName("가입 시 메일 전송")
void whenRegister_thenSendMail() {
userRegister.register("id", "pw", "[email protected]");

ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
BDDMockito.then(mockEmailNotifier)
.should()
.sendRegisterEmail(captor.capture());

String realEmail = captor.getValue();
assertEquals("[email protected]", realEmail);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.hou27.chap07.spy;

public interface EmailNotifier {
void sendRegisterEmail(String email);
}
20 changes: 20 additions & 0 deletions 김정호/src/test/java/com/hou27/chap07/spy/SpyEmailNotifier.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.hou27.chap07.spy;

public class SpyEmailNotifier implements EmailNotifier {
private boolean called;
private String email;

public boolean isCalled() {
return called;
}

public String getEmail() {
return email;
}

@Override
public void sendRegisterEmail(String email) {
called = true;
this.email = email;
}
}
Loading