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 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 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 routes(Class... controllerTypes) { Set 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 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(); } }