Fork me on GitHub
#clojure-norway
<
2023-10-22
>
leifericf12:10:47

Jeg oppdaget at man kan bruke clojure.spec og clojure.test for å generere "tulledata" når man jobber med front-end:

(ns kubernetes
  (:require [clojure.spec.alpha :as spec]
            [clojure.test.check.generators :as gen]))

(spec/def ::name string?)
(spec/def ::status #{:running :stopped})
(spec/def ::version string?)
(spec/def ::uptime string?)

(defn get-mock-data []
  {:name (gen/sample (spec/gen ::name) 1)
   :status (gen/sample (spec/gen ::status) 1)
   :version (gen/sample (spec/gen ::version) 1)
   :uptime (gen/sample (spec/gen ::uptime) 1)})

(get-mock-data) ;; => {:name (""), :status (:stopped), :version (""), :uptime ("")}
Før jeg legger masse tid i å integrere med Kubernetes.

teodorlu12:10:37

Nice! Minner meg om denne snutten som @U04V5VAUN har delt tidligere: https://github.com/clojure/data.json/blob/master/src/test/clojure/clojure/data/json_gen_test.clj Genererer data på samme måte, og bruker generert data til å teste systemet.

👀 1
leifericf18:10:45

Nice! Det var nok clojure.spec.gen.alpha jeg burde brukt, ja, og ikke clojure.test.check.generators 😅

slipset19:10:35

Du kunne jo laget en spec for data’ene dine også:

ardoq.specs> (s/def ::data (s/keys :req-un [::name ::status ::version ::uptime]))
;; => :ardoq.specs/data
ardoq.specs> (gen/sample (s/gen ::data))
;; => ({:name "", :status :running, :version "", :uptime ""}
 {:name "P", :status :stopped, :version "", :uptime ""}
 {:name "", :status :stopped, :version "A", :uptime ""}
 {:name "P5", :status :running, :version "AVm", :uptime "57"}
 {:name "15", :status :running, :version "k9K", :uptime "3"}
 {:name "lgwr7", :status :running, :version "Vr7", :uptime "l0"}
 {:name "W", :status :running, :version "", :uptime "it6"}
 {:name "tI751", :status :stopped, :version "LAZU", :uptime ""}
 {:name "Huw", :status :stopped, :version "O", :uptime "oQIN"}
 {:name "cpIA68", :status :running, :version "CaF91", :uptime "5"})
ardoq.specs> 

😮 1
slipset19:10:11

man ville da kanskje valgt å spec’e uptime som pos-int?

slipset19:10:04

eller egentlig kanskje nat-int? siden du kanskje vil tillate 0 som uptime?

👍 1
slipset19:10:21

ardoq.specs> (s/def ::uptime nat-int?)
;; => :ardoq.specs/uptime
ardoq.specs> (gen/sample (s/gen ::data))
;; => ({:name "", :status :running, :version "", :uptime 1}
 {:name "8", :status :running, :version "a", :uptime 0}
 {:name "", :status :stopped, :version "h", :uptime 1}
 {:name "17", :status :stopped, :version "", :uptime 0}
 {:name "L", :status :stopped, :version "Sl4", :uptime 1}
 {:name "pabA", :status :stopped, :version "", :uptime 2}
 {:name "5n6j", :status :running, :version "n3", :uptime 6}
 {:name "6j", :status :stopped, :version "BR", :uptime 20}
 {:name "", :status :running, :version "HVO18", :uptime 7}
 {:name "", :status :running, :version "", :uptime 1})
ardoq.specs> 

leifericf04:10:23

Nice, takk for tipsene! Kan man forresten bruke samme spec for å validere innkommende data fra API-et til Kubernetes senere, og er det lurt? :thinking_face:

slipset07:10:45

Ja, det er jo mye derfor det ble skrevet. Det det ikke anbefales å brukes til er coercion.