From fb3a77eda083f711eb402119701612b43b7844cd Mon Sep 17 00:00:00 2001
From: Cam Saul <cam@geotip.com>
Date: Mon, 9 Mar 2015 14:00:41 -0700
Subject: [PATCH] test for PUT /api/meta/field/:id

---
 .dir-locals.el                        |  1 +
 src/metabase/api/meta/field.clj       | 10 ++++++---
 test/metabase/api/meta/field_test.clj | 29 +++++++++++++++++++++++++--
 3 files changed, 35 insertions(+), 5 deletions(-)

diff --git a/.dir-locals.el b/.dir-locals.el
index 1e8f15c48de..fec58bfee51 100644
--- a/.dir-locals.el
+++ b/.dir-locals.el
@@ -13,6 +13,7 @@
                               (let-400 1)
                               (let-404 1)
                               (match 1)
+                              (match-$ 1)
                               (macrolet 1)
                               (org-perms-case 1)
                               (upd 2)
diff --git a/src/metabase/api/meta/field.clj b/src/metabase/api/meta/field.clj
index 70b59ffac03..65c76e0f36b 100644
--- a/src/metabase/api/meta/field.clj
+++ b/src/metabase/api/meta/field.clj
@@ -1,18 +1,22 @@
 (ns metabase.api.meta.field
   (:require [compojure.core :refer [GET PUT]]
+            [medley.core :as medley]
             [metabase.api.common :refer :all]
             [metabase.db :refer :all]
             (metabase.models [hydrate :refer [hydrate]]
-                             [field :refer [Field]])))
+                             [field :refer [Field]])
+            [metabase.util :as u]))
 
 (defendpoint GET "/:id" [id]
   (->404 (sel :one Field :id id)
          read-check
          (hydrate [:table :db])))
 
-(defendpoint PUT "/:id" [id :as {{:keys [special_type preview_display description]} :body}]
+(defendpoint PUT "/:id" [id :as {body :body}]
   (write-check Field id)
-  (upd Field id :special_type special_type :preview_display preview_display :description description))
+  (check-500 (->> (u/select-non-nil-keys body :special_type :preview_display :description)
+                  (medley/mapply upd Field id)))
+  (sel :one Field :id id))
 
 (defendpoint GET "/:id/summary" [id]
   (let-404 [{:keys [count distinct-count] :as field} (sel :one Field :id id)]
diff --git a/test/metabase/api/meta/field_test.clj b/test/metabase/api/meta/field_test.clj
index 6c9b4d7947e..dbce6b58334 100644
--- a/test/metabase/api/meta/field_test.clj
+++ b/test/metabase/api/meta/field_test.clj
@@ -4,7 +4,9 @@
             (metabase.models [field :refer [Field]]
                              [table :refer [Table]])
             [metabase.test-data :refer :all]
-            [metabase.test.util :refer [match-$]]))
+            [metabase.test.util :refer [match-$ expect-eval-actual-first]]))
+
+
 
 ;; ## GET /api/meta/field/:id
 (expect
@@ -43,8 +45,31 @@
        :base_type "TextField"})
   ((user->client :rasta) :get 200 (format "meta/field/%d" (field->id :users :name))))
 
-;; GET /api/meta/field/:id/summary
 
+;; ## GET /api/meta/field/:id/summary
 (expect [["count" 75]      ; why doesn't this come back as a dictionary ?
          ["distincts" 75]]
   ((user->client :rasta) :get 200 (format "meta/field/%d/summary" (field->id :categories :name))))
+
+
+;; ## PUT /api/meta/field/:id
+;; Check that we can update a Field
+(expect-eval-actual-first
+    (match-$ (sel :one Field :id (field->id :venues :latitude))
+      {:description nil
+       :table_id (table->id :venues)
+       :special_type "latitude"
+       :name "LONGITUDE"
+       :updated_at $
+       :active true
+       :id $
+       :field_type "dimension"
+       :position 0
+       :preview_display true
+       :created_at $
+       :base_type "FloatField"})
+  (let [result ((user->client :rasta) :put 200 (format "meta/field/:id" (field->id :venues :latitude)) {:special_type :latitude})]
+    ;; this is sketchy. But return the Field back to its unmodified state so it won't affect other unit tests
+    (upd Field (field->id :venues :latitude) :special_type nil)
+    ;; return the modified Field
+    result))
-- 
GitLab