From 19a55b5a5ba1e8f676b72cf7e4314c8d7e043f99 Mon Sep 17 00:00:00 2001 From: "Michael S. Klishin" Date: Mon, 5 Mar 2012 17:09:59 +0400 Subject: [PATCH] Initial factory/fixture DSL bits --- src/monger/testing.clj | 24 +++++++++++++++++++++++- test/monger/test/factory_dsl.clj | 19 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 test/monger/test/factory_dsl.clj diff --git a/src/monger/testing.clj b/src/monger/testing.clj index 492d3a7..11f9615 100644 --- a/src/monger/testing.clj +++ b/src/monger/testing.clj @@ -8,7 +8,8 @@ ;; You must not remove this notice, or any other, from this software. (ns monger.testing - (:require [monger collection])) + (:require [monger collection]) + (:import [org.bson.types ObjectId])) ;; @@ -35,3 +36,24 @@ (monger.collection/remove ~coll-arg) (f#) (monger.collection/remove ~coll-arg)))) + + +(def factories (atom {})) +(def defaults (atom {})) + + +(defn defaults-for + [f-group & { :as attributes }] + (swap! defaults (fn [v] + (assoc v (name f-group) attributes)))) + +(defn factory + [f-group f-name & { :as attributes }] + (swap! factories (fn [a] + (assoc-in a [(name f-group) (name f-name)] attributes)))) + +(defn build + [f-group f-name & { :as overrides }] + (let [d (@defaults (name f-group)) + attributes (get-in @factories [(name f-group) (name f-name)])] + (merge { :_id (ObjectId.) } d attributes overrides))) diff --git a/test/monger/test/factory_dsl.clj b/test/monger/test/factory_dsl.clj new file mode 100644 index 0000000..949a430 --- /dev/null +++ b/test/monger/test/factory_dsl.clj @@ -0,0 +1,19 @@ +(ns monger.test.factory-dsl + (:use [clojure.test] + [monger.testing] + [clj-time.core :only [days ago weeks]])) + +(defaults-for "domains" + :ipv6-enabled false) + +(factory "domains" "clojure.org" + :name "clojure.org" + :created-at (-> 2 days ago)) + +(deftest test-building-documents-from-a-factory-case-1 + (let [t (-> 2 weeks ago) + doc (build "domains" "clojure.org" :created-at t)] + (is (:_id doc)) + (is (= t (:created-at doc))) + (is (= "clojure.org" (:name doc))) + (is (false? (:ipv6-enabled doc))))) \ No newline at end of file