Commit 969fb9e8 authored by madvirus's avatar madvirus
Browse files

Initial Commit

parents
package com.myshop.member.command.domain;
import com.myshop.common.model.Email;
import com.myshop.helper.DbHelper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.LockModeType;
import java.util.Optional;
import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
class MemberRepositoryIT {
@Autowired
private MemberRepository memberRepository;
@Autowired
private DbHelper dbHelper;
@Autowired
private JdbcTemplate jdbcTemplate;
@BeforeEach
void setUp() {
dbHelper.clear();
}
@Test
void findById() {
jdbcTemplate.update(
"""
insert into member values (?, ?, ?, ?, ?)
""",
"member1", "이름", "p1", false, "email1@email.com,email2@email.com"
);
Optional<Member> memOpt = memberRepository.findById(MemberId.of("member1"));
assertThat(memOpt).isPresent();
Member member = memOpt.get();
assertThat(member.getEmails().getEmails()).contains(
Email.of("email1@email.com"), Email.of("email2@email.com")
);
}
@Test
void save() {
Member member = new Member(MemberId.of("id1"), "이름2");
member.changeEmails(Set.of(Email.of("mail1@mail.com"), Email.of("mail2@mail.com")));
memberRepository.save(member);
SqlRowSet rs = jdbcTemplate.queryForRowSet("select * from member where member_id = ?", "id1");
assertThat(rs.next()).isTrue();
assertThat(rs.getString("emails")).contains("mail1@mail.com", "mail2@mail.com");
}
@Transactional
@Test
void findByIdForUpdate() {
jdbcTemplate.update(
"""
insert into member values (?, ?, ?, ?, ?)
""",
"member1", "이름", "p1", false, "email1@email.com,email2@email.com"
);
Optional<Member> member1 = memberRepository.findByIdForUpdate(MemberId.of("member1"));
}
}
\ No newline at end of file
package com.myshop.member.query;
import com.myshop.common.jpa.Rangeable;
import com.myshop.common.jpa.SpecBuilder;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.test.context.jdbc.Sql;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.Optional;
@SpringBootTest
@Sql("classpath:shop-init-test.sql")
class MemberDataDaoIT {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private MemberDataDao memberDataDao;
@Test
void findByBlocked() {
Page<MemberData> page = memberDataDao.findByBlocked(false, PageRequest.of(2, 3));
logger.info("blocked result: {}", page.getContent().size());
List<MemberData> content = page.getContent();
long totalElements = page.getTotalElements();
int totalPages = page.getTotalPages();
int number = page.getNumber();
int numberOfElements = page.getNumberOfElements();
int size = page.getSize();
logger.info("content.size()={}, totalElements={}, totalPages={}, number={}, numberOfElements={}",
content.size(), totalElements, totalPages, number, numberOfElements);
}
@Test
void findByNameLike() {
Sort sort = Sort.by("name").descending();
PageRequest pageReq = PageRequest.of(1, 2, sort);
List<MemberData> user = memberDataDao.findByNameLike("사용자%", pageReq);
logger.info("name llike result: {}", user.size());
}
@Test
void findAll() {
Specification<MemberData> spec = MemberDataSpecs.nonBlocked();
List<MemberData> result = memberDataDao.findAll(spec, PageRequest.of(1, 2));
logger.info("spec result: {}", result.size());
}
@Test
void getRange() {
Specification<MemberData> spec = MemberDataSpecs.nonBlocked();
List<MemberData> result = memberDataDao.getRange(spec, Rangeable.of(2, 4));
logger.info("spec result: {}", result.size());
}
@Test
void findFirst() {
List<MemberData> result = memberDataDao.findFirst3ByNameLikeOrderByName("사용자%");
logger.info("result: {}", result.size());
Optional<MemberData> member = memberDataDao.findFirstByNameLikeOrderByName("없음");
logger.info("result: {}", member);
MemberData data = memberDataDao.findFirstByBlockedOrderById(false);
logger.info("result: {}", data);
}
@Test
void compositeSpec() {
SearchRequest searchRequest = new SearchRequest();
Specification<MemberData> spec = Specification.where(null);
if (searchRequest.isOnlyNotBlocked()) {
spec = spec.and(MemberDataSpecs.nonBlocked());
}
if (StringUtils.hasText(searchRequest.getName())) {
spec = spec.and(MemberDataSpecs.nameLike(searchRequest.getName()));
}
List<MemberData> result = memberDataDao.findAll(spec, PageRequest.of(0, 5));
logger.info("result: {}", result.size());
}
@Test
void specBuilder() {
SearchRequest searchRequest = new SearchRequest();
searchRequest.setOnlyNotBlocked(true);
Specification<MemberData> spec = SpecBuilder.builder(MemberData.class)
.ifTrue(
searchRequest.isOnlyNotBlocked(),
() -> MemberDataSpecs.nonBlocked())
.ifHasText(
searchRequest.getName(),
name -> MemberDataSpecs.nameLike(searchRequest.getName()))
.toSpec();
List<MemberData> result = memberDataDao.findAll(spec, PageRequest.of(0, 5));
logger.info("result: {}", result.size());
}
}
\ No newline at end of file
package com.myshop.member.query;
public class SearchRequest {
private boolean onlyNotBlocked;
private String name;
public boolean isOnlyNotBlocked() {
return onlyNotBlocked;
}
public void setOnlyNotBlocked(boolean onlyNotBlocked) {
this.onlyNotBlocked = onlyNotBlocked;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.myshop.order.command.application;
import com.myshop.order.command.domain.Canceller;
import com.myshop.order.command.domain.OrderNo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.jdbc.Sql;
@SpringBootTest
@Sql("classpath:shop-init-test.sql")
class CancelOrderServiceIT {
@Autowired
private CancelOrderService cancelOrderService;
@Test
void cancel() {
cancelOrderService.cancel(OrderNo.of("ORDER-001"), Canceller.of("user1"));
}
}
\ No newline at end of file
package com.myshop.order.command.domain;
import com.myshop.catalog.command.domain.product.ProductId;
import com.myshop.common.model.Address;
import com.myshop.common.model.Money;
import com.myshop.helper.DbHelper;
import com.myshop.member.command.domain.MemberId;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
class OrderRepositoryIT {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private OrderRepository orderRepository;
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private DbHelper dbHelper;
@BeforeEach
void setUp() {
dbHelper.clear();
}
@Test
void save() {
orderRepository.save(new Order(
OrderNo.of("ORD1234"),
new Orderer(MemberId.of("member"), "name"),
List.of(new OrderLine(ProductId.of("PRDID"), new Money(1000), 2)),
new ShippingInfo(new Address("12345", "addr1", "addr2"), "집앞",
new Receiver("아무개", "010-0000-0000")),
OrderState.PAYMENT_WAITING
));
}
@Test
void findById() {
jdbcTemplate.update(
"""
insert into purchase_order
values (?,?,?,?,?,?,?,?,?,?,?,?,?)
""",
"ORD1234", 1, "user1", "사용자1", 5000,
"11122", "주소1", "주소2", "1층",
"받는사람", "010-1234-5689",
OrderState.PAYMENT_WAITING.name(), LocalDateTime.now()
);
jdbcTemplate.update(
"""
insert into order_line
values (?,?,?,?,?,?)
""",
"ORD1234", 0, "PROD1", 1000, 5, 5000
);
Optional<Order> ordOpt = orderRepository.findById(OrderNo.of("ORD1234"));
assertThat(ordOpt).isPresent();
Order order = ordOpt.get();
assertThat(order.getOrderLines()).hasSize(1);
}
@Test
void nextOrderNo() {
OrderNo orderNo = orderRepository.nextOrderNo();
logger.info("nextOrderNo: {}", orderNo.getNumber());
}
}
\ No newline at end of file
package com.myshop.order.query.dao;
import com.myshop.order.query.dto.OrderSummary;
import com.myshop.order.query.dto.OrderView;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.test.context.jdbc.Sql;
import java.time.LocalDateTime;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
@Sql("classpath:shop-init-test.sql")
class OrderSummaryDaoIT {
@Autowired
private OrderSummaryDao orderSummaryDao;
@Test
void findAllSpec() {
LocalDateTime from = LocalDateTime.of(2022, 1, 1, 0, 0, 0);
LocalDateTime to = LocalDateTime.of(2022, 1, 2, 0, 0, 0);
Specification<OrderSummary> spec = OrderSummarySpecs.ordererId("user1")
.and(OrderSummarySpecs.orderDateBetween(from, to));
List<OrderSummary> results = orderSummaryDao.findAll(spec);
assertThat(results).hasSize(1);
}
@Test
void findAllSpecSort() {
LocalDateTime from = LocalDateTime.of(2022, 1, 1, 0, 0, 0);
LocalDateTime to = LocalDateTime.of(2022, 1, 2, 0, 0, 0);
Specification<OrderSummary> spec = OrderSummarySpecs.ordererId("user1")
.and(OrderSummarySpecs.orderDateBetween(from, to));
Sort sort = Sort.by("number").ascending().and(Sort.by("orderDate").descending());
List<OrderSummary> results = orderSummaryDao.findAll(spec, sort);
assertThat(results).hasSize(1);
}
@Test
void findAllSpecPageable() {
LocalDateTime from = LocalDateTime.of(2022, 1, 1, 0, 0, 0);
LocalDateTime to = LocalDateTime.of(2023, 1, 2, 0, 0, 0);
Specification<OrderSummary> spec = OrderSummarySpecs.orderDateBetween(from, to);
Pageable pageable = PageRequest.of(1, 1);
List<OrderSummary> results = orderSummaryDao.findAll(spec, pageable);
assertThat(results).hasSize(2);
}
@Test
void findByOrdererIdOrderByNumberDesc() {
List<OrderSummary> results = orderSummaryDao.findByOrdererIdOrderByNumberDesc("user1");
assertThat(results.get(0).getNumber()).isEqualTo("ORDER-002");
assertThat(results.get(1).getNumber()).isEqualTo("ORDER-001");
}
@Test
void findByOrdererIdSort() {
Sort sort = Sort.by("number").ascending();
List<OrderSummary> results = orderSummaryDao.findByOrdererId("user1", sort);
assertThat(results.get(0).getNumber()).isEqualTo("ORDER-001");
assertThat(results.get(1).getNumber()).isEqualTo("ORDER-002");
}
@Test
void findByOrdererIdPageable() {
Pageable pageable = PageRequest.of(1, 1);
List<OrderSummary> results = orderSummaryDao.findByOrdererId("user1", pageable);
assertThat(results.get(0).getNumber()).isEqualTo("ORDER-001");
assertThat(results.get(1).getNumber()).isEqualTo("ORDER-002");
}
@Test
void findOrderView() {
List<OrderView> result = orderSummaryDao.findOrderView("user1");
}
}
\ No newline at end of file
truncate table purchase_order;
truncate table order_line;
truncate table category;
truncate table product_category;
truncate table product;
truncate table image;
truncate table member;
truncate table member_authorities;
truncate table article;
truncate table article_content;
truncate table evententry;
insert into member (member_id, name, password, blocked) values ('user1', '사용자1', '1234', false);
insert into member (member_id, name, password, blocked) values ('user2', '사용자2', '5678', false);
insert into member (member_id, name, password, blocked) values ('user3', '사용자3', '5678', true);
insert into member (member_id, name, password, blocked) values ('user4', '사용자4', '5678', true);
insert into member (member_id, name, password, blocked) values ('user5', '사용자5', '5678', false);
insert into member (member_id, name, password, blocked) values ('user6', '사용자6', '5678', false);
insert into member (member_id, name, password, blocked) values ('user7', '사용자7', '5678', false);
insert into member (member_id, name, password, blocked) values ('user8', '사용자8', '5678', false);
insert into member (member_id, name, password, blocked) values ('admin', '운영자', 'admin1234', false);
insert into member_authorities values ('user1', 'ROLE_USER');
insert into member_authorities values ('user2', 'ROLE_USER');
insert into member_authorities values ('admin', 'ROLE_ADMIN');
insert into category values (1001, '전자제품');
insert into category values (2001, '필기구');
insert into product values ('prod-001', '라즈베리파이3 모델B', 56000, '모델B');
insert into image (product_id, list_idx, image_type, image_path, upload_time) values
('prod-001', 0, 'II', 'rpi3.jpg', now());
insert into image (product_id, list_idx, image_type, image_path, upload_time) values
('prod-001', 1, 'EI', 'http://external/image/path', now());
insert into product_category values ('prod-001', 1001);
insert into product values ('prod-002', '어프로치 휴대용 화이트보드 세트', 11920, '화이트보드');
insert into image (product_id, list_idx, image_type, image_path, upload_time) values
('prod-002', 0, 'II', 'wbp.png', now());
insert into product_category values ('prod-002', 2001);
insert into product values ('prod-003', '볼펜 겸용 터치펜', 9000, '볼펜과 터치펜을 하나로!');
insert into image (product_id, list_idx, image_type, image_path, upload_time) values
('prod-003', 0, 'II', 'pen.jpg', now());
insert into image (product_id, list_idx, image_type, image_path, upload_time) values
('prod-003', 1, 'II', 'pen2.jpg', now());
insert into product_category values ('prod-003', 1001);
insert into product_category values ('prod-003', 2001);
insert into purchase_order values (
'ORDER-001', 1, 'user1', '사용자1', 4000,
'123456', '서울시', '관악구', '메시지',
'사용자1', '010-1234-5678', 'PREPARING', '2022-01-01 15:30:00'
);
insert into order_line values ('ORDER-001', 0, 'prod-001', 1000, 2, 2000);
insert into order_line values ('ORDER-001', 1, 'prod-002', 2000, 1, 2000);
insert into purchase_order values (
'ORDER-002', 2, 'user1', '사용자1', 5000,
'123456', '서울시', '관악구', '메시지',
'사용자1', '010-1234-5678', 'PREPARING', '2022-01-02 09:18:21'
);
insert into order_line values ('ORDER-002', 0, 'prod-001', 1000, 5, 5000);
insert into purchase_order values (
'ORDER-003', 3, 'user2', '사용자2', 5000,
'123456', '서울시', '관악구', '메시지',
'사용자1', '010-1234-5678', 'SHIPPED', '2016-01-03 09:00:00'
);
insert into order_line values ('ORDER-003', 0, 'prod-001', 1000, 5, 5000);
insert into article (title) values ('제목');
insert into article_content values (1, 'content', 'type');
insert into evententry (type, content_type, payload, timestamp) values
('com.myshop.eventstore.infra.SampleEvent', 'application/json', '{"name": "name1", "value": 11}', now());
insert into evententry (type, content_type, payload, timestamp) values
('com.myshop.eventstore.infra.SampleEvent', 'application/json', '{"name": "name2", "value": 12}', now());
insert into evententry (type, content_type, payload, timestamp) values
('com.myshop.eventstore.infra.SampleEvent', 'application/json', '{"name": "name3", "value": 13}', now());
insert into evententry (type, content_type, payload, timestamp) values
('com.myshop.eventstore.infra.SampleEvent', 'application/json', '{"name": "name4", "value": 14}', now());
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment