소스 검색

#2213 improve ApiAdminPluginAction

igarashi 5 년 전
부모
커밋
e84614f443

+ 19 - 5
src/main/java/org/codelibs/fess/app/web/api/admin/plugin/ApiAdminPluginAction.java

@@ -19,6 +19,8 @@ import static org.codelibs.fess.app.web.admin.plugin.AdminPluginAction.getAllIns
 import static org.codelibs.fess.app.web.admin.plugin.AdminPluginAction.getAllAvailableArtifacts;
 import static org.codelibs.fess.app.web.admin.plugin.AdminPluginAction.installArtifact;
 import static org.codelibs.fess.app.web.admin.plugin.AdminPluginAction.deleteArtifact;
+import static org.codelibs.fess.helper.PluginHelper.getArtifactFromFileName;
+import static org.codelibs.fess.helper.PluginHelper.getArtifactTypeFromFileName;
 
 import org.codelibs.fess.app.web.api.ApiResult;
 import org.codelibs.fess.helper.PluginHelper.Artifact;
@@ -31,28 +33,40 @@ import java.util.Map;
 
 public class ApiAdminPluginAction extends FessApiAdminAction {
     @Execute
-    public JsonResponse<ApiResult> installedplugins() {
+    public JsonResponse<ApiResult> get$installed() {
         final List<Map<String, String>> list = getAllInstalledArtifacts();
         return asJson(new ApiResult.ApiPluginResponse().plugins(list).status(ApiResult.Status.OK).result());
     }
 
     @Execute
-    public JsonResponse<ApiResult> availableplugins() {
+    public JsonResponse<ApiResult> get$available() {
         final List<Map<String, String>> list = getAllAvailableArtifacts();
         return asJson(new ApiResult.ApiPluginResponse().plugins(list).status(ApiResult.Status.OK).result());
     }
 
     @Execute
-    public JsonResponse<ApiResult> install(final InstallBody body) {
+    public JsonResponse<ApiResult> put$index(final InstallBody body) {
         validateApi(body, messages -> {});
-        installArtifact(new Artifact(body.name, body.version, body.url));
+        final Artifact artifact = new Artifact(body.name, body.version, body.url);
+        if (!isValidBody(artifact)) {
+            return asJson(new ApiResult.ApiErrorResponse().message("invalid name, version, or url").status(ApiResult.Status.BAD_REQUEST)
+                    .result());
+        }
+        installArtifact(artifact);
         return asJson(new ApiResult.ApiResponse().status(ApiResult.Status.OK).result());
     }
 
     @Execute
-    public JsonResponse<ApiResult> delete(final DeleteBody body) {
+    public JsonResponse<ApiResult> delete$index(final DeleteBody body) {
         validateApi(body, messages -> {});
         deleteArtifact(new Artifact(body.name, body.version, null));
         return asJson(new ApiResult.ApiResponse().status(ApiResult.Status.OK).result());
     }
+
+    protected Boolean isValidBody(final Artifact artifact) {
+        final String[] tokens = artifact.getUrl().split("/");
+        final String filenameFromUrl = tokens[tokens.length - 1];
+        return getArtifactFromFileName(getArtifactTypeFromFileName(filenameFromUrl), filenameFromUrl).getFileName().equals(
+                artifact.getFileName());
+    }
 }

+ 10 - 2
src/main/java/org/codelibs/fess/helper/PluginHelper.java

@@ -172,17 +172,25 @@ public class PluginHelper {
         return list.toArray(new Artifact[list.size()]);
     }
 
-    protected Artifact getArtifactFromFileName(final ArtifactType artifactType, final String fileName) {
+    public static Artifact getArtifactFromFileName(final ArtifactType artifactType, final String fileName) {
         final String convertedFileName = fileName.substring(artifactType.getId().length() + 1, fileName.lastIndexOf('.'));
-        final int firstIndexOfDash = convertedFileName.indexOf("-");
+        final int firstIndexOfDash = convertedFileName.indexOf('-');
         final String artifactName = artifactType.getId() + "-" + convertedFileName.substring(0, firstIndexOfDash);
         final String artifactVersion = convertedFileName.substring(firstIndexOfDash + 1);
         return new Artifact(artifactName, artifactVersion, null);
     }
 
+    public static ArtifactType getArtifactTypeFromFileName(final String filename) {
+        return ArtifactType.getType(new Artifact(filename, null, null));
+    }
+
     public void installArtifact(final Artifact artifact) {
         final String fileName = artifact.getFileName();
         try (final CurlResponse response = Curl.get(artifact.getUrl()).execute()) {
+            if (response.getHttpStatusCode() != 200) {
+                throw new PluginException("HTTP Status " + response.getHttpStatusCode() + " : failed to get the artifact from "
+                        + artifact.getUrl());
+            }
             try (final InputStream in = response.getContentAsStream()) {
                 CopyUtil.copy(in, ResourceUtil.getPluginPath(fileName).toFile());
             }

+ 63 - 42
src/test/java/org/codelibs/fess/it/admin/PluginTests.java

@@ -16,87 +16,108 @@
 package org.codelibs.fess.it.admin;
 
 import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 import static org.hamcrest.Matchers.equalTo;
 
-import io.restassured.RestAssured;
-import org.codelibs.fess.it.ITBase;
+import io.restassured.response.Response;
+import org.codelibs.fess.it.CrudTestBase;
 import org.junit.jupiter.api.Tag;
-import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 @Tag("it")
-public class PluginTests extends ITBase {
+public class PluginTests extends CrudTestBase {
+    // TODO delete
+    private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(CrudTestBase.class);
 
+    private static final String NAME_PREFIX = "pluginTests_";
     private static final String API_PATH = "/api/admin/plugin";
-    private static final String INSTALLEDPLUGINS_ENDPOINT_SUFFIX = "installedplugins";
-    private static final String AVAILABLEPLUGINS_ENDPOINT_SUFFIX = "availableplugins";
-    private static final String INSTALL_ENDPOINT_SUFFIX = "install";
-    private static final String DELETE_ENDPOINT_SUFFIX = "delete";
+    private static final String INSTALLED_ENDPOINT_SUFFIX = "installed";
+    private static final String AVAILABLE_ENDPOINT_SUFFIX = "available";
 
-    @BeforeAll
-    protected static void initAll() {
-        RestAssured.baseURI = getFessUrl();
-        settingTestToken();
+    private static final String LIST_ENDPOINT_SUFFIX = "";
+    private static final String ITEM_ENDPOINT_SUFFIX = "";
+    private static final String KEY_PROPERTY = "";
+
+    @Override
+    protected String getNamePrefix() {
+        return NAME_PREFIX;
     }
 
-    @BeforeEach
-    protected void init() {
+    @Override
+    protected String getApiPath() {
+        return API_PATH;
     }
 
-    @AfterEach
-    protected void tearDown() {
+    @Override
+    protected String getKeyProperty() {
+        return KEY_PROPERTY;
     }
 
-    @AfterAll
-    protected static void tearDownAll() {
-        deleteTestToken();
+    @Override
+    protected String getListEndpointSuffix() {
+        return LIST_ENDPOINT_SUFFIX;
     }
 
-    protected String getApiPath() {
-        return API_PATH;
+    @Override
+    protected String getItemEndpointSuffix() {
+        return ITEM_ENDPOINT_SUFFIX;
+    }
+
+    @Override
+    protected Map<String, Object> createTestParam(int id) {
+        final Map<String, Object> requestBody = new HashMap<>();
+        return requestBody;
+    }
+
+    @Override
+    protected Map<String, Object> getUpdateMap() {
+        final Map<String, Object> updateMap = new HashMap<>();
+        return updateMap;
     }
 
-    protected String getInstalledpluginsEndpointSuffix() {
-        return INSTALLEDPLUGINS_ENDPOINT_SUFFIX;
+    @AfterEach
+    protected void tearDown() {
+        // do nothing
     }
 
-    protected String getAvailablepluginsEndpointSuffix() {
-        return AVAILABLEPLUGINS_ENDPOINT_SUFFIX;
+    protected String getInstalledEndpointSuffix() {
+        return INSTALLED_ENDPOINT_SUFFIX;
     }
 
-    protected String getInstallEndpointSuffix() {
-        return INSTALL_ENDPOINT_SUFFIX;
+    protected String getAvailableEndpointSuffix() {
+        return AVAILABLE_ENDPOINT_SUFFIX;
     }
 
-    protected String getDeleteEndpointSuffix() {
-        return DELETE_ENDPOINT_SUFFIX;
+    protected Response checkDeleteMethod(final Map<String, Object> body) {
+        return checkMethodBase(body).delete(getApiPath() + "/");
     }
 
     @Test
-    void testInstalledplugins() {
-        checkMethodBase(Collections.emptyMap()).get(getApiPath() + "/" + getInstalledpluginsEndpointSuffix() + "/").then()
-                .body("response.status", equalTo(0));
+    void testInstalled() {
+        checkGetMethod(Collections.emptyMap(), getInstalledEndpointSuffix() + "/").then().body("response.status", equalTo(0));
     }
 
     @Test
-    void testAvailavleplugins() {
-        checkMethodBase(Collections.emptyMap()).get(getApiPath() + "/" + getAvailablepluginsEndpointSuffix() + "/").then()
-                .body("response.status", equalTo(0));
+    void testAvailable() {
+        checkGetMethod(Collections.emptyMap(), getAvailableEndpointSuffix() + "/").then().body("response.status", equalTo(0));
     }
 
     @Test
     void testIntall() {
-        checkMethodBase(Collections.emptyMap()).get(getApiPath() + "/" + getInstallEndpointSuffix() + "/").then()
-                .body("response.status", equalTo(0));
+        checkPutMethod(Collections.emptyMap(), "").then().body("response.status", equalTo(1));
+    }
+
+    @Test
+    void testUninstall() {
+        checkDeleteMethod(Collections.emptyMap()).then().body("response.status", equalTo(1));
     }
 
     @Test
-    void testDelete() {
-        checkMethodBase(Collections.emptyMap()).get(getApiPath() + "/" + getDeleteEndpointSuffix() + "/").then()
-                .body("response.status", equalTo(0));
+    void testCRUD() {
+        // TODO
     }
 }