From d92057b0e55abef78201fb10f90476f9e6c7574f Mon Sep 17 00:00:00 2001
From: Allen Gilliland <agilliland@gmail.com>
Date: Thu, 10 Sep 2015 22:09:17 -0700
Subject: [PATCH] unit tests for /api/activity endpoints.

---
 test/metabase/api/activity_test.clj | 166 ++++++++++++++++++++++++++++
 1 file changed, 166 insertions(+)
 create mode 100644 test/metabase/api/activity_test.clj

diff --git a/test/metabase/api/activity_test.clj b/test/metabase/api/activity_test.clj
new file mode 100644
index 00000000000..cebf88628d5
--- /dev/null
+++ b/test/metabase/api/activity_test.clj
@@ -0,0 +1,166 @@
+(ns metabase.api.activity-test
+  "Tests for /api/activity endpoints."
+  (:require [expectations :refer :all]
+            [metabase.db :as db]
+            [metabase.http-client :refer :all]
+            (metabase.models [activity :refer [Activity]]
+                             [card :refer [Card]]
+                             [dashboard :refer [Dashboard]]
+                             [view-log :refer [ViewLog]])
+            [metabase.test.data :refer :all]
+            [metabase.test.data.users :refer :all]
+            [metabase.test.util :refer [match-$ expect-eval-actual-first random-name with-temp]]
+            [metabase.util :as u]))
+
+;; GET /
+
+; Things we are testing for:
+;  1. ordered by timestamp DESC
+;  2. :user and :model_exists are hydrated
+
+; NOTE: timestamp matching was being a real PITA so I cheated a bit.  ideally we'd fix that
+(expect-let [activity1 (db/ins Activity
+                         :topic     "install"
+                         :details   {}
+                         :timestamp (u/parse-iso8601 "2015-09-09T12:13:14.888Z"))
+             activity2 (db/ins Activity
+                         :topic     "dashboard-create"
+                         :user_id   (user->id :crowberto)
+                         :model     "dashboard"
+                         :model_id  1234
+                         :details   {:description  "Because I can!"
+                                     :name         "Bwahahaha"
+                                     :public_perms 2}
+                         :timestamp (u/parse-iso8601 "2015-09-10T18:53:01.632Z"))
+             activity3 (db/ins Activity
+                         :topic     "user-joined"
+                         :user_id   (user->id :rasta)
+                         :model     "user"
+                         :details   {}
+                         :timestamp (u/parse-iso8601 "2015-09-10T05:33:43.641Z"))]
+  [(match-$ (db/sel :one Activity :id (:id activity2))
+     {:id           $
+      :topic        "dashboard-create"
+      :user_id      $
+      :user         (match-$ (fetch-user :crowberto)
+                      {:id           (user->id :crowberto)
+                       :email        $
+                       :date_joined  $
+                       :first_name   $
+                       :last_name    $
+                       :last_login   $
+                       :is_superuser $
+                       :common_name  $})
+      :model        $
+      :model_id     $
+      :model_exists false
+      :database_id  nil
+      :database     nil
+      :table_id     nil
+      :table        nil
+      :custom_id    nil
+      :details      $})
+   (match-$ (db/sel :one Activity :id (:id activity3))
+     {:id           $
+      :topic        "user-joined"
+      :user_id      $
+      :user         (match-$ (fetch-user :rasta)
+                      {:id           (user->id :rasta)
+                       :email        $
+                       :date_joined  $
+                       :first_name   $
+                       :last_name    $
+                       :last_login   $
+                       :is_superuser $
+                       :common_name  $})
+      :model        $
+      :model_id     $
+      :model_exists nil
+      :database_id  nil
+      :database     nil
+      :table_id     nil
+      :table        nil
+      :custom_id    nil
+      :details      $})
+   (match-$ (db/sel :one Activity :id (:id activity1))
+     {:id           $
+      :topic        "install"
+      :user_id      nil
+      :user         nil
+      :model        $
+      :model_id     $
+      :model_exists nil
+      :database_id  nil
+      :database     nil
+      :table_id     nil
+      :table        nil
+      :custom_id    nil
+      :details      $})]
+  (->> ((user->client :crowberto) :get 200 "activity")
+       (map #(dissoc % :timestamp))))
+
+
+;; GET /recent_views
+
+; Things we are testing for:
+;  1. ordering is sorted by most recent
+;  2. results are filtered to current user
+;  3. `:model_object` is hydrated in each result
+;  4. we filter out entries where `:model_object` is nil (object doesn't exist)
+
+(defn- create-card []
+  (db/ins Card
+    :name                   "rand-name"
+    :creator_id             (user->id :crowberto)
+    :public_perms           2
+    :display                "table"
+    :dataset_query          {}
+    :visualization_settings {}))
+
+(defn- create-dash []
+  (db/ins Dashboard
+    :name         "rand-name"
+    :description  "rand-name"
+    :creator_id   (user->id :crowberto)
+    :public_perms 2))
+
+(expect-let [card1 (create-card)
+             dash1 (create-dash)
+             card2 (create-card)]
+  [{:cnt      1
+    :user_id  (user->id :crowberto)
+    :model    "card"
+    :model_id (:id card1)
+    :model_object {:id          (:id card1)
+                   :name        (:name card1)
+                   :description (:description card1)
+                   :display     (name (:display card1))}}
+   {:cnt      1
+    :user_id  (user->id :crowberto)
+    :model    "dashboard"
+    :model_id (:id dash1)
+    :model_object {:id          (:id dash1)
+                   :name        (:name dash1)
+                   :description (:description dash1)}}
+   {:cnt      1
+    :user_id  (user->id :crowberto)
+    :model    "card"
+    :model_id (:id card2)
+    :model_object {:id          (:id card2)
+                   :name        (:name card2)
+                   :description (:description card2)
+                   :display     (name (:display card2))}}]
+  (let [create-view (fn [user model model-id]
+                      (db/ins ViewLog
+                        :user_id  user
+                        :model    model
+                        :model_id model-id
+                        :timestamp (u/new-sql-timestamp)))]
+    (do
+      (create-view (user->id :crowberto) "card" (:id card2))
+      (create-view (user->id :crowberto) "dashboard" (:id dash1))
+      (create-view (user->id :crowberto) "card" (:id card1))
+      (create-view (user->id :crowberto) "card" 36478)
+      (create-view (user->id :rasta) "card" (:id card1))
+      (->> ((user->client :crowberto) :get 200 "activity/recent_views")
+           (map #(dissoc % :max_ts))))))
-- 
GitLab