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,75 @@
1
+ require "spec_helper"
2
+
3
+ describe Humanoid::Memoization do
4
+
5
+ let(:memo) { "Memo" }
6
+
7
+ before do
8
+ @person = Person.new
9
+ end
10
+
11
+ describe "#memoized" do
12
+
13
+ context "when variable has been defined" do
14
+
15
+ before do
16
+ @person.instance_variable_set("@memo", memo)
17
+ end
18
+
19
+ it "returns the memoized value" do
20
+ @person.memoized(:memo) { nil }.should == memo
21
+ end
22
+
23
+ end
24
+
25
+ context "when variable has not been defined" do
26
+
27
+ it "returns the new value" do
28
+ @person.memoized(:memo) { memo }.should == memo
29
+ end
30
+
31
+ it "memoizes the new value" do
32
+ @person.memoized(:memo) { memo }
33
+ @person.instance_variable_get("@memo").should == memo
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+
40
+ describe "#reset" do
41
+
42
+ context "when variable has been defined" do
43
+
44
+ before do
45
+ @person.instance_variable_set("@memo", memo)
46
+ end
47
+
48
+ it "removes the memoized value" do
49
+ @person.reset(:memo) { nil }
50
+ @person.instance_variable_defined?("@memo").should be_false
51
+ end
52
+
53
+ it "returns the new value" do
54
+ @person.reset(:memo) { memo }.should == memo
55
+ end
56
+
57
+ end
58
+
59
+ context "when variable has not been defined" do
60
+
61
+ it "memoizes the new value" do
62
+ @person.reset(:memo) { memo }
63
+ @person.instance_variable_get("@memo").should == memo
64
+ end
65
+
66
+ it "returns the value" do
67
+ @person.reset(:memo) { memo }.should == memo
68
+ end
69
+
70
+ end
71
+
72
+
73
+ end
74
+
75
+ end
@@ -0,0 +1,123 @@
1
+ require "spec_helper"
2
+
3
+ describe Humanoid::NamedScope do
4
+
5
+ class Player
6
+ include Humanoid::Document
7
+ field :active, :type => Boolean
8
+ field :frags, :type => Integer
9
+ field :deaths, :type => Integer
10
+ field :status
11
+
12
+ named_scope :active, criteria.where(:active => true) do
13
+ def extension
14
+ "extension"
15
+ end
16
+ end
17
+ named_scope :inactive, :where => { :active => false }
18
+ named_scope :frags_over, lambda { |count| { :where => { :frags.gt => count } } }
19
+ named_scope :deaths_under, lambda { |count| criteria.where(:deaths.lt => count) }
20
+ scope :deaths_over, lambda { |count| criteria.where(:deaths.gt => count) }
21
+
22
+ class << self
23
+ def alive
24
+ criteria.where(:status => "Alive")
25
+ end
26
+ end
27
+ end
28
+
29
+ describe ".named_scope" do
30
+
31
+ it "adds a class method for the scope" do
32
+ Player.should respond_to(:active)
33
+ end
34
+
35
+ it "adds the scope to the scopes" do
36
+ Player.scopes.should include(:active)
37
+ end
38
+
39
+ context "when options are a hash" do
40
+
41
+ it "adds the selector to the scope" do
42
+ Player.inactive.selector[:active].should be_false
43
+ end
44
+
45
+ end
46
+
47
+ context "when options are a criteria" do
48
+
49
+ it "adds the selector to the scope" do
50
+ Player.active.selector[:active].should be_true
51
+ end
52
+
53
+ end
54
+
55
+ context "when options are a proc" do
56
+
57
+ context "when the proc delegates to a hash" do
58
+
59
+ it "adds the selector to the scope" do
60
+ Player.frags_over(50).selector[:frags].should == { "$gt" => 50 }
61
+ end
62
+
63
+ end
64
+
65
+ context "when the proc delegates to a criteria" do
66
+
67
+ it "adds the selector to the scope" do
68
+ Player.deaths_under(40).selector[:deaths].should == { "$lt" => 40 }
69
+ end
70
+
71
+ end
72
+
73
+ end
74
+
75
+ context "when a block is supplied" do
76
+
77
+ it "adds a class method for the scope" do
78
+ Player.should respond_to(:deaths_over)
79
+ end
80
+
81
+ it "adds the scope to the scopes" do
82
+ Player.scopes.should include(:deaths_over)
83
+ end
84
+
85
+ end
86
+
87
+ end
88
+
89
+ describe ".scope" do
90
+
91
+ it "aliases to named_scope" do
92
+ Player.should respond_to(:deaths_over)
93
+ end
94
+
95
+ end
96
+
97
+ context "chained scopes" do
98
+
99
+ context "when chaining two named scopes" do
100
+
101
+ it "merges the criteria" do
102
+ selector = Player.active.frags_over(10).selector
103
+ selector[:active].should be_true
104
+ selector[:frags].should == { "$gt" => 10 }
105
+ end
106
+
107
+ end
108
+
109
+ context "when chaining named scoped with criteria class methods" do
110
+
111
+ it "merges the criteria" do
112
+ selector = Player.active.frags_over(10).alive.selector
113
+ selector[:active].should be_true
114
+ selector[:frags].should == { "$gt" => 10 }
115
+ selector[:status].should == "Alive"
116
+ end
117
+
118
+ end
119
+
120
+ end
121
+
122
+ end
123
+
@@ -0,0 +1,240 @@
1
+ require "spec_helper"
2
+
3
+ describe Humanoid::Scope do
4
+
5
+ before do
6
+ Person.delete_all
7
+ end
8
+
9
+ describe "#==" do
10
+
11
+ before do
12
+ @scope = Humanoid::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 = Humanoid::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 = Humanoid::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
+ Humanoid::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 = Humanoid::Scope.new(Person, {})
83
+ end
84
+
85
+ context "when parent is another scope" do
86
+
87
+ before do
88
+ @scope = Humanoid::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 = Humanoid::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 = Humanoid::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 = Humanoid::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 = Humanoid::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(Humanoid::Scope).returns(true)
169
+ @parent.expects(:fuse)
170
+ @scope = Humanoid::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 = Humanoid::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 = Humanoid::Scope.new(Person, {})
202
+ @scope = Humanoid::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 = Humanoid::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 = Humanoid::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,25 @@
1
+ require "spec_helper"
2
+
3
+ describe Humanoid::Timestamps do
4
+
5
+ describe ".included" do
6
+
7
+ before do
8
+ @person = Person.new
9
+ end
10
+
11
+ it "adds created_at and updated_at to the document" do
12
+ fields = Person.fields
13
+ fields["created_at"].should_not be_nil
14
+ fields["updated_at"].should_not be_nil
15
+ end
16
+
17
+ it "forces the timestamps to UTC" do
18
+ @person.run_callbacks(:before_save)
19
+ @person.created_at.should be_close(Time.now.utc, 10.seconds)
20
+ @person.updated_at.should be_close(Time.now.utc, 10.seconds)
21
+ end
22
+
23
+ end
24
+
25
+ end