package jnpf.dmsController.permission;
|
|
import jnpf.dms.DmsResourceApi;
|
import jnpf.dmsController.download.DmsFileDownloadController;
|
import jnpf.dmsController.filecenter.FileCenterController;
|
import jnpf.dmsController.personal.DmsPersonalFolderController;
|
import jnpf.dmsController.preview.DmsFilePageCountController;
|
import jnpf.dmsController.preview.DmsFilePreviewController;
|
import jnpf.dmsController.print.DmsFilePrintController;
|
import jnpf.dmsController.search.DmsFullTextSearchController;
|
import org.junit.jupiter.api.Test;
|
import org.springframework.cloud.openfeign.FeignClient;
|
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 org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestHeader;
|
|
import java.lang.reflect.Method;
|
import java.util.Arrays;
|
import java.util.Set;
|
import java.util.TreeSet;
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
|
class DmsPermissionApiRouteContractTest {
|
|
@Test
|
void exposesCompleteDmsFilePermissionApiSurface() {
|
Set<String> expected = new TreeSet<>(Arrays.asList(
|
"POST /permission-decisions/evaluate",
|
"POST /permission-decisions/batch-evaluate",
|
"GET /permission-admin/capabilities",
|
"POST /permission-grants",
|
"GET /permission-grants",
|
"GET /permission-grants/{id}",
|
"POST /permission-grants/revoke",
|
"GET /permission-principals/{type}/{id}/grants",
|
"GET /permission-grants/{id}/usages",
|
"GET /permission-principals/groups",
|
"POST /permission-principals/users/folder-tree",
|
"POST /access-exclusions",
|
"GET /access-exclusions",
|
"POST /access-exclusions/revoke",
|
"GET /permission-resource-types",
|
"GET /permission-resources",
|
"GET /permission-resources/tree",
|
"GET /permission-resources/{id}",
|
"GET /permission-resources/{id}/grants",
|
"GET /folders/{id}",
|
"POST /folders",
|
"PUT /folders/{id}",
|
"DELETE /folders/{id}",
|
"POST /folders/{id}/actions/reorder",
|
"POST /folders/{id}/actions/move",
|
"POST /folders/{id}/actions/copy",
|
"GET /documents/{id}",
|
"GET /file-versions/{id}",
|
"GET /folders/root/children",
|
"GET /folders/tree",
|
"GET /folders/{folderId}/children",
|
"GET /folders/{folderId}/documents",
|
"GET /folders/{folderId}/historical-versions",
|
"GET /documents/{documentId}/versions",
|
"GET /file-versions/{fileVersionId}/operation-logs",
|
"GET /file-versions/{fileVersionId}/page-count",
|
"GET /shared-documents",
|
"GET /personal-folders",
|
"GET /personal-folders/{folderType}/files",
|
"POST /personal-folders/favorite/files",
|
"POST /search",
|
"POST /file-download-tickets",
|
"POST /file-preview-tickets",
|
"POST /file-print-tickets",
|
"POST /Internal/dms/workflow-downloads/authorize",
|
"POST /Internal/dms/workflow-prints/authorize",
|
"POST /Internal/dms/workflow-prints/files",
|
"POST /Internal/dms/personal-folders/borrow/files",
|
"POST /Internal/dms/personal-folders/download/files",
|
"POST /Internal/dms/folders",
|
"POST /Internal/dms/documents",
|
"POST /Internal/dms/file-versions",
|
"POST /Internal/dms/file-versions/lifecycle",
|
"POST /Internal/dms/uploads",
|
"POST /Internal/dms/revisions",
|
"POST /Internal/dms/workflow-files/activate",
|
"POST /Internal/dms/workflow-files/prepare",
|
"POST /Internal/dms/workflow-files/revisions",
|
"POST /Internal/dms/workflow-files/uploads"
|
));
|
|
Set<String> actual = routes(
|
PermissionDecisionController.class,
|
PermissionGrantController.class,
|
AccessExclusionController.class,
|
PermissionResourceController.class,
|
FileCenterController.class,
|
DmsPersonalFolderController.class,
|
DmsFullTextSearchController.class,
|
DmsFileDownloadController.class,
|
DmsFilePreviewController.class,
|
DmsFilePrintController.class,
|
DmsFilePageCountController.class,
|
DmsInternalResourceController.class);
|
|
assertEquals(expected, actual);
|
assertEquals(59, actual.size());
|
}
|
|
@Test
|
void keepsInternalFeignClientAlignedWithProtectedControllers() {
|
FeignClient client = DmsResourceApi.class.getAnnotation(FeignClient.class);
|
assertNotNull(client);
|
assertEquals("jnpf-dms", client.name());
|
assertEquals("/Internal/dms", client.path());
|
assertEquals(new TreeSet<>(Arrays.asList(
|
"POST /folders",
|
"POST /documents",
|
"POST /file-versions",
|
"POST /file-versions/lifecycle",
|
"POST /uploads",
|
"POST /revisions",
|
"POST /personal-folders/borrow/files",
|
"POST /personal-folders/download/files",
|
"POST /workflow-downloads/authorize",
|
"POST /workflow-prints/authorize",
|
"POST /workflow-prints/files",
|
"POST /workflow-files/activate",
|
"POST /workflow-files/prepare",
|
"POST /workflow-files/revisions",
|
"POST /workflow-files/uploads"
|
)), routes(DmsResourceApi.class));
|
|
for (Method method : DmsResourceApi.class.getDeclaredMethods()) {
|
RequestHeader serviceId = method.getParameters()[0].getAnnotation(RequestHeader.class);
|
assertNotNull(serviceId, method.getName());
|
assertEquals("X-DMS-Service-Id", serviceId.value(), method.getName());
|
assertTrue(Arrays.stream(method.getParameters())
|
.anyMatch(parameter -> parameter.getAnnotation(RequestBody.class) != null),
|
method.getName());
|
}
|
}
|
|
private Set<String> routes(Class<?>... controllerTypes) {
|
Set<String> routes = new TreeSet<>();
|
for (Class<?> controllerType : controllerTypes) {
|
String basePath = mappingPath(controllerType.getAnnotation(RequestMapping.class));
|
for (Method method : controllerType.getDeclaredMethods()) {
|
add(routes, "GET", basePath, values(method.getAnnotation(GetMapping.class)));
|
add(routes, "POST", basePath, values(method.getAnnotation(PostMapping.class)));
|
add(routes, "PUT", basePath, values(method.getAnnotation(PutMapping.class)));
|
add(routes, "DELETE", basePath, values(method.getAnnotation(DeleteMapping.class)));
|
}
|
}
|
return routes;
|
}
|
|
private void add(Set<String> routes, String httpMethod, String basePath, String[] paths) {
|
if (paths == null) {
|
return;
|
}
|
for (String path : paths) {
|
routes.add(httpMethod + " " + basePath + path);
|
}
|
}
|
|
private String mappingPath(RequestMapping mapping) {
|
if (mapping == null || mapping.value().length == 0) {
|
return "";
|
}
|
return mapping.value()[0];
|
}
|
|
private String[] values(GetMapping mapping) {
|
return mapping == null ? null : mapping.value();
|
}
|
|
private String[] values(PostMapping mapping) {
|
return mapping == null ? null : mapping.value();
|
}
|
|
private String[] values(PutMapping mapping) {
|
return mapping == null ? null : mapping.value();
|
}
|
|
private String[] values(DeleteMapping mapping) {
|
return mapping == null ? null : mapping.value();
|
}
|
}
|