package com.label.unit; import com.label.module.annotation.controller.ExtractionController; import com.label.module.annotation.controller.QaController; import com.label.module.config.controller.SysConfigController; import com.label.module.export.controller.ExportController; import com.label.module.source.controller.SourceController; import com.label.module.source.dto.SourceResponse; import com.label.module.task.controller.TaskController; import com.label.module.task.dto.TaskResponse; import com.label.module.user.controller.AuthController; import com.label.module.user.controller.UserController; import com.label.module.user.dto.LoginRequest; import com.label.module.user.dto.LoginResponse; import com.label.module.user.dto.UserInfoResponse; import com.label.module.video.controller.VideoController; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Arrays; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @DisplayName("OpenAPI 注解覆盖测试") class OpenApiAnnotationTest { private static final List> CONTROLLERS = List.of( AuthController.class, UserController.class, SourceController.class, TaskController.class, ExtractionController.class, QaController.class, ExportController.class, SysConfigController.class, VideoController.class ); private static final List> DTOS = List.of( LoginRequest.class, LoginResponse.class, UserInfoResponse.class, TaskResponse.class, SourceResponse.class ); @Test @DisplayName("所有 REST Controller 都声明 @Tag") void allControllersHaveTag() { assertThat(CONTROLLERS) .allSatisfy(controller -> assertThat(controller.getAnnotation(Tag.class)) .as(controller.getSimpleName() + " should have @Tag") .isNotNull()); } @Test @DisplayName("所有 REST endpoint 方法都声明 @Operation") void allEndpointMethodsHaveOperation() { for (Class controller : CONTROLLERS) { Arrays.stream(controller.getDeclaredMethods()) .filter(method -> !Modifier.isPrivate(method.getModifiers())) .filter(OpenApiAnnotationTest::isEndpointMethod) .forEach(method -> assertThat(method.getAnnotation(Operation.class)) .as(controller.getSimpleName() + "." + method.getName() + " should have @Operation") .isNotNull()); } } @Test @DisplayName("核心 DTO 都声明 @Schema") void coreDtosHaveSchema() { assertThat(DTOS) .allSatisfy(dto -> assertThat(dto.getAnnotation(Schema.class)) .as(dto.getSimpleName() + " should have @Schema") .isNotNull()); } private static boolean isEndpointMethod(Method method) { return method.isAnnotationPresent(GetMapping.class) || method.isAnnotationPresent(PostMapping.class) || method.isAnnotationPresent(PutMapping.class) || method.isAnnotationPresent(DeleteMapping.class) || method.isAnnotationPresent(RequestMapping.class); } }