From cedfecbbbd2ce1f4c6da7b8a7deefde41b7cda1f Mon Sep 17 00:00:00 2001 From: "Michael S. Klishin" Date: Thu, 8 Mar 2012 12:18:02 +0400 Subject: [PATCH] Introduce monger.testing/memoized-oid (convenience function for defining referenced associations) --- src/monger/testing.clj | 12 +++++- test/monger/test/factory_dsl.clj | 69 ++++++++++++++++++++++---------- 2 files changed, 57 insertions(+), 24 deletions(-) diff --git a/src/monger/testing.clj b/src/monger/testing.clj index cd5e7cc..89c9aa0 100644 --- a/src/monger/testing.clj +++ b/src/monger/testing.clj @@ -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.)))) diff --git a/test/monger/test/factory_dsl.clj b/test/monger/test/factory_dsl.clj index 031d4df..08f6364 100644 --- a/test/monger/test/factory_dsl.clj +++ b/test/monger/test/factory_dsl.clj @@ -18,30 +18,37 @@ (defaults-for "domains" :ipv6-enabled false) -(factory "domains" "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")]) +(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" - :name "elixir-lang.org" - :created-at (fn [] (now)) - :topics (fn [] ["programming" "erlang" "beam" "ruby"]) - :related { - :terms (fn [] ["erlang" "python" "ruby"]) - }) + (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"]) + })) + +(let [coll "pages"] + (factory coll "http://clojure.org/rationale" + :name "/rationale" + :domain-id (parent-id "domains" "clojure")) + (factory coll "http://clojure.org/jvm_hosted" + :name "/jvm_hosted") + (factory coll "http://clojure.org/runtime_polymorphism" + :name "/runtime_polymorphism") + (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"))) -(factory "pages" "http://clojure.org/rationale" - :name "/rationale" - :domain-id (parent-id "domains" "clojure")) -(factory "pages" "http://clojure.org/jvm_hosted" - :name "/jvm_hosted") -(factory "pages" "http://clojure.org/runtime_polymorphism" - :name "/runtime_polymorphism") -(factory "pages" "http://clojure.org/lisp" - :name "/lisp") (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")))))