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,179 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Associations::HasOneRelated do
4
+
5
+ let(:document) { stub(:id => "1") }
6
+ let(:block) do
7
+ Proc.new do
8
+ def extension
9
+ "Testing"
10
+ end
11
+ end
12
+ end
13
+ let(:options) do
14
+ Mongoid::Associations::Options.new(:name => :game, :extend => block)
15
+ end
16
+
17
+ describe "#build" do
18
+
19
+ before do
20
+ @parent = stub(:id => "5", :class => Person)
21
+ Game.expects(:first).returns(nil)
22
+ @association = Mongoid::Associations::HasOneRelated.new(@parent, options)
23
+ end
24
+
25
+ it "adds a new object to the association" do
26
+ @association.build(:score => 100)
27
+ @association.score.should == 100
28
+ end
29
+
30
+ it "sets the parent object id on the child" do
31
+ @association.build(:score => 100)
32
+ @association.person_id.should == @parent.id
33
+ end
34
+
35
+ it "sets the parent object reference on the child" do
36
+ @association.build(:score => 100)
37
+ @association.person.should == @parent
38
+ end
39
+
40
+ end
41
+
42
+ describe "#create" do
43
+
44
+ before do
45
+ @parent = stub(:id => "5", :class => Person)
46
+ Game.expects(:first).returns(nil)
47
+ Mongoid::Commands::Save.expects(:execute)
48
+ @association = Mongoid::Associations::HasOneRelated.new(@parent, options)
49
+ end
50
+
51
+ it "adds a new object to the association" do
52
+ @association.create(:score => 100)
53
+ @association.score.should == 100
54
+ end
55
+
56
+ it "sets the parent object id on the child" do
57
+ @association.create(:score => 100)
58
+ @association.person_id.should == @parent.id
59
+ end
60
+
61
+ it "returns the new document" do
62
+ @association.create(:score => 100).should be_a_kind_of(Game)
63
+ end
64
+
65
+ end
66
+
67
+ describe "#id" do
68
+
69
+ before do
70
+ @parent = stub(:id => "5", :class => Person)
71
+ @game = Game.new
72
+ Game.expects(:first).returns(@game)
73
+ @association = Mongoid::Associations::HasOneRelated.new(@parent, options)
74
+ end
75
+
76
+ it "delegates to the proxied document" do
77
+ @association.id.should == @game.id
78
+ end
79
+
80
+ end
81
+
82
+ describe ".initialize" do
83
+
84
+ before do
85
+ @person = Person.new
86
+ @game = stub
87
+ end
88
+
89
+ it "finds the association game by the parent key" do
90
+ Game.expects(:first).with(:conditions => { "person_id"=> @person.id }).returns(@game)
91
+ @person.game.should == @game
92
+ end
93
+
94
+ context "when the options have an extension" do
95
+
96
+ before do
97
+ @parent = stub(:id => "5", :class => Person)
98
+ @game = Game.new
99
+ Game.expects(:first).returns(@game)
100
+ @association = Mongoid::Associations::HasOneRelated.new(@parent, options)
101
+ end
102
+
103
+ it "adds the extension to the module" do
104
+ @association.extension.should == "Testing"
105
+ end
106
+
107
+ end
108
+
109
+ end
110
+
111
+ describe ".instantiate" do
112
+
113
+ it "delegates to new" do
114
+ Mongoid::Associations::HasOneRelated.expects(:new).with(document, options, nil)
115
+ Mongoid::Associations::HasOneRelated.instantiate(document, options)
116
+ end
117
+
118
+ end
119
+
120
+ describe "#method_missing" do
121
+
122
+ before do
123
+ @person = Person.new
124
+ @game = stub
125
+ end
126
+
127
+ it "delegates to the documet" do
128
+ Game.expects(:first).with(:conditions => { "person_id"=> @person.id }).returns(@game)
129
+ @game.expects(:strange_method)
130
+ association = Mongoid::Associations::HasOneRelated.instantiate(@person, options)
131
+ association.strange_method
132
+ end
133
+
134
+ end
135
+
136
+ describe ".macro" do
137
+
138
+ it "returns :has_one_related" do
139
+ Mongoid::Associations::HasOneRelated.macro.should == :has_one_related
140
+ end
141
+
142
+ end
143
+
144
+ describe "#nil?" do
145
+
146
+ before do
147
+ @person = Person.new
148
+ @game = stub
149
+ Game.expects(:first).with(:conditions => { "person_id"=> @person.id }).returns(nil)
150
+ end
151
+
152
+ it "delegates to the document" do
153
+ association = Mongoid::Associations::HasOneRelated.instantiate(@person, options)
154
+ association.should be_nil
155
+ end
156
+
157
+ end
158
+
159
+ describe ".update" do
160
+
161
+ before do
162
+ @person = Person.new
163
+ @game = stub
164
+ end
165
+
166
+ it "sets the parent on the child association" do
167
+ @game.expects(:person=).with(@person)
168
+ Mongoid::Associations::HasOneRelated.update(@game, @person, options)
169
+ end
170
+
171
+ it "returns the proxy" do
172
+ @game.expects(:person=).with(@person)
173
+ @proxy = Mongoid::Associations::HasOneRelated.update(@game, @person, options)
174
+ @proxy.target.should == @game
175
+ end
176
+
177
+ end
178
+
179
+ end
@@ -0,0 +1,88 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Associations::MetaData do
4
+
5
+ before do
6
+ @extension = lambda { "Test" }
7
+ end
8
+
9
+ let(:association) do
10
+ Mongoid::Associations::HasManyRelated
11
+ end
12
+
13
+ let(:options) do
14
+ Mongoid::Associations::Options.new(
15
+ :name => :games,
16
+ :extend => @extension,
17
+ :foreign_key => "person_id",
18
+ :inverse_of => :people
19
+ )
20
+ end
21
+
22
+ let(:metadata) do
23
+ Mongoid::Associations::MetaData.new(association, options)
24
+ end
25
+
26
+ describe "#extension" do
27
+
28
+ it "delegates to the options" do
29
+ metadata.extension.should == @extension
30
+ end
31
+ end
32
+
33
+ describe "#foreign_key" do
34
+
35
+ it "delegates to the options" do
36
+ metadata.foreign_key.should == "person_id"
37
+ end
38
+ end
39
+
40
+ describe "#inverse_of" do
41
+
42
+ it "delegates to the options" do
43
+ metadata.inverse_of.should == :people
44
+ end
45
+ end
46
+
47
+ describe "#klass" do
48
+
49
+ it "returns the associated klass" do
50
+ metadata.klass.should == Game
51
+ end
52
+ end
53
+
54
+ describe "#macro" do
55
+
56
+ it "returns the association macro" do
57
+ metadata.macro.should == :has_many_related
58
+ end
59
+ end
60
+
61
+ describe "#name" do
62
+
63
+ it "delegates to the options" do
64
+ metadata.name.should == "games"
65
+ end
66
+ end
67
+
68
+ describe "#options" do
69
+
70
+ it "returns the association options" do
71
+ metadata.options.should == options
72
+ end
73
+ end
74
+
75
+ describe "#polymorphic" do
76
+
77
+ it "delegates to the options" do
78
+ metadata.polymorphic.should be_false
79
+ end
80
+ end
81
+
82
+ describe "#association" do
83
+
84
+ it "returns the association type" do
85
+ metadata.association.should == Mongoid::Associations::HasManyRelated
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,192 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Associations::Options do
4
+
5
+ describe "#name" do
6
+
7
+ before do
8
+ @attributes = { :name => :addresses }
9
+ @options = Mongoid::Associations::Options.new(@attributes)
10
+ end
11
+
12
+ it "returns the association name" do
13
+ @options.name.should == "addresses"
14
+ end
15
+
16
+ end
17
+
18
+ describe "#extend" do
19
+
20
+ context "when extension exists" do
21
+
22
+ before do
23
+ @attributes = { :extend => lambda { "Test" } }
24
+ @options = Mongoid::Associations::Options.new(@attributes)
25
+ end
26
+
27
+ it "returns the proc" do
28
+ @options.extension.should == @attributes[:extend]
29
+ end
30
+
31
+ end
32
+
33
+ context "when extension doesnt exist" do
34
+
35
+ before do
36
+ @options = Mongoid::Associations::Options.new({})
37
+ end
38
+
39
+ it "returns nil" do
40
+ @options.extension.should be_nil
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+
47
+ describe "extension?" do
48
+
49
+ context "when extension exists" do
50
+
51
+ before do
52
+ @attributes = { :extend => lambda { "Test" } }
53
+ @options = Mongoid::Associations::Options.new(@attributes)
54
+ end
55
+
56
+ it "returns true" do
57
+ @options.extension?.should be_true
58
+ end
59
+
60
+ end
61
+
62
+ context "when extension doesnt exist" do
63
+
64
+ before do
65
+ @options = Mongoid::Associations::Options.new({})
66
+ end
67
+
68
+ it "returns false" do
69
+ @options.extension?.should be_false
70
+ end
71
+
72
+ end
73
+
74
+ end
75
+
76
+ describe "#foreign_key" do
77
+
78
+ context "when no custom key defined" do
79
+
80
+ before do
81
+ @attributes = { :name => :posts }
82
+ @options = Mongoid::Associations::Options.new(@attributes)
83
+ end
84
+
85
+ it "returns the association foreign_key" do
86
+ @options.foreign_key.should == "post_id"
87
+ end
88
+ end
89
+
90
+ context "when a custom key is defined" do
91
+
92
+ before do
93
+ @attributes = { :name => :posts, :foreign_key => "blog_post_id" }
94
+ @options = Mongoid::Associations::Options.new(@attributes)
95
+ end
96
+
97
+ it "returns the custom foreign_key" do
98
+ @options.foreign_key.should == "blog_post_id"
99
+ end
100
+ end
101
+ end
102
+
103
+ describe "#inverse_of" do
104
+
105
+ before do
106
+ @attributes = { :inverse_of => :addresses }
107
+ @options = Mongoid::Associations::Options.new(@attributes)
108
+ end
109
+
110
+ it "returns the inverse_of value" do
111
+ @options.inverse_of.should == :addresses
112
+ end
113
+
114
+ end
115
+
116
+ describe "#klass" do
117
+
118
+ context "when class_name provided" do
119
+
120
+ before do
121
+ @attributes = { :class_name => "Person" }
122
+ @options = Mongoid::Associations::Options.new(@attributes)
123
+ end
124
+
125
+ it "constantizes the class name" do
126
+ @options.klass.should == Person
127
+ end
128
+
129
+ end
130
+
131
+ context "when no class_name provided" do
132
+
133
+ context "when association name is singular" do
134
+
135
+ before do
136
+ @attributes = { :name => :person }
137
+ @options = Mongoid::Associations::Options.new(@attributes)
138
+ end
139
+
140
+ it "classifies and constantizes the association name" do
141
+ @options.klass.should == Person
142
+ end
143
+
144
+ end
145
+
146
+ context "when association name is plural" do
147
+
148
+ before do
149
+ @attributes = { :name => :people }
150
+ @options = Mongoid::Associations::Options.new(@attributes)
151
+ end
152
+
153
+ it "classifies and constantizes the association name" do
154
+ @options.klass.should == Person
155
+ end
156
+
157
+ end
158
+
159
+ end
160
+
161
+ end
162
+
163
+ describe "#polymorphic" do
164
+
165
+ context "when attribute provided" do
166
+
167
+ before do
168
+ @attributes = { :polymorphic => true }
169
+ @options = Mongoid::Associations::Options.new(@attributes)
170
+ end
171
+
172
+ it "returns the attribute" do
173
+ @options.polymorphic.should be_true
174
+ end
175
+
176
+ end
177
+
178
+ context "when attribute not provided" do
179
+
180
+ before do
181
+ @options = Mongoid::Associations::Options.new
182
+ end
183
+
184
+ it "returns false" do
185
+ @options.polymorphic.should be_false
186
+ end
187
+
188
+ end
189
+
190
+ end
191
+
192
+ end