package com.yunhai.cms.service.impl; import com.yunhai.cms.model.dto.DeleteRequest; import com.yunhai.cms.model.dto.LinkSaveRequest; import com.yunhai.cms.model.vo.LinkVo; import com.yunhai.cms.support.CmsIntegrationTestBase; import com.yunhai.cms.support.TestUsers; import com.yunhai.platform.apistd.BizException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; /** * 友情链接管理集成测试(方案 §5.1 表6 / §9.2)。 */ @DisplayName("LinkService - 友情链接管理") @Transactional class LinkServiceIT extends CmsIntegrationTestBase { @Autowired private LinkService linkService; private Integer siteId; @BeforeEach void seed() { siteId = persistSite("demo1", 1, "演示站点一").getId(); } private LinkSaveRequest req(String name, String url) { LinkSaveRequest r = new LinkSaveRequest(); r.setSiteId(siteId); r.setName(name); r.setLinkUrl(url); return r; } @Test @DisplayName("保存友链:http/https/站内相对路径均接受;分组与默认值生效") void save_urlSchemesAndDefaults() { assertThat(linkService.save(TestUsers.superAdmin(), req("教育部", "http://www.moe.gov.cn")).getId()) .isNotNull(); assertThat(linkService.save(TestUsers.superAdmin(), req("兄弟院校", "https://www.pku.edu.cn")).getId()) .isNotNull(); LinkVo relative = linkService.save(TestUsers.superAdmin(), req("站内页", "/cms/portal/demo1/")); assertThat(relative.getGroupName()).isEqualTo("default"); // 分组缺省 assertThat(relative.getSortNo()).isZero(); assertThat(relative.getStatus()).isEqualTo(1); } @Test @DisplayName("保存友链:javascript: 等非法协议与空地址被拒") void save_invalidUrlRejected() { assertThatThrownBy(() -> linkService.save( TestUsers.superAdmin(), req("危险链", "javascript:alert(1)"))) .isInstanceOf(BizException.class) .hasMessageContaining("http"); assertThatThrownBy(() -> linkService.save(TestUsers.superAdmin(), req("空链", ""))) .isInstanceOf(BizException.class) .hasMessageContaining("http"); assertThatThrownBy(() -> linkService.save( TestUsers.superAdmin(), req("数据协议", "data:text/html,