테스트 코드 추가, 패키지 분류 개선
This commit is contained in:
@@ -9,9 +9,9 @@ import myblog.blog.category.service.CategoryService;
|
||||
import myblog.blog.category.dto.*;
|
||||
import myblog.blog.member.auth.PrincipalDetails;
|
||||
import myblog.blog.member.dto.MemberDto;
|
||||
import myblog.blog.tags.queries.TagsQueries;
|
||||
import myblog.blog.tags.service.TagsService;
|
||||
import myblog.blog.tags.dto.TagsDto;
|
||||
import myblog.blog.layout.LayoutDtoFactory;
|
||||
import myblog.blog.shared.queries.LayoutRenderingQueries;
|
||||
|
||||
import org.jsoup.Jsoup;
|
||||
|
||||
@@ -32,7 +32,7 @@ import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static myblog.blog.base.utils.MarkdownUtils.*;
|
||||
import static myblog.blog.shared.utils.MarkdownUtils.*;
|
||||
|
||||
@Controller
|
||||
@RequiredArgsConstructor
|
||||
@@ -43,7 +43,8 @@ public class ArticleController {
|
||||
private final CategoryService categoryService;
|
||||
private final TempArticleService tempArticleService;
|
||||
|
||||
private final LayoutDtoFactory layoutDtoFactory;
|
||||
private final TagsQueries tagsQueries;
|
||||
private final LayoutRenderingQueries layoutRenderingQueries;
|
||||
|
||||
private final ModelMapper modelMapper;
|
||||
|
||||
@@ -52,9 +53,9 @@ public class ArticleController {
|
||||
*/
|
||||
@GetMapping("article/write")
|
||||
public String getWriteArticleForm(Model model) {
|
||||
layoutDtoFactory.AddLayoutTo(model);
|
||||
layoutRenderingQueries.AddLayoutTo(model);
|
||||
model.addAttribute("categoryInput", getCategoryDtosForForm());
|
||||
model.addAttribute("tagsInput", getTagsDtosForForm());
|
||||
model.addAttribute("tagsInput", tagsQueries.findAllTagDtos());
|
||||
model.addAttribute("articleDto", new ArticleForm());
|
||||
return "article/articleWriteForm";
|
||||
}
|
||||
@@ -89,9 +90,9 @@ public class ArticleController {
|
||||
.collect(Collectors.toList());
|
||||
articleDto.setArticleTagList(articleTagStrings);
|
||||
//
|
||||
layoutDtoFactory.AddLayoutTo(model);
|
||||
layoutRenderingQueries.AddLayoutTo(model);
|
||||
model.addAttribute("categoryInput", getCategoryDtosForForm());
|
||||
model.addAttribute("tagsInput", getTagsDtosForForm());
|
||||
model.addAttribute("tagsInput", tagsQueries.findAllTagDtos());
|
||||
model.addAttribute("articleDto", articleDto);
|
||||
return "article/articleEditForm";
|
||||
}
|
||||
@@ -139,7 +140,7 @@ public class ArticleController {
|
||||
articleDto.setContent(Jsoup.parse(getHtmlRenderer().render(getParser().parse(articleDto.getContent()))).text());
|
||||
}
|
||||
|
||||
layoutDtoFactory.AddLayoutTo(model);
|
||||
layoutRenderingQueries.AddLayoutTo(model);
|
||||
model.addAttribute("pagingBox", pagingBoxDto);
|
||||
model.addAttribute("articleList", articleDtoList);
|
||||
|
||||
@@ -167,7 +168,7 @@ public class ArticleController {
|
||||
PagingBoxDto pagingBoxDto =
|
||||
PagingBoxDto.createOf(page, (int)articleList.getTotalElements());
|
||||
|
||||
layoutDtoFactory.AddLayoutTo(model);
|
||||
layoutRenderingQueries.AddLayoutTo(model);
|
||||
model.addAttribute("articleList", articleList);
|
||||
model.addAttribute("pagingBox", pagingBoxDto);
|
||||
|
||||
@@ -195,7 +196,7 @@ public class ArticleController {
|
||||
PagingBoxDto pagingBoxDto =
|
||||
PagingBoxDto.createOf(page, (int)articleList.getTotalElements());
|
||||
|
||||
layoutDtoFactory.AddLayoutTo(model);
|
||||
layoutRenderingQueries.AddLayoutTo(model);
|
||||
model.addAttribute("articleList", articleList);
|
||||
model.addAttribute("pagingBox", pagingBoxDto);
|
||||
|
||||
@@ -263,7 +264,7 @@ public class ArticleController {
|
||||
else substringContents = articleDtoForDetail.getContent();
|
||||
|
||||
// 4. 모델 담기
|
||||
layoutDtoFactory.AddLayoutTo(model);
|
||||
layoutRenderingQueries.AddLayoutTo(model);
|
||||
model.addAttribute("article", articleDtoForDetail);
|
||||
model.addAttribute("metaTags",metaTags);
|
||||
model.addAttribute("metaContents",Jsoup.parse(substringContents).text());
|
||||
@@ -325,17 +326,6 @@ public class ArticleController {
|
||||
throw new IllegalArgumentException("'"+category+"' 라는 카테고리는 존재하지 않습니다.");
|
||||
}
|
||||
|
||||
/*
|
||||
- 아티클 폼에 필요한 태그 dtos
|
||||
*/
|
||||
private List<TagsDto> getTagsDtosForForm() {
|
||||
return tagsService
|
||||
.findAllTags()
|
||||
.stream()
|
||||
.map(tag -> new TagsDto(tag.getName()))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/*
|
||||
- 아티클 폼에 필요한 카테고리 dtos
|
||||
*/
|
||||
|
||||
@@ -3,7 +3,7 @@ package myblog.blog.article.domain;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import myblog.blog.article.dto.ArticleForm;
|
||||
import myblog.blog.base.BasicEntity;
|
||||
import myblog.blog.shared.BasicEntity;
|
||||
import myblog.blog.category.domain.Category;
|
||||
import myblog.blog.comment.domain.Comment;
|
||||
import myblog.blog.member.doamin.Member;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package myblog.blog.article.domain;
|
||||
|
||||
import lombok.Getter;
|
||||
import myblog.blog.base.BasicEntity;
|
||||
import myblog.blog.shared.BasicEntity;
|
||||
|
||||
import javax.persistence.*;
|
||||
|
||||
|
||||
@@ -19,9 +19,4 @@ public class AppConfig {
|
||||
.setFieldMatchingEnabled(true);
|
||||
return modelMapper;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Gson gson(){
|
||||
return new Gson();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package myblog.blog.base.config;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import myblog.blog.exception.LoginFailHandler;
|
||||
import myblog.blog.shared.exception.LoginFailHandler;
|
||||
import myblog.blog.member.doamin.Role;
|
||||
import myblog.blog.member.service.Oauth2MemberService;
|
||||
import org.springframework.boot.autoconfigure.security.servlet.PathRequest;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package myblog.blog.log;
|
||||
package myblog.blog.base.log;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -1,4 +1,4 @@
|
||||
package myblog.blog.log;
|
||||
package myblog.blog.base.log;
|
||||
|
||||
import io.sentry.Sentry;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -1,4 +1,4 @@
|
||||
package myblog.blog.log;
|
||||
package myblog.blog.base.log;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package myblog.blog.log;
|
||||
package myblog.blog.base.log;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
@@ -1,8 +1,8 @@
|
||||
package myblog.blog.category.controller;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import myblog.blog.exception.CustomFormException;
|
||||
import myblog.blog.exception.ListValidator;
|
||||
import myblog.blog.shared.exception.CustomFormException;
|
||||
import myblog.blog.shared.exception.ListValidator;
|
||||
import myblog.blog.category.dto.CategoryForView;
|
||||
import myblog.blog.category.dto.CategoryNormalDto;
|
||||
import myblog.blog.category.service.CategoryService;
|
||||
|
||||
@@ -4,7 +4,7 @@ package myblog.blog.category.domain;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import myblog.blog.article.domain.Article;
|
||||
import myblog.blog.base.BasicEntity;
|
||||
import myblog.blog.shared.BasicEntity;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.util.ArrayList;
|
||||
|
||||
@@ -6,10 +6,9 @@ import myblog.blog.article.service.ArticleService;
|
||||
import myblog.blog.comment.dto.CommentDto;
|
||||
import myblog.blog.comment.dto.CommentForm;
|
||||
import myblog.blog.comment.service.CommentService;
|
||||
import myblog.blog.exception.CustomFormException;
|
||||
import myblog.blog.shared.exception.CustomFormException;
|
||||
import myblog.blog.member.auth.PrincipalDetails;
|
||||
import myblog.blog.member.doamin.Member;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||
import org.springframework.validation.Errors;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
@@ -3,7 +3,7 @@ package myblog.blog.comment.domain;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import myblog.blog.article.domain.Article;
|
||||
import myblog.blog.base.BasicEntity;
|
||||
import myblog.blog.shared.BasicEntity;
|
||||
import myblog.blog.member.doamin.Member;
|
||||
import org.hibernate.annotations.OnDelete;
|
||||
import org.hibernate.annotations.OnDeleteAction;
|
||||
|
||||
@@ -4,7 +4,7 @@ import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import myblog.blog.article.dto.ArticleDtoForCardBox;
|
||||
import myblog.blog.article.service.ArticleService;
|
||||
import myblog.blog.layout.LayoutDtoFactory;
|
||||
import myblog.blog.shared.queries.LayoutRenderingQueries;
|
||||
import org.jsoup.Jsoup;
|
||||
import org.modelmapper.ModelMapper;
|
||||
import org.springframework.stereotype.Controller;
|
||||
@@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.*;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static myblog.blog.base.utils.MarkdownUtils.*;
|
||||
import static myblog.blog.shared.utils.MarkdownUtils.*;
|
||||
|
||||
@Controller
|
||||
@RequiredArgsConstructor
|
||||
@@ -23,7 +23,7 @@ public class MainController {
|
||||
|
||||
private final ArticleService articleService;
|
||||
private final ModelMapper modelMapper;
|
||||
private final LayoutDtoFactory layoutDtoFactory;
|
||||
private final LayoutRenderingQueries layoutRenderingQueries;
|
||||
/*
|
||||
- 메인 화면 제어용 컨트롤러
|
||||
*/
|
||||
@@ -35,7 +35,7 @@ public class MainController {
|
||||
.map(article -> modelMapper.map(article, ArticleDtoForCardBox.class))
|
||||
.collect(Collectors.toList());
|
||||
//
|
||||
layoutDtoFactory.AddLayoutTo(model);
|
||||
layoutRenderingQueries.AddLayoutTo(model);
|
||||
model.addAttribute("popularArticles", popularArticles);
|
||||
return "index";
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import myblog.blog.article.domain.Article;
|
||||
import myblog.blog.base.BasicEntity;
|
||||
import myblog.blog.shared.BasicEntity;
|
||||
import myblog.blog.comment.domain.Comment;
|
||||
|
||||
import javax.persistence.*;
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
package myblog.blog.rss;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import myblog.blog.article.domain.Article;
|
||||
import myblog.blog.article.service.ArticleService;
|
||||
import org.jdom2.*;
|
||||
import org.jdom2.output.*;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import myblog.blog.article.domain.Article;
|
||||
import myblog.blog.article.service.ArticleService;
|
||||
import org.jdom2.*;
|
||||
import org.jdom2.output.*;
|
||||
import java.sql.Timestamp;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
|
||||
import static myblog.blog.base.utils.MarkdownUtils.*;
|
||||
import static myblog.blog.shared.utils.MarkdownUtils.*;
|
||||
|
||||
/*
|
||||
- rss 서비스 로직
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package myblog.blog.base;
|
||||
package myblog.blog.shared;
|
||||
|
||||
import lombok.Getter;
|
||||
import org.springframework.data.annotation.CreatedDate;
|
||||
@@ -1,4 +1,4 @@
|
||||
package myblog.blog.exception;
|
||||
package myblog.blog.shared.exception;
|
||||
/*
|
||||
- REST 컨트롤러 상태 메세지 전송용 커스텀 에러
|
||||
*/
|
||||
@@ -1,28 +1,23 @@
|
||||
package myblog.blog.exception;
|
||||
package myblog.blog.shared.exception;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import myblog.blog.layout.LayoutDtoFactory;
|
||||
import myblog.blog.shared.queries.LayoutRenderingQueries;
|
||||
import org.springframework.boot.web.servlet.error.ErrorController;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.context.request.WebRequest;
|
||||
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.security.Principal;
|
||||
|
||||
@Controller
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class ExceptionController implements ErrorController {
|
||||
|
||||
private final LayoutDtoFactory layoutDtoFactory;
|
||||
private final LayoutRenderingQueries layoutRenderingQueries;
|
||||
|
||||
@GetMapping("/error")
|
||||
public String errorView(Model model) {
|
||||
layoutDtoFactory.AddLayoutTo(model);
|
||||
layoutRenderingQueries.AddLayoutTo(model);
|
||||
return "error";
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package myblog.blog.exception;
|
||||
package myblog.blog.shared.exception;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||
@@ -1,4 +1,4 @@
|
||||
package myblog.blog.exception;
|
||||
package myblog.blog.shared.exception;
|
||||
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
@@ -1,4 +1,4 @@
|
||||
package myblog.blog.exception;
|
||||
package myblog.blog.shared.exception;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Component;
|
||||
@@ -1,4 +1,4 @@
|
||||
package myblog.blog.exception;
|
||||
package myblog.blog.shared.exception;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.security.authentication.AuthenticationServiceException;
|
||||
@@ -1,4 +1,4 @@
|
||||
package myblog.blog.layout;
|
||||
package myblog.blog.shared.queries;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import myblog.blog.category.dto.CategoryForView;
|
||||
@@ -12,7 +12,7 @@ import java.util.List;
|
||||
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class LayoutDtoFactory {
|
||||
public class LayoutRenderingQueries {
|
||||
|
||||
private final CategoryService categoryService;
|
||||
private final CommentService commentService;
|
||||
@@ -26,6 +26,4 @@ public class LayoutDtoFactory {
|
||||
model.addAttribute("category", categoryForView);
|
||||
model.addAttribute("commentsList", comments);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
25
src/main/java/myblog/blog/shared/utils/MapperUtils.java
Normal file
25
src/main/java/myblog/blog/shared/utils/MapperUtils.java
Normal file
@@ -0,0 +1,25 @@
|
||||
package myblog.blog.shared.utils;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import org.modelmapper.ModelMapper;
|
||||
|
||||
public class MapperUtils {
|
||||
private static final ModelMapper modelMapper;
|
||||
private static final Gson gson;
|
||||
|
||||
static {
|
||||
modelMapper = new ModelMapper();
|
||||
modelMapper.getConfiguration()
|
||||
.setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE)
|
||||
.setFieldMatchingEnabled(true);
|
||||
gson = new Gson();
|
||||
}
|
||||
|
||||
public static ModelMapper getModelMapper(){
|
||||
return modelMapper;
|
||||
}
|
||||
|
||||
public static Gson getGson(){
|
||||
return gson;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package myblog.blog.base.utils;
|
||||
package myblog.blog.shared.utils;
|
||||
|
||||
import org.commonmark.ext.gfm.tables.TablesExtension;
|
||||
import org.commonmark.parser.Parser;
|
||||
@@ -1,14 +1,15 @@
|
||||
package myblog.blog.sitemap;
|
||||
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.stereotype.Service;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
import myblog.blog.article.domain.Article;
|
||||
import myblog.blog.article.service.ArticleService;
|
||||
import myblog.blog.category.domain.Category;
|
||||
import myblog.blog.article.service.ArticleService;
|
||||
import myblog.blog.category.service.CategoryService;
|
||||
import org.jdom2.*;
|
||||
import org.jdom2.output.*;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
||||
@@ -2,7 +2,7 @@ package myblog.blog.tags.domain;
|
||||
|
||||
import lombok.*;
|
||||
import myblog.blog.article.domain.Article;
|
||||
import myblog.blog.base.BasicEntity;
|
||||
import myblog.blog.shared.BasicEntity;
|
||||
|
||||
import javax.persistence.*;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package myblog.blog.tags.domain;
|
||||
|
||||
import lombok.*;
|
||||
import myblog.blog.base.BasicEntity;
|
||||
import myblog.blog.shared.BasicEntity;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.util.*;
|
||||
|
||||
@@ -7,11 +7,8 @@ import lombok.Data;
|
||||
*/
|
||||
@Data
|
||||
public class TagsDto {
|
||||
|
||||
private String name;
|
||||
|
||||
public TagsDto(){}
|
||||
|
||||
public TagsDto(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
28
src/main/java/myblog/blog/tags/queries/TagsQueries.java
Normal file
28
src/main/java/myblog/blog/tags/queries/TagsQueries.java
Normal file
@@ -0,0 +1,28 @@
|
||||
package myblog.blog.tags.queries;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import myblog.blog.shared.utils.MapperUtils;
|
||||
import myblog.blog.tags.domain.Tags;
|
||||
import myblog.blog.tags.dto.TagsDto;
|
||||
import myblog.blog.tags.repository.ArticleTagListsRepository;
|
||||
import myblog.blog.tags.repository.TagsRepository;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Component
|
||||
@Transactional
|
||||
@RequiredArgsConstructor
|
||||
public class TagsQueries {
|
||||
private final TagsRepository tagsRepository;
|
||||
private final ArticleTagListsRepository articleTagListsRepository;
|
||||
|
||||
public List<TagsDto> findAllTagDtos(){
|
||||
List<Tags> tags = tagsRepository.findAll();
|
||||
return tags.stream()
|
||||
.map(tag -> MapperUtils.getModelMapper().map(tag, TagsDto.class))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
@@ -1,28 +1,27 @@
|
||||
package myblog.blog.tags.service;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import myblog.blog.article.domain.Article;
|
||||
import myblog.blog.tags.domain.*;
|
||||
import myblog.blog.tags.repository.*;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import myblog.blog.article.domain.*;
|
||||
import myblog.blog.tags.domain.*;
|
||||
import myblog.blog.shared.utils.MapperUtils;
|
||||
import myblog.blog.tags.repository.*;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@Service
|
||||
@Transactional
|
||||
@RequiredArgsConstructor
|
||||
public class TagsService {
|
||||
|
||||
private final TagsRepository tagsRepository;
|
||||
private final ArticleTagListsRepository articleTagListsRepository;
|
||||
private final Gson gson;
|
||||
/*
|
||||
- Json 객체로 넘어온 태그들을 파싱해서 신규 태그인경우 저장
|
||||
*/
|
||||
public void createNewTagsAndArticleTagList(String names, Article article) {
|
||||
List<Map<String,String>> tagsDtoArrayList = gson.fromJson(names, ArrayList.class);
|
||||
List<Map<String,String>> tagsDtoArrayList = MapperUtils.getGson().fromJson(names, ArrayList.class);
|
||||
for (var tagDto : tagsDtoArrayList) {
|
||||
Tags tag = findOrCreateTagFrom(tagDto);
|
||||
articleTagListsRepository.save(new ArticleTagList(article, tag));
|
||||
@@ -34,10 +33,6 @@ public class TagsService {
|
||||
.orElseGet(() -> tagsRepository.save(new Tags(tags.get("value"))));
|
||||
}
|
||||
|
||||
public List<Tags> findAllTags(){
|
||||
return tagsRepository.findAll();
|
||||
}
|
||||
|
||||
public void deleteAllTagsWith(Article article){
|
||||
articleTagListsRepository.deleteByArticle(article);
|
||||
}
|
||||
|
||||
76
src/test/kotlin/myblog/blog/rss/RssServiceTests.kt
Normal file
76
src/test/kotlin/myblog/blog/rss/RssServiceTests.kt
Normal file
@@ -0,0 +1,76 @@
|
||||
package myblog.blog.rss
|
||||
|
||||
import com.nhaarman.mockito_kotlin.whenever
|
||||
import myblog.blog.article.domain.Article
|
||||
import myblog.blog.article.service.ArticleService
|
||||
import myblog.blog.rss.RssService
|
||||
import org.assertj.core.api.Assertions.assertThat
|
||||
import org.junit.jupiter.api.Test
|
||||
//import org.junit.Test
|
||||
import org.junit.jupiter.api.extension.ExtendWith
|
||||
import org.mockito.InjectMocks
|
||||
import org.mockito.Mock
|
||||
import org.mockito.Mockito
|
||||
import org.mockito.junit.MockitoJUnitRunner
|
||||
import org.mockito.junit.jupiter.MockitoExtension
|
||||
import java.lang.reflect.Field
|
||||
import java.time.LocalDateTime
|
||||
import java.util.*
|
||||
|
||||
|
||||
@ExtendWith(MockitoExtension::class)
|
||||
class RssServiceTests {
|
||||
|
||||
@Mock
|
||||
lateinit var articleService: ArticleService
|
||||
@InjectMocks
|
||||
lateinit var rssService: RssService
|
||||
|
||||
@Test
|
||||
fun `정상적으로 rssFeed를 가져오는 테스트`() {
|
||||
// given
|
||||
whenever(articleService.totalArticle)
|
||||
.thenReturn(Arrays.asList(buildArticle("테스트용", "1호", 1L), buildArticle("테스트용이에용", "2호", 2L)))
|
||||
// when
|
||||
val rssFeed = rssService.rssFeed
|
||||
// then
|
||||
firstArticleAssert(rssFeed)
|
||||
secondArticleAssert(rssFeed)
|
||||
}
|
||||
|
||||
private fun buildArticle(title: String, content: String, id: Long): Article? {
|
||||
val article = Article.builder().title(title).content(content).build()
|
||||
setArticlePrivateFieldId(id, article)
|
||||
setArticleCreatedTimeStamp(article)
|
||||
return article
|
||||
}
|
||||
|
||||
private fun setArticleCreatedTimeStamp(article: Article) {
|
||||
val clazz = Class.forName("myblog.blog.article.domain.Article").superclass
|
||||
val field: Field = clazz.getDeclaredField("createdDate")
|
||||
field.setAccessible(true)
|
||||
field.set(article, LocalDateTime.now())
|
||||
}
|
||||
|
||||
private fun setArticlePrivateFieldId(id: Long, article: Article) {
|
||||
val clazz = Class.forName("myblog.blog.article.domain.Article")
|
||||
val field: Field = clazz.getDeclaredField("id")
|
||||
field.setAccessible(true)
|
||||
field.set(article, id)
|
||||
}
|
||||
|
||||
private fun secondArticleAssert(rssFeed: String?) {
|
||||
assertThat(rssFeed).contains("<title><![CDATA[테스트용이에용]]></title>")
|
||||
.contains("<link>https://www.jiniaslog.co.kr/article/view?articleId=2</link>")
|
||||
.contains("<description><![CDATA[<p>2호</p>]]></description>")
|
||||
.contains("<guid>https://www.jiniaslog.co.kr/article/view?articleId=2</guid>")
|
||||
}
|
||||
|
||||
private fun firstArticleAssert(rssFeed: String?) {
|
||||
assertThat(rssFeed).contains("<title><![CDATA[테스트용]]></title>")
|
||||
.contains("<link>https://www.jiniaslog.co.kr/article/view?articleId=1</link>")
|
||||
.contains("<description><![CDATA[<p>1호</p>]]></description>")
|
||||
.contains("<guid>https://www.jiniaslog.co.kr/article/view?articleId=1</guid>")
|
||||
}
|
||||
|
||||
}
|
||||
@@ -3,6 +3,8 @@ package myblog.blog.sitemap
|
||||
import com.nhaarman.mockito_kotlin.whenever
|
||||
import myblog.blog.article.domain.Article
|
||||
import myblog.blog.article.service.ArticleService
|
||||
import myblog.blog.category.domain.Category
|
||||
import myblog.blog.category.service.CategoryService
|
||||
import myblog.blog.rss.RssService
|
||||
import org.assertj.core.api.Assertions.assertThat
|
||||
import org.junit.jupiter.api.Test
|
||||
@@ -23,27 +25,27 @@ class SiteMapServiceTests {
|
||||
|
||||
@Mock
|
||||
lateinit var articleService: ArticleService
|
||||
@Mock
|
||||
lateinit var categoryService: CategoryService
|
||||
@InjectMocks
|
||||
lateinit var rssService: RssService
|
||||
lateinit var siteMapService: SiteMapService
|
||||
|
||||
@Test
|
||||
fun `rss 요청시 성공 테스트`() {
|
||||
fun `정상적으로 siteMap을 가져오는 테스트`() {
|
||||
// given
|
||||
whenever(articleService.totalArticle)
|
||||
.thenReturn(Arrays.asList(buildArticle("테스트용", "1호", 1L), buildArticle("테스트용이에용", "2호", 2L)))
|
||||
whenever(categoryService.allCategories)
|
||||
.thenReturn(Arrays.asList(buildCategory("목 카테고리")))
|
||||
// when
|
||||
val rssFeed = rssService.rssFeed
|
||||
val siteMap = siteMapService.siteMap
|
||||
// then
|
||||
assertThat(rssFeed).contains("<title><![CDATA[테스트용]]></title>")
|
||||
.contains("<link>https://www.jiniaslog.co.kr/article/view?articleId=1</link>")
|
||||
.contains("<description><![CDATA[<p>1호</p>]]></description>")
|
||||
.contains("<guid>https://www.jiniaslog.co.kr/article/view?articleId=1</guid>")
|
||||
assertThat(rssFeed).contains("<title><![CDATA[테스트용이에용]]></title>")
|
||||
.contains("<link>https://www.jiniaslog.co.kr/article/view?articleId=2</link>")
|
||||
.contains("<description><![CDATA[<p>2호</p>]]></description>")
|
||||
.contains("<guid>https://www.jiniaslog.co.kr/article/view?articleId=2</guid>")
|
||||
siteMapRootBuildlAssert(siteMap)
|
||||
siteMapCategoryUrlBuildAssert(siteMap)
|
||||
siteMapArticleUrlBuildAssert(siteMap)
|
||||
}
|
||||
|
||||
private fun buildCategory(title: String) = Category.builder().title(title).tier(1).build()
|
||||
private fun buildArticle(title: String, content: String, id: Long): Article? {
|
||||
val article = Article.builder().title(title).content(content).build()
|
||||
setArticlePrivateFieldId(id, article)
|
||||
@@ -64,4 +66,18 @@ class SiteMapServiceTests {
|
||||
field.setAccessible(true)
|
||||
field.set(article, id)
|
||||
}
|
||||
|
||||
private fun siteMapRootBuildlAssert(rssFeed: String?) {
|
||||
assertThat(rssFeed).contains("<loc>https://www.jiniaslog.co.kr</loc>")
|
||||
.contains("<priority>1.0</priority>")
|
||||
}
|
||||
|
||||
private fun siteMapCategoryUrlBuildAssert(rssFeed: String?) {
|
||||
assertThat(rssFeed).contains("<loc>https://www.jiniaslog.co.kr/article/list?category=목 카테고리&tier=1&page=1</loc>")
|
||||
}
|
||||
|
||||
private fun siteMapArticleUrlBuildAssert(rssFeed: String?) {
|
||||
assertThat(rssFeed).contains("<loc>https://www.jiniaslog.co.kr/article/view?articleId=1</loc>")
|
||||
.contains("<loc>https://www.jiniaslog.co.kr/article/view?articleId=2</loc>")
|
||||
}
|
||||
}
|
||||
20
src/test/kotlin/myblog/blog/tags/service/TagsServiceTests.kt
Normal file
20
src/test/kotlin/myblog/blog/tags/service/TagsServiceTests.kt
Normal file
@@ -0,0 +1,20 @@
|
||||
//package myblog.blog.tags.service
|
||||
//
|
||||
//import org.junit.jupiter.api.extension.ExtendWith
|
||||
//import org.mockito.InjectMocks
|
||||
//import org.mockito.Mock
|
||||
//import org.mockito.junit.jupiter.MockitoExtension
|
||||
//import myblog.blog.tags.repository.ArticleTagListsRepository
|
||||
//
|
||||
//@ExtendWith(MockitoExtension::class)
|
||||
//class TagsServiceTests {
|
||||
//
|
||||
// @Mock
|
||||
// lateinit var tagsRepository: ArticleTagListsRepository
|
||||
// @Mock
|
||||
// lateinit var articleTagListsRepository: ArticleTagListsRepository
|
||||
// @InjectMocks
|
||||
// lateinit var tagsService: TagsService
|
||||
// 커밋후 추가 작성 예정
|
||||
//
|
||||
//}
|
||||
Reference in New Issue
Block a user