diff --git a/test/metabase/events/activity_feed_test.clj b/test/metabase/events/activity_feed_test.clj new file mode 100644 index 0000000000000000000000000000000000000000..cabd2500e2c3e8070b9853692ef59bf679d5ab76 --- /dev/null +++ b/test/metabase/events/activity_feed_test.clj @@ -0,0 +1,249 @@ +(ns metabase.events.activity-feed-test + (:require [expectations :refer :all] + [korma.core :as k] + [metabase.db :as db] + [metabase.events.activity-feed :refer :all] + (metabase.models [activity :refer [Activity]] + [card :refer [Card]] + [dashboard :refer [Dashboard]] + [dashboard-card :refer [DashboardCard]] + [database :refer [Database]] + [session :refer [Session]] + [user :refer [User]]) + [metabase.test.data :refer :all] + [metabase.test.util :refer [expect-eval-actual-first with-temp random-name]] + [metabase.test-setup :refer :all])) + +(test-startup) + +;; TODO - we can simplify the cleanup work we do by using the :in-context :expectations-options +;; the only downside is that it then runs the annotated function on ALL tests :/ + + +(defn- create-test-objects + "Simple helper function which creates a series of test objects for use in the tests" + [] + (let [rand-name (random-name) + user (db/ins User + :email (str rand-name "@metabase.com") + :first_name rand-name + :last_name rand-name + :password rand-name) + ;; i don't know why, but the below `ins` doesn't return an object :( + session (db/ins Session + :id rand-name + :user_id (:id user)) + dashboard (db/ins Dashboard + :name rand-name + :description rand-name + :creator_id (:id user) + :public_perms 2) + card (db/ins Card + :name rand-name + :creator_id (:id user) + :public_perms 2 + :display "table" + :dataset_query {:database (db-id) + :type :query + :query {:source_table (id :categories)}} + :visualization_settings {}) + dashcard (db/ins DashboardCard + :card_id (:id card) + :dashboard_id (:id dashboard))] + {:card card + :dashboard dashboard + :dashcard dashcard + :session {:id rand-name} + :user user})) + + +;; `:card-create` event +(expect-let [{:keys [card dashboard dashcard user]} (create-test-objects)] + {:topic :card-create + :user_id (:id user) + :model "card" + :model_id (:id card) + :database_id (db-id) + :table_id (id :categories) + :details {:description (:description card) + :name (:name card) + :public_perms (:public_perms card)}} + (do + (k/delete Activity) + (process-activity-event {:topic :card-create + :item card}) + (-> (db/sel :one Activity :topic "card-create") + (select-keys [:topic :user_id :model :model_id :database_id :table_id :details])))) + +;; `:card-update` event +(expect-let [{:keys [card dashboard dashcard user]} (create-test-objects)] + {:topic :card-update + :user_id (:id user) + :model "card" + :model_id (:id card) + :database_id (db-id) + :table_id (id :categories) + :details {:description (:description card) + :name (:name card) + :public_perms (:public_perms card)}} + (do + (k/delete Activity) + (process-activity-event {:topic :card-update + :item card}) + (-> (db/sel :one Activity :topic "card-update") + (select-keys [:topic :user_id :model :model_id :database_id :table_id :details])))) + +;; `:card-delete` event +(expect-let [{:keys [card dashboard dashcard user]} (create-test-objects)] + {:topic :card-delete + :user_id (:id user) + :model "card" + :model_id (:id card) + :database_id (db-id) + :table_id (id :categories) + :details {:description (:description card) + :name (:name card) + :public_perms (:public_perms card)}} + (do + (k/delete Activity) + (process-activity-event {:topic :card-delete + :item card}) + (-> (db/sel :one Activity :topic "card-delete") + (select-keys [:topic :user_id :model :model_id :database_id :table_id :details])))) + +;; `:dashboard-create` event +(expect-let [{:keys [card dashboard dashcard user]} (create-test-objects)] + {:topic :dashboard-create + :user_id (:id user) + :model "dashboard" + :model_id (:id dashboard) + :details {:description (:description dashboard) + :name (:name dashboard) + :public_perms (:public_perms dashboard)}} + (do + (k/delete Activity) + (process-activity-event {:topic :dashboard-create + :item dashboard}) + (-> (db/sel :one Activity :topic "dashboard-create") + (select-keys [:topic :user_id :model :model_id :details])))) + +;; `:dashboard-delete` event +(expect-let [{:keys [card dashboard dashcard user]} (create-test-objects)] + {:topic :dashboard-delete + :user_id (:id user) + :model "dashboard" + :model_id (:id dashboard) + :details {:description (:description dashboard) + :name (:name dashboard) + :public_perms (:public_perms dashboard)}} + (do + (k/delete Activity) + (process-activity-event {:topic :dashboard-delete + :item dashboard}) + (-> (db/sel :one Activity :topic "dashboard-delete") + (select-keys [:topic :user_id :model :model_id :details])))) + +;; `:dashboard-add-cards` event +(expect-let [{:keys [card dashboard dashcard user]} (create-test-objects)] + {:topic :dashboard-add-cards + :user_id (:id user) + :model "dashboard" + :model_id (:id dashboard) + :details {:description (:description dashboard) + :name (:name dashboard) + :public_perms (:public_perms dashboard) + :dashcards [{:description (:description card) + :name (:name card) + :public_perms (:public_perms card) + :id (:id dashcard) + :card_id (:id card)}]}} + (do + (k/delete Activity) + (process-activity-event {:topic :dashboard-add-cards + :item {:id (:id dashboard) :actor_id (:id user) :dashcards [dashcard]}}) + (-> (db/sel :one Activity :topic "dashboard-add-cards") + (select-keys [:topic :user_id :model :model_id :details])))) + +;; `:dashboard-remove-cards` event +(expect-let [{:keys [card dashboard dashcard user]} (create-test-objects)] + {:topic :dashboard-remove-cards + :user_id (:id user) + :model "dashboard" + :model_id (:id dashboard) + :details {:description (:description dashboard) + :name (:name dashboard) + :public_perms (:public_perms dashboard) + :dashcards [{:description (:description card) + :name (:name card) + :public_perms (:public_perms card) + :id (:id dashcard) + :card_id (:id card)}]}} + (do + (k/delete Activity) + (process-activity-event {:topic :dashboard-remove-cards + :item {:id (:id dashboard) :actor_id (:id user) :dashcards [dashcard]}}) + (-> (db/sel :one Activity :topic "dashboard-remove-cards") + (select-keys [:topic :user_id :model :model_id :details])))) + +;; `:database-sync-*` events +(expect + [1 + {:topic :database-sync + :user_id nil + :model "database" + :model_id (db-id) + :database_id (db-id) + :custom_id "abc" + :details {:status "started"}} + {:topic :database-sync + :user_id nil + :model "database" + :model_id (db-id) + :database_id (db-id) + :custom_id "abc" + :details {:status "completed" :running_time 0}}] + (do + (k/delete Activity) + (let [_ (process-activity-event {:topic :database-sync-begin + :item {:database_id (db-id) :custom_id "abc"}}) + activity1 (-> (db/sel :one Activity :topic "database-sync") + (select-keys [:topic :user_id :model :model_id :database_id :custom_id :details])) + _ (process-activity-event {:topic :database-sync-end + :item {:database_id (db-id) :custom_id "abc"}}) + activity2 (-> (db/sel :one Activity :topic "database-sync") + (select-keys [:topic :user_id :model :model_id :database_id :custom_id :details]) + (assoc-in [:details :running_time] 0)) + activity-cnt (:cnt (first (k/select Activity (k/aggregate (count :*) :cnt) (k/where {:topic "database-sync"}))))] + [activity-cnt + activity1 + activity2]))) + +;; `:install` event +(expect + {:topic :install + :user_id nil + :model "install" + :model_id nil + :details {}} + (do + (k/delete Activity) + (process-activity-event {:topic :install + :item {}}) + (-> (db/sel :one Activity :topic "install") + (select-keys [:topic :user_id :model :model_id :details])))) + +;; `:user-login` event +(expect-let [{{user-id :id} :user {session-id :id :as session} :session} (create-test-objects)] + {:topic :user-joined + :user_id user-id + :model "user" + :model_id user-id + :details {}} + (do + (println "vals" user-id session-id session) + (k/delete Activity) + (process-activity-event {:topic :user-login + :item {:user_id user-id + :session_id session-id}}) + (-> (db/sel :one Activity :topic "user-joined") + (select-keys [:topic :user_id :model :model_id :details]))))