|
|
|
@ -0,0 +1,338 @@ |
|
|
|
package com.zdxt.rest.test; |
|
|
|
|
|
|
|
import cn.dev33.satoken.context.mock.SaTokenContextMockUtil; |
|
|
|
import cn.dev33.satoken.stp.parameter.SaLoginParameter; |
|
|
|
import cn.dev33.satoken.stp.StpUtil; |
|
|
|
import org.dromara.ZdxtAdminApplication; |
|
|
|
import org.dromara.common.core.domain.model.LoginUser; |
|
|
|
import org.dromara.common.satoken.utils.LoginHelper; |
|
|
|
import org.junit.jupiter.api.*; |
|
|
|
import org.springframework.mock.web.MockHttpServletRequest; |
|
|
|
import org.springframework.web.context.request.RequestContextHolder; |
|
|
|
import org.springframework.web.context.request.ServletRequestAttributes; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; |
|
|
|
import org.springframework.boot.test.context.SpringBootTest; |
|
|
|
import org.springframework.test.web.servlet.MockMvc; |
|
|
|
import org.springframework.test.web.servlet.MvcResult; |
|
|
|
|
|
|
|
import java.nio.charset.StandardCharsets; |
|
|
|
import java.util.HashSet; |
|
|
|
|
|
|
|
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; |
|
|
|
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; |
|
|
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; |
|
|
|
|
|
|
|
/** |
|
|
|
* AppEntEnterpriseInformationController 企业端-企业信息接口测试 |
|
|
|
* <p> |
|
|
|
* 覆盖以下接口: |
|
|
|
* 1. GET /app-ent/enterpriseInfo/getUserRefEnterpriseInfo - 根据用户ID获取关联企业信息 |
|
|
|
* 2. GET /app-ent/enterpriseInfo/getQrCode/{enterpriseNumber} - 获取企业二维码 |
|
|
|
* 3. GET /app-ent/enterpriseInfo/forceGenerateQrCode/{enterpriseNumber} - 强制生成二维码 |
|
|
|
* </p> |
|
|
|
* |
|
|
|
* @author zdxt |
|
|
|
*/ |
|
|
|
@SpringBootTest(classes = ZdxtAdminApplication.class) |
|
|
|
@AutoConfigureMockMvc |
|
|
|
@DisplayName("AppEntEnterpriseInformationController 企业端-企业信息接口测试") |
|
|
|
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) |
|
|
|
public class AppEntEnterpriseInformationControllerTest { |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private MockMvc mockMvc; |
|
|
|
|
|
|
|
private static final String BASE_URL = "/app-ent/enterpriseInfo"; |
|
|
|
private static final String TEST_CLIENT_ID = "e5cd7e4891bf95d1d19206ce24a7b32e"; |
|
|
|
/** 测试用企业纳税识别号(需在数据库中存在) */ |
|
|
|
private static final String TEST_ENTERPRISE_NUMBER = "91110000CTRL001"; |
|
|
|
/** 测试用用户ID */ |
|
|
|
private static final Long TEST_USER_ID = 1L; |
|
|
|
|
|
|
|
/** 登录后获取的 token */ |
|
|
|
private String token; |
|
|
|
|
|
|
|
@BeforeEach |
|
|
|
public void setUp() { |
|
|
|
// 初始化 Sa-Token 上下文(非 Web 环境下 StpUtil.login 需要)
|
|
|
|
SaTokenContextMockUtil.setMockContext(); |
|
|
|
|
|
|
|
// 设置模拟请求上下文(UserActionListener 需要从 Request 中获取 User-Agent)
|
|
|
|
MockHttpServletRequest mockRequest = new MockHttpServletRequest(); |
|
|
|
mockRequest.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"); |
|
|
|
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(mockRequest)); |
|
|
|
|
|
|
|
// 构造测试用登录用户
|
|
|
|
LoginUser loginUser = new LoginUser(); |
|
|
|
loginUser.setUserId(TEST_USER_ID); |
|
|
|
loginUser.setUserType("sys_user"); |
|
|
|
loginUser.setTenantId("000000"); |
|
|
|
loginUser.setUsername("test_admin"); |
|
|
|
loginUser.setNickname("测试管理员"); |
|
|
|
loginUser.setDeptId("103"); |
|
|
|
loginUser.setDeptName("测试部门"); |
|
|
|
loginUser.setRolePermission(new HashSet<>()); |
|
|
|
loginUser.setMenuPermission(new HashSet<>()); |
|
|
|
|
|
|
|
// 模拟登录并获取 token
|
|
|
|
SaLoginParameter param = new SaLoginParameter(); |
|
|
|
param.setExtra(LoginHelper.CLIENT_KEY, TEST_CLIENT_ID); |
|
|
|
LoginHelper.login(loginUser, param); |
|
|
|
token = StpUtil.getTokenValue(); |
|
|
|
} |
|
|
|
|
|
|
|
@AfterEach |
|
|
|
public void tearDown() { |
|
|
|
try { |
|
|
|
StpUtil.logout(); |
|
|
|
} catch (Exception ignored) { |
|
|
|
} |
|
|
|
RequestContextHolder.resetRequestAttributes(); |
|
|
|
SaTokenContextMockUtil.clearContext(); |
|
|
|
} |
|
|
|
|
|
|
|
// ==================== getUserRefEnterpriseInfo 接口测试 ====================
|
|
|
|
|
|
|
|
@DisplayName("获取用户关联企业信息 - 正常请求") |
|
|
|
@Test |
|
|
|
@Order(1) |
|
|
|
public void testGetUserRefEnterpriseInfo() throws Exception { |
|
|
|
mockMvc.perform(get(BASE_URL + "/getUserRefEnterpriseInfo") |
|
|
|
.header("Authorization", "Bearer " + token) |
|
|
|
.header("clientid", TEST_CLIENT_ID) |
|
|
|
.param("userId", String.valueOf(TEST_USER_ID))) |
|
|
|
.andDo(print()) |
|
|
|
.andExpect(status().isOk()) |
|
|
|
.andExpect(jsonPath("$.code").value(200)) |
|
|
|
.andExpect(jsonPath("$.data").isArray()); |
|
|
|
|
|
|
|
System.out.println("获取用户关联企业信息接口测试成功"); |
|
|
|
} |
|
|
|
|
|
|
|
@DisplayName("获取用户关联企业信息 - 缺少 userId 参数应返回失败") |
|
|
|
@Test |
|
|
|
@Order(1) |
|
|
|
public void testGetUserRefEnterpriseInfoMissingUserId() throws Exception { |
|
|
|
mockMvc.perform(get(BASE_URL + "/getUserRefEnterpriseInfo") |
|
|
|
.header("Authorization", "Bearer " + token) |
|
|
|
.header("clientid", TEST_CLIENT_ID)) |
|
|
|
.andDo(print()) |
|
|
|
.andExpect(status().isBadRequest()); |
|
|
|
} |
|
|
|
|
|
|
|
@DisplayName("获取用户关联企业信息 - 不存在的用户ID应返回空列表") |
|
|
|
@Test |
|
|
|
@Order(1) |
|
|
|
public void testGetUserRefEnterpriseInfoNonExistUser() throws Exception { |
|
|
|
mockMvc.perform(get(BASE_URL + "/getUserRefEnterpriseInfo") |
|
|
|
.header("Authorization", "Bearer " + token) |
|
|
|
.header("clientid", TEST_CLIENT_ID) |
|
|
|
.param("userId", "999999999")) |
|
|
|
.andDo(print()) |
|
|
|
.andExpect(status().isOk()) |
|
|
|
.andExpect(jsonPath("$.code").value(200)) |
|
|
|
.andExpect(jsonPath("$.data").isArray()) |
|
|
|
.andExpect(jsonPath("$.data.length()").value(0)); |
|
|
|
|
|
|
|
System.out.println("不存在用户ID返回空列表测试成功"); |
|
|
|
} |
|
|
|
|
|
|
|
// ==================== getQrCode 接口测试 ====================
|
|
|
|
|
|
|
|
@DisplayName("获取企业二维码 - 正常请求") |
|
|
|
@Test |
|
|
|
@Order(2) |
|
|
|
public void testGetQrCode() throws Exception { |
|
|
|
MvcResult result = mockMvc.perform(get(BASE_URL + "/getQrCode/{enterpriseNumber}", TEST_ENTERPRISE_NUMBER) |
|
|
|
.header("Authorization", "Bearer " + token) |
|
|
|
.header("clientid", TEST_CLIENT_ID)) |
|
|
|
.andDo(print()) |
|
|
|
.andExpect(status().isOk()) |
|
|
|
.andReturn(); |
|
|
|
|
|
|
|
String responseBody = result.getResponse().getContentAsString(StandardCharsets.UTF_8); |
|
|
|
System.out.println("获取企业二维码接口响应: " + responseBody); |
|
|
|
|
|
|
|
// 可能存在二维码记录也可能不存在,均为正常情况
|
|
|
|
// 如果存在,验证返回数据结构
|
|
|
|
if (responseBody.contains("\"code\":200")) { |
|
|
|
Assertions.assertTrue(responseBody.contains("qrCodeUrl"), "返回数据应包含 qrCodeUrl"); |
|
|
|
Assertions.assertTrue(responseBody.contains("enterpriseName"), "返回数据应包含 enterpriseName"); |
|
|
|
Assertions.assertTrue(responseBody.contains("generateTime"), "返回数据应包含 generateTime"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@DisplayName("获取企业二维码 - 不存在的企业纳税识别号应返回失败") |
|
|
|
@Test |
|
|
|
@Order(2) |
|
|
|
public void testGetQrCodeNonExistEnterprise() throws Exception { |
|
|
|
mockMvc.perform(get(BASE_URL + "/getQrCode/{enterpriseNumber}", "NON_EXIST_NUMBER_999") |
|
|
|
.header("Authorization", "Bearer " + token) |
|
|
|
.header("clientid", TEST_CLIENT_ID)) |
|
|
|
.andDo(print()) |
|
|
|
.andExpect(status().isOk()) |
|
|
|
.andExpect(jsonPath("$.code").value(500)); |
|
|
|
|
|
|
|
System.out.println("不存在企业纳税识别号返回失败测试成功"); |
|
|
|
} |
|
|
|
|
|
|
|
@DisplayName("获取企业二维码 - 空的企业纳税识别号应返回失败") |
|
|
|
@Test |
|
|
|
@Order(2) |
|
|
|
public void testGetQrCodeEmptyEnterpriseNumber() throws Exception { |
|
|
|
mockMvc.perform(get(BASE_URL + "/getQrCode/{enterpriseNumber}", " ") |
|
|
|
.header("Authorization", "Bearer " + token) |
|
|
|
.header("clientid", TEST_CLIENT_ID)) |
|
|
|
.andDo(print()) |
|
|
|
.andExpect(status().isOk()) |
|
|
|
.andExpect(jsonPath("$.code").value(500)); |
|
|
|
|
|
|
|
System.out.println("空企业纳税识别号返回失败测试成功"); |
|
|
|
} |
|
|
|
|
|
|
|
// ==================== forceGenerateQrCode 接口测试 ====================
|
|
|
|
|
|
|
|
@DisplayName("强制生成二维码 - 正常请求") |
|
|
|
@Test |
|
|
|
@Order(3) |
|
|
|
public void testForceGenerateQrCode() throws Exception { |
|
|
|
MvcResult result = mockMvc.perform(get(BASE_URL + "/forceGenerateQrCode/{enterpriseNumber}", TEST_ENTERPRISE_NUMBER) |
|
|
|
.header("Authorization", "Bearer " + token) |
|
|
|
.header("clientid", TEST_CLIENT_ID)) |
|
|
|
.andDo(print()) |
|
|
|
.andExpect(status().isOk()) |
|
|
|
.andReturn(); |
|
|
|
|
|
|
|
String responseBody = result.getResponse().getContentAsString(StandardCharsets.UTF_8); |
|
|
|
System.out.println("强制生成二维码接口响应: " + responseBody); |
|
|
|
|
|
|
|
// 如果企业存在,应返回成功并包含二维码信息
|
|
|
|
if (responseBody.contains("\"code\":200")) { |
|
|
|
Assertions.assertTrue(responseBody.contains("qrCodeUrl"), "返回数据应包含 qrCodeUrl"); |
|
|
|
Assertions.assertTrue(responseBody.contains("enterpriseName"), "返回数据应包含 enterpriseName"); |
|
|
|
Assertions.assertTrue(responseBody.contains("generateTime"), "返回数据应包含 generateTime"); |
|
|
|
System.out.println("强制生成二维码接口测试成功"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@DisplayName("强制生成二维码 - 连续两次调用均应成功生成新二维码") |
|
|
|
@Test |
|
|
|
@Order(4) |
|
|
|
public void testForceGenerateQrCodeTwice() throws Exception { |
|
|
|
// 第一次强制生成
|
|
|
|
MvcResult result1 = mockMvc.perform(get(BASE_URL + "/forceGenerateQrCode/{enterpriseNumber}", TEST_ENTERPRISE_NUMBER) |
|
|
|
.header("Authorization", "Bearer " + token) |
|
|
|
.header("clientid", TEST_CLIENT_ID)) |
|
|
|
.andDo(print()) |
|
|
|
.andExpect(status().isOk()) |
|
|
|
.andReturn(); |
|
|
|
|
|
|
|
String body1 = result1.getResponse().getContentAsString(StandardCharsets.UTF_8); |
|
|
|
|
|
|
|
// 第二次强制生成(应生成新的二维码,不受已有记录影响)
|
|
|
|
MvcResult result2 = mockMvc.perform(get(BASE_URL + "/forceGenerateQrCode/{enterpriseNumber}", TEST_ENTERPRISE_NUMBER) |
|
|
|
.header("Authorization", "Bearer " + token) |
|
|
|
.header("clientid", TEST_CLIENT_ID)) |
|
|
|
.andDo(print()) |
|
|
|
.andExpect(status().isOk()) |
|
|
|
.andReturn(); |
|
|
|
|
|
|
|
String body2 = result2.getResponse().getContentAsString(StandardCharsets.UTF_8); |
|
|
|
|
|
|
|
// 两次调用均应成功
|
|
|
|
if (body1.contains("\"code\":200") && body2.contains("\"code\":200")) { |
|
|
|
System.out.println("连续两次强制生成二维码均成功"); |
|
|
|
// 两次生成的 qrCodeUrl 应不同(新二维码)
|
|
|
|
String url1 = extractJsonValue(body1, "qrCodeUrl"); |
|
|
|
String url2 = extractJsonValue(body2, "qrCodeUrl"); |
|
|
|
if (url1 != null && url2 != null) { |
|
|
|
Assertions.assertNotEquals(url1, url2, "两次强制生成的二维码URL应不同"); |
|
|
|
System.out.println("两次生成的二维码URL不同,验证通过"); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@DisplayName("强制生成二维码 - 批量循环生成多个企业的二维码") |
|
|
|
@Test |
|
|
|
@Order(4) |
|
|
|
public void testForceGenerateQrCodeNum() throws Exception { |
|
|
|
String[] enterpriseNumbers = { |
|
|
|
"91440300788302281W", |
|
|
|
"914403007261811621", |
|
|
|
"91440300662678582M", |
|
|
|
"914403006820066603", |
|
|
|
"91440300763461366N", |
|
|
|
"91440300618837873J", |
|
|
|
"91440300738848091F" |
|
|
|
}; |
|
|
|
|
|
|
|
for (String enterpriseNumber : enterpriseNumbers) { |
|
|
|
System.out.println("========== 开始强制生成二维码: " + enterpriseNumber + " =========="); |
|
|
|
|
|
|
|
MvcResult result = mockMvc.perform(get(BASE_URL + "/forceGenerateQrCode/{enterpriseNumber}", enterpriseNumber) |
|
|
|
.header("Authorization", "Bearer " + token) |
|
|
|
.header("clientid", TEST_CLIENT_ID)) |
|
|
|
.andDo(print()) |
|
|
|
.andExpect(status().isOk()) |
|
|
|
.andReturn(); |
|
|
|
|
|
|
|
String responseBody = result.getResponse().getContentAsString(StandardCharsets.UTF_8); |
|
|
|
|
|
|
|
if (responseBody.contains("\"code\":200")) { |
|
|
|
Assertions.assertTrue(responseBody.contains("qrCodeUrl"), "返回数据应包含 qrCodeUrl"); |
|
|
|
Assertions.assertTrue(responseBody.contains("enterpriseName"), "返回数据应包含 enterpriseName"); |
|
|
|
Assertions.assertTrue(responseBody.contains("generateTime"), "返回数据应包含 generateTime"); |
|
|
|
System.out.println("企业[" + enterpriseNumber + "]强制生成二维码成功"); |
|
|
|
} else { |
|
|
|
System.out.println("企业[" + enterpriseNumber + "]强制生成二维码响应: " + responseBody); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
System.out.println("========== 批量强制生成二维码全部完成 =========="); |
|
|
|
} |
|
|
|
|
|
|
|
@DisplayName("强制生成二维码 - 不存在的企业纳税识别号应返回失败") |
|
|
|
@Test |
|
|
|
@Order(3) |
|
|
|
public void testForceGenerateQrCodeNonExistEnterprise() throws Exception { |
|
|
|
mockMvc.perform(get(BASE_URL + "/forceGenerateQrCode/{enterpriseNumber}", "NON_EXIST_NUMBER_999") |
|
|
|
.header("Authorization", "Bearer " + token) |
|
|
|
.header("clientid", TEST_CLIENT_ID)) |
|
|
|
.andDo(print()) |
|
|
|
.andExpect(status().isOk()) |
|
|
|
.andExpect(jsonPath("$.code").value(500)); |
|
|
|
|
|
|
|
System.out.println("不存在企业纳税识别号强制生成返回失败测试成功"); |
|
|
|
} |
|
|
|
|
|
|
|
@DisplayName("强制生成二维码 - 空的企业纳税识别号应返回失败") |
|
|
|
@Test |
|
|
|
@Order(3) |
|
|
|
public void testForceGenerateQrCodeEmptyEnterpriseNumber() throws Exception { |
|
|
|
mockMvc.perform(get(BASE_URL + "/forceGenerateQrCode/{enterpriseNumber}", " ") |
|
|
|
.header("Authorization", "Bearer " + token) |
|
|
|
.header("clientid", TEST_CLIENT_ID)) |
|
|
|
.andDo(print()) |
|
|
|
.andExpect(status().isOk()) |
|
|
|
.andExpect(jsonPath("$.code").value(500)); |
|
|
|
|
|
|
|
System.out.println("空企业纳税识别号强制生成返回失败测试成功"); |
|
|
|
} |
|
|
|
|
|
|
|
// ==================== 工具方法 ====================
|
|
|
|
|
|
|
|
/** |
|
|
|
* 从 JSON 响应中简单提取指定字段的值 |
|
|
|
*/ |
|
|
|
private String extractJsonValue(String responseBody, String key) { |
|
|
|
if (responseBody != null && responseBody.contains("\"" + key + "\"")) { |
|
|
|
int start = responseBody.indexOf("\"" + key + "\":\"") + key.length() + 4; |
|
|
|
int end = responseBody.indexOf("\"", start); |
|
|
|
if (start > 0 && end > start) { |
|
|
|
return responseBody.substring(start, end); |
|
|
|
} |
|
|
|
} |
|
|
|
return null; |
|
|
|
} |
|
|
|
} |