Files
label_backend/src/test/java/com/label/unit/OpenApiAnnotationTest.java

99 lines
3.8 KiB
Java
Raw Normal View History

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.dto.SourceResponse;
import com.label.module.task.controller.TaskController;
import com.label.dto.TaskResponse;
import com.label.module.user.controller.AuthController;
import com.label.module.user.controller.UserController;
import com.label.dto.LoginRequest;
import com.label.dto.LoginResponse;
import com.label.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<Class<?>> 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<Class<?>> 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);
}
}