Skip to content
Snippets Groups Projects
Unverified Commit 30c0bd02 authored by Alexander Solovyov's avatar Alexander Solovyov Committed by GitHub
Browse files

/api/testing/set-time: ability to set JVM time during development (#45230)

parent aa110f2e
Branches
Tags
No related merge requests found
......@@ -4,9 +4,12 @@
[clojure.java.jdbc :as jdbc]
[clojure.string :as str]
[compojure.core :refer [POST]]
[java-time.api :as t]
[java-time.clock]
[metabase.api.common :as api]
[metabase.config :as config]
[metabase.db :as mdb]
[metabase.util.date-2 :as u.date]
[metabase.util.files :as u.files]
[metabase.util.log :as log]
[metabase.util.malli.schema :as ms])
......@@ -125,4 +128,19 @@
{:status 200
:body body}))
(api/defendpoint POST "/set-time"
"Make java-time see world at exact time."
[:as {{:keys [time add-ms]} :body}]
{time [:maybe ms/TemporalString]
add-ms [:maybe ms/Int]}
(let [clock (when-let [time' (cond
time (u.date/parse time)
add-ms (t/plus (t/zoned-date-time)
(t/duration add-ms :millis)))]
(t/mock-clock (t/instant time') (t/zone-id time')))]
;; if time' is `nil`, we'll get system clock back
(alter-var-root #'java-time.clock/*clock* (constantly clock))
{:result (if clock :set :reset)
:time (t/instant)}))
(api/define-routes)
......@@ -3,10 +3,13 @@
[clojure.java.io :as io]
[clojure.java.jdbc :as jdbc]
[clojure.test :refer :all]
[java-time.api :as t]
[java-time.clock]
[metabase.api.testing :as testing]
[metabase.db :as mdb]
[metabase.test :as mt]
[metabase.util :as u]))
[metabase.util :as u]
[metabase.util.date-2 :as u.date]))
(set! *warn-on-reflection* true)
......@@ -54,3 +57,24 @@
(mt/with-temp-empty-app-db [_conn :h2]
(#'testing/restore-snapshot! snapshot-name)
(is (= [{:a 1}] (jdbc/query {:datasource (mdb/app-db)} ["select a from test_view"]))))))
(deftest set-time-test
(try
(let [t (t/zoned-date-time 2024 7 8 15 00 00)]
(testing "You can set exact date and reset it back"
(is (= {:result "set" :time "2024-07-08T15:00:00Z"}
(mt/user-http-request :rasta :post 200 "testing/set-time"
{:time (u.date/format t)})))
(is (=? {:result "reset" :time string?}
(mt/user-http-request :rasta :post 200 "testing/set-time"))))
(testing "You can move date with `add-ms`"
(is (= {:result "set" :time "2024-07-08T15:00:00Z"}
(mt/user-http-request :rasta :post 200 "testing/set-time"
{:time (u.date/format t)})))
(is (= {:result "set" :time "2024-07-08T15:00:10Z"}
(mt/user-http-request :rasta :post 200 "testing/set-time"
{:add-ms 10000})))
(is (=? {:result "reset" :time string?}
(mt/user-http-request :rasta :post 200 "testing/set-time")))))
(finally
(alter-var-root #'java-time.clock/*clock* (constantly nil)))))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment