mongoid-pre 2.0.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. data/.gitignore +6 -0
  2. data/.watchr +24 -0
  3. data/MIT_LICENSE +20 -0
  4. data/README.rdoc +49 -0
  5. data/Rakefile +52 -0
  6. data/VERSION +1 -0
  7. data/caliper.yml +4 -0
  8. data/lib/mongoid.rb +135 -0
  9. data/lib/mongoid/associations.rb +263 -0
  10. data/lib/mongoid/associations/belongs_to_related.rb +59 -0
  11. data/lib/mongoid/associations/embedded_in.rb +64 -0
  12. data/lib/mongoid/associations/embeds_many.rb +193 -0
  13. data/lib/mongoid/associations/embeds_one.rb +95 -0
  14. data/lib/mongoid/associations/has_many_related.rb +133 -0
  15. data/lib/mongoid/associations/has_one_related.rb +81 -0
  16. data/lib/mongoid/associations/meta_data.rb +28 -0
  17. data/lib/mongoid/associations/options.rb +52 -0
  18. data/lib/mongoid/associations/proxy.rb +31 -0
  19. data/lib/mongoid/attributes.rb +185 -0
  20. data/lib/mongoid/callbacks.rb +18 -0
  21. data/lib/mongoid/collection.rb +119 -0
  22. data/lib/mongoid/collections/cyclic_iterator.rb +34 -0
  23. data/lib/mongoid/collections/master.rb +28 -0
  24. data/lib/mongoid/collections/mimic.rb +46 -0
  25. data/lib/mongoid/collections/operations.rb +41 -0
  26. data/lib/mongoid/collections/slaves.rb +44 -0
  27. data/lib/mongoid/commands.rb +161 -0
  28. data/lib/mongoid/commands/create.rb +19 -0
  29. data/lib/mongoid/commands/delete.rb +16 -0
  30. data/lib/mongoid/commands/delete_all.rb +25 -0
  31. data/lib/mongoid/commands/deletion.rb +18 -0
  32. data/lib/mongoid/commands/destroy.rb +17 -0
  33. data/lib/mongoid/commands/destroy_all.rb +25 -0
  34. data/lib/mongoid/commands/save.rb +30 -0
  35. data/lib/mongoid/components.rb +31 -0
  36. data/lib/mongoid/config.rb +86 -0
  37. data/lib/mongoid/contexts.rb +25 -0
  38. data/lib/mongoid/contexts/enumerable.rb +151 -0
  39. data/lib/mongoid/contexts/ids.rb +25 -0
  40. data/lib/mongoid/contexts/mongo.rb +285 -0
  41. data/lib/mongoid/contexts/paging.rb +42 -0
  42. data/lib/mongoid/criteria.rb +239 -0
  43. data/lib/mongoid/criterion/complex.rb +21 -0
  44. data/lib/mongoid/criterion/exclusion.rb +65 -0
  45. data/lib/mongoid/criterion/inclusion.rb +93 -0
  46. data/lib/mongoid/criterion/optional.rb +136 -0
  47. data/lib/mongoid/cursor.rb +82 -0
  48. data/lib/mongoid/deprecation.rb +22 -0
  49. data/lib/mongoid/dirty.rb +203 -0
  50. data/lib/mongoid/document.rb +306 -0
  51. data/lib/mongoid/errors.rb +77 -0
  52. data/lib/mongoid/extensions.rb +99 -0
  53. data/lib/mongoid/extensions/array/accessors.rb +17 -0
  54. data/lib/mongoid/extensions/array/aliasing.rb +4 -0
  55. data/lib/mongoid/extensions/array/assimilation.rb +26 -0
  56. data/lib/mongoid/extensions/array/conversions.rb +27 -0
  57. data/lib/mongoid/extensions/array/parentization.rb +13 -0
  58. data/lib/mongoid/extensions/big_decimal/conversions.rb +19 -0
  59. data/lib/mongoid/extensions/binary/conversions.rb +17 -0
  60. data/lib/mongoid/extensions/boolean/conversions.rb +16 -0
  61. data/lib/mongoid/extensions/date/conversions.rb +15 -0
  62. data/lib/mongoid/extensions/datetime/conversions.rb +17 -0
  63. data/lib/mongoid/extensions/float/conversions.rb +16 -0
  64. data/lib/mongoid/extensions/hash/accessors.rb +38 -0
  65. data/lib/mongoid/extensions/hash/assimilation.rb +30 -0
  66. data/lib/mongoid/extensions/hash/conversions.rb +15 -0
  67. data/lib/mongoid/extensions/hash/criteria_helpers.rb +20 -0
  68. data/lib/mongoid/extensions/hash/scoping.rb +12 -0
  69. data/lib/mongoid/extensions/integer/conversions.rb +16 -0
  70. data/lib/mongoid/extensions/nil/assimilation.rb +13 -0
  71. data/lib/mongoid/extensions/object/conversions.rb +27 -0
  72. data/lib/mongoid/extensions/objectid/conversions.rb +15 -0
  73. data/lib/mongoid/extensions/proc/scoping.rb +12 -0
  74. data/lib/mongoid/extensions/string/conversions.rb +15 -0
  75. data/lib/mongoid/extensions/string/inflections.rb +97 -0
  76. data/lib/mongoid/extensions/symbol/inflections.rb +36 -0
  77. data/lib/mongoid/extensions/time/conversions.rb +18 -0
  78. data/lib/mongoid/extras.rb +61 -0
  79. data/lib/mongoid/factory.rb +19 -0
  80. data/lib/mongoid/field.rb +52 -0
  81. data/lib/mongoid/fields.rb +62 -0
  82. data/lib/mongoid/finders.rb +136 -0
  83. data/lib/mongoid/identity.rb +39 -0
  84. data/lib/mongoid/indexes.rb +27 -0
  85. data/lib/mongoid/javascript.rb +21 -0
  86. data/lib/mongoid/javascript/functions.yml +37 -0
  87. data/lib/mongoid/matchers.rb +36 -0
  88. data/lib/mongoid/matchers/all.rb +11 -0
  89. data/lib/mongoid/matchers/default.rb +26 -0
  90. data/lib/mongoid/matchers/exists.rb +13 -0
  91. data/lib/mongoid/matchers/gt.rb +11 -0
  92. data/lib/mongoid/matchers/gte.rb +11 -0
  93. data/lib/mongoid/matchers/in.rb +11 -0
  94. data/lib/mongoid/matchers/lt.rb +11 -0
  95. data/lib/mongoid/matchers/lte.rb +11 -0
  96. data/lib/mongoid/matchers/ne.rb +11 -0
  97. data/lib/mongoid/matchers/nin.rb +11 -0
  98. data/lib/mongoid/matchers/size.rb +11 -0
  99. data/lib/mongoid/memoization.rb +27 -0
  100. data/lib/mongoid/named_scope.rb +42 -0
  101. data/lib/mongoid/observable.rb +30 -0
  102. data/lib/mongoid/paths.rb +54 -0
  103. data/lib/mongoid/persistence.rb +27 -0
  104. data/lib/mongoid/persistence/command.rb +20 -0
  105. data/lib/mongoid/persistence/insert.rb +71 -0
  106. data/lib/mongoid/persistence/update.rb +78 -0
  107. data/lib/mongoid/scope.rb +75 -0
  108. data/lib/mongoid/state.rb +32 -0
  109. data/lib/mongoid/timestamps.rb +27 -0
  110. data/lib/mongoid/validations.rb +51 -0
  111. data/lib/mongoid/validations/associated.rb +32 -0
  112. data/lib/mongoid/validations/locale/en.yml +4 -0
  113. data/lib/mongoid/validations/uniqueness.rb +22 -0
  114. data/lib/mongoid/versioning.rb +26 -0
  115. data/mongoid.gemspec +413 -0
  116. data/perf/benchmark.rb +77 -0
  117. data/spec/integration/mongoid/associations_spec.rb +340 -0
  118. data/spec/integration/mongoid/attributes_spec.rb +22 -0
  119. data/spec/integration/mongoid/commands_spec.rb +230 -0
  120. data/spec/integration/mongoid/contexts/enumerable_spec.rb +33 -0
  121. data/spec/integration/mongoid/criteria_spec.rb +272 -0
  122. data/spec/integration/mongoid/dirty_spec.rb +70 -0
  123. data/spec/integration/mongoid/document_spec.rb +650 -0
  124. data/spec/integration/mongoid/extensions_spec.rb +22 -0
  125. data/spec/integration/mongoid/finders_spec.rb +119 -0
  126. data/spec/integration/mongoid/inheritance_spec.rb +137 -0
  127. data/spec/integration/mongoid/named_scope_spec.rb +46 -0
  128. data/spec/integration/mongoid/persistence/update_spec.rb +46 -0
  129. data/spec/models/address.rb +39 -0
  130. data/spec/models/animal.rb +6 -0
  131. data/spec/models/callbacks.rb +18 -0
  132. data/spec/models/comment.rb +8 -0
  133. data/spec/models/country_code.rb +6 -0
  134. data/spec/models/employer.rb +5 -0
  135. data/spec/models/game.rb +7 -0
  136. data/spec/models/inheritance.rb +56 -0
  137. data/spec/models/location.rb +5 -0
  138. data/spec/models/mixed_drink.rb +4 -0
  139. data/spec/models/name.rb +13 -0
  140. data/spec/models/namespacing.rb +11 -0
  141. data/spec/models/patient.rb +6 -0
  142. data/spec/models/person.rb +99 -0
  143. data/spec/models/pet.rb +7 -0
  144. data/spec/models/pet_owner.rb +6 -0
  145. data/spec/models/phone.rb +7 -0
  146. data/spec/models/post.rb +15 -0
  147. data/spec/models/translation.rb +5 -0
  148. data/spec/models/vet_visit.rb +5 -0
  149. data/spec/spec.opts +3 -0
  150. data/spec/spec_helper.rb +31 -0
  151. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +145 -0
  152. data/spec/unit/mongoid/associations/embedded_in_spec.rb +193 -0
  153. data/spec/unit/mongoid/associations/embeds_many_spec.rb +516 -0
  154. data/spec/unit/mongoid/associations/embeds_one_spec.rb +282 -0
  155. data/spec/unit/mongoid/associations/has_many_related_spec.rb +418 -0
  156. data/spec/unit/mongoid/associations/has_one_related_spec.rb +179 -0
  157. data/spec/unit/mongoid/associations/meta_data_spec.rb +88 -0
  158. data/spec/unit/mongoid/associations/options_spec.rb +192 -0
  159. data/spec/unit/mongoid/associations_spec.rb +595 -0
  160. data/spec/unit/mongoid/attributes_spec.rb +507 -0
  161. data/spec/unit/mongoid/callbacks_spec.rb +55 -0
  162. data/spec/unit/mongoid/collection_spec.rb +187 -0
  163. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
  164. data/spec/unit/mongoid/collections/master_spec.rb +41 -0
  165. data/spec/unit/mongoid/collections/mimic_spec.rb +43 -0
  166. data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
  167. data/spec/unit/mongoid/commands/create_spec.rb +31 -0
  168. data/spec/unit/mongoid/commands/delete_all_spec.rb +59 -0
  169. data/spec/unit/mongoid/commands/delete_spec.rb +38 -0
  170. data/spec/unit/mongoid/commands/destroy_all_spec.rb +21 -0
  171. data/spec/unit/mongoid/commands/destroy_spec.rb +51 -0
  172. data/spec/unit/mongoid/commands/save_spec.rb +107 -0
  173. data/spec/unit/mongoid/commands_spec.rb +270 -0
  174. data/spec/unit/mongoid/config_spec.rb +176 -0
  175. data/spec/unit/mongoid/contexts/enumerable_spec.rb +421 -0
  176. data/spec/unit/mongoid/contexts/mongo_spec.rb +682 -0
  177. data/spec/unit/mongoid/contexts_spec.rb +25 -0
  178. data/spec/unit/mongoid/criteria_spec.rb +824 -0
  179. data/spec/unit/mongoid/criterion/complex_spec.rb +19 -0
  180. data/spec/unit/mongoid/criterion/exclusion_spec.rb +91 -0
  181. data/spec/unit/mongoid/criterion/inclusion_spec.rb +219 -0
  182. data/spec/unit/mongoid/criterion/optional_spec.rb +319 -0
  183. data/spec/unit/mongoid/cursor_spec.rb +74 -0
  184. data/spec/unit/mongoid/deprecation_spec.rb +24 -0
  185. data/spec/unit/mongoid/dirty_spec.rb +286 -0
  186. data/spec/unit/mongoid/document_spec.rb +818 -0
  187. data/spec/unit/mongoid/errors_spec.rb +103 -0
  188. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
  189. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
  190. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +35 -0
  191. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
  192. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +22 -0
  193. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
  194. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
  195. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +102 -0
  196. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +67 -0
  197. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
  198. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
  199. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +46 -0
  200. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +21 -0
  201. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
  202. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
  203. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
  204. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +24 -0
  205. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +57 -0
  206. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
  207. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +17 -0
  208. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
  209. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +91 -0
  210. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +70 -0
  211. data/spec/unit/mongoid/extras_spec.rb +102 -0
  212. data/spec/unit/mongoid/factory_spec.rb +31 -0
  213. data/spec/unit/mongoid/field_spec.rb +143 -0
  214. data/spec/unit/mongoid/fields_spec.rb +181 -0
  215. data/spec/unit/mongoid/finders_spec.rb +404 -0
  216. data/spec/unit/mongoid/identity_spec.rb +109 -0
  217. data/spec/unit/mongoid/indexes_spec.rb +93 -0
  218. data/spec/unit/mongoid/javascript_spec.rb +48 -0
  219. data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
  220. data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
  221. data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
  222. data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
  223. data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
  224. data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
  225. data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
  226. data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
  227. data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
  228. data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
  229. data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
  230. data/spec/unit/mongoid/matchers_spec.rb +329 -0
  231. data/spec/unit/mongoid/memoization_spec.rb +75 -0
  232. data/spec/unit/mongoid/named_scope_spec.rb +123 -0
  233. data/spec/unit/mongoid/observable_spec.rb +46 -0
  234. data/spec/unit/mongoid/paths_spec.rb +124 -0
  235. data/spec/unit/mongoid/persistence/insert_spec.rb +175 -0
  236. data/spec/unit/mongoid/persistence/update_spec.rb +148 -0
  237. data/spec/unit/mongoid/persistence_spec.rb +40 -0
  238. data/spec/unit/mongoid/scope_spec.rb +240 -0
  239. data/spec/unit/mongoid/state_spec.rb +83 -0
  240. data/spec/unit/mongoid/timestamps_spec.rb +25 -0
  241. data/spec/unit/mongoid/validations/associated_spec.rb +103 -0
  242. data/spec/unit/mongoid/validations/uniqueness_spec.rb +47 -0
  243. data/spec/unit/mongoid/validations_spec.rb +190 -0
  244. data/spec/unit/mongoid/versioning_spec.rb +41 -0
  245. data/spec/unit/mongoid_spec.rb +46 -0
  246. metadata +476 -0
