This is an automated email from the ASF dual-hosted git repository.

kirs pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new ee95d07  [Feature][Alert plugin] Support slack alert (#5382) (#5384)
ee95d07 is described below

commit ee95d07a90f0190e1b55e2bb6ef8d906dc998f87
Author: ruanwenjun <[email protected]>
AuthorDate: Fri Apr 30 10:11:32 2021 +0800

    [Feature][Alert plugin] Support slack alert (#5382) (#5384)
    
    * [Feature][Alert plugin] Support slack alert (#5382)
    
    * fix code smell
    
    * add markdown table
---
 .../dolphinscheduler-alert-slack/pom.xml           |  84 ++++++++++++
 .../plugin/alert/slack/SlackAlertChannel.java      |  43 ++++++
 .../alert/slack/SlackAlertChannelFactory.java      |  66 +++++++++
 .../plugin/alert/slack/SlackAlertPlugin.java       |  34 +++++
 .../plugin/alert/slack/SlackParamsConstants.java   |  34 +++++
 .../plugin/alert/slack/SlackSender.java            | 149 +++++++++++++++++++++
 .../alert/slack/SlackAlertChannelFactoryTest.java  |  48 +++++++
 .../plugin/alert/slack/SlackAlertPluginTest.java   |  36 +++++
 .../plugin/alert/slack/SlackSenderTest.java        |  39 ++++++
 dolphinscheduler-alert-plugin/pom.xml              |   2 +-
 pom.xml                                            |   6 +-
 11 files changed, 538 insertions(+), 3 deletions(-)

diff --git a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/pom.xml 
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/pom.xml
new file mode 100644
index 0000000..9b7452a
--- /dev/null
+++ b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/pom.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <parent>
+        <artifactId>dolphinscheduler-alert-plugin</artifactId>
+        <groupId>org.apache.dolphinscheduler</groupId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.apache.dolphinscheduler</groupId>
+    <artifactId>dolphinscheduler-alert-slack</artifactId>
+    <packaging>dolphinscheduler-plugin</packaging>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.dolphinscheduler</groupId>
+            <artifactId>dolphinscheduler-spi</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <type>jar</type>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>dolphinscheduler-alert-slack-${project.version}</finalName>
+    </build>
+
+</project>
\ No newline at end of file
diff --git 
a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertChannel.java
 
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertChannel.java
new file mode 100644
index 0000000..6399d8b
--- /dev/null
+++ 
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertChannel.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.plugin.alert.slack;
+
+import org.apache.dolphinscheduler.spi.alert.AlertChannel;
+import org.apache.dolphinscheduler.spi.alert.AlertData;
+import org.apache.dolphinscheduler.spi.alert.AlertInfo;
+import org.apache.dolphinscheduler.spi.alert.AlertResult;
+
+import java.util.Map;
+
+/**
+ * SlackAlertChannel
+ */
+public class SlackAlertChannel implements AlertChannel {
+
+    @Override
+    public AlertResult process(AlertInfo alertInfo) {
+        AlertData alertData = alertInfo.getAlertData();
+        Map<String, String> alertParams = alertInfo.getAlertParams();
+        if (alertParams == null || alertParams.size() == 0) {
+            return new AlertResult("false", "Slack alert params is empty");
+        }
+        SlackSender slackSender = new SlackSender(alertParams);
+        String response = slackSender.sendMessage(alertData.getTitle(), 
alertData.getContent());
+        return new AlertResult("ok".equals(response) ? "true" : "false", 
response);
+    }
+}
diff --git 
a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertChannelFactory.java
 
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertChannelFactory.java
new file mode 100644
index 0000000..f3f135e
--- /dev/null
+++ 
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertChannelFactory.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.plugin.alert.slack;
+
+import org.apache.dolphinscheduler.spi.alert.AlertChannel;
+import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
+import org.apache.dolphinscheduler.spi.params.InputParam;
+import org.apache.dolphinscheduler.spi.params.base.PluginParams;
+import org.apache.dolphinscheduler.spi.params.base.Validate;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Slack alert factory, see {@link AlertChannelFactory}
+ */
+public class SlackAlertChannelFactory implements AlertChannelFactory {
+
+    @Override
+    public String getName() {
+        return "Slack";
+    }
+
+    @Override
+    public List<PluginParams> getParams() {
+        List<PluginParams> paramsList = new LinkedList<>();
+
+        InputParam webHookParam = 
InputParam.newBuilder(SlackParamsConstants.SLACK_WEN_HOOK_URL_NAME, 
SlackParamsConstants.SLACK_WEB_HOOK_URL)
+                .addValidate(Validate.newBuilder()
+                        .setRequired(true)
+                        .build())
+                .setPlaceholder("Input WebHook Url")
+                .build();
+
+        InputParam botName = 
InputParam.newBuilder(SlackParamsConstants.SLACK_BOT_NAME, 
SlackParamsConstants.SLACK_BOT)
+                .addValidate(Validate.newBuilder()
+                        .setRequired(true)
+                        .build())
+                .setPlaceholder("Input the bot username")
+                .build();
+
+        paramsList.add(webHookParam);
+        paramsList.add(botName);
+        return paramsList;
+    }
+
+    @Override
+    public AlertChannel create() {
+        return new SlackAlertChannel();
+    }
+}
diff --git 
a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertPlugin.java
 
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertPlugin.java
new file mode 100644
index 0000000..59c45ae
--- /dev/null
+++ 
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertPlugin.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.plugin.alert.slack;
+
+import org.apache.dolphinscheduler.spi.DolphinSchedulerPlugin;
+import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Slack alert plugin
+ */
+public class SlackAlertPlugin implements DolphinSchedulerPlugin {
+
+    @Override
+    public Iterable<AlertChannelFactory> getAlertChannelFactorys() {
+        return ImmutableList.of(new SlackAlertChannelFactory());
+    }
+}
diff --git 
a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackParamsConstants.java
 
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackParamsConstants.java
new file mode 100644
index 0000000..fd191c5
--- /dev/null
+++ 
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackParamsConstants.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.plugin.alert.slack;
+
+public class SlackParamsConstants {
+
+    private SlackParamsConstants() {
+
+    }
+
+    public static final String SLACK_WEB_HOOK_URL = "WebHook";
+    public static final String SLACK_WEN_HOOK_URL_NAME = "webHook";
+    public static final String SLACK_BOT = "Username";
+    public static final String SLACK_BOT_NAME = "username";
+    public static final String TEXT = "text";
+    public static final String ATTACHMENT = "attachments";
+
+    public static final Integer MAX_SHOW_NUMBER = 100;
+}
diff --git 
a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackSender.java
 
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackSender.java
new file mode 100644
index 0000000..21a8286
--- /dev/null
+++ 
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackSender.java
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.plugin.alert.slack;
+
+import org.apache.dolphinscheduler.spi.utils.JSONUtils;
+import org.apache.dolphinscheduler.spi.utils.StringUtils;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Preconditions;
+
+public class SlackSender {
+
+    private static final Logger logger = 
LoggerFactory.getLogger(SlackSender.class);
+
+    private String webHookUrl;
+
+    private String botName;
+
+    public SlackSender(Map<String, String> slackAlertParam) {
+        webHookUrl = 
slackAlertParam.get(SlackParamsConstants.SLACK_WEN_HOOK_URL_NAME);
+        botName = slackAlertParam.get(SlackParamsConstants.SLACK_BOT_NAME);
+        Preconditions.checkArgument(!Objects.isNull(webHookUrl), 
"SlackWebHookURL can not be null");
+        
Preconditions.checkArgument(webHookUrl.startsWith("https://hooks.slack.com/services/";),
 "SlackWebHookURL invalidate");
+        Preconditions.checkArgument(!Objects.isNull(botName), "slack bot name 
can not be null");
+    }
+
+    /**
+     * Send message to slack channel
+     *
+     * @param title title
+     * @param content content
+     * @return slack response
+     */
+    public String sendMessage(String title, String content) {
+        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
+            Map<String, Object> paramMap = new HashMap<>();
+            paramMap.put(SlackParamsConstants.SLACK_BOT_NAME, botName);
+            paramMap.put(SlackParamsConstants.TEXT, title);
+            if (StringUtils.isNotEmpty(content)) {
+                Map<String, String> attachmentTable = new HashMap<>();
+                attachmentTable.put(SlackParamsConstants.TEXT, 
generateMarkDownTable(content));
+                List<Map<String, String>> attachments = new ArrayList<>();
+                attachments.add(attachmentTable);
+                paramMap.put(SlackParamsConstants.ATTACHMENT, attachments);
+            }
+
+            HttpPost httpPost = new HttpPost(webHookUrl);
+            httpPost.setEntity(new 
StringEntity(JSONUtils.toJsonString(paramMap), "UTF-8"));
+            CloseableHttpResponse response = httpClient.execute(httpPost);
+
+            HttpEntity entity = response.getEntity();
+            return EntityUtils.toString(entity, "UTF-8");
+        } catch (Exception e) {
+            logger.error("Send message to slack error.", e);
+            return "System Exception";
+        }
+    }
+
+    /**
+     * Because the slack does not support table we can transform to specific 
markdown table
+     *
+     * @param content sql data content
+     */
+    private String generateMarkDownTable(String content) {
+        List<LinkedHashMap> linkedHashMaps = JSONUtils.toList(content, 
LinkedHashMap.class);
+        if (linkedHashMaps.size() > SlackParamsConstants.MAX_SHOW_NUMBER) {
+            linkedHashMaps = linkedHashMaps.subList(0, 
SlackParamsConstants.MAX_SHOW_NUMBER);
+        }
+        int maxLen = 0;
+        List<String> headers = new LinkedList<>();
+        LinkedHashMap<String, Object> tmp = linkedHashMaps.get(0);
+        for (Entry<String, Object> entry : tmp.entrySet()) {
+            maxLen = Math.max(maxLen, entry.getKey().length());
+            headers.add(entry.getKey());
+        }
+        List<List<String>> elements = new ArrayList<>(tmp.size());
+        // build header
+        for (LinkedHashMap<String, Object> linkedHashMap : linkedHashMaps) {
+            List<String> element = new ArrayList<>(linkedHashMap.size());
+            for (Object value : linkedHashMap.values()) {
+                String valueStr = value.toString();
+                maxLen = Math.max(maxLen, valueStr.length());
+                element.add(valueStr);
+            }
+            elements.add(element);
+        }
+        final int elementLen = maxLen;
+        StringBuilder stringBuilder = new StringBuilder(200);
+        stringBuilder.append(headers.stream()
+                .map(header -> generateString(header, elementLen, " "))
+                .collect(Collectors.joining("|")));
+        stringBuilder.append("\n");
+        for (List<String> element : elements) {
+            stringBuilder.append(element.stream()
+                    .map(lement -> generateString("", elementLen, "-"))
+                    .collect(Collectors.joining("|")));
+            stringBuilder.append("\n");
+            stringBuilder.append(element.stream()
+                    .map(e -> generateString(e, elementLen, " "))
+                    .collect(Collectors.joining("|")));
+            stringBuilder.append("\n");
+        }
+        return String.format("```%s```", stringBuilder);
+    }
+
+    private String generateString(String value, int len, String supplement) {
+        StringBuilder stringBuilder = new StringBuilder(len);
+        stringBuilder.append(value);
+        for (int i = 0; i < len - stringBuilder.length(); i++) {
+            stringBuilder.append(supplement);
+        }
+        return stringBuilder.toString();
+    }
+}
diff --git 
a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/test/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertChannelFactoryTest.java
 
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/test/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertChannelFactoryTest.java
new file mode 100644
index 0000000..e294365
--- /dev/null
+++ 
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/test/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertChannelFactoryTest.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.plugin.alert.slack;
+
+import org.apache.dolphinscheduler.spi.alert.AlertChannel;
+import org.apache.dolphinscheduler.spi.params.base.PluginParams;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SlackAlertChannelFactoryTest {
+
+    private SlackAlertChannelFactory slackAlertChannelFactory = new 
SlackAlertChannelFactory();
+
+    @Test
+    public void testTestGetName() {
+        Assert.assertEquals("Slack", slackAlertChannelFactory.getName());
+    }
+
+    @Test
+    public void testGetParams() {
+        List<PluginParams> params = slackAlertChannelFactory.getParams();
+        Assert.assertEquals(2, params.size());
+    }
+
+    @Test
+    public void testCreate() {
+        AlertChannel alertChannel = slackAlertChannelFactory.create();
+        Assert.assertTrue(alertChannel instanceof SlackAlertChannel);
+    }
+}
\ No newline at end of file
diff --git 
a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/test/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertPluginTest.java
 
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/test/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertPluginTest.java
new file mode 100644
index 0000000..5086352
--- /dev/null
+++ 
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/test/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackAlertPluginTest.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.plugin.alert.slack;
+
+import org.apache.dolphinscheduler.spi.alert.AlertChannelFactory;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SlackAlertPluginTest {
+
+    private SlackAlertPlugin slackAlertPlugin = new SlackAlertPlugin();
+
+    @Test
+    public void testGetAlertChannelFactorys() {
+        Iterable<AlertChannelFactory> alertChannelFactorys = 
slackAlertPlugin.getAlertChannelFactorys();
+        for (AlertChannelFactory alertChannelFactory : alertChannelFactorys) {
+            Assert.assertTrue(alertChannelFactory instanceof 
SlackAlertChannelFactory);
+        }
+    }
+}
\ No newline at end of file
diff --git 
a/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/test/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackSenderTest.java
 
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/test/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackSenderTest.java
new file mode 100644
index 0000000..a488026
--- /dev/null
+++ 
b/dolphinscheduler-alert-plugin/dolphinscheduler-alert-slack/src/test/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackSenderTest.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.plugin.alert.slack;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SlackSenderTest {
+
+    @Test
+    public void testSendMessage() {
+        Map<String, String> alertparam = new HashMap<>();
+        alertparam.put(SlackParamsConstants.SLACK_WEN_HOOK_URL_NAME,
+                "https://hooks.slack.com/services/123456";);
+        alertparam.put(SlackParamsConstants.SLACK_BOT_NAME, 
"Dolphinscheduler");
+
+        SlackSender slackSender = new SlackSender(alertparam);
+        String response = slackSender.sendMessage("test title", "test 
content");
+        Assert.assertNotEquals("ok", response);
+    }
+}
\ No newline at end of file
diff --git a/dolphinscheduler-alert-plugin/pom.xml 
b/dolphinscheduler-alert-plugin/pom.xml
index a10f7de..dba2776 100644
--- a/dolphinscheduler-alert-plugin/pom.xml
+++ b/dolphinscheduler-alert-plugin/pom.xml
@@ -36,7 +36,7 @@
         <module>dolphinscheduler-alert-script</module>
         <module>dolphinscheduler-alert-http</module>
         <module>dolphinscheduler-alert-feishu</module>
+        <module>dolphinscheduler-alert-slack</module>
     </modules>
 
-
 </project>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index ea58fec..1d87b0d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1033,16 +1033,18 @@
                         
<include>**/plugin/alert/feishu/FeiShuSenderTest.java</include>
                         
<include>**/plugin/alert/http/HttpAlertPluginTest.java</include>
                         
<include>**/plugin/alert/http/HttpSenderTest.java</include>
+                        
<include>**/plugin/alert/slack/SlackAlertChannelFactoryTest.java</include>
+                        
<include>**/plugin/alert/slack/SlackAlertPluginTest.java</include>
+                        
<include>**/plugin/alert/slack/SlackSenderTest.java</include>
                         
<include>**/spi/params/PluginParamsTransferTest.java</include>
                         
<include>**/alert/plugin/EmailAlertPluginTest.java</include>
                         
<include>**/alert/plugin/AlertPluginManagerTest.java</include>
                         
<include>**/alert/plugin/DolphinPluginLoaderTest.java</include>
-                        
<include>**/alert/utils/DingTalkUtilsTest.java</include>
-                        
<include>**/alert/utils/EnterpriseWeChatUtilsTest.java</include>
                         <include>**/alert/utils/FuncUtilsTest.java</include>
                         
<include>**/alert/processor/AlertRequestProcessorTest.java</include>
                         <include>**/alert/runner/AlertSenderTest.java</include>
                         <include>**/alert/AlertServerTest.java</include>
+
                     </includes>
                     <!-- <skip>true</skip> -->
                 </configuration>

Reply via email to