From 06f4647aadf0b8a923e91c5ee62b004a2121796b Mon Sep 17 00:00:00 2001
From: Ryan Kienstra <kienstraryan@gmail.com>
Date: Mon, 9 Oct 2023 03:37:44 -0600
Subject: [PATCH] Add tests for api endpoints: `timeline-event`, `search`
 (#34072)

* Add a unit test for /api/pulse/preview_card_info/:id

For the GET endpoint
/api/pulse/preview_card_info/:id

* Add a unit test for the GET endpoint /search/models

* Add a unit test for DELETE /api/timeline-event/:id

* Add a unit test for DELETE /api/timeline-event/:id

* Commit Ngoc's suggestion: Update test/metabase/api/timeline_event_test.clj

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>

* Apply Ngoc's suggestion to destructure :timeline_id

* Remove test for event that I created in with-temp

* Fix failed test I introduced, change collection to collection-id

* Test deleting a non-existent timeline event by id

* Move my search-models-test lower

* Copy-paste Ngoc's query-model-set-test and macro

https://github.com/metabase/metabase/pull/32624/files#diff-734923de9c62f49d6b708d64a214ee38d7d0fb1b2c20343bff7b947a6021b021R297-R332

https://github.com/metabase/metabase/pull/32624/files#diff-54344d8b75319d40a4cb2a2afe935500c23d34f0f3c63c51f005493d4dc4f8f1R690-R732

* Remove "database" and "table" from test expectation

Those failed in this PR,
though they passed in 32624

* Revert test for pulse/preview_card_info/, as it'll be removed

* Remove with-verified-cards, which I needlessly copied into this PR

That's needed in 32624,
but not this PR.

* Add a test for the archived-string param

---------

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
---
 test/metabase/api/search_test.clj         | 62 +++++++++++++++++++++++
 test/metabase/api/timeline_event_test.clj | 16 ++++++
 2 files changed, 78 insertions(+)

diff --git a/test/metabase/api/search_test.clj b/test/metabase/api/search_test.clj
index 3bf42b607ea..75658cd5da9 100644
--- a/test/metabase/api/search_test.clj
+++ b/test/metabase/api/search_test.clj
@@ -285,6 +285,16 @@
     (with-search-items-in-root-collection "test"
       (is (= [] (:available_models (mt/user-http-request :crowberto :get 200 "search?q=noresults")))))))
 
