Skip to content

Instantly share code, notes, and snippets.

@little-arhat
Last active March 1, 2017 21:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save little-arhat/c4da3415b88a0ddf8214f09dc44fff9a to your computer and use it in GitHub Desktop.
Save little-arhat/c4da3415b88a0ddf8214f09dc44fff9a to your computer and use it in GitHub Desktop.
(ns our.internal.library.test.client
(:require [clojure.core.async :as a]
[com.stuartsierra.component :as component]
[our.internal.library.http-client :as client]
[our.internal.library.test.mocks :as mocks]))
(defn define-mock
[mocks service])
(defrecord Client [mocks started-mocks]
component/Lifecycle
(start [this]
(assoc this :started-mocks (mocks/start mocks)))
(stop [this]
(mocks/check-mocks started-mocks)
this)
client/ServiceClient
(send-request [this method data]
(mocks/activation! started-mocks {:method method :arg data})))
(defmacro mocked-client
[& defs]
(let [mocks (->> defs
(partition 4)
(map (fn [[method pattern _ value]]
{:method method
:pattern pattern
:value value
:options (assoc (meta pattern)
:dynamic true)})))]
`(let [mocks# (-> (mocks/mocks)
~@(for [m mocks]
`(mocks/define {:method ~(:method m) :arg ~(:pattern m)}
(fn [v#] (a/go (~(:value m) (:arg v#)))) ~(:options m))))]
(map->Client {:mocks mocks#}))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment