diff --git a/src/metabase/api/user.clj b/src/metabase/api/user.clj
index 0e62e1ae0827a47edbe9869d03573e323cedf34a..22b28006bd035f51439194b010bd01914912ba7a 100644
--- a/src/metabase/api/user.clj
+++ b/src/metabase/api/user.clj
@@ -9,6 +9,7 @@
             [metabase.integrations.ldap :as ldap]
             [metabase.models.collection :as collection :refer [Collection]]
             [metabase.models.permissions-group :as group]
+            [metabase.models.pulse-channel-recipient :refer [PulseChannelRecipient]]
             [metabase.models.user :as user :refer [User]]
             [metabase.plugins.classloader :as classloader]
             [metabase.server.middleware.offset-paging :as offset-paging]
@@ -320,5 +321,13 @@
       (email/send-new-user-email! user @api/*current-user* join-url)))
   {:success true})
 
+(api/defendpoint DELETE "/:id/subscriptions"
+  "Delete all Alert and DashboardSubscription subscriptions for a User. Only allowed for admins or for the current
+  user."
+  [id]
+  (check-self-or-superuser id)
+  (db/delete! PulseChannelRecipient :user_id id)
+  api/generic-204-no-content)
+
 
 (api/define-routes)
diff --git a/test/metabase/api/alert_test.clj b/test/metabase/api/alert_test.clj
index d46c69981b87690cb57fea5a94dd7194ab7a733d..8b67b1acfda64fed3728670fa1d57175d1a1a960 100644
--- a/test/metabase/api/alert_test.clj
+++ b/test/metabase/api/alert_test.clj
@@ -15,8 +15,7 @@
             [metabase.test.mock.util :refer [pulse-channel-defaults]]
             [metabase.test.util :as tu]
             [metabase.util :as u]
-            [toucan.db :as db]
-            [toucan.util.test :as tt]))
+            [toucan.db :as db]))
 
 ;;; +----------------------------------------------------------------------------------------------------------------+
 ;;; |                                              Helper Fns & Macros                                               |
@@ -176,11 +175,11 @@
             (mt/with-temp* [PulseChannel [pulse-channel {:pulse_id (u/the-id recipient-alert)}]
                             PulseChannelRecipient [_ {:pulse_channel_id (u/the-id pulse-channel), :user_id (mt/user->id :lucky)}]]
               (is (= #{"LuckyCreator" "LuckyRecipient"}
-                      (set (map :name (mt/user-http-request :rasta :get 200 (str "alert?user_id=" (mt/user->id :lucky)))))))
+                     (set (map :name (mt/user-http-request :rasta :get 200 (str "alert?user_id=" (mt/user->id :lucky)))))))
               (is (= #{"LuckyRecipient" "Other"}
-                      (set (map :name (mt/user-http-request :rasta :get 200 (str "alert?user_id=" (mt/user->id :rasta)))))))
+                     (set (map :name (mt/user-http-request :rasta :get 200 (str "alert?user_id=" (mt/user->id :rasta)))))))
               (is (= #{}
-                      (set (map :name (mt/user-http-request :rasta :get 200 (str "alert?user_id=" (mt/user->id :trashbird))))))))))))))
+                     (set (map :name (mt/user-http-request :rasta :get 200 (str "alert?user_id=" (mt/user->id :trashbird))))))))))))))
 
 ;;; +----------------------------------------------------------------------------------------------------------------+
 ;;; |                                               GET /api/alert/:id                                               |
@@ -202,32 +201,38 @@
 
 (deftest put-alert-test
   (is (= {:errors {:alert_condition "value must be one of: `goal`, `rows`."}}
-         ((user->client :rasta) :post 400 "alert" {:alert_condition "not rows"
-                                                   :card            "foobar"})))
+         (mt/user-http-request
+          :rasta :post 400 "alert" {:alert_condition "not rows"
+                                    :card            "foobar"})))
 
   (is (= {:errors {:alert_first_only "value must be a boolean."}}
-         ((user->client :rasta) :post 400 "alert" {:alert_condition "rows"})))
+         (mt/user-http-request
+          :rasta :post 400 "alert" {:alert_condition "rows"})))
 
   (is (= {:errors {:card "value must be a map with the keys `id`, `include_csv`, `include_xls`, and `dashboard_card_id`."}}
-         ((user->client :rasta) :post 400 "alert" {:alert_condition  "rows"
-                                                   :alert_first_only false})))
+         (mt/user-http-request
+          :rasta :post 400 "alert" {:alert_condition  "rows"
+                                    :alert_first_only false})))
 
   (is (= {:errors {:channels "value must be an array. Each value must be a map. The array cannot be empty."}}
-         ((user->client :rasta) :post 400 "alert" {:alert_condition  "rows"
-                                                   :alert_first_only false
-                                                   :card             {:id 100, :include_csv false, :include_xls false, :dashboard_card_id nil}})))
+         (mt/user-http-request
+          :rasta :post 400 "alert" {:alert_condition  "rows"
+                                    :alert_first_only false
+                                    :card             {:id 100, :include_csv false, :include_xls false, :dashboard_card_id nil}})))
 
   (is (= {:errors {:channels "value must be an array. Each value must be a map. The array cannot be empty."}}
-         ((user->client :rasta) :post 400 "alert" {:alert_condition  "rows"
-                                                   :alert_first_only false
-                                                   :card             {:id 100, :include_csv false, :include_xls false, :dashboard_card_id nil}
-                                                   :channels         "foobar"})))
+         (mt/user-http-request
+          :rasta :post 400 "alert" {:alert_condition  "rows"
+                                    :alert_first_only false
+                                    :card             {:id 100, :include_csv false, :include_xls false, :dashboard_card_id nil}
+                                    :channels         "foobar"})))
 
   (is (= {:errors {:channels "value must be an array. Each value must be a map. The array cannot be empty."}}
-         ((user->client :rasta) :post 400 "alert" {:alert_condition  "rows"
-                                                   :alert_first_only false
-                                                   :card             {:id 100, :include_csv false, :include_xls false, :dashboard_card_id nil}
-                                                   :channels         ["abc"]}))))
+         (mt/user-http-request
+          :rasta :post 400 "alert" {:alert_condition  "rows"
+                                    :alert_first_only false
+                                    :card             {:id 100, :include_csv false, :include_xls false, :dashboard_card_id nil}
+                                    :channels         ["abc"]}))))
 
 (defn- rasta-new-alert-email [body-map]
   (mt/email-to :rasta {:subject "You set up an alert",
@@ -288,14 +293,14 @@
 
 ;; Check creation of a new rows alert with email notification
 (deftest new-rows-with-email-test
-  (tt/with-temp* [Card [card {:name "My question"}]]
+  (mt/with-temp* [Card [card {:name "My question"}]]
     (is (= [(-> (default-alert card)
                 (assoc-in [:card :include_csv] true)
                 (assoc-in [:card :collection_id] true)
                 (update-in [:channels 0] merge {:schedule_hour 12, :schedule_type "daily", :recipients []}))
             (rasta-new-alert-email {"has any results" true})]
            (tu/with-non-admin-groups-no-root-collection-perms
-             (tt/with-temp Collection [collection]
+             (mt/with-temp Collection [collection]
                (db/update! Card (u/the-id card) :collection_id (u/the-id collection))
                (with-alert-setup
                  (perms/grant-collection-readwrite-permissions! (group/all-users) collection)
@@ -317,7 +322,7 @@
 
 ;; An admin created alert should notify others they've been subscribed
 (deftest notify-subscribed-test
-  (tt/with-temp* [Card [card {:name "My question"}]]
+  (mt/with-temp* [Card [card {:name "My question"}]]
     (is (= {:response (-> (default-alert card)
                           (assoc :creator (user-details :crowberto))
                           (assoc-in [:card :include_csv] true)
@@ -353,14 +358,15 @@
 (deftest below-goal-alert-test
   (is (= (rasta-new-alert-email {"goes below its goal" true})
          (tu/with-non-admin-groups-no-root-collection-perms
-           (tt/with-temp* [Collection [collection]
+           (mt/with-temp* [Collection [collection]
                            Card       [card {:name          "My question"
                                              :display       "line"
                                              :collection_id (u/the-id collection)}]]
              (perms/grant-collection-readwrite-permissions! (group/all-users) collection)
              (with-alert-setup
                (et/with-expected-messages 1
-                 ((user->client :rasta) :post 200 "alert"
+                 (mt/user-http-request
+                  :rasta :post 200 "alert"
                   {:card             {:id (u/the-id card), :include_csv false, :include_xls false, :dashboard_card_id nil}
                    :alert_condition  "goal"
                    :alert_above_goal false
@@ -374,14 +380,15 @@
 (deftest above-goal-alert-test
   (is (= (rasta-new-alert-email {"meets its goal" true})
          (tu/with-non-admin-groups-no-root-collection-perms
-           (tt/with-temp* [Collection [collection]
+           (mt/with-temp* [Collection [collection]
                            Card       [card {:name          "My question"
                                              :display       "bar"
                                              :collection_id (u/the-id collection)}]]
              (perms/grant-collection-readwrite-permissions! (group/all-users) collection)
              (with-alert-setup
                (et/with-expected-messages 1
-                 ((user->client :rasta) :post 200 "alert"
+                 (mt/user-http-request
+                  :rasta :post 200 "alert"
                   {:card             {:id (u/the-id card), :include_csv false, :include_xls false, :dashboard_card_id nil}
                    :collection_id    (u/the-id collection)
                    :alert_condition  "goal"
@@ -398,31 +405,36 @@
 
 (deftest put-alert-test-2
   (is (= {:errors {:alert_condition "value may be nil, or if non-nil, value must be one of: `goal`, `rows`."}}
-         ((user->client :rasta) :put 400 "alert/1" {:alert_condition "not rows"})))
+         (mt/user-http-request
+          :rasta :put 400 "alert/1" {:alert_condition "not rows"})))
 
   (is (= {:errors {:alert_first_only "value may be nil, or if non-nil, value must be a boolean."}}
-         ((user->client :rasta) :put 400 "alert/1" {:alert_first_only 1000})))
+         (mt/user-http-request
+          :rasta :put 400 "alert/1" {:alert_first_only 1000})))
 
   (is (= {:errors {:card (str "value may be nil, or if non-nil, value must be a map with the keys `id`, `include_csv`, "
                               "`include_xls`, and `dashboard_card_id`.")}}
-         ((user->client :rasta) :put 400 "alert/1" {:alert_condition  "rows"
-                                                    :alert_first_only false
-                                                    :card             "foobar"})))
+         (mt/user-http-request
+          :rasta :put 400 "alert/1" {:alert_condition  "rows"
+                                     :alert_first_only false
+                                     :card             "foobar"})))
 
   (is (= {:errors {:channels (str "value may be nil, or if non-nil, value must be an array. Each value must be a map. The "
                                   "array cannot be empty.")}}
-         ((user->client :rasta) :put 400 "alert/1" {:alert_condition  "rows"
-                                                    :alert_first_only false
-                                                    :card             {:id 100, :include_csv false, :include_xls false, :dashboard_card_id nil}
-                                                    :channels         "foobar"})))
+         (mt/user-http-request
+          :rasta :put 400 "alert/1" {:alert_condition  "rows"
+                                     :alert_first_only false
+                                     :card             {:id 100, :include_csv false, :include_xls false, :dashboard_card_id nil}
+                                     :channels         "foobar"})))
 
   (is (= {:errors {:channels (str "value may be nil, or if non-nil, value must be an array. Each value must be a map. The "
                                   "array cannot be empty.")}}
-         ((user->client :rasta) :put 400 "alert/1" {:name             "abc"
-                                                    :alert_condition  "rows"
-                                                    :alert_first_only false
-                                                    :card             {:id 100, :include_csv false, :include_xls false, :dashboard_card_id nil}
-                                                    :channels         ["abc"]}))))
+         (mt/user-http-request
+          :rasta :put 400 "alert/1" {:name             "abc"
+                                     :alert_condition  "rows"
+                                     :alert_first_only false
+                                     :card             {:id 100, :include_csv false, :include_xls false, :dashboard_card_id nil}
+                                     :channels         ["abc"]}))))
 
 (defn- default-alert-req
   ([card pulse-card-or-id]
@@ -461,7 +473,7 @@
 
 (deftest update-alerts-test
   (testing "Non-admin users can update alerts they created *if* they are in the recipient list"
-    (tt/with-temp* [Pulse                 [alert (basic-alert)]
+    (mt/with-temp* [Pulse                 [alert (basic-alert)]
                     Card                  [card]
                     PulseCard             [_     (pulse-card alert card)]
                     PulseChannel          [pc    (pulse-channel alert)]
@@ -475,7 +487,7 @@
                    (default-alert-req card pc)))))))))
 
   (testing "Admin users can update any alert"
-    (tt/with-temp* [Pulse                 [alert (basic-alert)]
+    (mt/with-temp* [Pulse                 [alert (basic-alert)]
                     Card                  [card]
                     PulseCard             [_     (pulse-card alert card)]
                     PulseChannel          [pc    (pulse-channel alert)]
@@ -487,7 +499,7 @@
                  (default-alert-req card pc))))))))
 
   (testing "Admin users can update any alert, changing the related alert attributes"
-    (tt/with-temp* [Pulse                 [alert (basic-alert)]
+    (mt/with-temp* [Pulse                 [alert (basic-alert)]
                     Card                  [card]
                     PulseCard             [_     (pulse-card alert card)]
                     PulseChannel          [pc    (pulse-channel alert)]
@@ -503,7 +515,7 @@
                                     [(fetch-user :rasta)]))))))))
 
   (testing "Admin users can add a recipient, that recipient should be notified"
-    (tt/with-temp* [Pulse                 [alert (basic-alert)]
+    (mt/with-temp* [Pulse                 [alert (basic-alert)]
                     Card                  [card]
                     PulseCard             [_     (pulse-card alert card)]
                     PulseChannel          [pc    (pulse-channel alert)]
@@ -549,7 +561,7 @@
 (deftest permissions-test
   (testing "Non-admin users can't edit alerts they didn't create"
     (is (= "You don't have permissions to do that."
-           (tt/with-temp* [Pulse                 [alert (assoc (basic-alert) :creator_id (user->id :crowberto))]
+           (mt/with-temp* [Pulse                 [alert (assoc (basic-alert) :creator_id (user->id :crowberto))]
                            Card                  [card]
                            PulseCard             [_     (pulse-card alert card)]
                            PulseChannel          [pc    (pulse-channel alert)]
@@ -562,7 +574,7 @@
   (testing "Non-admin users can't edit alerts if they're not in the recipient list"
     (is (= "You don't have permissions to do that."
            (tu/with-non-admin-groups-no-root-collection-perms
-             (tt/with-temp* [Pulse                 [alert (basic-alert)]
+             (mt/with-temp* [Pulse                 [alert (basic-alert)]
                              Card                  [card]
                              PulseCard             [_     (pulse-card alert card)]
                              PulseChannel          [pc    (pulse-channel alert)]
@@ -575,7 +587,8 @@
   (testing "Can we archive an Alert?"
     (is (with-alert-in-collection [_ collection alert]
           (perms/grant-collection-readwrite-permissions! (group/all-users) collection)
-          ((user->client :rasta) :put 200 (str "alert/" (u/the-id alert))
+          (mt/user-http-request
+           :rasta :put 200 (str "alert/" (u/the-id alert))
            {:archived true})
           (db/select-one-field :archived Pulse :id (u/the-id alert)))))
 
@@ -583,7 +596,8 @@
     (is (false? (with-alert-in-collection [_ collection alert]
                   (perms/grant-collection-readwrite-permissions! (group/all-users) collection)
                   (db/update! Pulse (u/the-id alert) :archived true)
-                  ((user->client :rasta) :put 200 (str "alert/" (u/the-id alert))
+                  (mt/user-http-request
+                   :rasta :put 200 (str "alert/" (u/the-id alert))
                    {:archived false})
                   (db/select-one-field :archived Pulse :id (u/the-id alert)))))))
 
@@ -608,7 +622,7 @@
   (count ((alert-client user-kw) :get 200 (alert-question-url card-or-id archived))))
 
 (deftest get-alert-question-test
-  (tt/with-temp* [Card                 [card  (basic-alert-query)]
+  (mt/with-temp* [Card                 [card  (basic-alert-query)]
                   Pulse                [alert {:alert_condition  "rows"
                                                :alert_first_only false
                                                :alert_above_goal nil
@@ -630,7 +644,7 @@
   (testing "Non-admin users shouldn't see alerts they created if they're no longer recipients"
     (is (= {:count-1 1
             :count-2 0}
-           (tt/with-temp* [Card                  [card  (basic-alert-query)]
+           (mt/with-temp* [Card                  [card  (basic-alert-query)]
                            Pulse                 [alert (assoc (basic-alert) :alert_above_goal true)]
                            PulseCard             [_     (pulse-card alert card)]
                            PulseChannel          [pc    (pulse-channel alert)]
@@ -647,7 +661,7 @@
   (testing "Non-admin users should not see others alerts, admins see all alerts"
     (is (= {:rasta     1
             :crowberto 2}
-           (tt/with-temp* [Card                  [card    (basic-alert-query)]
+           (mt/with-temp* [Card                  [card    (basic-alert-query)]
                            Pulse                 [alert-1 (assoc (basic-alert)
                                                                  :alert_above_goal false)]
                            PulseCard             [_       (pulse-card alert-1 card)]
@@ -668,7 +682,7 @@
                   :crowberto (api:alert-question-count :crowberto card))))))))
 
   (testing "Archived alerts are excluded by default, unless `archived` parameter is sent"
-    (tt/with-temp* [Card                  [card    (basic-alert-query)]
+    (mt/with-temp* [Card                  [card    (basic-alert-query)]
                     Pulse                 [alert-1 (assoc (basic-alert)
                                                           :alert_above_goal false
                                                           :archived         true)]
@@ -724,7 +738,7 @@
     (is (= {:recipients-1 #{"crowberto@metabase.com" "rasta@metabase.com"}
             :recipients-2 #{"crowberto@metabase.com"}
             :emails       (rasta-unsubscribe-email {"Foo" true})}
-           (tt/with-temp* [Card                  [card  (basic-alert-query)]
+           (mt/with-temp* [Card                  [card  (basic-alert-query)]
                            Pulse                 [alert (basic-alert)]
                            PulseCard             [_     (pulse-card alert card)]
                            PulseChannel          [pc    (pulse-channel alert)]
@@ -733,11 +747,13 @@
              (with-alerts-in-readable-collection [alert]
                (with-alert-setup
                  (array-map
-                  :recipients-1 (recipient-emails ((user->client :rasta) :get 200 (alert-question-url card)))
+                  :recipients-1 (recipient-emails (mt/user-http-request
+                                                   :rasta :get 200 (alert-question-url card)))
                   :recipients-2 (do
                                   (et/with-expected-messages 1
                                     (api:unsubscribe! :rasta 204 alert))
-                                  (recipient-emails ((user->client :crowberto) :get 200 (alert-question-url card))))
+                                  (recipient-emails (mt/user-http-request
+                                                     :crowberto :get 200 (alert-question-url card))))
                   :emails       (et/regex-email-bodies #"https://metabase.com/testmb"
                                                        #"Foo"))))))))
 
@@ -745,7 +761,7 @@
     (is (= {:count-1 1
             :count-2 0
             :emails  (rasta-unsubscribe-email {"Foo" true})}
-           (tt/with-temp* [Card                  [card  (basic-alert-query)]
+           (mt/with-temp* [Card                  [card  (basic-alert-query)]
                            Pulse                 [alert (basic-alert)]
                            PulseCard             [_     (pulse-card alert card)]
                            PulseChannel          [pc    (pulse-channel alert)]
@@ -763,9 +779,9 @@
 
   (testing "Alert should not be deleted if there is a slack channel"
     (is (= {:count-1 1
-            :count-2 1 ; <-- Alert should not be deleted
+            :count-2 1                  ; <-- Alert should not be deleted
             :emails  (rasta-unsubscribe-email {"Foo" true})}
-           (tt/with-temp* [Card                  [card  (basic-alert-query)]
+           (mt/with-temp* [Card                  [card  (basic-alert-query)]
                            Pulse                 [alert (basic-alert)]
                            PulseCard             [_     (pulse-card alert card)]
                            PulseChannel          [pc-1  (assoc (pulse-channel alert) :channel_type :email)]
@@ -784,11 +800,11 @@
 
   (testing "If email is disabled, users should be unsubscribed"
     (is (= {:count-1 1
-            :count-2 1 ; <-- Alert should not be deleted
+            :count-2 1                  ; <-- Alert should not be deleted
             :emails  (et/email-to :rasta {:subject "You’ve been unsubscribed from an alert",
                                           :body    {"https://metabase.com/testmb"          true,
                                                     "letting you know that Crowberto Corv" true}})}
-           (tt/with-temp* [Card                  [card  (basic-alert-query)]
+           (mt/with-temp* [Card                  [card  (basic-alert-query)]
                            Pulse                 [alert (basic-alert)]
                            PulseCard             [_     (pulse-card alert card)]
                            PulseChannel          [pc-1  (assoc (pulse-channel alert) :channel_type :email)]
@@ -808,11 +824,11 @@
 
   (testing "Re-enabling email should send users a subscribe notification"
     (is (= {:count-1 1
-            :count-2 1 ; <-- Alert should not be deleted
+            :count-2 1                  ; <-- Alert should not be deleted
             :emails  (et/email-to :rasta {:subject "Crowberto Corv added you to an alert",
                                           :body    {"https://metabase.com/testmb"    true,
                                                     "now getting alerts about .*Foo" true}})}
-           (tt/with-temp* [Card                  [card  (basic-alert-query)]
+           (mt/with-temp* [Card                  [card  (basic-alert-query)]
                            Pulse                 [alert (basic-alert)]
                            PulseCard             [_     (pulse-card alert card)]
                            PulseChannel          [pc-1  (assoc (pulse-channel alert) :channel_type :email, :enabled false)]
@@ -832,9 +848,9 @@
 
   (testing "Alert should not be deleted if the unsubscriber isn't the creator"
     (is (= {:count-1 1
-            :count-2 1 ; <-- Alert should not be deleted
+            :count-2 1                  ; <-- Alert should not be deleted
             :emails  (rasta-unsubscribe-email {"Foo" true})}
-           (tt/with-temp* [Card                  [card  (basic-alert-query)]
+           (mt/with-temp* [Card                  [card  (basic-alert-query)]
                            Pulse                 [alert (assoc (basic-alert) :creator_id (user->id :crowberto))]
                            PulseCard             [_     (pulse-card alert card)]
                            PulseChannel          [pc-1  (assoc (pulse-channel alert) :channel_type :email)]
@@ -856,14 +872,15 @@
 ;;; +----------------------------------------------------------------------------------------------------------------+
 
 (defn- api:delete! [user-kw expected-status-code alert-or-id]
-  ((user->client user-kw) :delete expected-status-code (alert-url alert-or-id)))
+  (mt/user-http-request
+   user-kw :delete expected-status-code (alert-url alert-or-id)))
 
 (deftest delete-alert-test
   (testing "Only admins can delete an alert"
     (is (= {:count    1
             :response "You don't have permissions to do that."}
            (tu/with-non-admin-groups-no-root-collection-perms
-             (tt/with-temp* [Card                  [card  (basic-alert-query)]
+             (mt/with-temp* [Card                  [card  (basic-alert-query)]
                              Pulse                 [alert (basic-alert)]
                              PulseCard             [_     (pulse-card alert card)]
                              PulseChannel          [pc    (pulse-channel alert)]
@@ -879,13 +896,14 @@
             :response nil
             :count-2  0}
            (tu/with-non-admin-groups-no-root-collection-perms
-             (tt/with-temp* [Card                  [card  (basic-alert-query)]
+             (mt/with-temp* [Card                  [card  (basic-alert-query)]
                              Pulse                 [alert (basic-alert)]
                              PulseCard             [_     (pulse-card alert card)]
                              PulseChannel          [pc    (pulse-channel alert)]
                              PulseChannelRecipient [_     (recipient pc :rasta)]]
                (with-alert-setup
-                 (let [original-alert-response ((user->client :crowberto) :get 200 (alert-question-url card))]
+                 (let [original-alert-response (mt/user-http-request
+                                                :crowberto :get 200 (alert-question-url card))]
 
                    ;; A user can't delete an admin's alert
                    (api:delete! :rasta 403 alert)
@@ -900,7 +918,7 @@
             :response nil
             :count-2  0
             :emails   (rasta-deleted-email {})}
-           (tt/with-temp*  [Card                  [card  (basic-alert-query)]
+           (mt/with-temp*  [Card                  [card  (basic-alert-query)]
                             Pulse                 [alert (basic-alert)]
                             PulseCard             [_     (pulse-card alert card)]
                             PulseChannel          [pc    (pulse-channel alert)]
@@ -923,7 +941,7 @@
                        (et/email-to :lucky {:subject "You’ve been unsubscribed from an alert",
                                             :body    {"Crowberto Corv deleted an alert"             false
                                                       "Crowberto Corv unsubscribed you from alerts" true}}))}
-           (tt/with-temp*  [Card                  [card  (basic-alert-query)]
+           (mt/with-temp*  [Card                  [card  (basic-alert-query)]
                             Pulse                 [alert (basic-alert)]
                             PulseCard             [_     (pulse-card alert card)]
                             PulseChannel          [pc    (pulse-channel alert)]
@@ -944,7 +962,7 @@
             :response nil
             :count-2  0
             :emails   {}}
-           (tt/with-temp* [Card                  [card  (basic-alert-query)]
+           (mt/with-temp* [Card                  [card  (basic-alert-query)]
                            Pulse                 [alert (assoc (basic-alert) :creator_id (user->id :crowberto))]
                            PulseCard             [_     (pulse-card alert card)]
                            PulseChannel          [pc    (pulse-channel alert)]
diff --git a/test/metabase/api/user_test.clj b/test/metabase/api/user_test.clj
index a357e8e93277c448178f535f63819964abe0290a..04193c28b83a9945f5db0a90436671dfce7cf6ef 100644
--- a/test/metabase/api/user_test.clj
+++ b/test/metabase/api/user_test.clj
@@ -2,10 +2,10 @@
   "Tests for /api/user endpoints."
   (:require [clojure.test :refer :all]
             [metabase.http-client :as http]
-            [metabase.models.collection :as collection :refer [Collection]]
-            [metabase.models.permissions-group :as group :refer [PermissionsGroup]]
-            [metabase.models.permissions-group-membership :refer [PermissionsGroupMembership]]
-            [metabase.models.user :refer [User]]
+            [metabase.models :refer [Card Collection Dashboard DashboardCard PermissionsGroup PermissionsGroupMembership
+                                     Pulse PulseCard PulseChannel PulseChannelRecipient User]]
+            [metabase.models.collection :as collection]
+            [metabase.models.permissions-group :as group]
             [metabase.models.user-test :as user-test]
             [metabase.server.middleware.util :as middleware.u]
             [metabase.test :as mt]
@@ -865,3 +865,68 @@
     (testing "Check that non-superusers are denied access to resending invites"
       (is (= "You don't have permissions to do that."
              (mt/user-http-request :rasta :post 403 (format "user/%d/send_invite" (mt/user->id :crowberto))))))))
+
+(deftest delete-subscriptions-test
+  (testing "DELETE /api/user/:id/subscriptions"
+    (doseq [run-type [:admin :non-admin]]
+      (mt/with-temp* [User                  [{user-id :id}]
+                      Card                  [{card-id :id}]
+                      ;; Alert
+                      Pulse                 [{alert-id :id}         {:alert_condition  "rows"
+                                                                     :alert_first_only false
+                                                                     :name             nil}]
+                      PulseCard             [_                      {:pulse_id alert-id
+                                                                     :card_id  card-id}]
+                      PulseChannel          [{alert-chan-id :id}    {:pulse_id alert-id}]
+                      PulseChannelRecipient [_                      {:user_id          user-id
+                                                                     :pulse_channel_id alert-chan-id}]
+                      ;; DashboardSubscription
+                      Dashboard             [{dashboard-id :id}]
+                      DashboardCard         [{dashcard-id :id}      {:dashboard_id dashboard-id
+                                                                     :card_id      card-id}]
+                      Pulse                 [{dash-sub-id :id}      {:dashboard_id dashboard-id}]
+                      PulseCard             [_                      {:pulse_id          dash-sub-id
+                                                                     :card_id           card-id
+                                                                     :dashboard_card_id dashcard-id}]
+                      PulseChannel          [{dash-sub-chan-id :id} {:pulse_id dash-sub-id}]
+                      PulseChannelRecipient [_                      {:user_id          user-id
+                                                                     :pulse_channel_id dash-sub-chan-id}]]
+        (letfn [(describe-objects []
+                  {:num-subscriptions                (db/count PulseChannelRecipient :user_id user-id)
+                   :alert-archived?                  (db/select-one-field :archived Pulse :id alert-id)
+                   :dashboard-subscription-archived? (db/select-one-field :archived Pulse :id dash-sub-id)})
+                (api-delete-subscriptions! [request-user-name-or-id expected-status-code]
+                  (mt/user-http-request request-user-name-or-id
+                                        :delete expected-status-code
+                                        (format "user/%d/subscriptions" user-id)))]
+          (testing "Sanity check: User should have 2 subscriptions (1 Alert, 1 DashboardSubscription)"
+            (is (= {:num-subscriptions                2
+                    :alert-archived?                  false
+                    :dashboard-subscription-archived? false}
+                   (describe-objects))))
+          (case run-type
+            :non-admin
+            (testing "Non-admin"
+              (testing "should not be allowed to delete all subscriptions for another User"
+                (is (= "You don't have permissions to do that."
+                       (api-delete-subscriptions! :rasta 403)))
+                (is (= {:num-subscriptions                2
+                        :alert-archived?                  false
+                        :dashboard-subscription-archived? false}
+                       (describe-objects))))
+              (testing "should be allowed to delete all subscriptions for themselves."
+                (is (nil? (api-delete-subscriptions! user-id 204)))
+                (testing "\nAlert and DashboardSubscription should have gotten archived as well (since this was the last User)"
+                  (is (= {:num-subscriptions                0
+                          :alert-archived?                  true
+                          :dashboard-subscription-archived? true}
+                         (describe-objects))))))
+
+            :admin
+            (testing "Admin should be allowed to delete all subscriptions for another User"
+              (is (nil? (api-delete-subscriptions! :crowberto 204)))
+              (testing "\nAlert and DashboardSubscription should have gotten archived as well"
+                (is (= {:num-subscriptions                0
+                        :alert-archived?                  true
+                        :dashboard-subscription-archived? true}
+                       (describe-objects)))))))))))