+(deftest query-model-set-test
+  (let [search-term "query-model-set"]
+    (with-search-items-in-root-collection search-term
+      (testing "should return a list of models that search result will return"
+        (is (= #{"dashboard" "dataset" "segment" "collection" "action" "metric" "card"}
+               (set (mt/user-http-request :crowberto :get 200 "search/models" :q search-term)))))
+      (testing "should not return models when there is no search result"
+        (is (= #{}
+               (set (mt/user-http-request :crowberto :get 200 "search/models" :q "noresults"))))))))
+
 (def ^:private dashboard-count-results
   (letfn [(make-card [dashboard-count]
             (make-result (str "dashboard-count " dashboard-count) :dashboardcard_count dashboard-count,
@@ -755,3 +765,55 @@
     (snowplow-test/with-fake-snowplow-collector
       (mt/user-http-request :crowberto :get 200 "search" :q "test" :archived true)
       (is (empty? (snowplow-test/pop-event-data-and-user-id!))))))
+
+(deftest available-models-should-be-independent-of-models-param-test
+  (testing "if a search request includes `models` params, the `available_models` from the response should not be restricted by it"
+    (let [search-term "Available models"]
+      (with-search-items-in-root-collection search-term
+        (testing "GET /api/search"
+          (is (= #{"dashboard" "dataset" "segment" "collection" "action" "metric" "card"}
+                 (-> (mt/user-http-request :crowberto :get 200 "search" :q search-term :models "card")
+                     :available_models
+                     set)))
+
+          (is (= #{"dashboard" "dataset" "segment" "collection" "action" "metric" "card"}
+                 (-> (mt/user-http-request :crowberto :get 200 "search" :q search-term :models "card" :models "dashboard")
+                     :available_models
+                     set))))
+
+        (testing "GET /api/search/models"
+          (is (= #{"dashboard" "dataset" "segment" "collection" "action" "metric" "card"}
+                 (set (mt/user-http-request :crowberto :get 200 "search/models" :q search-term :models "card"))))
+
+          (is (= #{"dashboard" "dataset" "segment" "collection" "action" "metric" "card"}
+                 (set (mt/user-http-request :crowberto :get 200 "search/models" :q search-term :models "card" :models "dashboard")))))))))
+
+(deftest models-table-db-id-test
+  (testing "search/models request includes `table-db-id` param"
+    (with-search-items-in-root-collection "Available models"
+      (testing "`table-db-id` is invalid"
+        (is (=? {:errors {:table-db-id "nullable value must be an integer greater than zero."}}
+                (mt/user-http-request :crowberto :get 400 "search/models" :table-db-id -1))))
+      (testing "`table-db-id` is for a non-existent database"
+        (is (= #{"dashboard" "database" "segment" "collection" "action" "metric"}
+               (set (mt/user-http-request :crowberto :get 200 "search/models" :table-db-id Integer/MAX_VALUE)))))
+      (testing "`table-db-id` is for an existing database"
+        (is (= #{"dashboard" "database" "segment" "collection" "action" "metric" "card" "dataset" "table"}
+               (set (mt/user-http-request :crowberto :get 200 "search/models" :table-db-id (mt/id)))))))))
+
+(deftest models-archived-string-test
+  (testing "search/models request includes `archived-string` param"
+    (with-search-items-in-root-collection "Available models"
+      (mt/with-temp [Card        {model-id :id} action-model-params
+                     Action      _              (archived {:name     "test action"
+                                                           :type     :query
+                                                           :model_id model-id})]
+      (testing "`archived-string` is invalid"
+        (is (=? {:message "Invalid input: [\"value must be a valid boolean string ('true' or 'false').\"]"}
+                (mt/user-http-request :crowberto :get 500 "search/models" :archived-string 1))))
+      (testing "`archived-string` is 'false'"
+        (is (= #{"dashboard" "database" "segment" "collection" "action" "metric" "card" "dataset" "table"}
+               (set (mt/user-http-request :crowberto :get 200 "search/models" :archived-string "false")))))
+      (testing "`archived-string` is 'true'"
+        (is (= #{"action"}
+               (set (mt/user-http-request :crowberto :get 200 "search/models" :archived-string "true")))))))))
diff --git a/test/metabase/api/timeline_event_test.clj b/test/metabase/api/timeline_event_test.clj
index 537b9709dcb..d7c72d6f784 100644
--- a/test/metabase/api/timeline_event_test.clj
+++ b/test/metabase/api/timeline_event_test.clj
@@ -66,3 +66,19 @@
           (is (true?
                (->> (mt/user-http-request :rasta :put 200 (str "timeline-event/" (u/the-id event)) {:archived true})
                     :archived))))))))
+
+(deftest delete-timeline-event-test
+  (testing "DELETE /api/timeline-event/:id"
+    (mt/with-temp [Collection    {collection-id :id} {:name "Example Data"}
+                   Timeline      {timeline-id :id}   {:name "Some Events"
+                                                      :collection_id collection-id}
+                   TimelineEvent {event-id :id}      {:name "Example Event"
+                                                      :timeline_id timeline-id}]
+      (testing "delete an existing timeline-event `id`"
+        (is (= nil
+               (mt/user-http-request :rasta :delete 204 (str "timeline-event/" event-id))))
+        (is (= "Not found."
+               (mt/user-http-request :rasta :get 404 (str "timeline-event/" event-id)))))
+      (testing "delete a non-existent timeline-event `id`"
+        (is (= "Not found."
+               (mt/user-http-request :rasta :get 404 (str "timeline-event/" Integer/MAX_VALUE))))))))
-- 
GitLab