From 2e3bfaad653625618430b90817bf0a11f74adc41 Mon Sep 17 00:00:00 2001 From: tangcent Date: Sat, 12 Oct 2024 08:38:22 +0800 Subject: [PATCH] feat: add 'yapi.no_update.description' to stop api description updates --- .../idea/plugin/actions/SuvExportAction.kt | 2 +- .../api/export/core/RequestClassExporter.kt | 2 +- .../export/feign/FeignRequestClassExporter.kt | 2 +- .../generic/GenericMethodDocClassExporter.kt | 4 +- .../generic/GenericRequestClassExporter.kt | 2 +- .../SimpleGenericMethodDocClassExporter.kt | 4 +- .../SimpleGenericRequestClassExporter.kt | 4 +- .../export/jaxrs/JAXRSRequestClassExporter.kt | 2 +- .../jaxrs/SimpleJAXRSRequestClassExporter.kt | 5 +- .../export/postman/PostmanConfigProvider.kt | 2 +- .../postman/PostmanRequestBuilderListener.kt | 2 +- .../SimpleSpringRequestClassExporter.kt | 5 +- .../spring/SpringRequestClassExporter.kt | 2 +- .../api/export/yapi/DefaultYapiApiHelper.kt | 6 +- .../plugin/api/export/yapi/YapiApiHelper.kt | 31 ++-- .../api/export/yapi/YapiConfigProvider.kt | 2 +- .../yapi/YapiFeignRequestClassExporter.kt | 2 +- .../yapi/YapiMethodDocBuilderListener.kt | 2 +- .../export/yapi/YapiRequestBuilderListener.kt | 2 +- .../api/export/yapi/YapiSaveInterceptor.kt | 33 +++- .../yapi/YapiSpringRequestClassExporter.kt | 2 +- .../condition/ConditionOnChannel.kt | 2 +- .../plugin/condition/ConditionOnConfig.kt | 12 ++ .../export => }/condition/ConditionOnDoc.kt | 2 +- .../condition/ConditionOnSimple.kt | 4 +- .../condition/OnChannelCondition.kt | 2 +- .../plugin/condition/OnConfigCondition.kt | 30 ++++ .../export => }/condition/OnDocCondition.kt | 2 +- .../condition/OnSimpleCondition.kt | 2 +- .../com.itangcent.condition.Condition | 9 +- ...plugin.api.export.yapi.YapiSaveInterceptor | 1 + .../condition/OnChannelConditionTest.kt | 2 + .../export/condition/OnDocConditionTest.kt | 2 + .../export/condition/OnSimpleConditionTest.kt | 4 + .../export/yapi/YapiSaveInterceptorTest.kt | 160 ++++++++++++------ 35 files changed, 248 insertions(+), 104 deletions(-) rename idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/{api/export => }/condition/ConditionOnChannel.kt (82%) create mode 100644 idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/ConditionOnConfig.kt rename idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/{api/export => }/condition/ConditionOnDoc.kt (81%) rename idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/{api/export => }/condition/ConditionOnSimple.kt (85%) rename idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/{api/export => }/condition/OnChannelCondition.kt (92%) create mode 100644 idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/OnConfigCondition.kt rename idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/{api/export => }/condition/OnDocCondition.kt (91%) rename idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/{api/export => }/condition/OnSimpleCondition.kt (87%) diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/actions/SuvExportAction.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/actions/SuvExportAction.kt index 430479ada..7cfa6d784 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/actions/SuvExportAction.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/actions/SuvExportAction.kt @@ -4,7 +4,7 @@ import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys import com.intellij.openapi.project.Project import com.itangcent.idea.plugin.api.export.ExportDoc -import com.itangcent.idea.plugin.api.export.condition.markAsSimple +import com.itangcent.idea.plugin.condition.markAsSimple import com.itangcent.idea.plugin.api.export.core.ClassExporter import com.itangcent.idea.plugin.api.export.core.CompositeClassExporter import com.itangcent.idea.plugin.api.export.core.ConfigurableMethodFilter diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/core/RequestClassExporter.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/core/RequestClassExporter.kt index 9b34cef39..077aaa8f7 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/core/RequestClassExporter.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/core/RequestClassExporter.kt @@ -14,7 +14,7 @@ import com.itangcent.common.utils.* import com.itangcent.http.RequestUtils import com.itangcent.idea.plugin.api.ClassApiExporterHelper import com.itangcent.idea.plugin.api.MethodInferHelper -import com.itangcent.idea.plugin.api.export.condition.ConditionOnDoc +import com.itangcent.idea.plugin.condition.ConditionOnDoc import com.itangcent.idea.plugin.api.export.rule.RequestRuleWrap import com.itangcent.idea.plugin.api.export.spring.SpringClassName import com.itangcent.idea.plugin.settings.helper.IntelligentSettingsHelper diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/feign/FeignRequestClassExporter.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/feign/FeignRequestClassExporter.kt index deb99d41f..0a96c04d5 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/feign/FeignRequestClassExporter.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/feign/FeignRequestClassExporter.kt @@ -11,7 +11,7 @@ import com.itangcent.common.utils.Extensible import com.itangcent.common.utils.notNullOrBlank import com.itangcent.common.utils.notNullOrEmpty import com.itangcent.idea.condition.annotation.ConditionOnClass -import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple +import com.itangcent.idea.plugin.condition.ConditionOnSimple import com.itangcent.idea.plugin.api.export.core.* import com.itangcent.idea.plugin.api.export.spring.SpringRequestClassExporter import com.itangcent.idea.plugin.condition.ConditionOnSetting diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/generic/GenericMethodDocClassExporter.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/generic/GenericMethodDocClassExporter.kt index 186880431..99b4c77bb 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/generic/GenericMethodDocClassExporter.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/generic/GenericMethodDocClassExporter.kt @@ -12,8 +12,8 @@ import com.itangcent.common.utils.notNullOrEmpty import com.itangcent.idea.plugin.api.ClassApiExporterHelper import com.itangcent.idea.plugin.api.MethodInferHelper import com.itangcent.idea.plugin.api.export.Orders -import com.itangcent.idea.plugin.api.export.condition.ConditionOnDoc -import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple +import com.itangcent.idea.plugin.condition.ConditionOnDoc +import com.itangcent.idea.plugin.condition.ConditionOnSimple import com.itangcent.idea.plugin.api.export.core.* import com.itangcent.idea.plugin.api.export.core.LinkResolver import com.itangcent.idea.plugin.condition.ConditionOnSetting diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/generic/GenericRequestClassExporter.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/generic/GenericRequestClassExporter.kt index 8416ff20a..4a4c54238 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/generic/GenericRequestClassExporter.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/generic/GenericRequestClassExporter.kt @@ -10,7 +10,7 @@ import com.itangcent.common.model.URL import com.itangcent.common.utils.notNullOrBlank import com.itangcent.common.utils.safe import com.itangcent.idea.plugin.api.export.Orders -import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple +import com.itangcent.idea.plugin.condition.ConditionOnSimple import com.itangcent.idea.plugin.api.export.core.* import com.itangcent.idea.plugin.api.export.generic.GenericClassExportRuleKeys.HTTP_METHOD import com.itangcent.idea.plugin.api.export.generic.GenericClassExportRuleKeys.HTTP_PATH diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/generic/SimpleGenericMethodDocClassExporter.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/generic/SimpleGenericMethodDocClassExporter.kt index deef2afe0..2dc619624 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/generic/SimpleGenericMethodDocClassExporter.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/generic/SimpleGenericMethodDocClassExporter.kt @@ -8,8 +8,8 @@ import com.itangcent.common.logger.traceError import com.itangcent.common.model.MethodDoc import com.itangcent.idea.plugin.api.ClassApiExporterHelper import com.itangcent.idea.plugin.api.export.Orders -import com.itangcent.idea.plugin.api.export.condition.ConditionOnDoc -import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple +import com.itangcent.idea.plugin.condition.ConditionOnDoc +import com.itangcent.idea.plugin.condition.ConditionOnSimple import com.itangcent.idea.plugin.api.export.core.* import com.itangcent.idea.plugin.condition.ConditionOnSetting import com.itangcent.idea.plugin.settings.SettingBinder diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/generic/SimpleGenericRequestClassExporter.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/generic/SimpleGenericRequestClassExporter.kt index c52b344f5..14b201603 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/generic/SimpleGenericRequestClassExporter.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/generic/SimpleGenericRequestClassExporter.kt @@ -9,8 +9,8 @@ import com.itangcent.common.logger.traceError import com.itangcent.common.model.Request import com.itangcent.idea.plugin.api.ClassApiExporterHelper import com.itangcent.idea.plugin.api.export.Orders -import com.itangcent.idea.plugin.api.export.condition.ConditionOnDoc -import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple +import com.itangcent.idea.plugin.condition.ConditionOnDoc +import com.itangcent.idea.plugin.condition.ConditionOnSimple import com.itangcent.idea.plugin.api.export.core.* import com.itangcent.idea.plugin.condition.ConditionOnSetting import com.itangcent.idea.psi.PsiMethodResource diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/jaxrs/JAXRSRequestClassExporter.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/jaxrs/JAXRSRequestClassExporter.kt index 7524deee3..33c32f362 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/jaxrs/JAXRSRequestClassExporter.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/jaxrs/JAXRSRequestClassExporter.kt @@ -12,7 +12,7 @@ import com.itangcent.common.model.Request import com.itangcent.common.model.URL import com.itangcent.common.utils.notNullOrBlank import com.itangcent.idea.condition.annotation.ConditionOnClass -import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple +import com.itangcent.idea.plugin.condition.ConditionOnSimple import com.itangcent.idea.plugin.api.export.core.* import com.itangcent.idea.plugin.condition.ConditionOnSetting import com.itangcent.intellij.config.rule.computer diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/jaxrs/SimpleJAXRSRequestClassExporter.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/jaxrs/SimpleJAXRSRequestClassExporter.kt index 6bdd9d7b0..a38167807 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/jaxrs/SimpleJAXRSRequestClassExporter.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/jaxrs/SimpleJAXRSRequestClassExporter.kt @@ -7,11 +7,10 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod import com.itangcent.common.logger.traceError import com.itangcent.common.model.Request -import com.itangcent.common.utils.stream import com.itangcent.idea.condition.annotation.ConditionOnClass import com.itangcent.idea.plugin.api.ClassApiExporterHelper -import com.itangcent.idea.plugin.api.export.condition.ConditionOnDoc -import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple +import com.itangcent.idea.plugin.condition.ConditionOnDoc +import com.itangcent.idea.plugin.condition.ConditionOnSimple import com.itangcent.idea.plugin.api.export.core.ApiHelper import com.itangcent.idea.plugin.api.export.core.ClassExportRuleKeys import com.itangcent.idea.plugin.api.export.core.ClassExporter diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/postman/PostmanConfigProvider.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/postman/PostmanConfigProvider.kt index 6c289117d..aec7bebb6 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/postman/PostmanConfigProvider.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/postman/PostmanConfigProvider.kt @@ -1,7 +1,7 @@ package com.itangcent.idea.plugin.api.export.postman import com.itangcent.condition.Exclusion -import com.itangcent.idea.plugin.api.export.condition.ConditionOnChannel +import com.itangcent.idea.plugin.condition.ConditionOnChannel import com.itangcent.idea.plugin.api.export.core.EasyApiConfigProvider import com.itangcent.intellij.config.LocalFileSearchConfigProvider import com.itangcent.order.Order diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/postman/PostmanRequestBuilderListener.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/postman/PostmanRequestBuilderListener.kt index 4d5e9e28d..6b3dfe214 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/postman/PostmanRequestBuilderListener.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/postman/PostmanRequestBuilderListener.kt @@ -3,7 +3,7 @@ package com.itangcent.idea.plugin.api.export.postman import com.google.inject.Inject import com.itangcent.common.model.* import com.itangcent.common.utils.notNullOrBlank -import com.itangcent.idea.plugin.api.export.condition.ConditionOnChannel +import com.itangcent.idea.plugin.condition.ConditionOnChannel import com.itangcent.idea.plugin.api.export.core.ExportContext import com.itangcent.idea.plugin.api.export.core.MethodExportContext import com.itangcent.idea.plugin.api.export.core.RequestBuilderListener diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/spring/SimpleSpringRequestClassExporter.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/spring/SimpleSpringRequestClassExporter.kt index 54272d365..f953b1e96 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/spring/SimpleSpringRequestClassExporter.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/spring/SimpleSpringRequestClassExporter.kt @@ -7,11 +7,10 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod import com.itangcent.common.logger.traceError import com.itangcent.common.model.Request -import com.itangcent.common.utils.stream import com.itangcent.idea.condition.annotation.ConditionOnClass import com.itangcent.idea.plugin.api.ClassApiExporterHelper -import com.itangcent.idea.plugin.api.export.condition.ConditionOnDoc -import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple +import com.itangcent.idea.plugin.condition.ConditionOnDoc +import com.itangcent.idea.plugin.condition.ConditionOnSimple import com.itangcent.idea.plugin.api.export.core.ApiHelper import com.itangcent.idea.plugin.api.export.core.ClassExportRuleKeys import com.itangcent.idea.plugin.api.export.core.ClassExporter diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/spring/SpringRequestClassExporter.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/spring/SpringRequestClassExporter.kt index 4451a86a5..46bc99982 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/spring/SpringRequestClassExporter.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/spring/SpringRequestClassExporter.kt @@ -12,7 +12,7 @@ import com.itangcent.common.model.Request import com.itangcent.common.model.URL import com.itangcent.common.utils.* import com.itangcent.idea.condition.annotation.ConditionOnClass -import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple +import com.itangcent.idea.plugin.condition.ConditionOnSimple import com.itangcent.idea.plugin.api.export.core.* import com.itangcent.intellij.config.rule.computer import com.itangcent.intellij.jvm.AnnotationHelper diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/DefaultYapiApiHelper.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/DefaultYapiApiHelper.kt index 6f1cac54b..c8f37dd4f 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/DefaultYapiApiHelper.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/DefaultYapiApiHelper.kt @@ -73,12 +73,12 @@ open class DefaultYapiApiHelper : AbstractYapiApiHelper(), YapiApiHelper { return jsonArray } - private val saveInterceptor: YapiSaveInterceptor by lazy { - SpiCompositeLoader.loadComposite() + private val saveInterceptorList: Array by lazy { + SpiCompositeLoader.load(actionContext) } override fun saveApiInfo(apiInfo: HashMap): Boolean { - if (!saveInterceptor.beforeSaveApi(this, apiInfo)) { + if (saveInterceptorList.any { !it.beforeSaveApi(this, apiInfo) }) { return false } diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiApiHelper.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiApiHelper.kt index 696a87314..7d9e15b41 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiApiHelper.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiApiHelper.kt @@ -58,20 +58,29 @@ fun YapiApiHelper.listApis(token: String, catId: String): JsonArray? { } fun YapiApiHelper.existed(apiInfo: HashMap): Boolean { - val path = apiInfo["path"] ?: return false - val method = apiInfo["method"] ?: return false - val token = apiInfo["token"] as? String ?: return false - val projectId: String = this.getProjectIdByToken(token) ?: return false - val carts = this.findCarts(projectId, token) ?: return false + return this.findExistApi(apiInfo) != null +} + +fun YapiApiHelper.findExistApi(apiInfo: HashMap): JsonObject? { + val path = apiInfo["path"] as? String ?: return null + val method = apiInfo["method"] as? String ?: return null + val token = apiInfo["token"] as? String ?: return null + return this.findExistApi(token, path, method) +} + +fun YapiApiHelper.findExistApi(token: String, path: String, method: String): JsonObject? { + val projectId: String = this.getProjectIdByToken(token) ?: return null + val carts = this.findCarts(projectId, token) ?: return null for (cart in carts) { - val cart_id = (cart as? Map<*, *>)?.get("_id")?.toString() ?: continue - if (this.listApis(token, cart_id, null)?.any { api -> - api.sub("path")?.asString == path && api.sub("method")?.asString == method - } == true) { - return true + val catId = (cart as? Map<*, *>)?.get("_id")?.toString() ?: continue + val api = this.listApis(token, catId, null)?.find { api -> + api.sub("path")?.asString == path && api.sub("method")?.asString == method + } + if (api != null) { + return api as JsonObject } } - return false + return null } fun YapiApiHelper.getCartForFolder(folder: Folder, privateToken: String): CartInfo? { diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiConfigProvider.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiConfigProvider.kt index 58755fc92..b3e08e598 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiConfigProvider.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiConfigProvider.kt @@ -1,7 +1,7 @@ package com.itangcent.idea.plugin.api.export.yapi import com.itangcent.condition.Exclusion -import com.itangcent.idea.plugin.api.export.condition.ConditionOnChannel +import com.itangcent.idea.plugin.condition.ConditionOnChannel import com.itangcent.idea.plugin.api.export.core.EasyApiConfigProvider import com.itangcent.intellij.config.LocalFileSearchConfigProvider import com.itangcent.order.Order diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiFeignRequestClassExporter.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiFeignRequestClassExporter.kt index d7495ef78..78a243077 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiFeignRequestClassExporter.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiFeignRequestClassExporter.kt @@ -6,7 +6,7 @@ import com.itangcent.common.model.Request import com.itangcent.common.model.URL import com.itangcent.common.utils.append import com.itangcent.condition.Exclusion -import com.itangcent.idea.plugin.api.export.condition.ConditionOnChannel +import com.itangcent.idea.plugin.condition.ConditionOnChannel import com.itangcent.idea.plugin.api.export.core.MethodExportContext import com.itangcent.idea.plugin.api.export.core.addParam import com.itangcent.idea.plugin.api.export.core.addPathParam diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiMethodDocBuilderListener.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiMethodDocBuilderListener.kt index 907d27de4..c4fb07d53 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiMethodDocBuilderListener.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiMethodDocBuilderListener.kt @@ -3,7 +3,7 @@ package com.itangcent.idea.plugin.api.export.yapi import com.google.inject.Inject import com.itangcent.common.model.MethodDoc import com.itangcent.common.model.Param -import com.itangcent.idea.plugin.api.export.condition.ConditionOnChannel +import com.itangcent.idea.plugin.condition.ConditionOnChannel import com.itangcent.idea.plugin.api.export.core.ExportContext import com.itangcent.idea.plugin.api.export.core.MethodDocBuilderListener import com.itangcent.idea.plugin.api.export.core.MethodExportContext diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiRequestBuilderListener.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiRequestBuilderListener.kt index 9df4771f5..299356f0f 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiRequestBuilderListener.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiRequestBuilderListener.kt @@ -4,7 +4,7 @@ import com.google.inject.Inject import com.itangcent.common.constant.Attrs import com.itangcent.common.model.* import com.itangcent.common.utils.* -import com.itangcent.idea.plugin.api.export.condition.ConditionOnChannel +import com.itangcent.idea.plugin.condition.ConditionOnChannel import com.itangcent.idea.plugin.api.export.core.ExportContext import com.itangcent.idea.plugin.api.export.core.MethodExportContext import com.itangcent.idea.plugin.api.export.core.RequestBuilderListener diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiSaveInterceptor.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiSaveInterceptor.kt index 49e2bddde..93d32837d 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiSaveInterceptor.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiSaveInterceptor.kt @@ -2,9 +2,11 @@ package com.itangcent.idea.plugin.api.export.yapi import com.intellij.openapi.ui.Messages import com.itangcent.common.concurrent.ValueHolder +import com.itangcent.idea.plugin.condition.ConditionOnConfig import com.itangcent.idea.plugin.condition.ConditionOnSetting import com.itangcent.idea.swing.MessagesHelper import com.itangcent.intellij.context.ActionContext +import com.itangcent.intellij.extend.sub /** * Workflow interface that allows for customized yapi save action. @@ -68,7 +70,8 @@ class AlwaysAskYapiSaveInterceptor : YapiSaveInterceptor { val context = ActionContext.getContext() ?: return true context.instance(MessagesHelper::class).showAskWithApplyAllDialog( "The api [${apiInfo["title"]}] already existed in the project.\n" + - "Do you want update it?", arrayOf("Update", "Skip", "Cancel")) { ret, applyAll -> + "Do you want update it?", arrayOf("Update", "Skip", "Cancel") + ) { ret, applyAll -> if (ret == Messages.CANCEL) { context.stop() valueHolder.success(false) @@ -91,3 +94,31 @@ class AlwaysAskYapiSaveInterceptor : YapiSaveInterceptor { return valueHolder.value() ?: false } } + +/** + * A [YapiSaveInterceptor] that prevents overwriting the existing description and markdown fields in YAPI when saving API details. + * Only works when the configuration "yapi.no_update.description" is set to true. + */ +@ConditionOnConfig("yapi.no_update.description", havingValue = "true") +class NoUpdateDescriptionYapiSaveInterceptor : YapiSaveInterceptor { + override fun beforeSaveApi(apiHelper: YapiApiHelper, apiInfo: HashMap): Boolean { + recoverDescription(apiHelper, apiInfo) + return true + } + + /** + * Retrieves the existing API information from YAPI and copies the description and markdown + * fields to the new API information to prevent them from being overwritten. + */ + private fun recoverDescription(apiHelper: YapiApiHelper, apiInfo: HashMap) { + val existedApi = apiHelper.findExistApi(apiInfo) ?: return + val apiId = existedApi.sub("_id")?.asString ?: return + val existedApiInfo = apiHelper.getApiInfo(apiInfo["token"] as String, apiId) + + val existedDescription = existedApiInfo.sub("desc")?.asString ?: "" + apiInfo["desc"] = existedDescription + + val existedMarkdown = existedApiInfo.sub("markdown")?.asString ?: "" + apiInfo["markdown"] = existedMarkdown + } +} \ No newline at end of file diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiSpringRequestClassExporter.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiSpringRequestClassExporter.kt index 8b592376e..20556d566 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiSpringRequestClassExporter.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiSpringRequestClassExporter.kt @@ -6,7 +6,7 @@ import com.itangcent.common.model.Request import com.itangcent.common.model.URL import com.itangcent.common.utils.append import com.itangcent.condition.Exclusion -import com.itangcent.idea.plugin.api.export.condition.ConditionOnChannel +import com.itangcent.idea.plugin.condition.ConditionOnChannel import com.itangcent.idea.plugin.api.export.core.MethodExportContext import com.itangcent.idea.plugin.api.export.core.addParam import com.itangcent.idea.plugin.api.export.core.addPathParam diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/condition/ConditionOnChannel.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/ConditionOnChannel.kt similarity index 82% rename from idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/condition/ConditionOnChannel.kt rename to idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/ConditionOnChannel.kt index 0878f0c78..70b02d7a8 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/condition/ConditionOnChannel.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/ConditionOnChannel.kt @@ -1,4 +1,4 @@ -package com.itangcent.idea.plugin.api.export.condition +package com.itangcent.idea.plugin.condition /** * Conditional that only matches when exporting to the specified channel. diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/ConditionOnConfig.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/ConditionOnConfig.kt new file mode 100644 index 000000000..a96e0d7b6 --- /dev/null +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/ConditionOnConfig.kt @@ -0,0 +1,12 @@ +package com.itangcent.idea.plugin.condition + +/** + * Conditional that only matches when the specified config is present. + * @param value the config key + * + * @author tangcent + * @date 2024/10/10 + */ +@Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.RUNTIME) +annotation class ConditionOnConfig(vararg val value: String, val havingValue: String = "") diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/condition/ConditionOnDoc.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/ConditionOnDoc.kt similarity index 81% rename from idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/condition/ConditionOnDoc.kt rename to idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/ConditionOnDoc.kt index 646a4c9d3..32d99dbc3 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/condition/ConditionOnDoc.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/ConditionOnDoc.kt @@ -1,4 +1,4 @@ -package com.itangcent.idea.plugin.api.export.condition +package com.itangcent.idea.plugin.condition /** * Conditional that only matches when exporting the specified type of docs. diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/condition/ConditionOnSimple.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/ConditionOnSimple.kt similarity index 85% rename from idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/condition/ConditionOnSimple.kt rename to idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/ConditionOnSimple.kt index dd6b5ef2d..b632f0b4f 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/condition/ConditionOnSimple.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/ConditionOnSimple.kt @@ -1,6 +1,6 @@ -package com.itangcent.idea.plugin.api.export.condition +package com.itangcent.idea.plugin.condition -import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple.Companion.CACHE_NAME +import com.itangcent.idea.plugin.condition.ConditionOnSimple.Companion.CACHE_NAME import com.itangcent.intellij.context.ActionContext /** diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/condition/OnChannelCondition.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/OnChannelCondition.kt similarity index 92% rename from idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/condition/OnChannelCondition.kt rename to idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/OnChannelCondition.kt index 6e3a2b926..3bf639625 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/condition/OnChannelCondition.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/OnChannelCondition.kt @@ -1,4 +1,4 @@ -package com.itangcent.idea.plugin.api.export.condition +package com.itangcent.idea.plugin.condition import com.itangcent.condition.AnnotatedCondition import com.itangcent.idea.plugin.api.export.ExportChannel diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/OnConfigCondition.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/OnConfigCondition.kt new file mode 100644 index 000000000..c0e185dcf --- /dev/null +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/OnConfigCondition.kt @@ -0,0 +1,30 @@ +package com.itangcent.idea.plugin.condition + +import com.itangcent.common.utils.asBool +import com.itangcent.condition.AnnotatedCondition +import com.itangcent.intellij.config.ConfigReader +import com.itangcent.intellij.context.ActionContext + +/** + * Condition that checks for [ConditionOnConfig]. + */ +class OnConfigCondition : AnnotatedCondition() { + + override fun matches(actionContext: ActionContext, annotation: ConditionOnConfig): Boolean { + val valueChecker = getValueChecker(annotation.havingValue) + val configReader = actionContext.instance(ConfigReader::class) + annotation.value.forEach { property -> + if (!valueChecker(configReader.first(property))) { + return false + } + } + return true + } + + private fun getValueChecker(havingValue: String): (Any?) -> Boolean { + if (havingValue == "") { + return { it.asBool() == true } + } + return { it?.toString() == havingValue } + } +} \ No newline at end of file diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/condition/OnDocCondition.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/OnDocCondition.kt similarity index 91% rename from idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/condition/OnDocCondition.kt rename to idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/OnDocCondition.kt index 793d6022f..1ecdc54f1 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/condition/OnDocCondition.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/OnDocCondition.kt @@ -1,4 +1,4 @@ -package com.itangcent.idea.plugin.api.export.condition +package com.itangcent.idea.plugin.condition import com.itangcent.condition.AnnotatedCondition import com.itangcent.idea.plugin.api.export.ExportDoc diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/condition/OnSimpleCondition.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/OnSimpleCondition.kt similarity index 87% rename from idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/condition/OnSimpleCondition.kt rename to idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/OnSimpleCondition.kt index 7192169ad..b730ec893 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/condition/OnSimpleCondition.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/condition/OnSimpleCondition.kt @@ -1,4 +1,4 @@ -package com.itangcent.idea.plugin.api.export.condition +package com.itangcent.idea.plugin.condition import com.itangcent.condition.AnnotatedCondition import com.itangcent.intellij.context.ActionContext diff --git a/idea-plugin/src/main/resources/META-INF/services/com.itangcent.condition.Condition b/idea-plugin/src/main/resources/META-INF/services/com.itangcent.condition.Condition index 0424e234b..f1f9c91f5 100644 --- a/idea-plugin/src/main/resources/META-INF/services/com.itangcent.condition.Condition +++ b/idea-plugin/src/main/resources/META-INF/services/com.itangcent.condition.Condition @@ -1,6 +1,7 @@ com.itangcent.idea.condition.OnClassCondition com.itangcent.idea.condition.OnMissingClassCondition -com.itangcent.idea.plugin.api.export.condition.OnChannelCondition -com.itangcent.idea.plugin.api.export.condition.OnDocCondition -com.itangcent.idea.plugin.api.export.condition.OnSimpleCondition -com.itangcent.idea.plugin.condition.OnSettingCondition \ No newline at end of file +com.itangcent.idea.plugin.condition.OnChannelCondition +com.itangcent.idea.plugin.condition.OnDocCondition +com.itangcent.idea.plugin.condition.OnSimpleCondition +com.itangcent.idea.plugin.condition.OnSettingCondition +com.itangcent.idea.plugin.condition.OnConfigCondition \ No newline at end of file diff --git a/idea-plugin/src/main/resources/META-INF/services/com.itangcent.idea.plugin.api.export.yapi.YapiSaveInterceptor b/idea-plugin/src/main/resources/META-INF/services/com.itangcent.idea.plugin.api.export.yapi.YapiSaveInterceptor index 8ec229151..ae8eaaecb 100644 --- a/idea-plugin/src/main/resources/META-INF/services/com.itangcent.idea.plugin.api.export.yapi.YapiSaveInterceptor +++ b/idea-plugin/src/main/resources/META-INF/services/com.itangcent.idea.plugin.api.export.yapi.YapiSaveInterceptor @@ -1,3 +1,4 @@ com.itangcent.idea.plugin.api.export.yapi.AlwaysUpdateYapiSaveInterceptor com.itangcent.idea.plugin.api.export.yapi.NeverUpdateYapiSaveInterceptor com.itangcent.idea.plugin.api.export.yapi.AlwaysAskYapiSaveInterceptor +com.itangcent.idea.plugin.api.export.yapi.NoUpdateDescriptionYapiSaveInterceptor diff --git a/idea-plugin/src/test/kotlin/com/itangcent/idea/plugin/api/export/condition/OnChannelConditionTest.kt b/idea-plugin/src/test/kotlin/com/itangcent/idea/plugin/api/export/condition/OnChannelConditionTest.kt index 44ef7e307..e35289861 100644 --- a/idea-plugin/src/test/kotlin/com/itangcent/idea/plugin/api/export/condition/OnChannelConditionTest.kt +++ b/idea-plugin/src/test/kotlin/com/itangcent/idea/plugin/api/export/condition/OnChannelConditionTest.kt @@ -1,6 +1,8 @@ package com.itangcent.idea.plugin.api.export.condition import com.itangcent.idea.plugin.api.export.ExportChannel +import com.itangcent.idea.plugin.condition.ConditionOnChannel +import com.itangcent.idea.plugin.condition.OnChannelCondition import com.itangcent.intellij.context.ActionContext import com.itangcent.mock.AdvancedContextTest import org.junit.jupiter.api.Test diff --git a/idea-plugin/src/test/kotlin/com/itangcent/idea/plugin/api/export/condition/OnDocConditionTest.kt b/idea-plugin/src/test/kotlin/com/itangcent/idea/plugin/api/export/condition/OnDocConditionTest.kt index 67f1a88ab..e9bb8a8d9 100644 --- a/idea-plugin/src/test/kotlin/com/itangcent/idea/plugin/api/export/condition/OnDocConditionTest.kt +++ b/idea-plugin/src/test/kotlin/com/itangcent/idea/plugin/api/export/condition/OnDocConditionTest.kt @@ -1,6 +1,8 @@ package com.itangcent.idea.plugin.api.export.condition import com.itangcent.idea.plugin.api.export.ExportDoc +import com.itangcent.idea.plugin.condition.ConditionOnDoc +import com.itangcent.idea.plugin.condition.OnDocCondition import com.itangcent.intellij.context.ActionContext import com.itangcent.mock.AdvancedContextTest import org.junit.jupiter.api.Test diff --git a/idea-plugin/src/test/kotlin/com/itangcent/idea/plugin/api/export/condition/OnSimpleConditionTest.kt b/idea-plugin/src/test/kotlin/com/itangcent/idea/plugin/api/export/condition/OnSimpleConditionTest.kt index 876b921b8..0aefd28a2 100644 --- a/idea-plugin/src/test/kotlin/com/itangcent/idea/plugin/api/export/condition/OnSimpleConditionTest.kt +++ b/idea-plugin/src/test/kotlin/com/itangcent/idea/plugin/api/export/condition/OnSimpleConditionTest.kt @@ -1,5 +1,9 @@ package com.itangcent.idea.plugin.api.export.condition +import com.itangcent.idea.plugin.condition.ConditionOnSimple +import com.itangcent.idea.plugin.condition.OnSimpleCondition +import com.itangcent.idea.plugin.condition.markAsSimple +import com.itangcent.idea.plugin.condition.markSimple import com.itangcent.mock.AdvancedContextTest import org.junit.jupiter.api.Test import kotlin.test.assertFalse diff --git a/idea-plugin/src/test/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiSaveInterceptorTest.kt b/idea-plugin/src/test/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiSaveInterceptorTest.kt index c2f4b2626..e71c0f49b 100644 --- a/idea-plugin/src/test/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiSaveInterceptorTest.kt +++ b/idea-plugin/src/test/kotlin/com/itangcent/idea/plugin/api/export/yapi/YapiSaveInterceptorTest.kt @@ -8,6 +8,7 @@ import com.itangcent.idea.plugin.settings.Settings import com.itangcent.idea.plugin.settings.YapiExportMode import com.itangcent.idea.swing.MessagesHelper import com.itangcent.intellij.context.ActionContext +import com.itangcent.intellij.extend.sub import com.itangcent.mock.BaseContextTest import com.itangcent.mock.SettingBinderAdaptor import com.itangcent.spi.SpiCompositeLoader @@ -16,6 +17,7 @@ import org.junit.jupiter.api.Test import org.mockito.Mockito import org.mockito.kotlin.any import org.mockito.kotlin.mock +import kotlin.test.assertEquals import kotlin.test.assertFalse import kotlin.test.assertTrue @@ -26,72 +28,98 @@ internal class YapiSaveInterceptorTest : BaseContextTest() { private val settings = Settings() - private val yapiApiHelper: YapiApiHelper = mock() - private val messagesHelper: MessagesHelper = mock() + private lateinit var yapiApiHelper: YapiApiHelper + private lateinit var messagesHelper: MessagesHelper + + private var answerTask = Messages.YES + private var answerApplyAll = false + + private val api1: HashMap = hashMapOf( + "_id" to 1, + "name" to "test api", + "path" to "/test", + "method" to "GET", + "token" to "123", + "desc" to "test api description", + "markdown" to "test api markdown" + ) + + private val api2: HashMap = hashMapOf( + "_id" to 2, + "name" to "test api 2", + "path" to "/test2", + "method" to "POST", + "token" to "123", + "desc" to "test api description 2", + "markdown" to "test api markdown 2" + ) override fun bind(builder: ActionContext.ActionContextBuilder) { super.bind(builder) builder.bind(SettingBinder::class) { it.toInstance(SettingBinderAdaptor(settings)) } + + yapiApiHelper = mock() + val apis = JsonArray() + val api = JsonObject() + api1.forEach { (k, v) -> api.addProperty(k, v?.toString()) } + apis.add(api) + Mockito.`when`(yapiApiHelper.getProjectIdByToken(any())) + .thenReturn("123") + Mockito.`when`(yapiApiHelper.findCarts(any(), any())) + .thenReturn(arrayListOf(mapOf("_id" to 1), mapOf("_id" to 2))) + Mockito.`when`( + yapiApiHelper.listApis( + com.itangcent.mock.any(""), + com.itangcent.mock.any(""), + Mockito.any() + ) + ).thenReturn(apis) + Mockito.`when`(yapiApiHelper.getApiInfo(any(), any())) + .thenAnswer { + val id = it.getArgument(1, String::class.java) + return@thenAnswer apis.find { api -> api.sub("_id")?.asString == id } + } + builder.bind(YapiApiHelper::class) { it.toInstance(yapiApiHelper) } + + messagesHelper = mock() + Mockito.`when`( + messagesHelper.showAskWithApplyAllDialog( + Mockito.any(), + Mockito.any(), + com.itangcent.mock.any { _, _ -> }) + ).thenAnswer { + val callBack: (Int, Boolean) -> Unit = it.getArgument(2)!! + callBack(answerTask, answerApplyAll) + } + builder.bind(MessagesHelper::class) { it.toInstance(messagesHelper) } } @Test - fun beforeSaveApi() { - val api1: HashMap = hashMapOf( - "name" to "test api", - "path" to "/test", - "method" to "GET", - "token" to "123" - ) - val api2: HashMap = hashMapOf( - "name" to "test api 2", - "path" to "/test2", - "method" to "POST", - "token" to "123" - ) - var answerTask = Messages.YES - var answerApplyAll = false - run { - val apis = JsonArray() - val api = JsonObject() - api1.forEach { (k, v) -> api.addProperty(k, v?.toString()) } - apis.add(api) - Mockito.`when`(yapiApiHelper.getProjectIdByToken(any())) - .thenReturn("123") - Mockito.`when`(yapiApiHelper.findCarts(any(), any())) - .thenReturn(arrayListOf(mapOf("_id" to 1))) - Mockito.`when`(yapiApiHelper.listApis(com.itangcent.mock.any(""), - com.itangcent.mock.any(""), - Mockito.any())) - .thenReturn(apis) - - Mockito.doAnswer { - val callBack: (Int, Boolean) -> Unit = it.getArgument(2)!! - callBack(answerTask, answerApplyAll) - }.`when`(messagesHelper) - .showAskWithApplyAllDialog(Mockito.any(), Mockito.any(), com.itangcent.mock.any { _, _ -> }) - } + fun `test AlwaysUpdateYapiSaveInterceptor`() { + settings.yapiExportMode = YapiExportMode.ALWAYS_UPDATE.name + val saveInterceptor = SpiCompositeLoader.loadComposite() + assertTrue(saveInterceptor.beforeSaveApi(yapiApiHelper, api1)) + assertTrue(saveInterceptor.beforeSaveApi(yapiApiHelper, api2)) + } - run { - settings.yapiExportMode = YapiExportMode.ALWAYS_UPDATE.name - val saveInterceptor = SpiCompositeLoader.loadComposite() - assertTrue(saveInterceptor.beforeSaveApi(yapiApiHelper, api1)) - assertTrue(saveInterceptor.beforeSaveApi(yapiApiHelper, api2)) - } + @Test + fun `test NeverUpdateYapiSaveInterceptor`() { + settings.yapiExportMode = YapiExportMode.NEVER_UPDATE.name + val saveInterceptor = SpiCompositeLoader.loadComposite() - run { - settings.yapiExportMode = YapiExportMode.NEVER_UPDATE.name - val saveInterceptor = SpiCompositeLoader.loadComposite() + answerTask = Messages.YES + assertFalse(saveInterceptor.beforeSaveApi(yapiApiHelper, api1)) + assertTrue(saveInterceptor.beforeSaveApi(yapiApiHelper, api2)) - answerTask = Messages.YES - assertFalse(saveInterceptor.beforeSaveApi(yapiApiHelper, api1)) - assertTrue(saveInterceptor.beforeSaveApi(yapiApiHelper, api2)) + answerTask = Messages.NO + assertFalse(saveInterceptor.beforeSaveApi(yapiApiHelper, api1)) + assertTrue(saveInterceptor.beforeSaveApi(yapiApiHelper, api2)) + } - answerTask = Messages.NO - assertFalse(saveInterceptor.beforeSaveApi(yapiApiHelper, api1)) - assertTrue(saveInterceptor.beforeSaveApi(yapiApiHelper, api2)) - } + @Test + fun `test AlwaysAskYapiSaveInterceptor`() { run { settings.yapiExportMode = YapiExportMode.ALWAYS_ASK.name @@ -146,4 +174,30 @@ internal class YapiSaveInterceptorTest : BaseContextTest() { WaitHelper.waitUtil(5000) { actionContext.isStopped() } } } + + @Test + fun `test NoUpdateDescriptionYapiSaveInterceptor`() { + settings.yapiExportMode = YapiExportMode.ALWAYS_UPDATE.name + settings.builtInConfig = """ + yapi.no_update.description=true + """.trimIndent() + + val saveInterceptor = NoUpdateDescriptionYapiSaveInterceptor() + + val apiInfo = hashMapOf( + "name" to "test api", + "path" to "/test", + "method" to "GET", + "token" to "123", + "desc" to "New description", + "markdown" to "New markdown" + ) + + // Run interceptor + assertTrue(saveInterceptor.beforeSaveApi(yapiApiHelper, apiInfo)) + + // Assert that the existing description and markdown are retained + assertEquals("test api description", apiInfo["desc"]) + assertEquals("test api markdown", apiInfo["markdown"]) + } } \ No newline at end of file