mongoid 2.0.0.alpha → 2.0.0.beta.5
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/lib/mongoid.rb +11 -5
- data/lib/mongoid/associations.rb +112 -107
- data/lib/mongoid/associations/belongs_to_related.rb +2 -3
- data/lib/mongoid/associations/embedded_in.rb +12 -4
- data/lib/mongoid/associations/{embed_many.rb → embeds_many.rb} +101 -32
- data/lib/mongoid/associations/{embed_one.rb → embeds_one.rb} +10 -10
- data/lib/mongoid/associations/has_many_related.rb +51 -5
- data/lib/mongoid/associations/has_one_related.rb +9 -5
- data/lib/mongoid/associations/meta_data.rb +2 -1
- data/lib/mongoid/associations/options.rb +15 -6
- data/lib/mongoid/associations/proxy.rb +14 -21
- data/lib/mongoid/attributes.rb +34 -13
- data/lib/mongoid/callbacks.rb +1 -2
- data/lib/mongoid/collection.rb +4 -3
- data/lib/mongoid/collections.rb +41 -0
- data/lib/mongoid/collections/master.rb +3 -2
- data/lib/mongoid/collections/slaves.rb +3 -2
- data/lib/mongoid/components.rb +4 -1
- data/lib/mongoid/config.rb +163 -13
- data/lib/mongoid/contexts.rb +1 -2
- data/lib/mongoid/contexts/enumerable.rb +1 -1
- data/lib/mongoid/contexts/mongo.rb +1 -1
- data/lib/mongoid/contexts/paging.rb +10 -2
- data/lib/mongoid/criteria.rb +13 -22
- data/lib/mongoid/criterion/exclusion.rb +3 -3
- data/lib/mongoid/criterion/inclusion.rb +17 -0
- data/lib/mongoid/criterion/optional.rb +1 -1
- data/lib/mongoid/dirty.rb +253 -0
- data/lib/mongoid/document.rb +40 -85
- data/lib/mongoid/errors.rb +48 -1
- data/lib/mongoid/extensions.rb +11 -9
- data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
- data/lib/mongoid/extensions/boolean/conversions.rb +8 -2
- data/lib/mongoid/extensions/date/conversions.rb +13 -4
- data/lib/mongoid/extensions/datetime/conversions.rb +1 -6
- data/lib/mongoid/extensions/float/conversions.rb +5 -1
- data/lib/mongoid/extensions/hash/assimilation.rb +12 -3
- data/lib/mongoid/extensions/hash/conversions.rb +34 -4
- data/lib/mongoid/extensions/integer/conversions.rb +5 -1
- data/lib/mongoid/extensions/nil/assimilation.rb +4 -0
- data/lib/mongoid/extensions/object/conversions.rb +3 -3
- data/lib/mongoid/extensions/string/conversions.rb +1 -1
- data/lib/mongoid/extensions/symbol/inflections.rb +5 -2
- data/lib/mongoid/extensions/time_conversions.rb +35 -0
- data/lib/mongoid/factory.rb +2 -1
- data/lib/mongoid/field.rb +15 -2
- data/lib/mongoid/fields.rb +1 -1
- data/lib/mongoid/identity.rb +3 -3
- data/lib/mongoid/indexes.rb +3 -3
- data/lib/mongoid/matchers.rb +1 -2
- data/lib/mongoid/memoization.rb +8 -2
- data/lib/mongoid/named_scope.rb +0 -5
- data/lib/mongoid/observable.rb +1 -1
- data/lib/mongoid/paths.rb +30 -22
- data/lib/mongoid/persistence.rb +218 -0
- data/lib/mongoid/persistence/command.rb +39 -0
- data/lib/mongoid/persistence/insert.rb +47 -0
- data/lib/mongoid/persistence/insert_embedded.rb +38 -0
- data/lib/mongoid/persistence/remove.rb +39 -0
- data/lib/mongoid/persistence/remove_all.rb +37 -0
- data/lib/mongoid/persistence/remove_embedded.rb +50 -0
- data/lib/mongoid/persistence/update.rb +63 -0
- data/lib/mongoid/railtie.rb +53 -0
- data/lib/mongoid/railties/database.rake +37 -0
- data/lib/mongoid/timestamps.rb +2 -2
- data/lib/mongoid/validations.rb +2 -2
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/uniqueness.rb +13 -2
- data/lib/mongoid/version.rb +4 -0
- data/lib/mongoid/versioning.rb +3 -2
- data/lib/rails/generators/mongoid/config/config_generator.rb +41 -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
- metadata +76 -301
- data/.gitignore +0 -6
- data/.watchr +0 -29
- data/Rakefile +0 -52
- data/VERSION +0 -1
- data/caliper.yml +0 -4
- data/lib/mongoid/collections/mimic.rb +0 -46
- data/lib/mongoid/commands.rb +0 -161
- data/lib/mongoid/commands/create.rb +0 -19
- data/lib/mongoid/commands/delete.rb +0 -16
- data/lib/mongoid/commands/delete_all.rb +0 -23
- data/lib/mongoid/commands/deletion.rb +0 -18
- data/lib/mongoid/commands/destroy.rb +0 -17
- data/lib/mongoid/commands/destroy_all.rb +0 -23
- data/lib/mongoid/commands/save.rb +0 -29
- data/lib/mongoid/extensions/time/conversions.rb +0 -18
- data/mongoid.gemspec +0 -408
- data/perf/benchmark.rb +0 -77
- data/spec/integration/mongoid/associations_spec.rb +0 -340
- data/spec/integration/mongoid/attributes_spec.rb +0 -22
- data/spec/integration/mongoid/commands_spec.rb +0 -227
- data/spec/integration/mongoid/contexts/enumerable_spec.rb +0 -33
- data/spec/integration/mongoid/criteria_spec.rb +0 -272
- data/spec/integration/mongoid/document_spec.rb +0 -650
- data/spec/integration/mongoid/extensions_spec.rb +0 -22
- data/spec/integration/mongoid/finders_spec.rb +0 -119
- data/spec/integration/mongoid/inheritance_spec.rb +0 -137
- data/spec/integration/mongoid/named_scope_spec.rb +0 -46
- data/spec/models/address.rb +0 -39
- data/spec/models/animal.rb +0 -6
- data/spec/models/callbacks.rb +0 -18
- data/spec/models/comment.rb +0 -8
- data/spec/models/country_code.rb +0 -6
- data/spec/models/employer.rb +0 -5
- data/spec/models/game.rb +0 -7
- data/spec/models/inheritance.rb +0 -56
- data/spec/models/location.rb +0 -5
- data/spec/models/mixed_drink.rb +0 -4
- data/spec/models/name.rb +0 -13
- data/spec/models/namespacing.rb +0 -11
- data/spec/models/patient.rb +0 -4
- data/spec/models/person.rb +0 -99
- data/spec/models/pet.rb +0 -7
- data/spec/models/pet_owner.rb +0 -6
- data/spec/models/phone.rb +0 -7
- data/spec/models/post.rb +0 -15
- data/spec/models/translation.rb +0 -5
- data/spec/models/vet_visit.rb +0 -5
- data/spec/spec.opts +0 -3
- data/spec/spec_helper.rb +0 -31
- data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +0 -145
- data/spec/unit/mongoid/associations/embed_many_spec.rb +0 -516
- data/spec/unit/mongoid/associations/embed_one_spec.rb +0 -282
- data/spec/unit/mongoid/associations/embedded_in_spec.rb +0 -193
- data/spec/unit/mongoid/associations/has_many_related_spec.rb +0 -418
- data/spec/unit/mongoid/associations/has_one_related_spec.rb +0 -179
- data/spec/unit/mongoid/associations/meta_data_spec.rb +0 -88
- data/spec/unit/mongoid/associations/options_spec.rb +0 -192
- data/spec/unit/mongoid/associations_spec.rb +0 -595
- data/spec/unit/mongoid/attributes_spec.rb +0 -507
- data/spec/unit/mongoid/callbacks_spec.rb +0 -55
- data/spec/unit/mongoid/collection_spec.rb +0 -187
- data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +0 -75
- data/spec/unit/mongoid/collections/master_spec.rb +0 -41
- data/spec/unit/mongoid/collections/mimic_spec.rb +0 -43
- data/spec/unit/mongoid/collections/slaves_spec.rb +0 -81
- data/spec/unit/mongoid/commands/create_spec.rb +0 -31
- data/spec/unit/mongoid/commands/delete_all_spec.rb +0 -58
- data/spec/unit/mongoid/commands/delete_spec.rb +0 -38
- data/spec/unit/mongoid/commands/destroy_all_spec.rb +0 -21
- data/spec/unit/mongoid/commands/destroy_spec.rb +0 -51
- data/spec/unit/mongoid/commands/save_spec.rb +0 -107
- data/spec/unit/mongoid/commands_spec.rb +0 -270
- data/spec/unit/mongoid/config_spec.rb +0 -172
- data/spec/unit/mongoid/contexts/enumerable_spec.rb +0 -421
- data/spec/unit/mongoid/contexts/mongo_spec.rb +0 -682
- data/spec/unit/mongoid/contexts_spec.rb +0 -25
- data/spec/unit/mongoid/criteria_spec.rb +0 -824
- data/spec/unit/mongoid/criterion/complex_spec.rb +0 -19
- data/spec/unit/mongoid/criterion/exclusion_spec.rb +0 -91
- data/spec/unit/mongoid/criterion/inclusion_spec.rb +0 -219
- data/spec/unit/mongoid/criterion/optional_spec.rb +0 -319
- data/spec/unit/mongoid/cursor_spec.rb +0 -74
- data/spec/unit/mongoid/deprecation_spec.rb +0 -24
- data/spec/unit/mongoid/document_spec.rb +0 -818
- data/spec/unit/mongoid/errors_spec.rb +0 -103
- data/spec/unit/mongoid/extensions/array/accessors_spec.rb +0 -50
- data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +0 -24
- data/spec/unit/mongoid/extensions/array/conversions_spec.rb +0 -35
- data/spec/unit/mongoid/extensions/array/parentization_spec.rb +0 -20
- data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +0 -22
- data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +0 -22
- data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +0 -49
- data/spec/unit/mongoid/extensions/date/conversions_spec.rb +0 -102
- data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +0 -67
- data/spec/unit/mongoid/extensions/float/conversions_spec.rb +0 -61
- data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +0 -184
- data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +0 -46
- data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +0 -21
- data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +0 -17
- data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +0 -14
- data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +0 -61
- data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +0 -24
- data/spec/unit/mongoid/extensions/object/conversions_spec.rb +0 -57
- data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +0 -34
- data/spec/unit/mongoid/extensions/string/conversions_spec.rb +0 -17
- data/spec/unit/mongoid/extensions/string/inflections_spec.rb +0 -208
- data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +0 -91
- data/spec/unit/mongoid/extensions/time/conversions_spec.rb +0 -70
- data/spec/unit/mongoid/extras_spec.rb +0 -102
- data/spec/unit/mongoid/factory_spec.rb +0 -31
- data/spec/unit/mongoid/field_spec.rb +0 -143
- data/spec/unit/mongoid/fields_spec.rb +0 -181
- data/spec/unit/mongoid/finders_spec.rb +0 -404
- data/spec/unit/mongoid/identity_spec.rb +0 -109
- data/spec/unit/mongoid/indexes_spec.rb +0 -93
- data/spec/unit/mongoid/javascript_spec.rb +0 -48
- data/spec/unit/mongoid/matchers/all_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/default_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/exists_spec.rb +0 -56
- data/spec/unit/mongoid/matchers/gt_spec.rb +0 -39
- data/spec/unit/mongoid/matchers/gte_spec.rb +0 -49
- data/spec/unit/mongoid/matchers/in_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/lt_spec.rb +0 -39
- data/spec/unit/mongoid/matchers/lte_spec.rb +0 -49
- data/spec/unit/mongoid/matchers/ne_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/nin_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/size_spec.rb +0 -27
- data/spec/unit/mongoid/matchers_spec.rb +0 -329
- data/spec/unit/mongoid/memoization_spec.rb +0 -75
- data/spec/unit/mongoid/named_scope_spec.rb +0 -123
- data/spec/unit/mongoid/observable_spec.rb +0 -46
- data/spec/unit/mongoid/paths_spec.rb +0 -124
- data/spec/unit/mongoid/scope_spec.rb +0 -240
- data/spec/unit/mongoid/state_spec.rb +0 -83
- data/spec/unit/mongoid/timestamps_spec.rb +0 -25
- data/spec/unit/mongoid/validations/associated_spec.rb +0 -103
- data/spec/unit/mongoid/validations/uniqueness_spec.rb +0 -47
- data/spec/unit/mongoid/validations_spec.rb +0 -190
- data/spec/unit/mongoid/versioning_spec.rb +0 -41
- data/spec/unit/mongoid_spec.rb +0 -46
@@ -1,31 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Mongoid::Factory do
|
4
|
-
|
5
|
-
describe ".build" do
|
6
|
-
|
7
|
-
context "when the _type attribute is present" do
|
8
|
-
|
9
|
-
before do
|
10
|
-
@attributes = { "_type" => "Person", "title" => "Sir" }
|
11
|
-
end
|
12
|
-
|
13
|
-
it "instantiates based on the type" do
|
14
|
-
person = Mongoid::Factory.build(Person, @attributes)
|
15
|
-
person.title.should == "Sir"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
context "when _type is not preset" do
|
20
|
-
|
21
|
-
before do
|
22
|
-
@attributes = { "title" => "Sir" }
|
23
|
-
end
|
24
|
-
|
25
|
-
it "instantiates based on the type" do
|
26
|
-
person = Mongoid::Factory.build(Person, @attributes)
|
27
|
-
person.title.should == "Sir"
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,143 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Mongoid::Field do
|
4
|
-
|
5
|
-
describe "#accessible?" do
|
6
|
-
|
7
|
-
context "when value is not set" do
|
8
|
-
|
9
|
-
before do
|
10
|
-
@field = Mongoid::Field.new(:name)
|
11
|
-
end
|
12
|
-
|
13
|
-
it "defaults to true" do
|
14
|
-
@field.accessible?.should be_true
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
context "when set to true" do
|
19
|
-
|
20
|
-
before do
|
21
|
-
@field = Mongoid::Field.new(:name, :accessible => true)
|
22
|
-
end
|
23
|
-
|
24
|
-
it "returns true" do
|
25
|
-
@field.accessible?.should be_true
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
context "when set to false" do
|
30
|
-
|
31
|
-
before do
|
32
|
-
@field = Mongoid::Field.new(:name, :accessible => false)
|
33
|
-
end
|
34
|
-
|
35
|
-
it "returns false" do
|
36
|
-
@field.accessible?.should be_false
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
describe "#default" do
|
42
|
-
|
43
|
-
before do
|
44
|
-
@field = Mongoid::Field.new(:score, :default => 0)
|
45
|
-
end
|
46
|
-
|
47
|
-
it "returns the default option" do
|
48
|
-
@field.default.should == 0
|
49
|
-
end
|
50
|
-
|
51
|
-
context "when the field is an array" do
|
52
|
-
|
53
|
-
before do
|
54
|
-
@field = Mongoid::Field.new(:vals, :type => Array, :default => [ "first" ])
|
55
|
-
end
|
56
|
-
|
57
|
-
it "dups the array" do
|
58
|
-
array = @field.default
|
59
|
-
array << "second"
|
60
|
-
@field.default.should == [ "first" ]
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
context "when the field is a hash" do
|
65
|
-
|
66
|
-
before do
|
67
|
-
@field = Mongoid::Field.new(:vals, :type => Hash, :default => { :key => "value" })
|
68
|
-
end
|
69
|
-
|
70
|
-
it "dups the hash" do
|
71
|
-
hash = @field.default
|
72
|
-
hash[:key_two] = "value2"
|
73
|
-
@field.default.should == { :key => "value" }
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|
78
|
-
|
79
|
-
describe "#name" do
|
80
|
-
|
81
|
-
before do
|
82
|
-
@field = Mongoid::Field.new(:score, :default => 0)
|
83
|
-
end
|
84
|
-
|
85
|
-
it "returns the name" do
|
86
|
-
@field.name.should == :score
|
87
|
-
end
|
88
|
-
|
89
|
-
end
|
90
|
-
|
91
|
-
describe "#type" do
|
92
|
-
|
93
|
-
before do
|
94
|
-
@field = Mongoid::Field.new(:name)
|
95
|
-
end
|
96
|
-
|
97
|
-
it "defaults to String" do
|
98
|
-
@field.type.should == String
|
99
|
-
end
|
100
|
-
|
101
|
-
end
|
102
|
-
|
103
|
-
describe "#set" do
|
104
|
-
|
105
|
-
before do
|
106
|
-
@type = mock
|
107
|
-
@field = Mongoid::Field.new(:score, :default => 10, :type => @type)
|
108
|
-
end
|
109
|
-
|
110
|
-
context "nil is provided" do
|
111
|
-
|
112
|
-
it "returns the default value" do
|
113
|
-
@field.set(nil).should == 10
|
114
|
-
end
|
115
|
-
|
116
|
-
end
|
117
|
-
|
118
|
-
context "value is provided" do
|
119
|
-
|
120
|
-
it "sets the value" do
|
121
|
-
@type.expects(:set).with("30").returns(30)
|
122
|
-
@field.set("30").should == 30
|
123
|
-
end
|
124
|
-
|
125
|
-
end
|
126
|
-
|
127
|
-
end
|
128
|
-
|
129
|
-
describe "#get" do
|
130
|
-
|
131
|
-
before do
|
132
|
-
@type = mock
|
133
|
-
@field = Mongoid::Field.new(:score, :default => 10, :type => @type)
|
134
|
-
end
|
135
|
-
|
136
|
-
it "returns the value" do
|
137
|
-
@type.expects(:get).with(30).returns(30)
|
138
|
-
@field.get(30).should == 30
|
139
|
-
end
|
140
|
-
|
141
|
-
end
|
142
|
-
|
143
|
-
end
|
@@ -1,181 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Mongoid::Fields do
|
4
|
-
|
5
|
-
describe ".defaults" do
|
6
|
-
|
7
|
-
it "returns a hash of all the default values" do
|
8
|
-
Game.defaults.should == { "high_score" => 500, "score" => 0 }
|
9
|
-
end
|
10
|
-
|
11
|
-
end
|
12
|
-
|
13
|
-
describe "#defaults" do
|
14
|
-
|
15
|
-
context "with defaults specified as a non-primitive" do
|
16
|
-
|
17
|
-
before do
|
18
|
-
Person.field(:hash_testing, :type => Hash, :default => {})
|
19
|
-
Person.field(:array_testing, :type => Array, :default => [])
|
20
|
-
@first_person = Person.new
|
21
|
-
@second_person = Person.new
|
22
|
-
end
|
23
|
-
|
24
|
-
after do
|
25
|
-
Person.fields.delete("hash_testing")
|
26
|
-
Person.fields.delete("array_testing")
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should not return the same object when calling defaults with a default hash" do
|
30
|
-
@first_person.hash_testing.object_id.should_not == @second_person.hash_testing.object_id
|
31
|
-
end
|
32
|
-
|
33
|
-
it "should not return the same object when calling defaults with a default array" do
|
34
|
-
@first_person.array_testing.object_id.should_not == @second_person.array_testing.object_id
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
context "on parent classes" do
|
39
|
-
|
40
|
-
before do
|
41
|
-
@shape = Shape.new
|
42
|
-
end
|
43
|
-
|
44
|
-
it "does not return subclass defaults" do
|
45
|
-
@shape.defaults.should == { "x" => 0, "y" => 0 }
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
context "on subclasses" do
|
51
|
-
|
52
|
-
before do
|
53
|
-
@circle = Circle.new
|
54
|
-
end
|
55
|
-
|
56
|
-
it "has the parent and child defaults" do
|
57
|
-
@circle.defaults.should == { "x" => 0, "y" => 0, "radius" => 0 }
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
describe ".field" do
|
65
|
-
|
66
|
-
context "with no options" do
|
67
|
-
|
68
|
-
before do
|
69
|
-
Person.field(:testing)
|
70
|
-
end
|
71
|
-
|
72
|
-
it "adds a reader for the fields defined" do
|
73
|
-
@person = Person.new(:testing => "Test")
|
74
|
-
@person.testing.should == "Test"
|
75
|
-
end
|
76
|
-
|
77
|
-
it "adds a writer for the fields defined" do
|
78
|
-
@person = Person.new(:testing => "Test")
|
79
|
-
@person.testing = "Testy"
|
80
|
-
@person.testing.should == "Testy"
|
81
|
-
end
|
82
|
-
|
83
|
-
it "adds an reader method with a question mark" do
|
84
|
-
@person = Person.new(:testing => "Test")
|
85
|
-
@person.testing?.should be_true
|
86
|
-
Person.new.testing?.should be_false
|
87
|
-
end
|
88
|
-
|
89
|
-
end
|
90
|
-
|
91
|
-
context "when type is an object" do
|
92
|
-
|
93
|
-
before do
|
94
|
-
@person = Person.new
|
95
|
-
@drink = MixedDrink.new(:name => "Jack and Coke")
|
96
|
-
@person.mixed_drink = @drink
|
97
|
-
end
|
98
|
-
|
99
|
-
it "allows proper access to the object" do
|
100
|
-
@person.mixed_drink.should == @drink
|
101
|
-
@person.attributes[:mixed_drink].except(:_id).except(:_type).should ==
|
102
|
-
{ "name" => "Jack and Coke" }
|
103
|
-
end
|
104
|
-
|
105
|
-
it "adds an reader method with a question mark" do
|
106
|
-
@person.mixed_drink?.should be_true
|
107
|
-
end
|
108
|
-
|
109
|
-
end
|
110
|
-
|
111
|
-
context "when type is a boolean" do
|
112
|
-
|
113
|
-
before do
|
114
|
-
@person = Person.new(:terms => true)
|
115
|
-
end
|
116
|
-
|
117
|
-
it "adds an accessor method with a question mark" do
|
118
|
-
@person.terms?.should be_true
|
119
|
-
end
|
120
|
-
|
121
|
-
end
|
122
|
-
|
123
|
-
context "when as is specified" do
|
124
|
-
|
125
|
-
before do
|
126
|
-
Person.field :aliased, :as => :alias, :type => Boolean
|
127
|
-
@person = Person.new(:alias => true)
|
128
|
-
end
|
129
|
-
|
130
|
-
it "uses the alias to write the attribute" do
|
131
|
-
@person.expects(:write_attribute).with("aliased", true)
|
132
|
-
@person.alias = true
|
133
|
-
end
|
134
|
-
|
135
|
-
it "uses the alias to read the attribute" do
|
136
|
-
@person.expects(:read_attribute).with("aliased")
|
137
|
-
@person.alias
|
138
|
-
end
|
139
|
-
|
140
|
-
it "uses the alias for the query method" do
|
141
|
-
@person.expects(:read_attribute).with("aliased")
|
142
|
-
@person.alias?
|
143
|
-
end
|
144
|
-
|
145
|
-
end
|
146
|
-
|
147
|
-
end
|
148
|
-
|
149
|
-
describe "#fields" do
|
150
|
-
|
151
|
-
context "on parent classes" do
|
152
|
-
|
153
|
-
before do
|
154
|
-
@shape = Shape.new
|
155
|
-
end
|
156
|
-
|
157
|
-
it "does not return subclass fields" do
|
158
|
-
@shape.fields.keys.should include("x")
|
159
|
-
@shape.fields.keys.should include("y")
|
160
|
-
@shape.fields.keys.should_not include("radius")
|
161
|
-
end
|
162
|
-
|
163
|
-
end
|
164
|
-
|
165
|
-
context "on subclasses" do
|
166
|
-
|
167
|
-
before do
|
168
|
-
@circle = Circle.new
|
169
|
-
end
|
170
|
-
|
171
|
-
it "has the parent and child fields" do
|
172
|
-
@circle.fields.keys.should include("x")
|
173
|
-
@circle.fields.keys.should include("y")
|
174
|
-
@circle.fields.keys.should include("radius")
|
175
|
-
end
|
176
|
-
|
177
|
-
end
|
178
|
-
|
179
|
-
end
|
180
|
-
|
181
|
-
end
|
@@ -1,404 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Mongoid::Finders do
|
4
|
-
|
5
|
-
before do
|
6
|
-
@collection = stub(:name => "people")
|
7
|
-
@database = stub(:collection => @collection)
|
8
|
-
Mongoid.stubs(:database).returns(@database)
|
9
|
-
end
|
10
|
-
|
11
|
-
after do
|
12
|
-
Person.instance_variable_set(:@collection, nil)
|
13
|
-
@database = nil
|
14
|
-
@collection = nil
|
15
|
-
end
|
16
|
-
|
17
|
-
describe ".all" do
|
18
|
-
|
19
|
-
before do
|
20
|
-
@conditions = { :conditions => { :test => "Test" } }
|
21
|
-
end
|
22
|
-
|
23
|
-
context "when a selector is provided" do
|
24
|
-
|
25
|
-
it "finds from the collection and instantiate objects for each returned" do
|
26
|
-
Mongoid::Criteria.expects(:translate).with(Person, @conditions)
|
27
|
-
Person.all(@conditions)
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
context "when a selector is not provided" do
|
33
|
-
|
34
|
-
it "finds from the collection and instantiate objects for each returned" do
|
35
|
-
Mongoid::Criteria.expects(:translate).with(Person, nil)
|
36
|
-
Person.all
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
describe ".all_in" do
|
44
|
-
|
45
|
-
it "returns a new criteria with select conditions added" do
|
46
|
-
criteria = Person.all_in(:aliases => [ "Bond", "007" ])
|
47
|
-
criteria.selector.should == { :aliases => { "$all" => [ "Bond", "007" ] } }
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
describe ".any_in" do
|
53
|
-
|
54
|
-
it "returns a new criteria with select conditions added" do
|
55
|
-
criteria = Person.any_in(:aliases => [ "Bond", "007" ])
|
56
|
-
criteria.selector.should == { :aliases => { "$in" => [ "Bond", "007" ] } }
|
57
|
-
end
|
58
|
-
|
59
|
-
end
|
60
|
-
|
61
|
-
describe ".count" do
|
62
|
-
|
63
|
-
before do
|
64
|
-
@conditions = { :conditions => { :title => "Sir" } }
|
65
|
-
@criteria = mock
|
66
|
-
end
|
67
|
-
|
68
|
-
it "delegates to the criteria api" do
|
69
|
-
Mongoid::Criteria.expects(:translate).with(Person, @conditions).returns(@criteria)
|
70
|
-
@criteria.expects(:count).returns(10)
|
71
|
-
Person.count(@conditions).should == 10
|
72
|
-
end
|
73
|
-
|
74
|
-
context "when no options provided" do
|
75
|
-
|
76
|
-
it "adds in the default parameters" do
|
77
|
-
Mongoid::Criteria.expects(:translate).with(Person, nil).returns(@criteria)
|
78
|
-
@criteria.expects(:count).returns(10)
|
79
|
-
Person.count.should == 10
|
80
|
-
end
|
81
|
-
|
82
|
-
end
|
83
|
-
|
84
|
-
end
|
85
|
-
|
86
|
-
describe ".excludes" do
|
87
|
-
|
88
|
-
it "returns a new criteria with select conditions added" do
|
89
|
-
criteria = Person.excludes(:title => "Sir")
|
90
|
-
criteria.selector.should == { :title => { "$ne" => "Sir" } }
|
91
|
-
end
|
92
|
-
|
93
|
-
end
|
94
|
-
|
95
|
-
describe ".find" do
|
96
|
-
|
97
|
-
before do
|
98
|
-
@attributes = {}
|
99
|
-
@criteria = mock
|
100
|
-
end
|
101
|
-
|
102
|
-
context "when an id is passed in" do
|
103
|
-
|
104
|
-
before do
|
105
|
-
@id = Mongo::ObjectID.new.to_s
|
106
|
-
end
|
107
|
-
|
108
|
-
it "delegates to criteria" do
|
109
|
-
Mongoid::Criteria.expects(:translate).with(Person, @id.to_s).returns(Person.new)
|
110
|
-
Person.find(@id.to_s)
|
111
|
-
end
|
112
|
-
|
113
|
-
context "when no document is found" do
|
114
|
-
|
115
|
-
it "raises an error" do
|
116
|
-
@error = Mongoid::Errors::DocumentNotFound.new(Person, @id.to_s)
|
117
|
-
Mongoid::Criteria.expects(:translate).with(Person, @id.to_s).raises(@error)
|
118
|
-
lambda { Person.find(@id.to_s) }.should raise_error
|
119
|
-
end
|
120
|
-
|
121
|
-
end
|
122
|
-
|
123
|
-
end
|
124
|
-
|
125
|
-
context "when an array of ids is passed in" do
|
126
|
-
|
127
|
-
before do
|
128
|
-
@ids = []
|
129
|
-
3.times { @ids << Mongo::ObjectID.new.to_s }
|
130
|
-
end
|
131
|
-
|
132
|
-
it "delegates to the criteria" do
|
133
|
-
|
134
|
-
end
|
135
|
-
|
136
|
-
end
|
137
|
-
|
138
|
-
context "when nil passed in" do
|
139
|
-
|
140
|
-
it "raises an error" do
|
141
|
-
lambda { Person.find(nil) }.should raise_error
|
142
|
-
end
|
143
|
-
|
144
|
-
end
|
145
|
-
|
146
|
-
context "when finding first" do
|
147
|
-
|
148
|
-
it "delegates to criteria" do
|
149
|
-
Mongoid::Criteria.expects(:translate).with(Person, :conditions => { :test => "Test" }).returns(@criteria)
|
150
|
-
@criteria.expects(:one).returns(@attributes)
|
151
|
-
Person.find(:first, :conditions => { :test => "Test" })
|
152
|
-
end
|
153
|
-
|
154
|
-
end
|
155
|
-
|
156
|
-
context "when finding all" do
|
157
|
-
|
158
|
-
before do
|
159
|
-
@conditions = { :conditions => { :test => "Test" } }
|
160
|
-
end
|
161
|
-
|
162
|
-
it "delegates to find_all" do
|
163
|
-
Mongoid::Criteria.expects(:translate).with(Person, @conditions).returns(@criteria)
|
164
|
-
Person.find(:all, @conditions)
|
165
|
-
end
|
166
|
-
|
167
|
-
end
|
168
|
-
|
169
|
-
context "when sorting" do
|
170
|
-
|
171
|
-
before do
|
172
|
-
@conditions = { :conditions => { :test => "Test" }, :sort => { :test => -1 } }
|
173
|
-
end
|
174
|
-
|
175
|
-
it "adds the sort parameters for the collection call" do
|
176
|
-
Mongoid::Criteria.expects(:translate).with(Person, @conditions).returns(@criteria)
|
177
|
-
Person.find(:all, @conditions)
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
end
|
182
|
-
|
183
|
-
describe ".find_or_create_by" do
|
184
|
-
|
185
|
-
before do
|
186
|
-
@person = Person.new(:age => 30)
|
187
|
-
@criteria = mock
|
188
|
-
end
|
189
|
-
|
190
|
-
context "when the document is found" do
|
191
|
-
|
192
|
-
it "returns the document" do
|
193
|
-
Mongoid::Criteria.expects(:translate).with(
|
194
|
-
Person, :conditions => { :age => 30 }
|
195
|
-
).returns(@criteria)
|
196
|
-
@criteria.expects(:one).returns(@person)
|
197
|
-
Person.find_or_create_by(:age => 30).should == @person
|
198
|
-
end
|
199
|
-
|
200
|
-
end
|
201
|
-
|
202
|
-
context "when the document is not found" do
|
203
|
-
|
204
|
-
it "creates a new document" do
|
205
|
-
Mongoid::Criteria.expects(:translate).with(
|
206
|
-
Person, :conditions => { :age => 30 }
|
207
|
-
).returns(@criteria)
|
208
|
-
@criteria.expects(:one).returns(nil)
|
209
|
-
Person.expects(:create).returns(@person)
|
210
|
-
person = Person.find_or_create_by(:age => 30)
|
211
|
-
person.should be_a_kind_of(Person)
|
212
|
-
person.age.should == 30
|
213
|
-
end
|
214
|
-
|
215
|
-
end
|
216
|
-
|
217
|
-
end
|
218
|
-
|
219
|
-
describe ".find_or_initialize_by" do
|
220
|
-
|
221
|
-
before do
|
222
|
-
@person = Person.new(:age => 30)
|
223
|
-
@criteria = mock
|
224
|
-
end
|
225
|
-
|
226
|
-
context "when the document is found" do
|
227
|
-
|
228
|
-
it "returns the document" do
|
229
|
-
Mongoid::Criteria.expects(:translate).with(
|
230
|
-
Person, :conditions => { :age => 30 }
|
231
|
-
).returns(@criteria)
|
232
|
-
@criteria.expects(:one).returns(@person)
|
233
|
-
Person.find_or_initialize_by(:age => 30).should == @person
|
234
|
-
end
|
235
|
-
|
236
|
-
end
|
237
|
-
|
238
|
-
context "when the document is not found" do
|
239
|
-
|
240
|
-
it "returns a new document with the conditions" do
|
241
|
-
Mongoid::Criteria.expects(:translate).with(
|
242
|
-
Person, :conditions => { :age => 30 }
|
243
|
-
).returns(@criteria)
|
244
|
-
@criteria.expects(:one).returns(nil)
|
245
|
-
person = Person.find_or_initialize_by(:age => 30)
|
246
|
-
person.should be_a_kind_of(Person)
|
247
|
-
person.should be_a_new_record
|
248
|
-
person.age.should == 30
|
249
|
-
end
|
250
|
-
|
251
|
-
end
|
252
|
-
|
253
|
-
end
|
254
|
-
|
255
|
-
describe ".first" do
|
256
|
-
|
257
|
-
before do
|
258
|
-
@criteria = mock
|
259
|
-
@conditions = { :conditions => { :test => "Test" } }
|
260
|
-
end
|
261
|
-
|
262
|
-
context "when a selector is provided" do
|
263
|
-
|
264
|
-
it "finds the first document from the collection and instantiates it" do
|
265
|
-
Mongoid::Criteria.expects(:translate).with(Person, @conditions).returns(@criteria)
|
266
|
-
@criteria.expects(:one)
|
267
|
-
Person.first(@conditions)
|
268
|
-
end
|
269
|
-
|
270
|
-
end
|
271
|
-
|
272
|
-
context "when a selector is not provided" do
|
273
|
-
|
274
|
-
it "finds the first document from the collection and instantiates it" do
|
275
|
-
Mongoid::Criteria.expects(:translate).with(Person, nil).returns(@criteria)
|
276
|
-
@criteria.expects(:one)
|
277
|
-
Person.first
|
278
|
-
end
|
279
|
-
|
280
|
-
end
|
281
|
-
|
282
|
-
end
|
283
|
-
|
284
|
-
describe ".last" do
|
285
|
-
|
286
|
-
before do
|
287
|
-
@criteria = mock
|
288
|
-
end
|
289
|
-
|
290
|
-
it "finds the last document by the id" do
|
291
|
-
Mongoid::Criteria.expects(:translate).with(Person, nil).returns(@criteria)
|
292
|
-
@criteria.expects(:last)
|
293
|
-
Person.last
|
294
|
-
end
|
295
|
-
|
296
|
-
end
|
297
|
-
|
298
|
-
describe ".max" do
|
299
|
-
|
300
|
-
before do
|
301
|
-
@criteria = mock
|
302
|
-
end
|
303
|
-
|
304
|
-
it "returns the sum of a new criteria" do
|
305
|
-
Mongoid::Criteria.expects(:new).returns(@criteria)
|
306
|
-
@criteria.expects(:max).with(:age).returns(50.0)
|
307
|
-
Person.max(:age).should == 50.0
|
308
|
-
end
|
309
|
-
|
310
|
-
end
|
311
|
-
|
312
|
-
describe ".min" do
|
313
|
-
|
314
|
-
before do
|
315
|
-
@criteria = mock
|
316
|
-
end
|
317
|
-
|
318
|
-
it "returns the sum of a new criteria" do
|
319
|
-
Mongoid::Criteria.expects(:new).returns(@criteria)
|
320
|
-
@criteria.expects(:min).with(:age).returns(50.0)
|
321
|
-
Person.min(:age).should == 50.0
|
322
|
-
end
|
323
|
-
|
324
|
-
end
|
325
|
-
|
326
|
-
describe ".not_in" do
|
327
|
-
|
328
|
-
it "returns a new criteria with select conditions added" do
|
329
|
-
criteria = Person.not_in(:aliases => [ "Bond", "007" ])
|
330
|
-
criteria.selector.should == { :aliases => { "$nin" => [ "Bond", "007" ] } }
|
331
|
-
end
|
332
|
-
|
333
|
-
end
|
334
|
-
|
335
|
-
describe ".paginate" do
|
336
|
-
|
337
|
-
before do
|
338
|
-
@criteria = stub(:page => 1, :per_page => "20", :count => 100)
|
339
|
-
end
|
340
|
-
|
341
|
-
context "when pagination parameters are passed" do
|
342
|
-
|
343
|
-
before do
|
344
|
-
@params = { :conditions => { :test => "Test" }, :page => 2, :per_page => 20 }
|
345
|
-
end
|
346
|
-
|
347
|
-
it "delegates to will paginate with the results" do
|
348
|
-
Mongoid::Criteria.expects(:translate).with(Person, @params).returns(@criteria)
|
349
|
-
@criteria.expects(:paginate).returns([])
|
350
|
-
Person.paginate(@params)
|
351
|
-
end
|
352
|
-
|
353
|
-
end
|
354
|
-
|
355
|
-
context "when pagination parameters are not passed" do
|
356
|
-
|
357
|
-
before do
|
358
|
-
@params = { :conditions => { :test => "Test" }}
|
359
|
-
end
|
360
|
-
|
361
|
-
it "delegates to will paginate with default values" do
|
362
|
-
Mongoid::Criteria.expects(:translate).with(Person, @params).returns(@criteria)
|
363
|
-
@criteria.expects(:paginate).returns([])
|
364
|
-
Person.paginate(:conditions => { :test => "Test" })
|
365
|
-
end
|
366
|
-
|
367
|
-
end
|
368
|
-
|
369
|
-
end
|
370
|
-
|
371
|
-
describe ".only" do
|
372
|
-
|
373
|
-
it "returns a new criteria with select conditions added" do
|
374
|
-
criteria = Person.only(:title, :age)
|
375
|
-
criteria.options.should == { :fields => [ :title, :age ] }
|
376
|
-
end
|
377
|
-
|
378
|
-
end
|
379
|
-
|
380
|
-
describe ".sum" do
|
381
|
-
|
382
|
-
before do
|
383
|
-
@criteria = mock
|
384
|
-
end
|
385
|
-
|
386
|
-
it "returns the sum of a new criteria" do
|
387
|
-
Mongoid::Criteria.expects(:new).returns(@criteria)
|
388
|
-
@criteria.expects(:sum).with(:age).returns(50.0)
|
389
|
-
sum = Person.sum(:age)
|
390
|
-
sum.should == 50.0
|
391
|
-
end
|
392
|
-
|
393
|
-
end
|
394
|
-
|
395
|
-
describe ".where" do
|
396
|
-
|
397
|
-
it "returns a new criteria with select conditions added" do
|
398
|
-
criteria = Person.where(:title => "Sir")
|
399
|
-
criteria.selector.should == { :title => "Sir" }
|
400
|
-
end
|
401
|
-
|
402
|
-
end
|
403
|
-
|
404
|
-
end
|