@@ -0,0 +1,148 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Persistence::Update do
4
+
5
+ let(:document) do
6
+ Patient.new(:_id => Mongo::ObjectID.new.to_s)
7
+ end
8
+
9
+ let(:address) do
10
+ Address.new(:_id => Mongo::ObjectID.new.to_s, :street => "Oxford St")
11
+ end
12
+
13
+ let(:collection) do
14
+ stub.quacks_like(Mongoid::Collection.allocate)
15
+ end
16
+
17
+ before do
18
+ document.stubs(:collection).returns(collection)
19
+ end
20
+
21
+ describe "#initialize" do
22
+
23
+ let(:update) do
24
+ Mongoid::Persistence::Update.new(document)
25
+ end
26
+
27
+ it "sets the document" do
28
+ update.document.should == document
29
+ end
30
+
31
+ it "sets the collection" do
32
+ update.collection.should == document.collection
33
+ end
34
+
35
+ it "defaults validation to true" do
36
+ update.validate.should == true
37
+ end
38
+
39
+ it "sets the options" do
40
+ update.options.should ==
41
+ { :multi => false, :safe => Mongoid.persist_in_safe_mode }
42
+ end
43
+ end
44
+
45
+ describe "#persist" do
46
+
47
+ def root_set_expectation
48
+ lambda {
49
+ collection.expects(:update).with(
50
+ { "_id" => document.id },
51
+ { "$set" => document.setters },
52
+ :multi => false,
53
+ :safe => true
54
+ ).returns("Object")
55
+ }
56
+ end
57
+
58
+ def embedded_set_expectation
59
+ lambda {
60
+ collection.expects(:update).with(
61
+ { "_id" => document.id, "addresses._id" => address.id },
62
+ { "$set" => address.setters },
63
+ :multi => false,
64
+ :safe => true
65
+ ).returns("Object")
66
+ }
67
+ end
68
+
69
+ let(:update) do
70
+ Mongoid::Persistence::Update.new(document)
71
+ end
72
+
73
+ context "when the document is changed" do
74
+
75
+ before do
76
+ document.title = "Sir"
77
+ end
78
+
79
+ context "when the document is valid" do
80
+
81
+ it "performs a $set for changed fields" do
82
+ root_set_expectation.call
83
+ update.persist.should == true
84
+ end
85
+
86
+ it "moves the changed fields to previously changed" do
87
+ root_set_expectation.call
88
+ update.persist
89
+ document.changed?.should == false
90
+ end
91
+
92
+ end
93
+
94
+ context "when the document is not valid" do
95
+
96
+ before do
97
+ document.stubs(:valid?).returns(false)
98
+ end
99
+
100
+ it "returns false" do
101
+ update.persist.should == false
102
+ end
103
+ end
104
+
105
+ context "when not validating" do
106
+
107
+ before do
108
+ update.instance_variable_set(:@validate, false)
109
+ document.stubs(:valid?).returns(false)
110
+ end
111
+
112
+ after do
113
+ update.instance_variable_set(:@validate, true)
114
+ end
115
+
116
+ it "updates the document in the database" do
117
+ root_set_expectation.call
118
+ update.persist.should == true
119
+ end
120
+ end
121
+
122
+ context "when the document is embedded" do
123
+
124
+ let(:embedded) do
125
+ Mongoid::Persistence::Update.new(address)
126
+ end
127
+
128
+ before do
129
+ # TODO: What to do about composite keys?
130
+ document.addresses << address
131
+ address.city = "London"
132
+ end
133
+
134
+ it "performs a $set for the embedded changed fields" do
135
+ embedded_set_expectation.call
136
+ embedded.persist
137
+ end
138
+ end
139
+ end
140
+
141
+ context "when the document is not changed" do
142
+
143
+ it "returns true" do
144
+ update.persist.should == true
145
+ end
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,40 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Persistence do
4
+
5
+ let(:person) do
6
+ Person.new
7
+ end
8
+
9
+ describe "#insert" do
10
+
11
+ let(:insert) do
12
+ stub.quacks_like(Mongoid::Persistence::Insert.allocate)
13
+ end
14
+
15
+ before do
16
+ Mongoid::Persistence::Insert.expects(:new).with(person).returns(insert)
17
+ end
18
+
19
+ it "delegates to the insert persistence command" do
20
+ insert.expects(:persist).returns(person)
21
+ person.insert.should == person
22
+ end
23
+ end
24
+
25
+ describe "#update" do
26
+
27
+ let(:update) do
28
+ stub.quacks_like(Mongoid::Persistence::Update.allocate)
29
+ end
30
+
31
+ before do
32
+ Mongoid::Persistence::Update.expects(:new).with(person).returns(update)
33
+ end
34
+
35
+ it "delegates to the update persistence command" do
36
+ update.expects(:persist).returns(true)
37
+ person.update.should == true
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,240 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Scope do
4
+
5
+ before do
6
+ Person.delete_all
7
+ end
8
+
9
+ describe "#==" do
10
+
11
+ before do
12
+ @scope = Mongoid::Scope.new(Person, {})
13
+ end
14
+
15
+ context "when other is a scope" do
16
+
17
+ context "when the parent and conditions match" do
18
+
19
+ before do
20
+ @other = Mongoid::Scope.new(Person, {})
21
+ end
22
+
23
+ it "returns true" do
24
+ @scope.should == @other
25
+ end
26
+
27
+ end
28
+
29
+ context "when the conditions do not match" do
30
+
31
+ before do
32
+ @other = Mongoid::Scope.new(Person, { :where => { :field => "value" } })
33
+ end
34
+
35
+ it "returns false" do
36
+ @scope.should_not == @other
37
+ end
38
+ end
39
+
40
+ end
41
+
42
+ context "when other is an enumerable" do
43
+
44
+ context "when the array contents are equal" do
45
+
46
+ before do
47
+ @other = []
48
+ end
49
+
50
+ it "returns true" do
51
+ @scope.should == @other
52
+ end
53
+
54
+ end
55
+
56
+ context "when the array contents are not equal" do
57
+
58
+ before do
59
+ @other = [ stub ]
60
+ end
61
+
62
+ it "returns false" do
63
+ @scope.should_not == @other
64
+ end
65
+
66
+ end
67
+ end
68
+
69
+ context "when other is an invalid type" do
70
+
71
+ it "returns false" do
72
+ Mongoid::Scope.new(Person, {}).should_not == stub
73
+ end
74
+
75
+ end
76
+
77
+ end
78
+
79
+ describe ".initialize" do
80
+
81
+ before do
82
+ @parent = Mongoid::Scope.new(Person, {})
83
+ end
84
+
85
+ context "when parent is another scope" do
86
+
87
+ before do
88
+ @scope = Mongoid::Scope.new(@parent, {})
89
+ end
90
+
91
+ it "does not set the class" do
92
+ @scope.klass.should be_nil
93
+ end
94
+
95
+ end
96
+
97
+ context "when parent is a class" do
98
+
99
+ before do
100
+ @scope = Mongoid::Scope.new(Person, {})
101
+ end
102
+
103
+ it "returns the parent class" do
104
+ @scope.klass.should == Person
105
+ end
106
+
107
+ end
108
+
109
+ context "when a block is passed in" do
110
+
111
+ before do
112
+ @scope = Mongoid::Scope.new(Person, {}) do
113
+ def extended
114
+ "extended"
115
+ end
116
+ end
117
+ end
118
+
119
+ it "extends the block" do
120
+ @scope.extended.should == "extended"
121
+ end
122
+
123
+ end
124
+
125
+ end
126
+
127
+ describe "#method_missing" do
128
+
129
+ context "when a scope has been defined for the name" do
130
+
131
+ before do
132
+ @defined = mock
133
+ @class = mock
134
+ @class.expects(:scopes).twice.returns({ :testing => @defined })
135
+ @scope = Mongoid::Scope.new(@class, {})
136
+ end
137
+
138
+ it "calls the matching scope" do
139
+ @defined.expects(:call).with(@scope, "Testing").returns(true)
140
+ @scope.testing("Testing").should be_true
141
+ end
142
+
143
+ end
144
+
145
+ context "when a scope is not defined for the name" do
146
+
147
+ context "when the scope is the parent" do
148
+
149
+ before do
150
+ @target = mock
151
+ @scope = Mongoid::Scope.new(Person, {})
152
+ @scope.instance_variable_set("@target", @target)
153
+ end
154
+
155
+ it "sends the call to the target" do
156
+ @target.expects(:testing).with("Testing").returns(true)
157
+ @scope.testing("Testing").should be_true
158
+ end
159
+
160
+ end
161
+
162
+ context "when the scope is not the parent" do
163
+
164
+ before do
165
+ @parent = mock
166
+ @criteria = mock
167
+ @parent.expects(:scopes).returns({})
168
+ @parent.expects(:is_a?).with(Mongoid::Scope).returns(true)
169
+ @parent.expects(:fuse)
170
+ @scope = Mongoid::Scope.new(@parent, {})
171
+ end
172
+
173
+ it "creates a criteria from the parent scope" do
174
+ @parent.expects(:testing).returns(true)
175
+ @scope.testing.should be_true
176
+ end
177
+
178
+ end
179
+
180
+ end
181
+
182
+ end
183
+
184
+ describe "#respond_to?" do
185
+
186
+ context "when parent is a class" do
187
+
188
+ before do
189
+ @scope = Mongoid::Scope.new(Person, {})
190
+ end
191
+
192
+ it "delegates to the target" do
193
+ @scope.respond_to?(:only).should be_true
194
+ end
195
+
196
+ end
197
+
198
+ context "when parent is a scope" do
199
+
200
+ before do
201
+ @parent = Mongoid::Scope.new(Person, {})
202
+ @scope = Mongoid::Scope.new(@parent, {})
203
+ end
204
+
205
+ it "delegates to the parent" do
206
+ @scope.respond_to?(:only).should be_true
207
+ end
208
+
209
+ end
210
+
211
+ end
212
+
213
+ describe "#scopes" do
214
+
215
+ before do
216
+ @parent = mock
217
+ @scope = Mongoid::Scope.new(@parent, {})
218
+ end
219
+
220
+ it "delegates to the parent" do
221
+ @parent.expects(:scopes).returns({})
222
+ @scope.scopes.should == {}
223
+ end
224
+
225
+ end
226
+
227
+ describe "#target" do
228
+
229
+ before do
230
+ @scope = Mongoid::Scope.new(Person, { :where => { :title => "Sir" } })
231
+ end
232
+
233
+ it "returns the conditions criteria" do
234
+ @scope.target.selector.should ==
235
+ { :title => "Sir" }
236
+ end
237
+
238
+ end
239
+
240
+ end
@@ -0,0 +1,83 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::State do
4
+
5
+ describe "#new_record?" do
6
+
7
+ context "when the object has been saved" do
8
+
9
+ before do
10
+ @person = Person.new(:_id => "1")
11
+ end
12
+
13
+ it "returns false" do
14
+ @person.new_record?.should be_false
15
+ end
16
+
17
+ end
18
+
19
+ context "when the object has not been saved" do
20
+
21
+ before do
22
+ @person = Person.new
23
+ end
24
+
25
+ it "returns true" do
26
+ @person.new_record?.should be_true
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+
33
+ describe "#persisted?" do
34
+
35
+ before do
36
+ @person = Person.new
37
+ end
38
+
39
+ it "delegates to new_record?" do
40
+ @person.persisted?.should be_false
41
+ end
42
+ end
43
+
44
+ describe "destroyed?" do
45
+
46
+ before do
47
+ @person = Person.new
48
+ end
49
+
50
+ context "when destroyed is true" do
51
+
52
+ before do
53
+ @person.destroyed = true
54
+ end
55
+
56
+ it "returns true" do
57
+ @person.destroyed?.should be_true
58
+ end
59
+ end
60
+
61
+ context "when destroyed is false" do
62
+
63
+ before do
64
+ @person.destroyed = false
65
+ end
66
+
67
+ it "returns true" do
68
+ @person.destroyed?.should be_false
69
+ end
70
+ end
71
+
72
+ context "when destroyed is nil" do
73
+
74
+ before do
75
+ @person.destroyed = nil
76
+ end
77
+
78
+ it "returns false" do
79
+ @person.destroyed?.should be_false
80
+ end
81
+ end
82
+ end
83
+ end