(ns coinbase-pro.order-test (:require [coinbase-pro.order :as cb-order] [coinbase-pro.test-helpers :refer [gen-order gen-limit-order gen-limit-buy gen-limit-sell gen-stop-gain gen-stop-loss]] [fudo-clojure.common :refer [is-valid? is-invalid? sample]] [clojure.test :as t :refer [deftest testing is]])) (defn gen-amount [& {:keys [min max] :or {min 0 max (+ min 10000000)}}] (bigdec (+ (rand (- max min)) min))) (deftest test-order (testing "order" (is-valid? ::cb-order/base-order (gen-order)) (is-invalid? ::cb-order/base-order (gen-order { ::cb-order/product-id :btc-usd })) (is-invalid? ::cb-order/base-order (gen-order { ::cb-order/product-id "USD-BTC" })) (is-invalid? ::cb-order/base-order (gen-order { ::cb-order/product-id "BTCBTCBTC-USD" })) (is-invalid? ::cb-order/base-order (gen-order { ::cb-order/product-id "BTC-USDC" })) (is-invalid? ::cb-order/base-order (gen-order { ::cb-order/product-id nil })) (is-invalid? ::cb-order/base-order (gen-order { ::cb-order/side :oops })) (is-invalid? ::cb-order/base-order (gen-order { ::cb-order/side nil })) (is-invalid? ::cb-order/base-order (gen-order { ::cb-order/price "12345" })) (is-invalid? ::cb-order/base-order (gen-order { ::cb-order/price 5 })) (is-invalid? ::cb-order/base-order (gen-order { ::cb-order/price nil })) (is-invalid? ::cb-order/base-order (gen-order { ::cb-order/size "12345" })) (is-invalid? ::cb-order/base-order (gen-order { ::cb-order/size 5 })) (is-invalid? ::cb-order/base-order (gen-order { ::cb-order/size nil })))) (testing "buy-order" (is-valid? ::cb-order/buy-order (gen-order { ::cb-order/side :buy })) (is-invalid? ::cb-order/buy-order (gen-order { ::cb-order/side :sell }))) (testing "sell-order" (is-valid? ::cb-order/sell-order (gen-order { ::cb-order/side :sell })) (is-invalid? ::cb-order/sell-order (gen-order { ::cb-order/side :buy }))) (testing "limit-buy-order" (is-valid? ::cb-order/limit-buy-order (gen-limit-buy)) (is-invalid? ::cb-order/limit-buy-order (gen-limit-buy { ::cb-order/side :sell })) (is-invalid? ::cb-order/limit-buy-order (gen-limit-buy { ::cb-order/type :market }))) (testing "limit-sell-order" (is-valid? ::cb-order/limit-sell-order (gen-limit-sell)) (is-invalid? ::cb-order/limit-sell-order (gen-limit-sell { ::cb-order/side :buy })) (is-invalid? ::cb-order/limit-sell-order (gen-limit-sell { ::cb-order/type :market }))) (testing "stop-gain-order" (is-valid? ::cb-order/stop-gain-order (gen-stop-gain)) (is-invalid? ::cb-order/stop-gain-order (gen-stop-gain {::cb-order/stop :loss})) (is-invalid? ::cb-order/stop-gain-order (gen-stop-gain {::cb-order/stop-price nil})) (is-invalid? ::cb-order/stop-gain-order (gen-stop-gain {::cb-order/stop-price "12345"})) (is-invalid? ::cb-order/stop-gain-order (gen-stop-gain {::cb-order/stop-price 5})) (is-invalid? ::cb-order/stop-gain-order (gen-stop-gain {::cb-order/stop-price (bigdec 8) ::cb-order/price (bigdec 7)}))) (testing "stop-loss-order" (is-valid? ::cb-order/stop-loss-order (gen-stop-loss)) (is-invalid? ::cb-order/stop-loss-order (gen-stop-loss {::cb-order/stop :entry})) (is-invalid? ::cb-order/stop-loss-order (gen-stop-loss {::cb-order/stop-price nil})) (is-invalid? ::cb-order/stop-loss-order (gen-stop-loss {::cb-order/stop-price "12345"})) (is-invalid? ::cb-order/stop-loss-order (gen-stop-loss {::cb-order/stop-price 5})) (is-invalid? ::cb-order/stop-loss-order (gen-stop-loss {::cb-order/stop-price (bigdec 7) ::cb-order/price (bigdec 8)})))