humanoid 1.2.7

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 (210) hide show
  1. data/.gitignore +6 -0
  2. data/.watchr +29 -0
  3. data/HISTORY +342 -0
  4. data/MIT_LICENSE +20 -0
  5. data/README.rdoc +56 -0
  6. data/Rakefile +53 -0
  7. data/VERSION +1 -0
  8. data/caliper.yml +4 -0
  9. data/humanoid.gemspec +374 -0
  10. data/lib/humanoid.rb +111 -0
  11. data/lib/humanoid/associations.rb +258 -0
  12. data/lib/humanoid/associations/belongs_to.rb +64 -0
  13. data/lib/humanoid/associations/belongs_to_related.rb +62 -0
  14. data/lib/humanoid/associations/has_many.rb +180 -0
  15. data/lib/humanoid/associations/has_many_related.rb +109 -0
  16. data/lib/humanoid/associations/has_one.rb +95 -0
  17. data/lib/humanoid/associations/has_one_related.rb +81 -0
  18. data/lib/humanoid/associations/options.rb +57 -0
  19. data/lib/humanoid/associations/proxy.rb +31 -0
  20. data/lib/humanoid/attributes.rb +184 -0
  21. data/lib/humanoid/callbacks.rb +23 -0
  22. data/lib/humanoid/collection.rb +118 -0
  23. data/lib/humanoid/collections/cyclic_iterator.rb +34 -0
  24. data/lib/humanoid/collections/master.rb +28 -0
  25. data/lib/humanoid/collections/mimic.rb +46 -0
  26. data/lib/humanoid/collections/operations.rb +41 -0
  27. data/lib/humanoid/collections/slaves.rb +44 -0
  28. data/lib/humanoid/commands.rb +182 -0
  29. data/lib/humanoid/commands/create.rb +21 -0
  30. data/lib/humanoid/commands/delete.rb +16 -0
  31. data/lib/humanoid/commands/delete_all.rb +23 -0
  32. data/lib/humanoid/commands/deletion.rb +18 -0
  33. data/lib/humanoid/commands/destroy.rb +19 -0
  34. data/lib/humanoid/commands/destroy_all.rb +23 -0
  35. data/lib/humanoid/commands/save.rb +27 -0
  36. data/lib/humanoid/components.rb +24 -0
  37. data/lib/humanoid/config.rb +84 -0
  38. data/lib/humanoid/contexts.rb +25 -0
  39. data/lib/humanoid/contexts/enumerable.rb +117 -0
  40. data/lib/humanoid/contexts/ids.rb +25 -0
  41. data/lib/humanoid/contexts/mongo.rb +224 -0
  42. data/lib/humanoid/contexts/paging.rb +42 -0
  43. data/lib/humanoid/criteria.rb +259 -0
  44. data/lib/humanoid/criterion/complex.rb +21 -0
  45. data/lib/humanoid/criterion/exclusion.rb +65 -0
  46. data/lib/humanoid/criterion/inclusion.rb +91 -0
  47. data/lib/humanoid/criterion/optional.rb +128 -0
  48. data/lib/humanoid/cursor.rb +82 -0
  49. data/lib/humanoid/document.rb +300 -0
  50. data/lib/humanoid/enslavement.rb +38 -0
  51. data/lib/humanoid/errors.rb +77 -0
  52. data/lib/humanoid/extensions.rb +84 -0
  53. data/lib/humanoid/extensions/array/accessors.rb +17 -0
  54. data/lib/humanoid/extensions/array/aliasing.rb +4 -0
  55. data/lib/humanoid/extensions/array/assimilation.rb +26 -0
  56. data/lib/humanoid/extensions/array/conversions.rb +29 -0
  57. data/lib/humanoid/extensions/array/parentization.rb +13 -0
  58. data/lib/humanoid/extensions/boolean/conversions.rb +16 -0
  59. data/lib/humanoid/extensions/date/conversions.rb +15 -0
  60. data/lib/humanoid/extensions/datetime/conversions.rb +17 -0
  61. data/lib/humanoid/extensions/float/conversions.rb +16 -0
  62. data/lib/humanoid/extensions/hash/accessors.rb +38 -0
  63. data/lib/humanoid/extensions/hash/assimilation.rb +30 -0
  64. data/lib/humanoid/extensions/hash/conversions.rb +15 -0
  65. data/lib/humanoid/extensions/hash/criteria_helpers.rb +20 -0
  66. data/lib/humanoid/extensions/hash/scoping.rb +12 -0
  67. data/lib/humanoid/extensions/integer/conversions.rb +16 -0
  68. data/lib/humanoid/extensions/nil/assimilation.rb +13 -0
  69. data/lib/humanoid/extensions/object/conversions.rb +33 -0
  70. data/lib/humanoid/extensions/proc/scoping.rb +12 -0
  71. data/lib/humanoid/extensions/string/conversions.rb +15 -0
  72. data/lib/humanoid/extensions/string/inflections.rb +97 -0
  73. data/lib/humanoid/extensions/symbol/inflections.rb +36 -0
  74. data/lib/humanoid/extensions/time/conversions.rb +18 -0
  75. data/lib/humanoid/factory.rb +19 -0
  76. data/lib/humanoid/field.rb +39 -0
  77. data/lib/humanoid/fields.rb +62 -0
  78. data/lib/humanoid/finders.rb +224 -0
  79. data/lib/humanoid/identity.rb +39 -0
  80. data/lib/humanoid/indexes.rb +30 -0
  81. data/lib/humanoid/matchers.rb +36 -0
  82. data/lib/humanoid/matchers/all.rb +11 -0
  83. data/lib/humanoid/matchers/default.rb +26 -0
  84. data/lib/humanoid/matchers/exists.rb +13 -0
  85. data/lib/humanoid/matchers/gt.rb +11 -0
  86. data/lib/humanoid/matchers/gte.rb +11 -0
  87. data/lib/humanoid/matchers/in.rb +11 -0
  88. data/lib/humanoid/matchers/lt.rb +11 -0
  89. data/lib/humanoid/matchers/lte.rb +11 -0
  90. data/lib/humanoid/matchers/ne.rb +11 -0
  91. data/lib/humanoid/matchers/nin.rb +11 -0
  92. data/lib/humanoid/matchers/size.rb +11 -0
  93. data/lib/humanoid/memoization.rb +27 -0
  94. data/lib/humanoid/named_scope.rb +40 -0
  95. data/lib/humanoid/scope.rb +75 -0
  96. data/lib/humanoid/timestamps.rb +30 -0
  97. data/lib/humanoid/versioning.rb +28 -0
  98. data/perf/benchmark.rb +77 -0
  99. data/spec/integration/humanoid/associations_spec.rb +301 -0
  100. data/spec/integration/humanoid/attributes_spec.rb +22 -0
  101. data/spec/integration/humanoid/commands_spec.rb +216 -0
  102. data/spec/integration/humanoid/contexts/enumerable_spec.rb +33 -0
  103. data/spec/integration/humanoid/criteria_spec.rb +224 -0
  104. data/spec/integration/humanoid/document_spec.rb +587 -0
  105. data/spec/integration/humanoid/extensions_spec.rb +26 -0
  106. data/spec/integration/humanoid/finders_spec.rb +119 -0
  107. data/spec/integration/humanoid/inheritance_spec.rb +137 -0
  108. data/spec/integration/humanoid/named_scope_spec.rb +46 -0
  109. data/spec/models/address.rb +39 -0
  110. data/spec/models/animal.rb +6 -0
  111. data/spec/models/comment.rb +8 -0
  112. data/spec/models/country_code.rb +6 -0
  113. data/spec/models/employer.rb +5 -0
  114. data/spec/models/game.rb +6 -0
  115. data/spec/models/inheritance.rb +56 -0
  116. data/spec/models/location.rb +5 -0
  117. data/spec/models/mixed_drink.rb +4 -0
  118. data/spec/models/name.rb +13 -0
  119. data/spec/models/namespacing.rb +11 -0
  120. data/spec/models/patient.rb +4 -0
  121. data/spec/models/person.rb +98 -0
  122. data/spec/models/pet.rb +7 -0
  123. data/spec/models/pet_owner.rb +6 -0
  124. data/spec/models/phone.rb +7 -0
  125. data/spec/models/post.rb +15 -0
  126. data/spec/models/translation.rb +5 -0
  127. data/spec/models/vet_visit.rb +5 -0
  128. data/spec/spec.opts +3 -0
  129. data/spec/spec_helper.rb +31 -0
  130. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +141 -0
  131. data/spec/unit/mongoid/associations/belongs_to_spec.rb +193 -0
  132. data/spec/unit/mongoid/associations/has_many_related_spec.rb +387 -0
  133. data/spec/unit/mongoid/associations/has_many_spec.rb +471 -0
  134. data/spec/unit/mongoid/associations/has_one_related_spec.rb +179 -0
  135. data/spec/unit/mongoid/associations/has_one_spec.rb +282 -0
  136. data/spec/unit/mongoid/associations/options_spec.rb +191 -0
  137. data/spec/unit/mongoid/associations_spec.rb +545 -0
  138. data/spec/unit/mongoid/attributes_spec.rb +484 -0
  139. data/spec/unit/mongoid/callbacks_spec.rb +55 -0
  140. data/spec/unit/mongoid/collection_spec.rb +171 -0
  141. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
  142. data/spec/unit/mongoid/collections/master_spec.rb +41 -0
  143. data/spec/unit/mongoid/collections/mimic_spec.rb +43 -0
  144. data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
  145. data/spec/unit/mongoid/commands/create_spec.rb +30 -0
  146. data/spec/unit/mongoid/commands/delete_all_spec.rb +58 -0
  147. data/spec/unit/mongoid/commands/delete_spec.rb +35 -0
  148. data/spec/unit/mongoid/commands/destroy_all_spec.rb +23 -0
  149. data/spec/unit/mongoid/commands/destroy_spec.rb +44 -0
  150. data/spec/unit/mongoid/commands/save_spec.rb +105 -0
  151. data/spec/unit/mongoid/commands_spec.rb +282 -0
  152. data/spec/unit/mongoid/config_spec.rb +165 -0
  153. data/spec/unit/mongoid/contexts/enumerable_spec.rb +374 -0
  154. data/spec/unit/mongoid/contexts/mongo_spec.rb +505 -0
  155. data/spec/unit/mongoid/contexts_spec.rb +25 -0
  156. data/spec/unit/mongoid/criteria_spec.rb +769 -0
  157. data/spec/unit/mongoid/criterion/complex_spec.rb +19 -0
  158. data/spec/unit/mongoid/criterion/exclusion_spec.rb +91 -0
  159. data/spec/unit/mongoid/criterion/inclusion_spec.rb +211 -0
  160. data/spec/unit/mongoid/criterion/optional_spec.rb +329 -0
  161. data/spec/unit/mongoid/cursor_spec.rb +74 -0
  162. data/spec/unit/mongoid/document_spec.rb +986 -0
  163. data/spec/unit/mongoid/enslavement_spec.rb +63 -0
  164. data/spec/unit/mongoid/errors_spec.rb +103 -0
  165. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
  166. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
  167. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +35 -0
  168. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
  169. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
  170. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +102 -0
  171. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +70 -0
  172. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
  173. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
  174. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +46 -0
  175. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +21 -0
  176. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
  177. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
  178. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
  179. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +24 -0
  180. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +43 -0
  181. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
  182. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +17 -0
  183. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
  184. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +91 -0
  185. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +70 -0
  186. data/spec/unit/mongoid/factory_spec.rb +31 -0
  187. data/spec/unit/mongoid/field_spec.rb +81 -0
  188. data/spec/unit/mongoid/fields_spec.rb +158 -0
  189. data/spec/unit/mongoid/finders_spec.rb +368 -0
  190. data/spec/unit/mongoid/identity_spec.rb +88 -0
  191. data/spec/unit/mongoid/indexes_spec.rb +93 -0
  192. data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
  193. data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
  194. data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
  195. data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
  196. data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
  197. data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
  198. data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
  199. data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
  200. data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
  201. data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
  202. data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
  203. data/spec/unit/mongoid/matchers_spec.rb +329 -0
  204. data/spec/unit/mongoid/memoization_spec.rb +75 -0
  205. data/spec/unit/mongoid/named_scope_spec.rb +123 -0
  206. data/spec/unit/mongoid/scope_spec.rb +240 -0
  207. data/spec/unit/mongoid/timestamps_spec.rb +25 -0
  208. data/spec/unit/mongoid/versioning_spec.rb +41 -0
  209. data/spec/unit/mongoid_spec.rb +37 -0
  210. metadata +431 -0
