mongoid-locomotive 2.0.0.beta9
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.
- data/MIT_LICENSE +20 -0
- data/README.rdoc +47 -0
- data/lib/mongoid.rb +141 -0
- data/lib/mongoid/associations.rb +306 -0
- data/lib/mongoid/associations/embedded_in.rb +74 -0
- data/lib/mongoid/associations/embeds_many.rb +280 -0
- data/lib/mongoid/associations/embeds_one.rb +97 -0
- data/lib/mongoid/associations/foreign_key.rb +35 -0
- data/lib/mongoid/associations/meta_data.rb +38 -0
- data/lib/mongoid/associations/options.rb +62 -0
- data/lib/mongoid/associations/proxy.rb +33 -0
- data/lib/mongoid/associations/referenced_in.rb +59 -0
- data/lib/mongoid/associations/references_many.rb +245 -0
- data/lib/mongoid/associations/references_many_as_array.rb +78 -0
- data/lib/mongoid/associations/references_one.rb +99 -0
- data/lib/mongoid/atomicity.rb +55 -0
- data/lib/mongoid/attributes.rb +242 -0
- data/lib/mongoid/callbacks.rb +21 -0
- data/lib/mongoid/collection.rb +120 -0
- data/lib/mongoid/collections.rb +71 -0
- data/lib/mongoid/collections/cyclic_iterator.rb +34 -0
- data/lib/mongoid/collections/master.rb +29 -0
- data/lib/mongoid/collections/operations.rb +41 -0
- data/lib/mongoid/collections/slaves.rb +45 -0
- data/lib/mongoid/components.rb +34 -0
- data/lib/mongoid/config.rb +263 -0
- data/lib/mongoid/contexts.rb +24 -0
- data/lib/mongoid/contexts/enumerable.rb +156 -0
- data/lib/mongoid/contexts/ids.rb +25 -0
- data/lib/mongoid/contexts/mongo.rb +285 -0
- data/lib/mongoid/contexts/paging.rb +50 -0
- data/lib/mongoid/criteria.rb +248 -0
- data/lib/mongoid/criterion/complex.rb +21 -0
- data/lib/mongoid/criterion/exclusion.rb +65 -0
- data/lib/mongoid/criterion/inclusion.rb +110 -0
- data/lib/mongoid/criterion/optional.rb +189 -0
- data/lib/mongoid/cursor.rb +81 -0
- data/lib/mongoid/deprecation.rb +21 -0
- data/lib/mongoid/dirty.rb +252 -0
- data/lib/mongoid/document.rb +210 -0
- data/lib/mongoid/errors.rb +131 -0
- data/lib/mongoid/extensions.rb +115 -0
- data/lib/mongoid/extensions/array/accessors.rb +17 -0
- data/lib/mongoid/extensions/array/assimilation.rb +26 -0
- data/lib/mongoid/extensions/array/conversions.rb +23 -0
- data/lib/mongoid/extensions/array/parentization.rb +13 -0
- data/lib/mongoid/extensions/big_decimal/conversions.rb +19 -0
- data/lib/mongoid/extensions/binary/conversions.rb +17 -0
- data/lib/mongoid/extensions/boolean/conversions.rb +27 -0
- data/lib/mongoid/extensions/date/conversions.rb +24 -0
- data/lib/mongoid/extensions/datetime/conversions.rb +12 -0
- data/lib/mongoid/extensions/false_class/equality.rb +13 -0
- data/lib/mongoid/extensions/float/conversions.rb +20 -0
- data/lib/mongoid/extensions/hash/accessors.rb +42 -0
- data/lib/mongoid/extensions/hash/assimilation.rb +40 -0
- data/lib/mongoid/extensions/hash/conversions.rb +42 -0
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +20 -0
- data/lib/mongoid/extensions/hash/scoping.rb +12 -0
- data/lib/mongoid/extensions/integer/conversions.rb +20 -0
- data/lib/mongoid/extensions/nil/assimilation.rb +17 -0
- data/lib/mongoid/extensions/object/conversions.rb +21 -0
- data/lib/mongoid/extensions/objectid/conversions.rb +15 -0
- data/lib/mongoid/extensions/proc/scoping.rb +12 -0
- data/lib/mongoid/extensions/set/conversions.rb +20 -0
- data/lib/mongoid/extensions/string/conversions.rb +15 -0
- data/lib/mongoid/extensions/string/inflections.rb +97 -0
- data/lib/mongoid/extensions/symbol/inflections.rb +40 -0
- data/lib/mongoid/extensions/time_conversions.rb +35 -0
- data/lib/mongoid/extensions/true_class/equality.rb +13 -0
- data/lib/mongoid/extras.rb +61 -0
- data/lib/mongoid/factory.rb +20 -0
- data/lib/mongoid/field.rb +83 -0
- data/lib/mongoid/fields.rb +62 -0
- data/lib/mongoid/finders.rb +145 -0
- data/lib/mongoid/hierarchy.rb +74 -0
- data/lib/mongoid/identity.rb +47 -0
- data/lib/mongoid/indexes.rb +27 -0
- data/lib/mongoid/javascript.rb +21 -0
- data/lib/mongoid/javascript/functions.yml +37 -0
- data/lib/mongoid/logger.rb +19 -0
- data/lib/mongoid/matchers.rb +35 -0
- data/lib/mongoid/matchers/all.rb +11 -0
- data/lib/mongoid/matchers/default.rb +26 -0
- data/lib/mongoid/matchers/exists.rb +13 -0
- data/lib/mongoid/matchers/gt.rb +11 -0
- data/lib/mongoid/matchers/gte.rb +11 -0
- data/lib/mongoid/matchers/in.rb +11 -0
- data/lib/mongoid/matchers/lt.rb +11 -0
- data/lib/mongoid/matchers/lte.rb +11 -0
- data/lib/mongoid/matchers/ne.rb +11 -0
- data/lib/mongoid/matchers/nin.rb +11 -0
- data/lib/mongoid/matchers/size.rb +11 -0
- data/lib/mongoid/memoization.rb +33 -0
- data/lib/mongoid/named_scope.rb +37 -0
- data/lib/mongoid/paranoia.rb +106 -0
- data/lib/mongoid/paths.rb +61 -0
- data/lib/mongoid/persistence.rb +216 -0
- data/lib/mongoid/persistence/command.rb +39 -0
- data/lib/mongoid/persistence/insert.rb +48 -0
- data/lib/mongoid/persistence/insert_embedded.rb +44 -0
- data/lib/mongoid/persistence/remove.rb +39 -0
- data/lib/mongoid/persistence/remove_all.rb +38 -0
- data/lib/mongoid/persistence/remove_embedded.rb +50 -0
- data/lib/mongoid/persistence/update.rb +71 -0
- data/lib/mongoid/railtie.rb +67 -0
- data/lib/mongoid/railties/database.rake +60 -0
- data/lib/mongoid/scope.rb +75 -0
- data/lib/mongoid/state.rb +32 -0
- data/lib/mongoid/timestamps.rb +27 -0
- data/lib/mongoid/validations.rb +51 -0
- data/lib/mongoid/validations/associated.rb +32 -0
- data/lib/mongoid/validations/locale/en.yml +5 -0
- data/lib/mongoid/validations/uniqueness.rb +56 -0
- data/lib/mongoid/version.rb +4 -0
- data/lib/mongoid/versioning.rb +26 -0
- data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +24 -0
- data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
- data/lib/rails/generators/mongoid/model/templates/model.rb +15 -0
- data/lib/rails/generators/mongoid_generator.rb +61 -0
- data/spec/integration/mongoid/association_attributes_spec.rb +71 -0
- data/spec/integration/mongoid/associations_spec.rb +768 -0
- data/spec/integration/mongoid/attributes_spec.rb +59 -0
- data/spec/integration/mongoid/callback_spec.rb +33 -0
- data/spec/integration/mongoid/contexts/enumerable_spec.rb +33 -0
- data/spec/integration/mongoid/criteria_spec.rb +281 -0
- data/spec/integration/mongoid/dirty_spec.rb +85 -0
- data/spec/integration/mongoid/document_spec.rb +741 -0
- data/spec/integration/mongoid/extensions_spec.rb +22 -0
- data/spec/integration/mongoid/finders_spec.rb +119 -0
- data/spec/integration/mongoid/inheritance_spec.rb +171 -0
- data/spec/integration/mongoid/named_scope_spec.rb +58 -0
- data/spec/integration/mongoid/paranoia_spec.rb +44 -0
- data/spec/integration/mongoid/persistence/update_spec.rb +46 -0
- data/spec/integration/mongoid/persistence_spec.rb +311 -0
- data/spec/integration/mongoid/validations/uniqueness_spec.rb +206 -0
- data/spec/models/account.rb +5 -0
- data/spec/models/address.rb +40 -0
- data/spec/models/agent.rb +7 -0
- data/spec/models/animal.rb +15 -0
- data/spec/models/answer.rb +4 -0
- data/spec/models/callbacks.rb +47 -0
- data/spec/models/category.rb +13 -0
- data/spec/models/comment.rb +10 -0
- data/spec/models/country_code.rb +6 -0
- data/spec/models/employer.rb +5 -0
- data/spec/models/favorite.rb +8 -0
- data/spec/models/game.rb +9 -0
- data/spec/models/inheritance.rb +72 -0
- data/spec/models/location.rb +5 -0
- data/spec/models/login.rb +6 -0
- data/spec/models/mixed_drink.rb +4 -0
- data/spec/models/name.rb +13 -0
- data/spec/models/namespacing.rb +11 -0
- data/spec/models/paranoid_post.rb +18 -0
- data/spec/models/parents.rb +32 -0
- data/spec/models/patient.rb +15 -0
- data/spec/models/person.rb +106 -0
- data/spec/models/pet.rb +7 -0
- data/spec/models/pet_owner.rb +6 -0
- data/spec/models/phone.rb +7 -0
- data/spec/models/post.rb +25 -0
- data/spec/models/preference.rb +7 -0
- data/spec/models/question.rb +8 -0
- data/spec/models/survey.rb +6 -0
- data/spec/models/translation.rb +5 -0
- data/spec/models/user.rb +6 -0
- data/spec/models/user_accout.rb +5 -0
- data/spec/models/vet_visit.rb +5 -0
- data/spec/models/video.rb +5 -0
- data/spec/spec_helper.rb +33 -0
- data/spec/unit/mongoid/associations/embedded_in_spec.rb +193 -0
- data/spec/unit/mongoid/associations/embeds_many_spec.rb +626 -0
- data/spec/unit/mongoid/associations/embeds_one_spec.rb +287 -0
- data/spec/unit/mongoid/associations/foreign_key_spec.rb +90 -0
- data/spec/unit/mongoid/associations/meta_data_spec.rb +110 -0
- data/spec/unit/mongoid/associations/options_spec.rb +215 -0
- data/spec/unit/mongoid/associations/referenced_in_spec.rb +145 -0
- data/spec/unit/mongoid/associations/references_many_as_array_spec.rb +424 -0
- data/spec/unit/mongoid/associations/references_many_spec.rb +502 -0
- data/spec/unit/mongoid/associations/references_one_spec.rb +204 -0
- data/spec/unit/mongoid/associations_spec.rb +688 -0
- data/spec/unit/mongoid/atomicity_spec.rb +164 -0
- data/spec/unit/mongoid/attributes_spec.rb +646 -0
- data/spec/unit/mongoid/callbacks_spec.rb +85 -0
- data/spec/unit/mongoid/collection_spec.rb +187 -0
- data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
- data/spec/unit/mongoid/collections/master_spec.rb +41 -0
- data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
- data/spec/unit/mongoid/collections_spec.rb +98 -0
- data/spec/unit/mongoid/config_spec.rb +298 -0
- data/spec/unit/mongoid/contexts/enumerable_spec.rb +447 -0
- data/spec/unit/mongoid/contexts/mongo_spec.rb +703 -0
- data/spec/unit/mongoid/contexts_spec.rb +25 -0
- data/spec/unit/mongoid/criteria_spec.rb +873 -0
- data/spec/unit/mongoid/criterion/complex_spec.rb +17 -0
- data/spec/unit/mongoid/criterion/exclusion_spec.rb +121 -0
- data/spec/unit/mongoid/criterion/inclusion_spec.rb +274 -0
- data/spec/unit/mongoid/criterion/optional_spec.rb +483 -0
- data/spec/unit/mongoid/cursor_spec.rb +80 -0
- data/spec/unit/mongoid/deprecation_spec.rb +24 -0
- data/spec/unit/mongoid/dirty_spec.rb +430 -0
- data/spec/unit/mongoid/document_spec.rb +623 -0
- data/spec/unit/mongoid/errors_spec.rb +154 -0
- data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
- data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
- data/spec/unit/mongoid/extensions/array/conversions_spec.rb +52 -0
- data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
- data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +36 -0
- data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
- data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
- data/spec/unit/mongoid/extensions/date/conversions_spec.rb +145 -0
- data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +14 -0
- data/spec/unit/mongoid/extensions/false_class/equality_spec.rb +35 -0
- data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
- data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
- data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +59 -0
- data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +35 -0
- data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
- data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
- data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
- data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +29 -0
- data/spec/unit/mongoid/extensions/object/conversions_spec.rb +44 -0
- data/spec/unit/mongoid/extensions/objectid/conversions_spec.rb +22 -0
- data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
- data/spec/unit/mongoid/extensions/set/conversions_spec.rb +21 -0
- data/spec/unit/mongoid/extensions/string/conversions_spec.rb +28 -0
- data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
- data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +107 -0
- data/spec/unit/mongoid/extensions/time_conversions_spec.rb +186 -0
- data/spec/unit/mongoid/extensions/true_class/equality_spec.rb +35 -0
- data/spec/unit/mongoid/extras_spec.rb +102 -0
- data/spec/unit/mongoid/factory_spec.rb +31 -0
- data/spec/unit/mongoid/field_spec.rb +169 -0
- data/spec/unit/mongoid/fields_spec.rb +181 -0
- data/spec/unit/mongoid/finders_spec.rb +439 -0
- data/spec/unit/mongoid/hierarchy_spec.rb +68 -0
- data/spec/unit/mongoid/identity_spec.rb +109 -0
- data/spec/unit/mongoid/indexes_spec.rb +99 -0
- data/spec/unit/mongoid/javascript_spec.rb +48 -0
- data/spec/unit/mongoid/logger_spec.rb +38 -0
- data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
- data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
- data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
- data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
- data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
- data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
- data/spec/unit/mongoid/matchers_spec.rb +329 -0
- data/spec/unit/mongoid/memoization_spec.rb +75 -0
- data/spec/unit/mongoid/named_scope_spec.rb +123 -0
- data/spec/unit/mongoid/paranoia_spec.rb +108 -0
- data/spec/unit/mongoid/paths_spec.rb +272 -0
- data/spec/unit/mongoid/persistence/insert_embedded_spec.rb +154 -0
- data/spec/unit/mongoid/persistence/insert_spec.rb +144 -0
- data/spec/unit/mongoid/persistence/remove_all_spec.rb +82 -0
- data/spec/unit/mongoid/persistence/remove_embedded_spec.rb +152 -0
- data/spec/unit/mongoid/persistence/remove_spec.rb +89 -0
- data/spec/unit/mongoid/persistence/update_spec.rb +177 -0
- data/spec/unit/mongoid/persistence_spec.rb +452 -0
- data/spec/unit/mongoid/scope_spec.rb +240 -0
- data/spec/unit/mongoid/serialization_spec.rb +43 -0
- data/spec/unit/mongoid/state_spec.rb +94 -0
- data/spec/unit/mongoid/timestamps_spec.rb +30 -0
- data/spec/unit/mongoid/validations/associated_spec.rb +103 -0
- data/spec/unit/mongoid/validations/uniqueness_spec.rb +201 -0
- data/spec/unit/mongoid/validations_spec.rb +43 -0
- data/spec/unit/mongoid/versioning_spec.rb +41 -0
- data/spec/unit/mongoid_spec.rb +46 -0
- metadata +433 -0
|
@@ -0,0 +1,623 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Document do
|
|
4
|
+
|
|
5
|
+
before do
|
|
6
|
+
@database = mock
|
|
7
|
+
@collection = stub(:name => "people")
|
|
8
|
+
@canvas_collection = stub(:name => "canvases")
|
|
9
|
+
Person.stubs(:collection).returns(@collection)
|
|
10
|
+
Canvas.stubs(:collection).returns(@canvas_collection)
|
|
11
|
+
@collection.stubs(:create_index).with(:_type, false)
|
|
12
|
+
@canvas_collection.stubs(:create_index).with(:_type, false)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe "#==" do
|
|
16
|
+
|
|
17
|
+
context "when other object is a Document" do
|
|
18
|
+
|
|
19
|
+
context "when attributes are equal" do
|
|
20
|
+
|
|
21
|
+
before do
|
|
22
|
+
@document = Person.new(:_id => 1, :title => "Sir")
|
|
23
|
+
@other = Person.new(:_id => 1, :title => "Sir")
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "returns true" do
|
|
27
|
+
@document.should == @other
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context "when attributes are not equal" do
|
|
33
|
+
|
|
34
|
+
before do
|
|
35
|
+
@document = Person.new(:title => "Sir")
|
|
36
|
+
@other = Person.new(:title => "Madam")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "returns false" do
|
|
40
|
+
@document.should_not == @other
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
context "when other object is not a Document" do
|
|
48
|
+
|
|
49
|
+
it "returns false" do
|
|
50
|
+
Person.new.==("Test").should be_false
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
context "when comapring parent to its subclass" do
|
|
56
|
+
|
|
57
|
+
it "returns false" do
|
|
58
|
+
Canvas.new.should_not == Firefox.new
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
describe "#eql?" do
|
|
66
|
+
|
|
67
|
+
context "when other object is a Document" do
|
|
68
|
+
|
|
69
|
+
context "when attributes are equal" do
|
|
70
|
+
|
|
71
|
+
before do
|
|
72
|
+
@document = Person.new(:_id => 1, :title => "Sir")
|
|
73
|
+
@other = Person.new(:_id => 1, :title => "Sir")
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it "returns true" do
|
|
77
|
+
@document.eql?(@other).should be_true
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
context "when attributes are not equal" do
|
|
83
|
+
|
|
84
|
+
before do
|
|
85
|
+
@document = Person.new(:title => "Sir")
|
|
86
|
+
@other = Person.new(:title => "Madam")
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "returns false" do
|
|
90
|
+
@document.eql?(@other).should_not be_true
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
context "when other object is not a Document" do
|
|
98
|
+
|
|
99
|
+
it "returns false" do
|
|
100
|
+
Person.new.eql?("Test").should be_false
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
context "when comapring parent to its subclass" do
|
|
106
|
+
|
|
107
|
+
it "returns false" do
|
|
108
|
+
Canvas.new.eql?(Firefox.new).should_not be_true
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
describe "#hash" do
|
|
116
|
+
|
|
117
|
+
before do
|
|
118
|
+
@document = Person.new(:_id => 1, :title => "Sir")
|
|
119
|
+
@other = Person.new(:_id => 2, :title => "Sir")
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it "deligates to id" do
|
|
123
|
+
@document.hash.should == @document.id.hash
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
it "has unique hash per id" do
|
|
127
|
+
@document.hash.should_not == @other.hash
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
describe "#alias_method_chain" do
|
|
133
|
+
|
|
134
|
+
context "on a field setter" do
|
|
135
|
+
|
|
136
|
+
before do
|
|
137
|
+
@person = Person.new
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it "chains the method properly" do
|
|
141
|
+
@person.score = 10
|
|
142
|
+
@person.rescored.should == 30
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
describe "#assimilate" do
|
|
150
|
+
|
|
151
|
+
before do
|
|
152
|
+
@child = Name.new(:first_name => "Hank", :last_name => "Moody")
|
|
153
|
+
@parent = Person.new(:title => "Mr.")
|
|
154
|
+
@options = Mongoid::Associations::Options.new(:name => :name)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
it "sets up all associations in the object graph" do
|
|
158
|
+
@child.assimilate(@parent, @options)
|
|
159
|
+
@parent.name.should == @child
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
describe ".db" do
|
|
165
|
+
|
|
166
|
+
before do
|
|
167
|
+
@db = stub
|
|
168
|
+
@collection.expects(:db).returns(@db)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it "returns the database from the collection" do
|
|
172
|
+
Person.db.should == @db
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
describe "#clone" do
|
|
177
|
+
|
|
178
|
+
before do
|
|
179
|
+
@comment = Comment.new(:text => "Woooooo")
|
|
180
|
+
@clone = @comment.clone
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
it "returns a new document sans id and versions" do
|
|
184
|
+
@clone.id.should_not == @comment.id
|
|
185
|
+
@clone.versions.should be_empty
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
describe ".embedded" do
|
|
191
|
+
|
|
192
|
+
context "when the document is embedded" do
|
|
193
|
+
|
|
194
|
+
it "returns true" do
|
|
195
|
+
address = Address.new
|
|
196
|
+
address.embedded.should be_true
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
context "when the document is not embedded" do
|
|
202
|
+
|
|
203
|
+
it "returns false" do
|
|
204
|
+
person = Person.new
|
|
205
|
+
person.embedded.should be_false
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
context "when a subclass is embedded" do
|
|
211
|
+
|
|
212
|
+
it "returns true" do
|
|
213
|
+
circle = Circle.new
|
|
214
|
+
circle.embedded.should be_true
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
describe ".hereditary" do
|
|
222
|
+
|
|
223
|
+
context "when the class is part of a hierarchy" do
|
|
224
|
+
|
|
225
|
+
it "returns true" do
|
|
226
|
+
Canvas.hereditary.should be_true
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
context "when the class is not part of a hierarchy" do
|
|
232
|
+
|
|
233
|
+
it "returns false" do
|
|
234
|
+
Game.hereditary.should be_false
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
describe ".human_name" do
|
|
242
|
+
|
|
243
|
+
it "returns the class name underscored and humanized" do
|
|
244
|
+
MixedDrink.model_name.human.should == "Mixed drink"
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
describe ".initialize" do
|
|
250
|
+
|
|
251
|
+
context "when passed a block" do
|
|
252
|
+
|
|
253
|
+
it "yields self to the block" do
|
|
254
|
+
person = Person.new do |p|
|
|
255
|
+
p.title = "Sir"
|
|
256
|
+
p.age = 60
|
|
257
|
+
end
|
|
258
|
+
person.title.should == "Sir"
|
|
259
|
+
person.age.should == 60
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
context "with no attributes" do
|
|
265
|
+
|
|
266
|
+
it "sets default attributes" do
|
|
267
|
+
person = Person.new
|
|
268
|
+
person.attributes.empty?.should be_false
|
|
269
|
+
person.age.should == 100
|
|
270
|
+
person.blood_alcohol_content.should == 0.0
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
context "with nil attributes" do
|
|
276
|
+
|
|
277
|
+
before do
|
|
278
|
+
@person = Person.new(nil)
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
it "sets default attributes" do
|
|
282
|
+
@person.attributes.empty?.should be_false
|
|
283
|
+
@person.age.should == 100
|
|
284
|
+
@person.blood_alcohol_content.should == 0.0
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
context "with attributes from another document" do
|
|
290
|
+
|
|
291
|
+
let(:person) do
|
|
292
|
+
Person.new(Person.new.attributes)
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
it "is a new record with a new id" do
|
|
296
|
+
person.new_record?.should be_true
|
|
297
|
+
end
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
context "with attributes" do
|
|
301
|
+
|
|
302
|
+
before do
|
|
303
|
+
@attributes = {
|
|
304
|
+
:_id => "1",
|
|
305
|
+
:title => "value",
|
|
306
|
+
:age => "30",
|
|
307
|
+
:terms => "true",
|
|
308
|
+
:name => {
|
|
309
|
+
:_id => "2", :first_name => "Test", :last_name => "User"
|
|
310
|
+
},
|
|
311
|
+
:addresses => [
|
|
312
|
+
{ :_id => "3", :street => "First Street" },
|
|
313
|
+
{ :_id => "4", :street => "Second Street" }
|
|
314
|
+
]
|
|
315
|
+
}
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
it "sets the attributes hash on the object properly casted" do
|
|
319
|
+
person = Person.new(@attributes)
|
|
320
|
+
person.attributes[:age].should == 30
|
|
321
|
+
person.attributes[:terms].should be_true
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
it "is a new record" do
|
|
325
|
+
Person.new(@attributes).new_record?.should == true
|
|
326
|
+
end
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
context "with a primary key" do
|
|
330
|
+
|
|
331
|
+
context "when the value for the key exists" do
|
|
332
|
+
|
|
333
|
+
before do
|
|
334
|
+
Address.key :street
|
|
335
|
+
@address = Address.new(:street => "Test")
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
it "sets the primary key" do
|
|
339
|
+
@address.id.should == "test"
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
context "without a type specified" do
|
|
347
|
+
|
|
348
|
+
it "sets the type" do
|
|
349
|
+
Person.new._type.should == "Person"
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
describe ".instantiate" do
|
|
357
|
+
|
|
358
|
+
context "when attributes have an id" do
|
|
359
|
+
|
|
360
|
+
before do
|
|
361
|
+
@attributes = { "_id" => "1", "_type" => "Person", "title" => "Sir", "age" => 30 }
|
|
362
|
+
end
|
|
363
|
+
|
|
364
|
+
it "sets the attributes directly" do
|
|
365
|
+
person = Person.instantiate(@attributes)
|
|
366
|
+
person._id.should == "1"
|
|
367
|
+
person._type.should == "Person"
|
|
368
|
+
person.title.should == "Sir"
|
|
369
|
+
person.age.should == 30
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
context "with nil attributes" do
|
|
375
|
+
|
|
376
|
+
it "sets the attributes directly" do
|
|
377
|
+
person = Person.instantiate(nil)
|
|
378
|
+
person.id.should_not be_nil
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
describe ".key" do
|
|
386
|
+
|
|
387
|
+
context "when key is single field" do
|
|
388
|
+
|
|
389
|
+
before do
|
|
390
|
+
Address.key :street
|
|
391
|
+
@address = Address.new(:street => "Testing Street Name")
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
it "adds the callback for primary key generation" do
|
|
395
|
+
@address.run_callbacks(:save)
|
|
396
|
+
@address.id.should == "testing-street-name"
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
context "when key is composite" do
|
|
402
|
+
|
|
403
|
+
before do
|
|
404
|
+
Address.key :street, :post_code
|
|
405
|
+
@address = Address.new(:street => "Testing Street Name", :post_code => "94123")
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
it "combines all fields" do
|
|
409
|
+
@address.run_callbacks(:save)
|
|
410
|
+
@address.id.should == "testing-street-name-94123"
|
|
411
|
+
end
|
|
412
|
+
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
context "when key is on a subclass" do
|
|
416
|
+
|
|
417
|
+
before do
|
|
418
|
+
Firefox.key :name
|
|
419
|
+
end
|
|
420
|
+
|
|
421
|
+
it "sets the key for the entire hierarchy" do
|
|
422
|
+
Canvas.primary_key.should == [:name]
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
describe "#_parent" do
|
|
430
|
+
|
|
431
|
+
before do
|
|
432
|
+
@attributes = { :title => "Sir",
|
|
433
|
+
:addresses => [
|
|
434
|
+
{ :street => "Street 1" },
|
|
435
|
+
{ :street => "Street 2" } ] }
|
|
436
|
+
@person = Person.new(@attributes)
|
|
437
|
+
end
|
|
438
|
+
|
|
439
|
+
context "when document is embedded" do
|
|
440
|
+
|
|
441
|
+
it "returns the parent document" do
|
|
442
|
+
@person.addresses.first._parent.should == @person
|
|
443
|
+
end
|
|
444
|
+
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
context "when document is root" do
|
|
448
|
+
|
|
449
|
+
it "returns nil" do
|
|
450
|
+
@person._parent.should be_nil
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
end
|
|
456
|
+
|
|
457
|
+
describe "#parentize" do
|
|
458
|
+
|
|
459
|
+
before do
|
|
460
|
+
@parent = Person.new
|
|
461
|
+
@child = Name.new
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
it "sets the parent on each element" do
|
|
465
|
+
@child.parentize(@parent, :child)
|
|
466
|
+
@child._parent.should == @parent
|
|
467
|
+
end
|
|
468
|
+
|
|
469
|
+
end
|
|
470
|
+
|
|
471
|
+
describe "#reload" do
|
|
472
|
+
|
|
473
|
+
before do
|
|
474
|
+
@attributes = { "title" => "Herr" }
|
|
475
|
+
@person = Person.new(:_id => BSON::ObjectID.new.to_s)
|
|
476
|
+
@collection.expects(:find_one).with(:_id => @person.id).returns(@attributes)
|
|
477
|
+
end
|
|
478
|
+
|
|
479
|
+
it "reloads the object attribtues from the database" do
|
|
480
|
+
@person.reload
|
|
481
|
+
@person.attributes.should == @attributes
|
|
482
|
+
end
|
|
483
|
+
|
|
484
|
+
it 'should return a person object' do
|
|
485
|
+
@person.reload.should be_kind_of(Person)
|
|
486
|
+
end
|
|
487
|
+
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
describe "#remove" do
|
|
491
|
+
|
|
492
|
+
context "when removing an element from a has many" do
|
|
493
|
+
|
|
494
|
+
before do
|
|
495
|
+
@person = Person.new
|
|
496
|
+
@address = Address.new(:street => "Testing")
|
|
497
|
+
@person.addresses << @address
|
|
498
|
+
end
|
|
499
|
+
|
|
500
|
+
it "removes the child document attributes" do
|
|
501
|
+
@person.remove(@address)
|
|
502
|
+
@person.addresses.size.should == 0
|
|
503
|
+
end
|
|
504
|
+
|
|
505
|
+
end
|
|
506
|
+
|
|
507
|
+
context "when removing a has one" do
|
|
508
|
+
|
|
509
|
+
before do
|
|
510
|
+
@person = Person.new
|
|
511
|
+
@name = Name.new(:first_name => "Neytiri")
|
|
512
|
+
@person.name = @name
|
|
513
|
+
end
|
|
514
|
+
|
|
515
|
+
it "removes the child document attributes" do
|
|
516
|
+
@person.remove(@name)
|
|
517
|
+
@person.name.should be_nil
|
|
518
|
+
end
|
|
519
|
+
end
|
|
520
|
+
end
|
|
521
|
+
|
|
522
|
+
describe "#_root" do
|
|
523
|
+
|
|
524
|
+
before do
|
|
525
|
+
@person = Person.new(:title => "Mr")
|
|
526
|
+
@phone_number = Phone.new(:number => "415-555-1212")
|
|
527
|
+
@country_code = CountryCode.new(:code => 1)
|
|
528
|
+
@phone_number.country_code = @country_code
|
|
529
|
+
@person.phone_numbers << @phone_number
|
|
530
|
+
end
|
|
531
|
+
|
|
532
|
+
context "when document is the root" do
|
|
533
|
+
|
|
534
|
+
it "returns self" do
|
|
535
|
+
@person._root.should == @person
|
|
536
|
+
end
|
|
537
|
+
end
|
|
538
|
+
|
|
539
|
+
context "when document is embedded one level" do
|
|
540
|
+
|
|
541
|
+
it "returns the parent" do
|
|
542
|
+
@phone_number._root.should == @person
|
|
543
|
+
end
|
|
544
|
+
end
|
|
545
|
+
|
|
546
|
+
context "when document is embedded multiple levels" do
|
|
547
|
+
|
|
548
|
+
it "returns the top level parent" do
|
|
549
|
+
@country_code._root.should == @person
|
|
550
|
+
end
|
|
551
|
+
end
|
|
552
|
+
end
|
|
553
|
+
|
|
554
|
+
describe "._types" do
|
|
555
|
+
|
|
556
|
+
it "returns all subclasses for the class plus the class" do
|
|
557
|
+
types = Canvas._types
|
|
558
|
+
types.size.should == 3
|
|
559
|
+
types.should include("Firefox")
|
|
560
|
+
types.should include("Browser")
|
|
561
|
+
types.should include("Canvas")
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
it "does not return parent classes" do
|
|
565
|
+
types = Browser._types
|
|
566
|
+
types.size.should == 2
|
|
567
|
+
types.should include("Firefox")
|
|
568
|
+
types.should include("Browser")
|
|
569
|
+
end
|
|
570
|
+
|
|
571
|
+
it 'should return strings' do
|
|
572
|
+
types = Canvas._types
|
|
573
|
+
types.each do |type|
|
|
574
|
+
type.should be_an_instance_of String
|
|
575
|
+
end
|
|
576
|
+
end
|
|
577
|
+
|
|
578
|
+
end
|
|
579
|
+
|
|
580
|
+
describe "#to_a" do
|
|
581
|
+
|
|
582
|
+
it "returns an array with the document in it" do
|
|
583
|
+
person = Person.new
|
|
584
|
+
person.to_a.should == [ person ]
|
|
585
|
+
end
|
|
586
|
+
|
|
587
|
+
end
|
|
588
|
+
|
|
589
|
+
describe "#to_key" do
|
|
590
|
+
|
|
591
|
+
context "when the document is new" do
|
|
592
|
+
|
|
593
|
+
before do
|
|
594
|
+
@person = Person.new
|
|
595
|
+
end
|
|
596
|
+
|
|
597
|
+
it "returns nil" do
|
|
598
|
+
@person.to_key.should be_nil
|
|
599
|
+
end
|
|
600
|
+
end
|
|
601
|
+
|
|
602
|
+
context "when the document is not new" do
|
|
603
|
+
|
|
604
|
+
before do
|
|
605
|
+
@id = BSON::ObjectID.new.to_s
|
|
606
|
+
@person = Person.instantiate("_id" => @id)
|
|
607
|
+
end
|
|
608
|
+
|
|
609
|
+
it "returns the id in an array" do
|
|
610
|
+
@person.to_key.should == [ @id ]
|
|
611
|
+
end
|
|
612
|
+
end
|
|
613
|
+
end
|
|
614
|
+
|
|
615
|
+
describe "#to_param" do
|
|
616
|
+
|
|
617
|
+
it "returns the id" do
|
|
618
|
+
id = BSON::ObjectID.new.to_s
|
|
619
|
+
Person.instantiate("_id" => id).to_param.should == id.to_s
|
|
620
|
+
end
|
|
621
|
+
|
|
622
|
+
end
|
|
623
|
+
end
|