Implement expansion (evaluation) of function values in factories

This commit is contained in:
Michael S. Klishin 2012-03-06 11:35:35 +04:00
parent b9016aff99
commit 2e47407ef0
2 changed files with 35 additions and 8 deletions

View file

@ -10,6 +10,7 @@
(ns monger.testing (ns monger.testing
(:require [monger.collection :as mc] (:require [monger.collection :as mc]
[monger.result :as mr]) [monger.result :as mr])
(:use [monger.internal.fn :only (expand-all) :as fntools])
(:import [org.bson.types ObjectId])) (:import [org.bson.types ObjectId]))
@ -39,6 +40,7 @@
(mc/remove ~coll-arg)))) (mc/remove ~coll-arg))))
(def factories (atom {})) (def factories (atom {}))
(def defaults (atom {})) (def defaults (atom {}))
@ -52,11 +54,12 @@
(swap! factories (fn [a] (swap! factories (fn [a]
(assoc-in a [(name f-group) (name f-name)] attributes)))) (assoc-in a [(name f-group) (name f-name)] attributes))))
(defn build (defn build
[f-group f-name & { :as overrides }] [f-group f-name & { :as overrides }]
(let [d (@defaults (name f-group)) (let [d (@defaults (name f-group))
attributes (get-in @factories [(name f-group) (name f-name)])] attributes (get-in @factories [(name f-group) (name f-name)])]
(merge { :_id (ObjectId.) } d attributes overrides))) (expand-all (merge { :_id (ObjectId.) } d attributes overrides))))
(defn seed (defn seed
[f-group f-name & { :as overrides }] [f-group f-name & { :as overrides }]

View file

@ -2,10 +2,11 @@
(:use [clojure.test] (:use [clojure.test]
[monger testing joda-time] [monger testing joda-time]
[monger.test.fixtures] [monger.test.fixtures]
[clj-time.core :only [days ago weeks]]) [clj-time.core :only [days ago weeks now]])
(:require [monger.collection :as mc] (:require [monger.collection :as mc]
[monger.test.helper :as helper]) [monger.test.helper :as helper])
(:import [org.bson.types ObjectId])) (:import [org.bson.types ObjectId]
[org.joda.time DateTime]))
(helper/connect!) (helper/connect!)
@ -17,13 +18,27 @@
(defaults-for "domains" (defaults-for "domains"
:ipv6-enabled false) :ipv6-enabled false)
(factory "domains" "clojure.org" (factory "domains" "clojure"
:name "clojure.org" :name "clojure.org"
:created-at (-> 2 days ago)) :created-at (-> 2 days ago))
(factory "domains" "elixir"
:name "elixir-lang.org"
:created-at (fn [] (now))
:topics (fn [] ["programming" "erlang" "beam" "ruby"])
:related {
:terms (fn [] ["erlang" "python" "ruby"])
})
(factory "pages" "http://clojure.org/rationale"
:name "/rationale"
:created-at (-> 2 days ago)
;; :domain-id (parent-id "domains" "clojure")
)
(deftest test-building-documents-from-a-factory-case-1 (deftest test-building-documents-from-a-factory-case-1
(let [t (-> 2 weeks ago) (let [t (-> 2 weeks ago)
doc (build "domains" "clojure.org" :created-at t)] doc (build "domains" "clojure" :created-at t)]
(is (:_id doc)) (is (:_id doc))
(is (= t (:created-at doc))) (is (= t (:created-at doc)))
(is (= "clojure.org" (:name doc))) (is (= "clojure.org" (:name doc)))
@ -31,7 +46,7 @@
(deftest test-building-documents-from-a-factory-case-2 (deftest test-building-documents-from-a-factory-case-2
(let [oid (ObjectId.) (let [oid (ObjectId.)
doc (build "domains" "clojure.org" :_id oid)] doc (build "domains" "clojure" :_id oid)]
(is (= oid (:_id doc))) (is (= oid (:_id doc)))
(is (= "clojure.org" (:name doc))) (is (= "clojure.org" (:name doc)))
(is (false? (:ipv6-enabled doc))))) (is (false? (:ipv6-enabled doc)))))
@ -39,19 +54,28 @@
(deftest test-building-documents-from-a-factory-case-3 (deftest test-building-documents-from-a-factory-case-3
(let [oid (ObjectId.) (let [oid (ObjectId.)
t (-> 3 weeks ago) t (-> 3 weeks ago)
doc (build "domains" "clojure.org" :_id oid :created-at t :name "clojurewerkz.org" :ipv6-enabled true)] doc (build "domains" "clojure" :_id oid :created-at t :name "clojurewerkz.org" :ipv6-enabled true)]
(is (= oid (:_id doc))) (is (= oid (:_id doc)))
(is (= t (:created-at doc))) (is (= t (:created-at doc)))
(is (= "clojurewerkz.org" (:name doc))) (is (= "clojurewerkz.org" (:name doc)))
(is (:ipv6-enabled doc)))) (is (:ipv6-enabled doc))))
(deftest test-building-documents-from-a-factory-case-4
(let [doc (build "domains" "elixir")]
(is (:_id doc))
(is (instance? DateTime (:created-at doc)))
(is (= ["erlang" "python" "ruby"] (get-in doc [:related :terms])))
(is (= "elixir-lang.org" (:name doc)))
(is (not (:ipv6-enabled doc)))))
(deftest test-seeding-documents-using-a-factory-case1 (deftest test-seeding-documents-using-a-factory-case1
(is (mc/empty? "domains")) (is (mc/empty? "domains"))
(let [t (-> 2 weeks ago) (let [t (-> 2 weeks ago)
doc (seed "domains" "clojure.org" :created-at t)] doc (seed "domains" "clojure" :created-at t)]
(is (= 1 (mc/count "domains"))) (is (= 1 (mc/count "domains")))
(is (:_id doc)) (is (:_id doc))
(is (= t (:created-at doc))) (is (= t (:created-at doc)))