Introduce monger.testing/memoized-oid (convenience function for defining referenced associations)

This commit is contained in:
Michael S. Klishin 2012-03-08 12:18:02 +04:00
parent 425327aafa
commit cedfecbbbd
2 changed files with 57 additions and 24 deletions

View file

@ -87,7 +87,8 @@
(f))))
(defn build
"Generates a new document and returns it"
"Generates a new document and returns it.
Unless _id field is defined by the factory, it is generated."
[f-group f-name & { :as overrides }]
(let [d (@defaults (name f-group))
attributes (get-in @factories [(name f-group) (name f-name)])
@ -95,7 +96,8 @@
(expand-all-with merged expand-for-building)))
(defn seed
"Generates and inserts a new document, then returns it"
"Generates and inserts a new document, then returns it.
Unless _id field is defined by the factory, it is generated."
[f-group f-name & { :as overrides }]
(io!
(let [d (@defaults (name f-group))
@ -133,3 +135,9 @@
"Returns last object id of a document inserted using given factory"
[f-group f-name]
(get-in @last-oids [(name f-group) (name f-name)]))
(def ^{ :doc "Returns a new object id. Generates it if needed, otherwise returns a cached version.
Useful for defining referenced associations between fixture documents." }
memoized-oid (memoize (fn [f-group f-name]
(ObjectId.))))

View file

@ -18,30 +18,37 @@
(defaults-for "domains"
:ipv6-enabled false)
(factory "domains" "clojure"
(let [coll "domains"]
(factory coll "clojure"
:name "clojure.org"
:created-at (-> 2 days ago)
:embedded [(embedded-doc "pages" "http://clojure.org/lisp")
(embedded-doc "pages" "http://clojure.org/jvm_hosted")
(embedded-doc "pages" "http://clojure.org/runtime_polymorphism")])
(factory "domains" "elixir"
(factory coll "elixir"
:_id (memoized-oid coll "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"
(let [coll "pages"]
(factory coll "http://clojure.org/rationale"
:name "/rationale"
:domain-id (parent-id "domains" "clojure"))
(factory "pages" "http://clojure.org/jvm_hosted"
(factory coll "http://clojure.org/jvm_hosted"
:name "/jvm_hosted")
(factory "pages" "http://clojure.org/runtime_polymorphism"
(factory coll "http://clojure.org/runtime_polymorphism"
:name "/runtime_polymorphism")
(factory "pages" "http://clojure.org/lisp"
(factory coll "http://clojure.org/lisp"
:name "/lisp")
(factory coll "http://elixir-lang.org/getting_started"
:name "/getting_started/1.html"
:domain-id (memoized-oid "domains" "elixir")))
(deftest test-building-documents-from-a-factory-case-1
(let [t (-> 2 weeks ago)
@ -73,6 +80,7 @@
(deftest test-building-documents-from-a-factory-case-4
(let [doc (build "domains" "elixir")]
(is (:_id doc))
(is (= (:_id doc) (memoized-oid "domains" "elixir")))
(is (instance? DateTime (:created-at doc)))
(is (= ["erlang" "python" "ruby"] (get-in doc [:related :terms])))
(is (= "elixir-lang.org" (:name doc)))
@ -82,6 +90,9 @@
(let [doc (build "pages" "http://clojure.org/rationale")]
(is (:domain-id doc))))
(deftest test-building-child-documents-that-use-memoized-oids-for-parents
(let [doc (build "pages" "http://elixir-lang.org/getting_started")]
(is (= (:domain-id doc) (memoized-oid "domains" "elixir")))))
(deftest test-seeding-documents-using-a-factory-case-1
@ -128,3 +139,17 @@
(seed-all "pages")
(is (>= (mc/count "domains") 1))
(is (>= (mc/count "pages") 4)))
(deftest test-named-memoized-object-ids
(let [oid1 (memoized-oid "domains" "clojure.org")
oid2 (memoized-oid "domains" "python.org")]
(is (= oid1 (memoized-oid "domains" "clojure.org")))
(is (= oid1 (memoized-oid "domains" "clojure.org")))
(is (= oid1 (memoized-oid "domains" "clojure.org")))
(is (= oid1 (memoized-oid "domains" "clojure.org")))
(is (not (= oid1 oid2)))
(is (= oid2 (memoized-oid "domains" "python.org")))
(is (= oid2 (memoized-oid "domains" "python.org")))
(is (= oid2 (memoized-oid "domains" "python.org")))))