diff --git a/backend/deps.edn b/backend/deps.edn index a55b85032..6874d3605 100644 --- a/backend/deps.edn +++ b/backend/deps.edn @@ -51,6 +51,7 @@ org.clojure/tools.namespace {:mvn/version "0.3.1"} fipp/fipp {:mvn/version "0.6.21"} criterium/criterium {:mvn/version "0.4.5"} + mockery/mockery {:mvn/version "0.1.4"} } :extra-paths ["test"]} :repl {:main-opts ["-m" "rebel-readline.main"]} diff --git a/backend/src/uxbox/emails.clj b/backend/src/uxbox/emails.clj index 420d0bba2..1719f2dfb 100644 --- a/backend/src/uxbox/emails.clj +++ b/backend/src/uxbox/emails.clj @@ -29,8 +29,7 @@ [email context] (let [defaults {:from (:email-from cfg/config) :reply-to (:email-reply-to cfg/config)}] - (->> (email context) - (merge defaults)))) + (email (merge defaults context)))) (defn send! "Schedule the email for sending." @@ -39,8 +38,8 @@ (s/assert map? context) (let [defaults {:from (:email-from cfg/config) :reply-to (:email-reply-to cfg/config)} - data (->> (email context) - (merge defaults) + data (->> (merge defaults context) + (email) (blob/encode)) priority (case (:priority context :high) :low 1 :high 10) sql "insert into email_queue (data, priority) diff --git a/backend/src/uxbox/jobs/sendmail.clj b/backend/src/uxbox/jobs/sendmail.clj index 15dc7ceca..75e82a864 100644 --- a/backend/src/uxbox/jobs/sendmail.clj +++ b/backend/src/uxbox/jobs/sendmail.clj @@ -53,8 +53,7 @@ [conn id] (let [sql "update email_queue set status = 'ok' - where id = $1 - and deleted_at is null;"] + where id = $1"] (-> (db/query-one conn [sql id]) (p/then (constantly nil))))) @@ -111,11 +110,13 @@ (defn send-email [conn {:keys [id data] :as entry}] (-> (impl-sendmail data) - (p/then (fn [_] - (mark-email-as-sent conn id))) - (p/catch (fn [e] - (log/error e "Error on sending email" id) - (mark-email-as-failed conn id))))) + (p/handle (fn [v e] + (if e + (do + (log/error e "Error on sending email" id) + (mark-email-as-failed conn id)) + (mark-email-as-sent conn id)))))) + ;; --- Main Task Functions @@ -123,7 +124,8 @@ [opts] (db/with-atomic [conn db/pool] (p/let [items (fetch-emails conn)] - (p/run! (partial send-email conn) items)))) + (-> (p/run! (partial send-email conn) items) + (p/then' (constantly (count items))))))) (defn send-failed-emails [opts] diff --git a/backend/src/uxbox/util/pgsql.clj b/backend/src/uxbox/util/pgsql.clj index 240952c85..5a46e222e 100644 --- a/backend/src/uxbox/util/pgsql.clj +++ b/backend/src/uxbox/util/pgsql.clj @@ -115,11 +115,13 @@ (defn- impl-query [conn sql params {:keys [xfm] :as opts}] (let [conn (if (instance? IDeref conn) @conn conn)] - (->> (impl-execute conn sql params) - (p/map (fn [rows] - (if xfm - (into [] xfm rows) - (into [] (map vec) rows))))))) + (-> (impl-execute conn sql params) + (p/catch' (fn [err] + (p/rejected err))) + (p/then' (fn [rows] + (if xfm + (into [] xfm rows) + (into [] (map vec) rows))))))) (defn impl-transact [pool f] diff --git a/backend/test/uxbox/tests/helpers.clj b/backend/test/uxbox/tests/helpers.clj index 9463ef2c3..79d225375 100644 --- a/backend/test/uxbox/tests/helpers.clj +++ b/backend/test/uxbox/tests/helpers.clj @@ -19,7 +19,6 @@ (let [config (cfg/read-test-config)] (-> (mount/only #{#'uxbox.config/config #'uxbox.config/secret - ;; #'uxbox.db/datasource #'uxbox.core/system #'uxbox.db/pool #'uxbox.migrations/migrations diff --git a/backend/test/uxbox/tests/test_emails.clj b/backend/test/uxbox/tests/test_emails.clj new file mode 100644 index 000000000..2ffacd253 --- /dev/null +++ b/backend/test/uxbox/tests/test_emails.clj @@ -0,0 +1,45 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) 2019 Andrey Antukh + +(ns uxbox.tests.test-emails + (:require + [clojure.test :as t] + [promesa.core :as p] + [mockery.core :refer [with-mock]] + [uxbox.db :as db] + [uxbox.emails :as emails] + [uxbox.services.core :as sv] + [uxbox.tests.helpers :as th])) + +(t/use-fixtures :once th/state-init) +(t/use-fixtures :each th/database-reset) + +(t/deftest register-email-rendering + (let [result (emails/render emails/register {:to "example@uxbox.io"})] + (t/is (map? result)) + (t/is (contains? result :subject)) + (t/is (contains? result :body)) + (t/is (contains? result :to)) + (t/is (contains? result :reply-to)) + (t/is (vector? (:body result))))) + +(t/deftest email-sending-and-sendmail-job + (let [res @(emails/send! emails/register {:to "example@uxbox.io"})] + (t/is (nil? res))) + (with-mock mock + {:target 'uxbox.jobs.sendmail/impl-sendmail + :return (p/resolved nil)} + + (let [res @(uxbox.jobs.sendmail/send-emails {})] + (t/is (= 1 res)) + (t/is (:called? @mock)) + (t/is (= 1 (:call-count @mock)))) + + (let [res @(uxbox.jobs.sendmail/send-emails {})] + (t/is (= 0 res)) + (t/is (:called? @mock)) + (t/is (= 1 (:call-count @mock)))))) +