@@ -0,0 +1,30 @@
1
+ require "spec_helper"
2
+
3
+ describe Humanoid::Commands::Create do
4
+
5
+ describe "#execute" do
6
+
7
+ before do
8
+ @document = stub(:run_callbacks)
9
+ end
10
+
11
+ it "executes a save command" do
12
+ Humanoid::Commands::Save.expects(:execute).with(@document, true).returns(@document)
13
+ Humanoid::Commands::Create.execute(@document)
14
+ end
15
+
16
+ it "runs the before and after create callbacks" do
17
+ @document.expects(:run_callbacks).with(:before_create)
18
+ Humanoid::Commands::Save.expects(:execute).with(@document, true).returns(@document)
19
+ @document.expects(:run_callbacks).with(:after_create)
20
+ Humanoid::Commands::Create.execute(@document)
21
+ end
22
+
23
+ it "returns the document" do
24
+ Humanoid::Commands::Save.expects(:execute).with(@document, true).returns(@document)
25
+ Humanoid::Commands::Create.execute(@document).should == @document
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,58 @@
1
+ require "spec_helper"
2
+
3
+ describe Humanoid::Commands::DeleteAll do
4
+
5
+ describe "#execute" do
6
+
7
+ before do
8
+ @doc = mock
9
+ @docs = [@doc]
10
+ @klass = stub(:name => "Person")
11
+ end
12
+
13
+ context "when conditions supplied" do
14
+
15
+ before do
16
+ @collection = mock
17
+ @conditions = { :conditions => { :title => "Sir" } }
18
+ end
19
+
20
+ it "deletes each document that the criteria finds" do
21
+ @klass.expects(:collection).returns(@collection)
22
+ @collection.expects(:remove).with(@conditions[:conditions].merge(:_type => "Person"), :safe => true)
23
+ Humanoid::Commands::DeleteAll.execute(@klass, @conditions)
24
+ end
25
+
26
+ end
27
+
28
+ context "when no conditions supplied" do
29
+
30
+ before do
31
+ @collection = mock
32
+ end
33
+
34
+ it "drops the collection" do
35
+ @klass.expects(:collection).returns(@collection)
36
+ @collection.expects(:remove).with({ :_type => "Person" }, { :safe => true })
37
+ Humanoid::Commands::DeleteAll.execute(@klass)
38
+ end
39
+
40
+ end
41
+
42
+ context "when empty conditions supplied" do
43
+
44
+ before do
45
+ @collection = mock
46
+ end
47
+
48
+ it "drops the collection" do
49
+ @klass.expects(:collection).returns(@collection)
50
+ @collection.expects(:remove).with({ :_type => "Person" }, { :safe => true })
51
+ Humanoid::Commands::DeleteAll.execute(@klass, {})
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+
58
+ end
@@ -0,0 +1,35 @@
1
+ require "spec_helper"
2
+
3
+ describe Humanoid::Commands::Delete do
4
+
5
+ describe "#execute" do
6
+
7
+ before do
8
+ @collection = mock
9
+ @document = stub(:collection => @collection, :id => "1", :_parent => false)
10
+ end
11
+
12
+ it "removes the document from its collection" do
13
+ @collection.expects(:remove).with({ :_id => @document.id })
14
+ Humanoid::Commands::Delete.execute(@document)
15
+ end
16
+
17
+ context "when the document is embedded" do
18
+
19
+ before do
20
+ @parent = Person.new
21
+ @address = Address.new(:street => "Genoa Pl")
22
+ @parent.addresses << @address
23
+ end
24
+
25
+ it "removes the document from the parent attributes" do
26
+ @parent.addresses.should == [@address]
27
+ Humanoid::Commands::Delete.execute(@address)
28
+ @parent.addresses.should be_empty
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,23 @@
1
+ require "spec_helper"
2
+
3
+ describe Humanoid::Commands::DestroyAll do
4
+
5
+ describe "#execute" do
6
+
7
+ before do
8
+ @doc = mock
9
+ @docs = [@doc]
10
+ @klass = stub(:name => "Person")
11
+ @conditions = { :conditions => { :title => "Sir" } }
12
+ @expected = { :conditions => { :title => "Sir", :_type => "Person" } }
13
+ end
14
+
15
+ it "destroys each document that the criteria finds" do
16
+ @klass.expects(:find).with(:all, @expected).returns(@docs)
17
+ Humanoid::Commands::Destroy.expects(:execute).with(@doc)
18
+ Humanoid::Commands::DestroyAll.execute(@klass, @conditions)
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,44 @@
1
+ require "spec_helper"
2
+
3
+ describe Humanoid::Commands::Destroy do
4
+
5
+ describe "#execute" do
6
+
7
+ before do
8
+ @collection = stub_everything
9
+ @document = stub(:run_callbacks => true,
10
+ :collection => @collection,
11
+ :id => "1",
12
+ :_parent => false)
13
+ end
14
+
15
+ it "runs the before and after destroy callbacks" do
16
+ @document.expects(:run_callbacks).with(:before_destroy)
17
+ @document.expects(:run_callbacks).with(:after_destroy)
18
+ Humanoid::Commands::Destroy.execute(@document)
19
+ end
20
+
21
+ it "removes the document from its collection" do
22
+ @collection.expects(:remove).with({ :_id => @document.id })
23
+ Humanoid::Commands::Destroy.execute(@document)
24
+ end
25
+
26
+ context "when the document is embedded" do
27
+
28
+ before do
29
+ @parent = Person.new
30
+ @address = Address.new(:street => "Genoa Pl")
31
+ @parent.addresses << @address
32
+ end
33
+
34
+ it "removes the document from the parent attributes" do
35
+ @parent.addresses.should == [@address]
36
+ Humanoid::Commands::Destroy.execute(@address)
37
+ @parent.addresses.should be_empty
38
+ end
39
+
40
+ end
41
+
42
+ end
43
+
44
+ end
@@ -0,0 +1,105 @@
1
+ require "spec_helper"
2
+
3
+ describe Humanoid::Commands::Save do
4
+
5
+ describe "#execute" do
6
+
7
+ before do
8
+ @parent_collection = stub(:save => true)
9
+ @doc_collection = stub(:save => true)
10
+ @parent = stub(:collection => @parent_collection,
11
+ :valid? => true,
12
+ :run_callbacks => true,
13
+ :_parent => nil,
14
+ :raw_attributes => {},
15
+ :new_record= => false)
16
+ @document = stub(:collection => @doc_collection,
17
+ :run_callbacks => true,
18
+ :_parent => @parent,
19
+ :raw_attributes => {},
20
+ :new_record= => false)
21
+ end
22
+
23
+ context "when document is valid" do
24
+
25
+ before do
26
+ @document.expects(:valid?).returns(true)
27
+ end
28
+
29
+ it "runs the before and after callbacks" do
30
+ @document.expects(:run_callbacks).with(:before_save)
31
+ @document.expects(:run_callbacks).with(:after_save)
32
+ Humanoid::Commands::Save.execute(@document)
33
+ end
34
+
35
+ it "returns true" do
36
+ Humanoid::Commands::Save.execute(@document).should be_true
37
+ end
38
+
39
+ context "when the document has a parent" do
40
+
41
+ it "executes a save on the parent" do
42
+ @parent_collection.expects(:save).with(@parent.raw_attributes, :safe => true)
43
+ Humanoid::Commands::Save.execute(@document)
44
+ end
45
+
46
+ end
47
+
48
+ context "when the document has no parent" do
49
+
50
+ before do
51
+ @document.expects(:_parent).returns(nil)
52
+ end
53
+
54
+ it "calls save on the document collection" do
55
+ @doc_collection.expects(:save).with(@document.raw_attributes, :safe => true)
56
+ Humanoid::Commands::Save.execute(@document)
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+
63
+ context "when document is invalid" do
64
+
65
+ before do
66
+ @document.expects(:valid?).returns(false)
67
+ end
68
+
69
+ it "returns false" do
70
+ Humanoid::Commands::Save.execute(@document).should be_false
71
+ end
72
+
73
+ end
74
+
75
+ context "when saving without validation" do
76
+
77
+ before do
78
+ @document.stubs(:valid?).returns(false)
79
+ end
80
+
81
+ it "ignores validation and returns true" do
82
+ Humanoid::Commands::Save.execute(@document, false).should be_true
83
+ end
84
+
85
+ end
86
+
87
+ end
88
+
89
+ context "when the document is embedded" do
90
+
91
+ before do
92
+ @child_name = Name.new(:first_name => "Testy")
93
+ end
94
+
95
+ context "when parent reference does not exist" do
96
+
97
+ it "raises an error" do
98
+ lambda { @child_name.save }.should raise_error
99
+ end
100
+
101
+ end
102
+
103
+ end
104
+
105
+ end
@@ -0,0 +1,282 @@
1
+ require "spec_helper"
2
+
3
+ describe Humanoid::Commands do
4
+
5
+ before do
6
+ @person = Person.new(:_id => Mongo::ObjectID.new.to_s)
7
+ end
8
+
9
+ describe "#delete" do
10
+
11
+ it "delegates to the Delete command" do
12
+ Humanoid::Commands::Delete.expects(:execute).with(@person)
13
+ @person.delete
14
+ end
15
+
16
+ end
17
+
18
+ describe "#destroy" do
19
+
20
+ it "delegates to the Destroy command" do
21
+ Humanoid::Commands::Destroy.expects(:execute).with(@person)
22
+ @person.destroy
23
+ end
24
+
25
+ end
26
+
27
+ describe "#save" do
28
+
29
+ it "delegates to the Save command" do
30
+ Humanoid::Commands::Save.expects(:execute).with(@person, true).returns(true)
31
+ @person.save
32
+ end
33
+
34
+ context "when document is new" do
35
+
36
+ before do
37
+ @person = Person.new
38
+ end
39
+
40
+ context "when validation fails" do
41
+
42
+ it "it raises an error" do
43
+ Humanoid::Commands::Save.expects(:execute).with(@person, true).returns(false)
44
+ @person.save.should be_false
45
+ end
46
+
47
+ it "should run callback before_create and no after_create" do
48
+ @person.expects(:run_callbacks).with(:before_create)
49
+ Humanoid::Commands::Save.expects(:execute).with(@person, true).returns(false)
50
+ @person.expects(:run_callbacks).with(:after_create).never
51
+ @person.save.should be_false
52
+ end
53
+
54
+ end
55
+
56
+ it "delegates to the save command" do
57
+ Humanoid::Commands::Save.expects(:execute).with(@person, true).returns(true)
58
+ @person.save
59
+ end
60
+
61
+ it "runs the before and after create callbacks" do
62
+ @person.expects(:run_callbacks).with(:before_create)
63
+ Humanoid::Commands::Save.expects(:execute).with(@person, true).returns(true)
64
+ @person.expects(:run_callbacks).with(:after_create)
65
+ @person.save
66
+ end
67
+
68
+ end
69
+
70
+ context "when not validating" do
71
+
72
+ before do
73
+ @person = Person.new
74
+ end
75
+
76
+ it "passes the validate param to the command" do
77
+ Humanoid::Commands::Save.expects(:execute).with(@person, false).returns(true)
78
+ @person.save(false)
79
+ end
80
+
81
+ end
82
+
83
+ context "when the database raises an error" do
84
+
85
+ before do
86
+ @person = Person.new
87
+ end
88
+
89
+ it "returns false" do
90
+ Humanoid::Commands::Save.expects(:execute).raises(Mongo::OperationFailure.new("Operation Failed"))
91
+ @person.save
92
+ @person.errors.on(:humanoid).should == "Operation Failed"
93
+ end
94
+
95
+ end
96
+
97
+ end
98
+
99
+ describe "#save!" do
100
+
101
+ context "when validation passes" do
102
+
103
+ it "it returns the person" do
104
+ Humanoid::Commands::Save.expects(:execute).with(@person, true).returns(true)
105
+ @person.save!
106
+ end
107
+
108
+ end
109
+
110
+ context "when validation fails" do
111
+
112
+ it "it raises an error" do
113
+ Humanoid::Commands::Save.expects(:execute).with(@person, true).returns(false)
114
+ lambda { @person.save! }.should raise_error
115
+ end
116
+
117
+ end
118
+
119
+ context "when document is new" do
120
+
121
+ before do
122
+ @person = Person.new
123
+ end
124
+
125
+ it "delegates to the save command" do
126
+ Humanoid::Commands::Save.expects(:execute).with(@person, true).returns(true)
127
+ @person.save!
128
+ end
129
+
130
+ context "when validation fails" do
131
+
132
+ it "it raises an error " do
133
+ Humanoid::Commands::Save.expects(:execute).with(@person, true).returns(false)
134
+ lambda { @person.save! }.should raise_error
135
+ end
136
+
137
+ end
138
+
139
+ it "runs the before and after create callbacks" do
140
+ @person.expects(:run_callbacks).with(:before_create)
141
+ Humanoid::Commands::Save.expects(:execute).with(@person, true).returns(true)
142
+ @person.expects(:run_callbacks).with(:after_create)
143
+ @person.save!
144
+ end
145
+
146
+ end
147
+
148
+ end
149
+
150
+ describe "#update_attributes" do
151
+
152
+ it "delegates to the Save command" do
153
+ Humanoid::Commands::Save.expects(:execute).with(@person, true).returns(true)
154
+ @person.update_attributes({})
155
+ end
156
+
157
+ it "executes the before and after update callbacks" do
158
+ @person.expects(:run_callbacks).with(:before_update)
159
+ Humanoid::Commands::Save.expects(:execute).with(@person, true).returns(true)
160
+ @person.expects(:run_callbacks).with(:after_update)
161
+ @person.update_attributes({})
162
+ end
163
+
164
+ end
165
+
166
+ describe "#update_attributes!" do
167
+
168
+ context "when validation passes" do
169
+
170
+ it "it returns the person" do
171
+ Humanoid::Commands::Save.expects(:execute).with(@person, true).returns(true)
172
+ @person.update_attributes({}).should be_true
173
+ end
174
+
175
+ end
176
+
177
+ context "when validation fails" do
178
+
179
+ it "it raises an error" do
180
+ Humanoid::Commands::Save.expects(:execute).with(@person, true).returns(false)
181
+ lambda { @person.update_attributes!({}) }.should raise_error
182
+ end
183
+
184
+ end
185
+
186
+ end
187
+
188
+ describe ".create" do
189
+
190
+ it "delegates to the Create command" do
191
+ Humanoid::Commands::Create.expects(:execute)
192
+ Person.create
193
+ end
194
+
195
+ it "returns the document" do
196
+ Humanoid::Commands::Create.expects(:execute).returns(Person.new)
197
+ Person.create.should_not be_nil
198
+ end
199
+
200
+ context "when the database raises an error" do
201
+
202
+ before do
203
+ @person = Person.new
204
+ Humanoid::Commands::Save.expects(:execute).raises(Mongo::OperationFailure.new("Operation Failed"))
205
+ end
206
+
207
+ it "returns the document with errors" do
208
+ person = Person.create
209
+ person.errors.on(:humanoid).should == "Operation Failed"
210
+ end
211
+
212
+ it "keeps the document's new record flag" do
213
+ person = Person.create
214
+ person.should be_a_new_record
215
+ end
216
+
217
+ end
218
+
219
+ end
220
+
221
+ describe ".create!" do
222
+
223
+ it "delegates to the Create command" do
224
+ Humanoid::Commands::Create.expects(:execute).returns(Person.new)
225
+ Person.create!
226
+ end
227
+
228
+ it "returns the document" do
229
+ Humanoid::Commands::Create.expects(:execute).returns(Person.new)
230
+ Person.create!.should_not be_nil
231
+ end
232
+
233
+ context "when validation fails" do
234
+
235
+ it "raises an error" do
236
+ person = stub(:errors => stub(:empty? => false))
237
+ Humanoid::Commands::Create.expects(:execute).returns(person)
238
+ lambda { Person.create! }.should raise_error(Humanoid::Errors::Validations)
239
+ end
240
+
241
+ end
242
+
243
+ end
244
+
245
+ describe ".delete_all" do
246
+
247
+ it "delegates to the DeleteAll command" do
248
+ Humanoid::Commands::DeleteAll.expects(:execute).with(Person, {})
249
+ Person.delete_all
250
+ end
251
+
252
+ end
253
+
254
+ describe ".destroy_all" do
255
+
256
+ it "delegates to the DestroyAll command" do
257
+ Humanoid::Commands::DestroyAll.expects(:execute).with(Person, {})
258
+ Person.destroy_all
259
+ end
260
+
261
+ end
262
+
263
+ describe "#valid?" do
264
+
265
+ before do
266
+ @comment = Comment.new
267
+ end
268
+
269
+ it "validates the document" do
270
+ @comment.valid?.should be_false
271
+ end
272
+
273
+ it "runs the validation callbacks" do
274
+ @comment.expects(:run_callbacks).with(:validate)
275
+ @comment.expects(:run_callbacks).with(:before_validation)
276
+ @comment.expects(:run_callbacks).with(:after_validation)
277
+ @comment.valid?
278
+ end
279
+
280
+ end
281
+
282
+ end