diff --git a/pkg/digger/digger.go b/pkg/digger/digger.go index f99c70ebb..62ab1eed4 100644 --- a/pkg/digger/digger.go +++ b/pkg/digger/digger.go @@ -1,8 +1,6 @@ package digger import ( - "bytes" - "encoding/json" "errors" "fmt" config "github.com/diggerhq/digger/libs/digger_config" @@ -17,11 +15,10 @@ import ( "github.com/diggerhq/digger/pkg/core/terraform" "github.com/diggerhq/digger/pkg/core/utils" "github.com/diggerhq/digger/pkg/locking" + "github.com/diggerhq/digger/pkg/notification" "github.com/diggerhq/digger/pkg/reporting" "github.com/diggerhq/digger/pkg/usage" - "io" "log" - "net/http" "os" "path" "strings" @@ -576,7 +573,6 @@ func runDriftDetection(policyChecker policy.Checker, SCMOrganisation string, SCM } if planPerformed && nonEmptyPlan { - httpClient := &http.Client{} slackNotificationUrl := os.Getenv("INPUT_DRIFT_DETECTION_SLACK_NOTIFICATION_URL") if slackNotificationUrl == "" { @@ -584,46 +580,13 @@ func runDriftDetection(policyChecker policy.Checker, SCMOrganisation string, SCM log.Printf(msg) return msg, fmt.Errorf(msg) } - - type SlackMessage struct { - Text string `json:"text"` - } - slackMessage := SlackMessage{ - Text: fmt.Sprintf(":bangbang: Drift detected in digger project %v details below: \n\n```\n%v\n```", projectName, plan), - } - - jsonData, err := json.Marshal(slackMessage) - if err != nil { - msg := fmt.Sprintf("failed to marshal slack message. %v", err) - log.Printf(msg) - return msg, fmt.Errorf(msg) - } - - request, err := http.NewRequest("POST", slackNotificationUrl, bytes.NewBuffer(jsonData)) - if err != nil { - msg := fmt.Sprintf("failed to create slack notification request. %v", err) - log.Printf(msg) - return msg, fmt.Errorf(msg) - } - - request.Header.Set("Content-Type", "application/json") - resp, err := httpClient.Do(request) + // send notification + notificationMessage := fmt.Sprintf(":bangbang: Drift detected in digger project %v details below: \n\n```\n%v\n```", projectName, plan) + notification := notification.SlackNotification{Url: slackNotificationUrl} + err := notification.Send(notificationMessage) if err != nil { - msg := fmt.Sprintf("failed to send slack notification request. %v", err) - log.Printf(msg) - } - if resp.StatusCode != 200 { - body, err := io.ReadAll(resp.Body) - if err != nil { - msg := fmt.Sprintf("failed to read response body. %v", err) - log.Printf(msg) - return msg, fmt.Errorf(msg) - } - msg := fmt.Sprintf("failed to send slack notification request. %v. Message: %v", resp.Status, body) - log.Printf(msg) - return msg, fmt.Errorf(msg) + log.Printf("Erorr sending drift notification: %v", err) } - defer resp.Body.Close() } else if planPerformed && !nonEmptyPlan { log.Printf("No drift detected") } else { diff --git a/pkg/notification/slack.go b/pkg/notification/slack.go new file mode 100644 index 000000000..06d205fbb --- /dev/null +++ b/pkg/notification/slack.go @@ -0,0 +1,94 @@ +package notification + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "log" + "net/http" + "regexp" + "strings" +) + +type Notification interface { + Send(message string) error +} + +type SlackNotification struct { + Url string +} + +func SplitCodeBlocks(message string) []string { + var res []string + + if strings.Count(message, "```") < 2 { + res = append(res, message) + return res + } + + regex := regexp.MustCompile("\n") + split := regex.Split(message, -1) + part := "" + for _, line := range split { + if len(part+line) > 4000 { + res = append(res, part+"\n"+line+"\n```") + part = "```\n" + line + } else { + part = part + "\n" + line + } + } + if len(part) > 0 { + res = append(res, part) + } + return res +} + +func (slack SlackNotification) Send(message string) error { + httpClient := &http.Client{} + type SlackMessage struct { + Text string `json:"text"` + } + parts := SplitCodeBlocks(message) + for _, part := range parts { + slackMessage := SlackMessage{ + Text: part, + } + + jsonData, err := json.Marshal(slackMessage) + if err != nil { + msg := fmt.Sprintf("failed to marshal slack message. %v", err) + log.Printf(msg) + return fmt.Errorf(msg) + } + + request, err := http.NewRequest("POST", slack.Url, bytes.NewBuffer(jsonData)) + if err != nil { + msg := fmt.Sprintf("failed to create slack notification request. %v", err) + log.Printf(msg) + return fmt.Errorf(msg) + } + + request.Header.Set("Content-Type", "application/json") + resp, err := httpClient.Do(request) + if err != nil { + msg := fmt.Sprintf("failed to send slack notification request. %v", err) + log.Printf(msg) + return fmt.Errorf(msg) + } + if resp.StatusCode != 200 { + body, err := io.ReadAll(resp.Body) + if err != nil { + msg := fmt.Sprintf("failed to read response body. %v", err) + log.Printf(msg) + return fmt.Errorf(msg) + } + msg := fmt.Sprintf("failed to send slack notification request. %v. Message: %v", resp.Status, body) + log.Printf(msg) + return fmt.Errorf(msg) + } + resp.Body.Close() + } + + return nil +} diff --git a/pkg/notification/slack_test.go b/pkg/notification/slack_test.go new file mode 100644 index 000000000..e5d572a5f --- /dev/null +++ b/pkg/notification/slack_test.go @@ -0,0 +1,34 @@ +package notification + +import ( + "github.com/stretchr/testify/assert" + "os" + "strings" + "testing" +) + +func TestSlackSplitLargerMessage(t *testing.T) { + parts := SplitCodeBlocks(":bangbang: drift detected\n\n ```\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\n\n\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\n\n```") + assert.Equal(t, 2, len(parts)) + assert.Equal(t, 2, strings.Count(parts[0], "```")) + assert.Equal(t, 2, strings.Count(parts[1], "```")) +} + +func TestSlackSmallerMessageNotSplit(t *testing.T) { + msg := ":bangbang: drift detected\n\n ```\nhere it is\nhere it is```" + parts := SplitCodeBlocks(msg) + assert.Equal(t, 1, len(parts)) + // TODO: Fix the func then update test to remove the first newline char + assert.Equal(t, "\n"+msg, parts[0]) +} + +func TestSendSlackMessageThatIsLargerThan2Parts(t *testing.T) { + url := os.Getenv("TEST_SLACK_NOTIFICATION_URL") + if url == "" { + t.Skip("Skipping slack message test: $TEST_SLACK_NOTIFICATION_URL not set") + } + msg := ":bangbang: drift detected\n\n ```\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\n\n\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\nhere it is\n\n```" + notification := SlackNotification{Url: url} + err := notification.Send(msg) + assert.Equal(t, nil, err) +}