mongomodel 0.5.5 → 0.5.6
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.
- checksums.yaml +5 -5
- data/.travis.yml +23 -11
- data/gemfiles/rails-3.2.gemfile +2 -2
- data/gemfiles/rails-4-observers.gemfile +1 -1
- data/gemfiles/rails-4.1.gemfile +2 -2
- data/gemfiles/{mongoid.gemfile → rails-4.2.gemfile} +2 -3
- data/gemfiles/{mongo_mapper.gemfile → rails-5.0.gemfile} +2 -3
- data/gemfiles/rails-5.1.gemfile +10 -0
- data/gemfiles/rails-5.2.gemfile +10 -0
- data/lib/mongomodel.rb +15 -15
- data/lib/mongomodel/attributes/mongo.rb +7 -7
- data/lib/mongomodel/attributes/store.rb +4 -4
- data/lib/mongomodel/attributes/typecasting.rb +7 -7
- data/lib/mongomodel/compatibility/mongo_mapper.rb +3 -3
- data/lib/mongomodel/compatibility/mongoid.rb +3 -3
- data/lib/mongomodel/concerns/abstract_class.rb +3 -3
- data/lib/mongomodel/concerns/activemodel.rb +4 -4
- data/lib/mongomodel/concerns/associations.rb +8 -8
- data/lib/mongomodel/concerns/associations/base/association.rb +5 -5
- data/lib/mongomodel/concerns/associations/base/definition.rb +4 -4
- data/lib/mongomodel/concerns/associations/base/proxy.rb +1 -1
- data/lib/mongomodel/concerns/associations/belongs_to.rb +19 -19
- data/lib/mongomodel/concerns/associations/has_many_by_foreign_key.rb +36 -36
- data/lib/mongomodel/concerns/associations/has_many_by_ids.rb +34 -34
- data/lib/mongomodel/concerns/attribute_methods.rb +10 -10
- data/lib/mongomodel/concerns/attribute_methods/before_type_cast.rb +4 -4
- data/lib/mongomodel/concerns/attribute_methods/dirty.rb +95 -13
- data/lib/mongomodel/concerns/attribute_methods/forbidden.rb +1 -1
- data/lib/mongomodel/concerns/attribute_methods/multi_parameter_assignment.rb +6 -6
- data/lib/mongomodel/concerns/attribute_methods/nested.rb +18 -18
- data/lib/mongomodel/concerns/attribute_methods/protected.rb +3 -3
- data/lib/mongomodel/concerns/attribute_methods/query.rb +3 -3
- data/lib/mongomodel/concerns/attribute_methods/read.rb +4 -4
- data/lib/mongomodel/concerns/attribute_methods/write.rb +4 -4
- data/lib/mongomodel/concerns/attributes.rb +18 -18
- data/lib/mongomodel/concerns/callbacks.rb +7 -7
- data/lib/mongomodel/concerns/document_parent.rb +2 -2
- data/lib/mongomodel/concerns/logging.rb +2 -2
- data/lib/mongomodel/concerns/map_reduce.rb +11 -11
- data/lib/mongomodel/concerns/pretty_inspect.rb +3 -3
- data/lib/mongomodel/concerns/properties.rb +18 -18
- data/lib/mongomodel/concerns/record_status.rb +9 -13
- data/lib/mongomodel/concerns/serialization.rb +4 -4
- data/lib/mongomodel/concerns/timestamps.rb +4 -4
- data/lib/mongomodel/concerns/translation.rb +2 -2
- data/lib/mongomodel/concerns/validations.rb +5 -5
- data/lib/mongomodel/concerns/validations/associated.rb +1 -1
- data/lib/mongomodel/document.rb +6 -6
- data/lib/mongomodel/document/callbacks.rb +15 -21
- data/lib/mongomodel/document/collection_modifiers.rb +5 -5
- data/lib/mongomodel/document/dynamic_finders.rb +1 -1
- data/lib/mongomodel/document/indexes.rb +19 -19
- data/lib/mongomodel/document/optimistic_locking.rb +7 -7
- data/lib/mongomodel/document/persistence.rb +23 -23
- data/lib/mongomodel/document/scopes.rb +20 -20
- data/lib/mongomodel/document/validations.rb +6 -6
- data/lib/mongomodel/document/validations/uniqueness.rb +11 -11
- data/lib/mongomodel/embedded_document.rb +11 -11
- data/lib/mongomodel/locale/en.yml +0 -1
- data/lib/mongomodel/log_subscriber.rb +5 -5
- data/lib/mongomodel/railtie.rb +13 -13
- data/lib/mongomodel/support/collection.rb +31 -31
- data/lib/mongomodel/support/configuration.rb +11 -11
- data/lib/mongomodel/support/core_extensions.rb +1 -1
- data/lib/mongomodel/support/dynamic_finder.rb +12 -12
- data/lib/mongomodel/support/exceptions.rb +6 -6
- data/lib/mongomodel/support/instrumented_collection.rb +20 -20
- data/lib/mongomodel/support/map.rb +33 -33
- data/lib/mongomodel/support/mongo_operator.rb +6 -6
- data/lib/mongomodel/support/mongo_options.rb +18 -18
- data/lib/mongomodel/support/mongo_order.rb +16 -16
- data/lib/mongomodel/support/paginator.rb +8 -8
- data/lib/mongomodel/support/reference.rb +10 -10
- data/lib/mongomodel/support/scope.rb +37 -37
- data/lib/mongomodel/support/scope/array_methods.rb +1 -1
- data/lib/mongomodel/support/scope/batches.rb +1 -1
- data/lib/mongomodel/support/scope/dynamic_finders.rb +1 -1
- data/lib/mongomodel/support/scope/finder_methods.rb +7 -7
- data/lib/mongomodel/support/scope/load_methods.rb +1 -1
- data/lib/mongomodel/support/scope/pagination.rb +1 -1
- data/lib/mongomodel/support/scope/query_methods.rb +6 -6
- data/lib/mongomodel/support/scope/spawn_methods.rb +8 -8
- data/lib/mongomodel/support/types.rb +2 -2
- data/lib/mongomodel/support/types/array.rb +1 -1
- data/lib/mongomodel/support/types/boolean.rb +3 -3
- data/lib/mongomodel/support/types/custom.rb +3 -3
- data/lib/mongomodel/support/types/date.rb +2 -2
- data/lib/mongomodel/support/types/date_time.rb +6 -16
- data/lib/mongomodel/support/types/float.rb +1 -1
- data/lib/mongomodel/support/types/hash.rb +1 -1
- data/lib/mongomodel/support/types/integer.rb +13 -10
- data/lib/mongomodel/support/types/object.rb +5 -5
- data/lib/mongomodel/support/types/rational.rb +3 -3
- data/lib/mongomodel/support/types/time.rb +2 -2
- data/lib/mongomodel/version.rb +1 -1
- data/lib/rails/generators/mongo_model/config/templates/mongomodel.yml +3 -4
- data/lib/rails/generators/mongo_model/model/model_generator.rb +3 -3
- data/mongomodel.gemspec +5 -4
- data/spec/mongomodel/attributes/store_spec.rb +21 -21
- data/spec/mongomodel/concerns/activemodel_spec.rb +4 -4
- data/spec/mongomodel/concerns/associations/base/association_spec.rb +12 -12
- data/spec/mongomodel/concerns/associations/belongs_to_spec.rb +34 -21
- data/spec/mongomodel/concerns/associations/has_many_by_foreign_key_spec.rb +53 -53
- data/spec/mongomodel/concerns/associations/has_many_by_ids_spec.rb +30 -30
- data/spec/mongomodel/concerns/attribute_methods/before_type_cast_spec.rb +7 -7
- data/spec/mongomodel/concerns/attribute_methods/dirty_spec.rb +45 -41
- data/spec/mongomodel/concerns/attribute_methods/multi_parameter_assignment_spec.rb +7 -7
- data/spec/mongomodel/concerns/attribute_methods/nested_spec.rb +31 -31
- data/spec/mongomodel/concerns/attribute_methods/protected_spec.rb +15 -15
- data/spec/mongomodel/concerns/attribute_methods/query_spec.rb +19 -19
- data/spec/mongomodel/concerns/attribute_methods/read_spec.rb +9 -9
- data/spec/mongomodel/concerns/attribute_methods/write_spec.rb +6 -6
- data/spec/mongomodel/concerns/attribute_methods_spec.rb +13 -13
- data/spec/mongomodel/concerns/attributes_spec.rb +34 -34
- data/spec/mongomodel/concerns/callbacks_spec.rb +25 -21
- data/spec/mongomodel/concerns/logging_spec.rb +5 -3
- data/spec/mongomodel/concerns/map_reduce_spec.rb +19 -19
- data/spec/mongomodel/concerns/observing_spec.rb +3 -3
- data/spec/mongomodel/concerns/pretty_inspect_spec.rb +10 -10
- data/spec/mongomodel/concerns/properties_spec.rb +11 -11
- data/spec/mongomodel/concerns/serialization/json_serialization_spec.rb +13 -13
- data/spec/mongomodel/concerns/timestamps_spec.rb +39 -39
- data/spec/mongomodel/concerns/validations_spec.rb +41 -38
- data/spec/mongomodel/document/callbacks_spec.rb +20 -16
- data/spec/mongomodel/document/collection_modifiers_spec.rb +16 -16
- data/spec/mongomodel/document/dynamic_finders_spec.rb +46 -46
- data/spec/mongomodel/document/finders_spec.rb +15 -15
- data/spec/mongomodel/document/indexes_spec.rb +29 -29
- data/spec/mongomodel/document/optimistic_locking_spec.rb +16 -16
- data/spec/mongomodel/document/persistence_spec.rb +39 -39
- data/spec/mongomodel/document/scopes_spec.rb +17 -17
- data/spec/mongomodel/document/validations/uniqueness_spec.rb +46 -46
- data/spec/mongomodel/document/validations_spec.rb +35 -35
- data/spec/mongomodel/document_spec.rb +19 -19
- data/spec/mongomodel/embedded_document_spec.rb +19 -19
- data/spec/mongomodel/mongomodel_spec.rb +7 -6
- data/spec/mongomodel/support/collection_spec.rb +54 -54
- data/spec/mongomodel/support/configuration_spec.rb +1 -1
- data/spec/mongomodel/support/map_spec.rb +66 -66
- data/spec/mongomodel/support/mongo_operator_spec.rb +5 -5
- data/spec/mongomodel/support/mongo_options_spec.rb +42 -42
- data/spec/mongomodel/support/mongo_order_spec.rb +24 -24
- data/spec/mongomodel/support/paginator_spec.rb +15 -15
- data/spec/mongomodel/support/property_spec.rb +29 -23
- data/spec/mongomodel/support/scope_spec.rb +205 -204
- data/spec/spec_helper.rb +13 -2
- data/spec/support/callbacks.rb +3 -8
- data/spec/support/helpers/define_class.rb +7 -7
- data/spec/support/helpers/document_finder_stubs.rb +6 -6
- data/spec/support/helpers/specs_for.rb +1 -1
- data/spec/support/helpers/validations.rb +1 -1
- data/spec/support/matchers/find_with.rb +8 -8
- data/spec/support/matchers/respond_to_boolean.rb +3 -3
- data/spec/support/matchers/run_callbacks.rb +6 -9
- data/spec/support/models.rb +5 -5
- metadata +23 -7
|
@@ -6,69 +6,73 @@ module MongoModel
|
|
|
6
6
|
define_class(:CallbackTestDocument, Document) do
|
|
7
7
|
include MongoModel::CallbackHelpers
|
|
8
8
|
end
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
let(:doc) { CallbackTestDocument.create! }
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
it "runs each type of callback when initializing" do
|
|
13
13
|
instance = CallbackTestDocument.new
|
|
14
14
|
instance.should run_callbacks(:after_initialize)
|
|
15
15
|
end
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
it "runs each type of callback on find" do
|
|
18
18
|
instance = CallbackTestDocument.find(doc.id)
|
|
19
19
|
instance.should run_callbacks(:after_initialize, :after_find)
|
|
20
20
|
end
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
it "runs each type of callback when validating a new document" do
|
|
23
23
|
instance = CallbackTestDocument.new
|
|
24
24
|
instance.valid?
|
|
25
25
|
instance.should run_callbacks(:after_initialize, :before_validation, :after_validation)
|
|
26
26
|
end
|
|
27
|
-
|
|
27
|
+
|
|
28
28
|
it "runs each type of callback when validating an existing document" do
|
|
29
29
|
instance = CallbackTestDocument.find(doc.id)
|
|
30
30
|
instance.valid?
|
|
31
31
|
instance.should run_callbacks(:after_initialize, :after_find, :before_validation, :after_validation)
|
|
32
32
|
end
|
|
33
|
-
|
|
33
|
+
|
|
34
34
|
it "runs each type of callback when creating a document" do
|
|
35
35
|
instance = CallbackTestDocument.create!
|
|
36
36
|
instance.should run_callbacks(:after_initialize, :before_validation, :after_validation, :before_save, :before_create, :after_create, :after_save)
|
|
37
37
|
end
|
|
38
|
-
|
|
38
|
+
|
|
39
39
|
it "runs each type of callback when saving an existing document" do
|
|
40
40
|
instance = CallbackTestDocument.find(doc.id)
|
|
41
41
|
instance.save
|
|
42
42
|
instance.should run_callbacks(:after_initialize, :after_find, :before_validation, :after_validation, :before_save, :before_update, :after_update, :after_save)
|
|
43
43
|
end
|
|
44
|
-
|
|
44
|
+
|
|
45
45
|
it "runs each type of callback when destroying a document" do
|
|
46
46
|
instance = CallbackTestDocument.find(doc.id)
|
|
47
47
|
instance.destroy
|
|
48
48
|
instance.should run_callbacks(:after_initialize, :after_find, :before_destroy, :after_destroy)
|
|
49
49
|
end
|
|
50
|
-
|
|
50
|
+
|
|
51
51
|
it "does not run destroy callbacks when deleting a document" do
|
|
52
52
|
instance = CallbackTestDocument.find(doc.id)
|
|
53
53
|
instance.delete
|
|
54
54
|
instance.should run_callbacks(:after_initialize, :after_find)
|
|
55
55
|
end
|
|
56
56
|
end
|
|
57
|
-
|
|
57
|
+
|
|
58
58
|
[ :before_save, :before_create ].each do |callback|
|
|
59
|
-
context "#{callback} callback
|
|
59
|
+
context "#{callback} callback halts" do
|
|
60
60
|
define_class(:CallbackTestDocument, Document) do
|
|
61
|
-
|
|
61
|
+
if Gem::Version.new(ActiveSupport::VERSION::STRING) >= Gem::Version.new('5.0.0')
|
|
62
|
+
send(callback) { throw :abort }
|
|
63
|
+
else
|
|
64
|
+
send(callback) { false }
|
|
65
|
+
end
|
|
62
66
|
end
|
|
63
|
-
|
|
67
|
+
|
|
64
68
|
subject { CallbackTestDocument.new }
|
|
65
|
-
|
|
69
|
+
|
|
66
70
|
describe "#save" do
|
|
67
71
|
it "returns false" do
|
|
68
|
-
subject.save.should
|
|
72
|
+
subject.save.should be false
|
|
69
73
|
end
|
|
70
74
|
end
|
|
71
|
-
|
|
75
|
+
|
|
72
76
|
describe "#save!" do
|
|
73
77
|
it "raises a MongoModel::DocumentNotSaved exception" do
|
|
74
78
|
lambda { subject.save! }.should raise_error(MongoModel::DocumentNotSaved)
|
|
@@ -8,96 +8,96 @@ module MongoModel
|
|
|
8
8
|
property :available, Integer
|
|
9
9
|
property :tags, Array
|
|
10
10
|
end
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
let(:collection) { Post.collection }
|
|
13
13
|
subject { Post }
|
|
14
|
-
|
|
14
|
+
|
|
15
15
|
def self.should_update_collection(expression, &block)
|
|
16
16
|
it "updates the collection" do
|
|
17
17
|
collection.should_receive(:update).with(selector, expression, :multi => true)
|
|
18
18
|
instance_eval(&block)
|
|
19
19
|
end
|
|
20
20
|
end
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
shared_examples_for "collection modifiers" do
|
|
23
23
|
describe "increment!" do
|
|
24
24
|
should_update_collection('$inc' => { 'hits' => 1, 'available' => -1 }) do
|
|
25
25
|
subject.increment!(:hits => 1, :available => -1)
|
|
26
26
|
end
|
|
27
27
|
end
|
|
28
|
-
|
|
28
|
+
|
|
29
29
|
describe "increase! (alias of increment!)" do
|
|
30
30
|
should_update_collection('$inc' => { 'hits' => 1, 'available' => -1 }) do
|
|
31
31
|
subject.increase!(:hits => 1, :available => -1)
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
describe "set!" do
|
|
36
36
|
should_update_collection('$set' => { 'hits' => 20, 'available' => 100 }) do
|
|
37
37
|
subject.set!(:hits => 20, :available => 100)
|
|
38
38
|
end
|
|
39
39
|
end
|
|
40
|
-
|
|
40
|
+
|
|
41
41
|
describe "unset!" do
|
|
42
42
|
should_update_collection('$unset' => { 'hits' => 1, 'available' => 1 }) do
|
|
43
43
|
subject.unset!(:hits, :available)
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
|
-
|
|
46
|
+
|
|
47
47
|
describe "push!" do
|
|
48
48
|
should_update_collection('$push' => { 'tags' => 'abc' }) do
|
|
49
49
|
subject.push!(:tags => 'abc')
|
|
50
50
|
end
|
|
51
51
|
end
|
|
52
|
-
|
|
52
|
+
|
|
53
53
|
describe "push_all!" do
|
|
54
54
|
should_update_collection('$pushAll' => { 'tags' => ['xxx', 'yyy', 'zzz'] }) do
|
|
55
55
|
subject.push_all!(:tags => ['xxx', 'yyy', 'zzz'])
|
|
56
56
|
end
|
|
57
57
|
end
|
|
58
|
-
|
|
58
|
+
|
|
59
59
|
describe "add_to_set!" do
|
|
60
60
|
should_update_collection('$addToSet' => { 'tags' => 'xxx' }) do
|
|
61
61
|
subject.add_to_set!(:tags => 'xxx')
|
|
62
62
|
end
|
|
63
63
|
end
|
|
64
|
-
|
|
64
|
+
|
|
65
65
|
describe "pull!" do
|
|
66
66
|
should_update_collection('$pull' => { 'tags' => 'abc' }) do
|
|
67
67
|
subject.pull!(:tags => 'abc')
|
|
68
68
|
end
|
|
69
69
|
end
|
|
70
|
-
|
|
70
|
+
|
|
71
71
|
describe "pull_all!" do
|
|
72
72
|
should_update_collection('$pullAll' => { 'tags' => ['xxx', 'yyy', 'zzz'] }) do
|
|
73
73
|
subject.pull_all!(:tags => ['xxx', 'yyy', 'zzz'])
|
|
74
74
|
end
|
|
75
75
|
end
|
|
76
|
-
|
|
76
|
+
|
|
77
77
|
describe "pop!" do
|
|
78
78
|
should_update_collection('$pop' => { 'tags' => 1 }) do
|
|
79
79
|
subject.pop!(:tags)
|
|
80
80
|
end
|
|
81
81
|
end
|
|
82
|
-
|
|
82
|
+
|
|
83
83
|
describe "shift!" do
|
|
84
84
|
should_update_collection('$pop' => { 'tags' => -1 }) do
|
|
85
85
|
subject.shift!(:tags)
|
|
86
86
|
end
|
|
87
87
|
end
|
|
88
|
-
|
|
88
|
+
|
|
89
89
|
describe "rename!" do
|
|
90
90
|
should_update_collection('$rename' => { 'tags' => :tag_collection }) do
|
|
91
91
|
subject.rename!(:tags => :tag_collection)
|
|
92
92
|
end
|
|
93
93
|
end
|
|
94
94
|
end
|
|
95
|
-
|
|
95
|
+
|
|
96
96
|
describe "class methods" do
|
|
97
97
|
let(:selector) { {} }
|
|
98
98
|
it_should_behave_like "collection modifiers"
|
|
99
99
|
end
|
|
100
|
-
|
|
100
|
+
|
|
101
101
|
describe "instance methods" do
|
|
102
102
|
subject { Post.new }
|
|
103
103
|
before { subject.save }
|
|
@@ -7,9 +7,9 @@ module MongoModel
|
|
|
7
7
|
property :name, String
|
|
8
8
|
property :age, Integer
|
|
9
9
|
end
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
subject { Person }
|
|
12
|
-
|
|
12
|
+
|
|
13
13
|
before(:each) do
|
|
14
14
|
@john = Person.create!(:name => 'John', :age => 42, :id => '1')
|
|
15
15
|
@young_john = Person.create!(:name => 'John', :age => 12, :id => '2')
|
|
@@ -17,163 +17,163 @@ module MongoModel
|
|
|
17
17
|
@tom2 = Person.create!(:name => 'Tom', :age => 23, :id => '4')
|
|
18
18
|
@mary = Person.create!(:name => 'Mary', :age => 33, :id => '5')
|
|
19
19
|
end
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
def self.should_find(*args, &block)
|
|
22
22
|
it "returns correct results when called with #{args.inspect}" do
|
|
23
23
|
expected = instance_eval(&block)
|
|
24
24
|
subject.send(valid_finder, *args).should == expected
|
|
25
25
|
end
|
|
26
26
|
end
|
|
27
|
-
|
|
27
|
+
|
|
28
28
|
def self.should_raise(*args, &block)
|
|
29
29
|
it "raises DocumentNotFound exception if results not found" do
|
|
30
30
|
message = instance_eval(&block)
|
|
31
31
|
lambda { subject.send(valid_finder, *args) }.should raise_error(DocumentNotFound, message)
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
def self.should_initialize(*args, &block)
|
|
36
36
|
it "initializes new instance" do
|
|
37
37
|
result = subject.send(valid_finder, *args)
|
|
38
38
|
result.should be_a_new_record
|
|
39
39
|
result.should be_an_instance_of(Person)
|
|
40
|
-
yield(result).should
|
|
40
|
+
yield(result).should be true
|
|
41
41
|
end
|
|
42
42
|
end
|
|
43
|
-
|
|
43
|
+
|
|
44
44
|
def self.should_create(*args, &block)
|
|
45
45
|
it "creates new instance" do
|
|
46
46
|
result = subject.send(valid_finder, *args)
|
|
47
47
|
result.should_not be_a_new_record
|
|
48
48
|
result.should be_an_instance_of(Person)
|
|
49
|
-
yield(result).should
|
|
49
|
+
yield(result).should be true
|
|
50
50
|
end
|
|
51
51
|
end
|
|
52
|
-
|
|
52
|
+
|
|
53
53
|
shared_examples_for "a dynamic finder" do
|
|
54
54
|
it { should respond_to(valid_finder) }
|
|
55
55
|
it { should_not respond_to(invalid_finder) }
|
|
56
|
-
|
|
56
|
+
|
|
57
57
|
it "raises NoMethodError calling an invalid finder" do
|
|
58
58
|
lambda { subject.send(invalid_finder, "Foo") }.should raise_error(NoMethodError)
|
|
59
59
|
end
|
|
60
60
|
end
|
|
61
|
-
|
|
61
|
+
|
|
62
62
|
describe "find first by single property" do
|
|
63
63
|
let(:valid_finder) { :find_by_name }
|
|
64
64
|
let(:invalid_finder) { :find_by_something_else }
|
|
65
|
-
|
|
65
|
+
|
|
66
66
|
it_should_behave_like "a dynamic finder"
|
|
67
|
-
|
|
67
|
+
|
|
68
68
|
should_find("John") { @john }
|
|
69
69
|
should_find("Jane") { nil }
|
|
70
70
|
end
|
|
71
|
-
|
|
71
|
+
|
|
72
72
|
describe "find first by single property (bang method)" do
|
|
73
73
|
let(:valid_finder) { :find_by_name! }
|
|
74
74
|
let(:invalid_finder) { :find_by_something_else! }
|
|
75
|
-
|
|
75
|
+
|
|
76
76
|
it_should_behave_like "a dynamic finder"
|
|
77
|
-
|
|
77
|
+
|
|
78
78
|
should_find("John") { @john }
|
|
79
79
|
should_raise("Jane") { 'Couldn\'t find Person with {:name=>"Jane"}' }
|
|
80
80
|
end
|
|
81
|
-
|
|
81
|
+
|
|
82
82
|
describe "find last by single property" do
|
|
83
83
|
let(:valid_finder) { :find_last_by_name }
|
|
84
84
|
let(:invalid_finder) { :find_last_by_something_else }
|
|
85
|
-
|
|
85
|
+
|
|
86
86
|
it_should_behave_like "a dynamic finder"
|
|
87
|
-
|
|
87
|
+
|
|
88
88
|
should_find("John") { @young_john }
|
|
89
89
|
should_find("Jane") { nil }
|
|
90
90
|
end
|
|
91
|
-
|
|
91
|
+
|
|
92
92
|
describe "find all by single property" do
|
|
93
93
|
let(:valid_finder) { :find_all_by_name }
|
|
94
94
|
let(:invalid_finder) { :find_all_by_something_else }
|
|
95
|
-
|
|
95
|
+
|
|
96
96
|
it_should_behave_like "a dynamic finder"
|
|
97
|
-
|
|
97
|
+
|
|
98
98
|
should_find("John") { [@john, @young_john] }
|
|
99
99
|
end
|
|
100
|
-
|
|
100
|
+
|
|
101
101
|
describe "find first by multiple properties" do
|
|
102
102
|
let(:valid_finder) { :find_by_name_and_age }
|
|
103
103
|
let(:invalid_finder) { :find_by_age_and_something_else }
|
|
104
|
-
|
|
104
|
+
|
|
105
105
|
it_should_behave_like "a dynamic finder"
|
|
106
|
-
|
|
106
|
+
|
|
107
107
|
should_find("Tom", 23) { @tom1 }
|
|
108
108
|
should_find("Tom", 5) { nil }
|
|
109
109
|
end
|
|
110
|
-
|
|
110
|
+
|
|
111
111
|
describe "find first by multiple properties (bang method)" do
|
|
112
112
|
let(:valid_finder) { :find_by_name_and_age! }
|
|
113
113
|
let(:invalid_finder) { :find_by_age_and_something_else! }
|
|
114
|
-
|
|
114
|
+
|
|
115
115
|
it_should_behave_like "a dynamic finder"
|
|
116
|
-
|
|
116
|
+
|
|
117
117
|
should_find("Tom", 23) { @tom1 }
|
|
118
118
|
should_raise("Tom", 5) { "Couldn\'t find Person with #{{:name=>"Tom", :age=>5}.inspect}" }
|
|
119
119
|
end
|
|
120
|
-
|
|
120
|
+
|
|
121
121
|
describe "find all by multiple properties" do
|
|
122
122
|
let(:valid_finder) { :find_all_by_name_and_age }
|
|
123
123
|
let(:invalid_finder) { :find_all_by_age_and_something_else }
|
|
124
|
-
|
|
124
|
+
|
|
125
125
|
it_should_behave_like "a dynamic finder"
|
|
126
|
-
|
|
126
|
+
|
|
127
127
|
should_find("Tom", 23) { [@tom1, @tom2] }
|
|
128
128
|
should_find("Tom", 5) { [] }
|
|
129
129
|
end
|
|
130
|
-
|
|
130
|
+
|
|
131
131
|
describe "find last by multiple properties" do
|
|
132
132
|
let(:valid_finder) { :find_last_by_name_and_age }
|
|
133
133
|
let(:invalid_finder) { :find_last_by_age_and_something_else }
|
|
134
|
-
|
|
134
|
+
|
|
135
135
|
it_should_behave_like "a dynamic finder"
|
|
136
|
-
|
|
136
|
+
|
|
137
137
|
should_find("Tom", 23) { @tom2 }
|
|
138
138
|
should_find("Tom", 5) { nil }
|
|
139
139
|
end
|
|
140
|
-
|
|
140
|
+
|
|
141
141
|
describe "find or initialize by single property" do
|
|
142
142
|
let(:valid_finder) { :find_or_initialize_by_name }
|
|
143
143
|
let(:invalid_finder) { :find_or_initialize_by_something_else }
|
|
144
|
-
|
|
144
|
+
|
|
145
145
|
it_should_behave_like "a dynamic finder"
|
|
146
|
-
|
|
146
|
+
|
|
147
147
|
should_find("John") { @john }
|
|
148
148
|
should_initialize("Jane") { |p| p.name == "Jane" }
|
|
149
149
|
end
|
|
150
|
-
|
|
150
|
+
|
|
151
151
|
describe "find or initialize by multiple properties" do
|
|
152
152
|
let(:valid_finder) { :find_or_initialize_by_name_and_age }
|
|
153
153
|
let(:invalid_finder) { :find_or_initialize_by_name_and_something_else }
|
|
154
|
-
|
|
154
|
+
|
|
155
155
|
it_should_behave_like "a dynamic finder"
|
|
156
|
-
|
|
156
|
+
|
|
157
157
|
should_find("John", 42) { @john }
|
|
158
158
|
should_initialize("John", 1) { |p| p.name == "John" && p.age == 1 }
|
|
159
159
|
end
|
|
160
|
-
|
|
160
|
+
|
|
161
161
|
describe "find or create by single property" do
|
|
162
162
|
let(:valid_finder) { :find_or_create_by_name }
|
|
163
163
|
let(:invalid_finder) { :find_or_create_by_something_else }
|
|
164
|
-
|
|
164
|
+
|
|
165
165
|
it_should_behave_like "a dynamic finder"
|
|
166
|
-
|
|
166
|
+
|
|
167
167
|
should_find("John") { @john }
|
|
168
168
|
should_create("Jane") { |p| p.name == "Jane" }
|
|
169
169
|
end
|
|
170
|
-
|
|
170
|
+
|
|
171
171
|
describe "find or create by multiple properties" do
|
|
172
172
|
let(:valid_finder) { :find_or_create_by_name_and_age }
|
|
173
173
|
let(:invalid_finder) { :find_or_create_by_name_and_something_else }
|
|
174
|
-
|
|
174
|
+
|
|
175
175
|
it_should_behave_like "a dynamic finder"
|
|
176
|
-
|
|
176
|
+
|
|
177
177
|
should_find("John", 42) { @john }
|
|
178
178
|
should_create("John", 1) { |p| p.name == "John" && p.age == 1 }
|
|
179
179
|
end
|
|
@@ -6,36 +6,36 @@ module MongoModel
|
|
|
6
6
|
property :name, String
|
|
7
7
|
property :age, Integer
|
|
8
8
|
end
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
define_class(:NonUser, Document)
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
describe "#find" do
|
|
13
13
|
before(:each) do
|
|
14
14
|
User.collection.save({ '_id' => '1', 'name' => 'Fred', :age => 45 })
|
|
15
15
|
User.collection.save({ '_id' => '2', 'name' => 'Alistair', :age => 18 })
|
|
16
16
|
User.collection.save({ '_id' => '3', 'name' => 'Barney', :age => 10 })
|
|
17
17
|
end
|
|
18
|
-
|
|
18
|
+
|
|
19
19
|
describe "by id" do
|
|
20
20
|
context "document exists" do
|
|
21
21
|
subject { User.find('2') }
|
|
22
|
-
|
|
22
|
+
|
|
23
23
|
it "returns a User" do
|
|
24
24
|
subject.should be_a(User)
|
|
25
25
|
end
|
|
26
|
-
|
|
26
|
+
|
|
27
27
|
it "loads the document attributes" do
|
|
28
28
|
subject.id.should == '2'
|
|
29
29
|
subject.name.should == 'Alistair'
|
|
30
30
|
end
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
it { should_not be_a_new_record }
|
|
33
|
-
|
|
33
|
+
|
|
34
34
|
it "stringifies ids" do
|
|
35
35
|
User.find(2).id.should == '2'
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
|
-
|
|
38
|
+
|
|
39
39
|
context "document does not exist" do
|
|
40
40
|
it "raises a DocumentNotFound exception" do
|
|
41
41
|
lambda {
|
|
@@ -43,37 +43,37 @@ module MongoModel
|
|
|
43
43
|
}.should raise_error(MongoModel::DocumentNotFound)
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
|
-
|
|
46
|
+
|
|
47
47
|
context "no id specified" do
|
|
48
48
|
it "raises an ArgumentError" do
|
|
49
|
-
lambda {
|
|
49
|
+
lambda {
|
|
50
50
|
User.find
|
|
51
51
|
}.should raise_error(ArgumentError)
|
|
52
52
|
end
|
|
53
53
|
end
|
|
54
54
|
end
|
|
55
|
-
|
|
55
|
+
|
|
56
56
|
describe "by multiple ids" do
|
|
57
57
|
context "all documents exist" do
|
|
58
58
|
subject { User.find('1', '2') }
|
|
59
|
-
|
|
59
|
+
|
|
60
60
|
it "returns an array of Users" do
|
|
61
61
|
subject[0].should be_a(User)
|
|
62
62
|
subject[1].should be_a(User)
|
|
63
63
|
end
|
|
64
|
-
|
|
64
|
+
|
|
65
65
|
it "loads document attributes" do
|
|
66
66
|
subject[0].name.should == 'Fred'
|
|
67
67
|
subject[1].name.should == 'Alistair'
|
|
68
68
|
end
|
|
69
|
-
|
|
69
|
+
|
|
70
70
|
it "loads documents in correct order" do
|
|
71
71
|
result = User.find('2', '1')
|
|
72
72
|
result[0].id.should == '2'
|
|
73
73
|
result[1].id.should == '1'
|
|
74
74
|
end
|
|
75
75
|
end
|
|
76
|
-
|
|
76
|
+
|
|
77
77
|
context "some documents missing" do
|
|
78
78
|
it "raises a DocumentNotFound exception" do
|
|
79
79
|
lambda {
|