diff --git a/src/metabase/channel/slack.clj b/src/metabase/channel/slack.clj index 9fd599ec5a32f47272ab020f590869763782f0b3..12d6c334fac7bdeb6d4f6ddf5f060af76c6924f7 100644 --- a/src/metabase/channel/slack.clj +++ b/src/metabase/channel/slack.clj @@ -53,12 +53,12 @@ :tab-title (text->markdown-block (format "# %s" (:text payload))))) -(def slack-width +(def ^:private slack-width "Maximum width of the rendered PNG of HTML to be sent to Slack. Content that exceeds this width (e.g. a table with many columns) is truncated." 1200) -(defn create-and-upload-slack-attachments! +(defn- create-and-upload-slack-attachments! "Create an attachment in Slack for a given Card by rendering its content into an image and uploading it. Slack-attachment-uploader is a function which takes image-bytes and an attachment name, uploads the file, and returns an image url, defaulting to slack/upload-file!. diff --git a/src/metabase/pulse.clj b/src/metabase/pulse.clj index ffd680923cda313b6fda2374560c5b868a5b284b..a256f726a96c1e854fdc1eee4777b347a715f080 100644 --- a/src/metabase/pulse.clj +++ b/src/metabase/pulse.clj @@ -4,7 +4,6 @@ [metabase.api.common :as api] [metabase.channel.core :as channel] [metabase.events :as events] - [metabase.integrations.slack :as slack] [metabase.models.dashboard :as dashboard :refer [Dashboard]] [metabase.models.dashboard-card :as dashboard-card] [metabase.models.database :refer [Database]] @@ -12,7 +11,6 @@ [metabase.models.pulse :as pulse :refer [Pulse]] [metabase.models.serialization :as serdes] [metabase.pulse.parameters :as pulse-params] - [metabase.pulse.render :as render] [metabase.pulse.util :as pu] [metabase.query-processor.timezone :as qp.timezone] [metabase.server.middleware.session :as mw.session] @@ -180,33 +178,6 @@ (or (some->> card database-id (t2/select-one Database :id) qp.timezone/results-timezone-id) (qp.timezone/system-timezone-id))) -(def slack-width - "Maximum width of the rendered PNG of HTML to be sent to Slack. Content that exceeds this width (e.g. a table with - many columns) is truncated." - 1200) - -(defn create-and-upload-slack-attachments! - "Create an attachment in Slack for a given Card by rendering its content into an image and uploading - it. Slack-attachment-uploader is a function which takes image-bytes and an attachment name, uploads the file, and - returns an image url, defaulting to slack/upload-file!. - - Nested `blocks` lists containing text cards are passed through unmodified." - ([attachments] (create-and-upload-slack-attachments! attachments slack/upload-file!)) - ([attachments slack-attachment-uploader] - (letfn [(f [a] (select-keys a [:title :title_link :fallback]))] - (reduce (fn [processed {:keys [rendered-info attachment-name channel-id] :as attachment-data}] - (conj processed (if (:blocks attachment-data) - attachment-data - (if (:render/text rendered-info) - (-> (f attachment-data) - (assoc :text (:render/text rendered-info))) - (let [image-bytes (render/png-from-render-info rendered-info slack-width) - image-url (slack-attachment-uploader image-bytes attachment-name channel-id)] - (-> (f attachment-data) - (assoc :image_url image-url))))))) - [] - attachments)))) - (defn- are-all-parts-empty? "Do none of the cards have any results?" [results] diff --git a/test/metabase/channel/slack_test.clj b/test/metabase/channel/slack_test.clj new file mode 100644 index 0000000000000000000000000000000000000000..4100ad3cd4ac5d3456e1342b8629cabad5f7101e --- /dev/null +++ b/test/metabase/channel/slack_test.clj @@ -0,0 +1,48 @@ +(ns metabase.channel.slack-test + (:require + [clojure.test :refer :all] + [metabase.channel.slack :as channel.slack] + [metabase.integrations.slack :as slack])) + +(deftest create-and-upload-slack-attachments!-test + (let [slack-uploader (fn [storage] + (fn [_bytes attachment-name _channel-id] + (swap! storage conj attachment-name) + (str "http://uploaded/" attachment-name)))] + (testing "Uploads files" + (let [titles (atom []) + attachments [{:title "a" + :attachment-name "a.png" + :rendered-info {:attachments nil + :content [:div "hi"]} + :channel-id "FOO"} + {:title "b" + :attachment-name "b.png" + :rendered-info {:attachments nil + :content [:div "hi again"]} + :channel-id "FOO"}] + processed (with-redefs [slack/upload-file! (slack-uploader titles)] + (#'channel.slack/create-and-upload-slack-attachments! attachments))] + (is (= [{:title "a", :image_url "http://uploaded/a.png"} + {:title "b", :image_url "http://uploaded/b.png"}] + processed)) + (is (= @titles ["a.png" "b.png"])))) + (testing "Uses the raw text when present" + (let [titles (atom []) + attachments [{:title "a" + :attachment-name "a.png" + :rendered-info {:attachments nil + :content [:div "hi"]} + :channel-id "FOO"} + {:title "b" + :attachment-name "b.png" + :rendered-info {:attachments nil + :content [:div "hi again"] + :render/text "hi again"} + :channel-id "FOO"}] + processed (with-redefs [slack/upload-file! (slack-uploader titles)] + (#'channel.slack/create-and-upload-slack-attachments! attachments))] + (is (= [{:title "a", :image_url "http://uploaded/a.png"} + {:title "b", :text "hi again"}] + processed)) + (is (= @titles ["a.png"])))))) diff --git a/test/metabase/pulse_test.clj b/test/metabase/pulse_test.clj index fd5dffafee2557cb46c09cb34fc78357a8227162..bb2d63dc3a470593600416a0a722e68145104d64 100644 --- a/test/metabase/pulse_test.clj +++ b/test/metabase/pulse_test.clj @@ -697,47 +697,6 @@ (is (mt/received-email-body? :rasta #"Manage your subscriptions")) (is (mt/received-email-body? "nonuser@metabase.com" #"Unsubscribe")))))) -(deftest create-and-upload-slack-attachments!-test - (let [slack-uploader (fn [storage] - (fn [_bytes attachment-name _channel-id] - (swap! storage conj attachment-name) - (str "http://uploaded/" attachment-name)))] - (testing "Uploads files" - (let [titles (atom []) - attachments [{:title "a" - :attachment-name "a.png" - :rendered-info {:attachments nil - :content [:div "hi"]} - :channel-id "FOO"} - {:title "b" - :attachment-name "b.png" - :rendered-info {:attachments nil - :content [:div "hi again"]} - :channel-id "FOO"}] - processed (metabase.pulse/create-and-upload-slack-attachments! attachments (slack-uploader titles))] - (is (= [{:title "a", :image_url "http://uploaded/a.png"} - {:title "b", :image_url "http://uploaded/b.png"}] - processed)) - (is (= @titles ["a.png" "b.png"])))) - (testing "Uses the raw text when present" - (let [titles (atom []) - attachments [{:title "a" - :attachment-name "a.png" - :rendered-info {:attachments nil - :content [:div "hi"]} - :channel-id "FOO"} - {:title "b" - :attachment-name "b.png" - :rendered-info {:attachments nil - :content [:div "hi again"] - :render/text "hi again"} - :channel-id "FOO"}] - processed (metabase.pulse/create-and-upload-slack-attachments! attachments (slack-uploader titles))] - (is (= [{:title "a", :image_url "http://uploaded/a.png"} - {:title "b", :text "hi again"}] - processed)) - (is (= @titles ["a.png"])))))) - (deftest pulse-permissions-test (testing "Pulses should be sent with the Permissions of the user that created them." (letfn [(send-pulse-created-by-user!* [user-kw]