模块化拆分

This commit is contained in:
禾几海
2021-10-01 01:08:46 +08:00
parent c1c7f38ee9
commit 7e700b6499
69 changed files with 471 additions and 331 deletions

View File

@@ -0,0 +1,13 @@
package cn.celess.article;
import cn.celess.common.CommonApplication;
import cn.celess.user.UserApplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackageClasses = {ArticleApplication.class, CommonApplication.class, UserApplication.class})
public class ArticleApplication {
public static void main(String[] args) {
SpringApplication.run(ArticleApplication.class, args);
}
}

View File

@@ -24,6 +24,7 @@ import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
@@ -38,22 +39,22 @@ import java.util.stream.Collectors;
@Slf4j
public class ArticleServiceImpl implements ArticleService {
@Autowired
@Resource
ArticleMapper articleMapper;
@Autowired
@Resource
TagMapper tagMapper;
@Autowired
@Resource
CategoryMapper categoryMapper;
@Autowired
@Resource
CommentMapper commentMapper;
@Autowired
@Resource
ArticleTagMapper articleTagMapper;
@Autowired
@Resource
UserService userService;
@Autowired
HttpServletRequest request;
@Autowired
@Resource
RedisUserUtil redisUserUtil;
@Override

View File

@@ -0,0 +1,11 @@
package cn.celess.article;
import cn.celess.common.test.RedisServerMock;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest(classes = {ArticleApplication.class})
@RunWith(SpringRunner.class)
public abstract class ArticleBaseTest extends RedisServerMock {
}

View File

@@ -0,0 +1,303 @@
package cn.celess.article.controller;
import cn.celess.article.ArticleBaseTest;
import cn.celess.common.entity.Article;
import cn.celess.common.entity.Response;
import cn.celess.common.entity.Tag;
import cn.celess.common.entity.dto.ArticleReq;
import cn.celess.common.entity.vo.ArticleModel;
import cn.celess.common.entity.vo.PageData;
import cn.celess.common.mapper.ArticleMapper;
import com.fasterxml.jackson.core.type.TypeReference;
import org.junit.Test;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import javax.annotation.Resource;
import java.util.List;
import static cn.celess.common.enmu.ResponseEnum.*;
import static org.junit.Assert.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
public class ArticleControllerTest extends ArticleBaseTest {
@Resource
ArticleMapper articleMapper;
private static final TypeReference<?> ARTICLE_MODEL_TYPE = new TypeReference<Response<ArticleModel>>() {
};
private static final TypeReference<?> ARTICLE_MODEL_PAGE_TYPE = new TypeReference<Response<PageData<ArticleModel>>>() {
};
@Test
public void create() {
ArticleReq articleReq = new ArticleReq();
// 应该正常通过
articleReq.setTitle("test-" + randomStr());
articleReq.setMdContent("# test title");
articleReq.setCategory("随笔");
String[] tagList = {"tag", "category"};
articleReq.setTags(tagList);
articleReq.setOpen(true);
articleReq.setType(true);
articleReq.setUrl("http://xxxx.com");
MockHttpServletRequestBuilder post = post("/admin/article/create");
try {
getMockData(post, adminLogin(), articleReq).andDo(result -> {
Response<ArticleModel> response = getResponse(result, ARTICLE_MODEL_TYPE);
assertEquals(SUCCESS.getCode(), response.getCode());
assertNotNull(response.getResult());
ArticleModel articleModel = response.getResult();
assertNotNull(articleModel.getId());
assertNotNull(articleModel.getTitle());
assertNotNull(articleModel.getSummary());
assertNotNull(articleModel.getOriginal());
assertNotNull(articleModel.getTags());
assertNotNull(articleModel.getCategory());
assertNotNull(articleModel.getPublishDateFormat());
assertNotNull(articleModel.getMdContent());
assertNotNull(articleModel.getPreArticle());
assertNull(articleModel.getNextArticle());
assertNotNull(articleModel.getOpen());
assertNotNull(articleModel.getReadingNumber());
assertNotNull(articleModel.getAuthor());
assertNotNull(articleModel.getUrl());
});
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void delete() {
Article article;
do {
article = articleMapper.getLastestArticle();
create();
} while (article.isDeleted());
assertFalse(article.isDeleted());
MockHttpServletRequestBuilder delete = MockMvcRequestBuilders.delete("/admin/article/del?articleID=" + article.getId());
try {
Article finalArticle = article;
getMockData(delete, adminLogin()).andDo(result -> {
Response<Boolean> response = getResponse(result, BOOLEAN_TYPE);
assertEquals(SUCCESS.getCode(), response.getCode());
// 断言删除成功
assertTrue(response.getResult());
assertTrue(articleMapper.isDeletedById(finalArticle.getId()));
});
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void update() {
Article article = articleMapper.getLastestArticle();
ArticleReq articleReq = new ArticleReq();
articleReq.setId(article.getId());
articleReq.setUrl("http://www.test.test");
articleReq.setType(!article.getType());
articleReq.setCategory("test");
articleReq.setMdContent("test-" + article.getMdContent());
articleReq.setOpen(!article.getOpen());
String tag1 = randomStr(4);
String tag2 = randomStr(4);
String[] tagList = {"test", tag1, tag2};
articleReq.setTags(tagList);
articleReq.setTitle("test-" + article.getTitle());
try {
getMockData(put("/admin/article/update"), adminLogin(), articleReq).andDo(result -> {
Response<ArticleModel> response = getResponse(result, ARTICLE_MODEL_TYPE);
assertEquals(SUCCESS.getCode(), response.getCode());
ArticleModel a = response.getResult();
assertEquals(articleReq.getCategory(), a.getCategory());
assertEquals(articleReq.getUrl(), a.getUrl());
assertEquals(articleReq.getMdContent(), a.getMdContent());
assertEquals(articleReq.getTitle(), a.getTitle());
assertEquals(articleReq.getType(), a.getOriginal());
// Tag
List<Tag> asList = a.getTags();
assertEquals(3, asList.size());
assertEquals(articleReq.getOpen(), a.getOpen());
assertEquals(articleReq.getId(), a.getId());
});
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void retrieveOneById() {
try {
long articleID = 3;
getMockData(MockMvcRequestBuilders.get("/article/articleID/" + articleID));
getMockData(MockMvcRequestBuilders.get("/article/articleID/" + articleID + "?update=true"));
// 文章不存在
getMockData(MockMvcRequestBuilders.get("/article/articleID/-1"))
.andDo(result -> assertEquals(ARTICLE_NOT_EXIST.getCode(), getResponse(result, STRING_TYPE).getCode()));
// 正常情况
getMockData(MockMvcRequestBuilders.get("/article/articleID/" + articleID + "?update=false")).andDo(result -> {
Response<ArticleModel> response = getResponse(result, ARTICLE_MODEL_TYPE);
// 断言获取数据成功
assertEquals(SUCCESS.getCode(), response.getCode());
assertNotNull(response.getResult());
ArticleModel a = response.getResult();
assertNotNull(a.getTitle());
assertNotNull(a.getId());
assertNotNull(a.getSummary());
assertNotNull(a.getMdContent());
assertNotNull(a.getUrl());
assertNotNull(a.getUpdateDateFormat());
assertTrue(a.getPreArticle() != null || a.getNextArticle() != null);
assertNotNull(a.getReadingNumber());
assertNotNull(a.getOriginal());
assertNotNull(a.getPublishDateFormat());
assertNotNull(a.getCategory());
assertNotNull(a.getTags());
assertNotNull(a.getAuthor());
});
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void articles() {
try {
// 测试不带参数访问
getMockData(MockMvcRequestBuilders.get("/articles"));
getMockData(MockMvcRequestBuilders.get("/articles?page=1&count=5")).andDo(result -> {
Response<PageData<ArticleModel>> response = getResponse(result, ARTICLE_MODEL_PAGE_TYPE);
// 断言获取数据成功
assertEquals(SUCCESS.getCode(), response.getCode());
// 结果集非空
assertNotNull(response.getResult());
// 判断pageInfo是否包装完全
PageData<ArticleModel> pageData = response.getResult();
assertNotEquals(0, pageData.getTotal());
assertEquals(1, pageData.getPageNum());
assertEquals(5, pageData.getPageSize());
// 内容完整
for (ArticleModel a : pageData.getList()) {
assertNotNull(a.getTitle());
assertNotNull(a.getId());
assertNotNull(a.getSummary());
assertNotNull(a.getOriginal());
assertNotNull(a.getPublishDateFormat());
assertNotNull(a.getCategory());
assertNotNull(a.getTags());
assertNotNull(a.getAuthor());
assertNull(a.getOpen());
assertNull(a.getMdContent());
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void adminArticles() {
try {
getMockData(get("/admin/articles?page=1&count=5")).andExpect(result ->
assertEquals(HAVE_NOT_LOG_IN.getCode(), getResponse(result, ARTICLE_MODEL_PAGE_TYPE).getCode())
);
// User权限登陆
getMockData(get("/admin/articles?page=1&count=5"), userLogin()).andDo(result ->
assertEquals(PERMISSION_ERROR.getCode(), getResponse(result, ARTICLE_MODEL_PAGE_TYPE).getCode())
);
for (int i = 0; i < 2; i++) {
// admin权限登陆
int finalI = i;
getMockData(get("/admin/articles?page=1&count=5&deleted=" + (i == 1)), adminLogin()).andDo(result -> {
Response<PageData<ArticleModel>> response = getResponse(result, ARTICLE_MODEL_PAGE_TYPE);
assertEquals(SUCCESS.getCode(), response.getCode());
assertNotNull(response.getResult());
// 判断pageInfo是否包装完全
PageData<ArticleModel> pageData = response.getResult();
assertNotEquals(0, pageData.getTotal());
assertEquals(1, pageData.getPageNum());
assertEquals(5, pageData.getPageSize());
// 内容完整
for (ArticleModel a : pageData.getList()) {
assertNotNull(a.getTitle());
assertNotNull(a.getId());
assertNotNull(a.getOriginal());
assertNotNull(a.getPublishDateFormat());
assertNotNull(a.getOpen());
assertNotNull(a.getReadingNumber());
assertNotNull(a.getLikeCount());
assertNotNull(a.getDislikeCount());
assertEquals((finalI == 1), a.isDeleted());
assertNull(a.getMdContent());
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void findByCategory() {
try {
// 分类不存在
String categoryName = "NoSuchCategory";
getMockData(MockMvcRequestBuilders.get("/articles/category/" + categoryName + "?page=1&count=10"))
.andDo(result -> assertEquals(CATEGORY_NOT_EXIST.getCode(), getResponse(result, STRING_TYPE).getCode()));
// 正常查询
categoryName = "linux";
getMockData(MockMvcRequestBuilders.get("/articles/category/" + categoryName + "?page=1&count=10"))
.andDo(result -> {
Response<PageData<ArticleModel>> response = getResponse(result, ARTICLE_MODEL_PAGE_TYPE);
assertEquals(SUCCESS.getCode(), response.getCode());
PageData<ArticleModel> pageData = response.getResult();
assertNotEquals(0, pageData.getTotal());
assertEquals(1, pageData.getPageNum());
assertEquals(10, pageData.getPageSize());
for (ArticleModel arc : pageData.getList()) {
assertNotEquals(0, arc.getId().longValue());
assertNotNull(arc.getTitle());
assertNotNull(arc.getSummary());
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void findByTag() {
try {
// 分类不存在
String tagName = "NoSuchTag";
getMockData(MockMvcRequestBuilders.get("/articles/tag/" + tagName + "?page=1&count=10"))
.andDo(result -> assertEquals(TAG_NOT_EXIST.getCode(), getResponse(result, STRING_TYPE).getCode()));
// 正常查询
tagName = "linux";
getMockData(MockMvcRequestBuilders.get("/articles/tag/" + tagName + "?page=1&count=10"))
.andDo(result -> {
Response<PageData<ArticleModel>> response = getResponse(result, ARTICLE_MODEL_PAGE_TYPE);
assertEquals(SUCCESS.getCode(), response.getCode());
PageData<ArticleModel> pageData = response.getResult();
assertNotEquals(0, pageData.getTotal());
assertEquals(1, pageData.getPageNum());
assertEquals(10, pageData.getPageSize());
for (ArticleModel arc : pageData.getList()) {
assertNotEquals(0, arc.getId().longValue());
assertNotNull(arc.getTitle());
assertNotNull(arc.getSummary());
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,55 @@
package cn.celess.article.serviceimpl;
import cn.celess.article.ArticleBaseTest;
import cn.celess.common.entity.vo.ArticleModel;
import cn.celess.common.entity.vo.PageData;
import cn.celess.common.mapper.ArticleMapper;
import cn.celess.common.service.ArticleService;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import javax.annotation.Resource;
import static org.junit.Assert.*;
public class ArticleServiceTest extends ArticleBaseTest {
@Autowired
ArticleService articleService;
@Resource
ArticleMapper articleMapper;
@Test
public void adminArticles() {
// 测deleted参数传值
PageData<ArticleModel> pageData = articleService.adminArticles(10, 1, true);
assertTrue(pageData.getList().stream().allMatch(ArticleModel::isDeleted));
pageData = articleService.adminArticles(10, 1, false);
assertFalse(pageData.getList().stream().allMatch(ArticleModel::isDeleted));
pageData = articleService.adminArticles(10, 1, null);
assertTrue(pageData.getList().stream().anyMatch(ArticleModel::isDeleted));
assertTrue(pageData.getList().stream().anyMatch(articleModel -> !articleModel.isDeleted()));
}
@Test
public void retrievePageForOpen() {
PageData<ArticleModel> articleModelPageData = articleService.retrievePageForOpen(10, 1);
assertEquals(10, articleModelPageData.getPageSize());
assertEquals(1, articleModelPageData.getPageNum());
assertEquals(10, articleModelPageData.getList().size());
articleModelPageData.getList().forEach(Assert::assertNotNull);
// 测试open字段
articleModelPageData.getList().forEach(articleModel -> {
// 当前文章
assertTrue(articleMapper.findArticleById(articleModel.getId()).getOpen());
if (articleModel.getPreArticle() != null) {
assertTrue(articleMapper.findArticleById(articleModel.getPreArticle().getId()).getOpen());
}
if (articleModel.getNextArticle() != null) {
assertTrue(articleMapper.findArticleById(articleModel.getNextArticle().getId()).getOpen());
}
});
}
}