mongo_mapper 0.8.6 → 0.9.0
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/UPGRADES +10 -0
- data/bin/mmconsole +0 -1
- data/examples/identity_map/automatic.rb +1 -7
- data/examples/plugins.rb +9 -9
- data/examples/safe.rb +43 -0
- data/lib/mongo_mapper.rb +46 -33
- data/lib/mongo_mapper/document.rb +33 -32
- data/lib/mongo_mapper/embedded_document.rb +22 -22
- data/lib/mongo_mapper/locale/en.yml +5 -0
- data/lib/mongo_mapper/middleware/identity_map.rb +16 -0
- data/lib/mongo_mapper/plugins.rb +16 -3
- data/lib/mongo_mapper/plugins/accessible.rb +2 -0
- data/lib/mongo_mapper/plugins/active_model.rb +18 -0
- data/lib/mongo_mapper/plugins/associations.rb +37 -42
- data/lib/mongo_mapper/plugins/associations/base.rb +14 -50
- data/lib/mongo_mapper/plugins/associations/belongs_to_association.rb +58 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +6 -1
- data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +30 -2
- data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +4 -0
- data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +12 -6
- data/lib/mongo_mapper/plugins/associations/many_association.rb +67 -0
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +5 -5
- data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +1 -1
- data/lib/mongo_mapper/plugins/associations/one_association.rb +20 -0
- data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +5 -0
- data/lib/mongo_mapper/plugins/associations/one_proxy.rb +7 -7
- data/lib/mongo_mapper/plugins/associations/proxy.rb +2 -2
- data/lib/mongo_mapper/plugins/caching.rb +3 -1
- data/lib/mongo_mapper/plugins/callbacks.rb +12 -221
- data/lib/mongo_mapper/plugins/clone.rb +3 -1
- data/lib/mongo_mapper/plugins/dirty.rb +38 -91
- data/lib/mongo_mapper/plugins/document.rb +4 -2
- data/lib/mongo_mapper/plugins/dynamic_querying.rb +2 -0
- data/lib/mongo_mapper/plugins/embedded_callbacks.rb +43 -0
- data/lib/mongo_mapper/plugins/embedded_document.rb +16 -9
- data/lib/mongo_mapper/plugins/equality.rb +2 -0
- data/lib/mongo_mapper/plugins/identity_map.rb +4 -2
- data/lib/mongo_mapper/plugins/indexes.rb +2 -0
- data/lib/mongo_mapper/plugins/inspect.rb +3 -1
- data/lib/mongo_mapper/plugins/keys.rb +28 -22
- data/lib/mongo_mapper/plugins/keys/key.rb +12 -6
- data/lib/mongo_mapper/plugins/logger.rb +2 -0
- data/lib/mongo_mapper/plugins/modifiers.rb +3 -1
- data/lib/mongo_mapper/plugins/pagination.rb +2 -0
- data/lib/mongo_mapper/plugins/persistence.rb +2 -0
- data/lib/mongo_mapper/plugins/protected.rb +2 -0
- data/lib/mongo_mapper/plugins/querying.rb +5 -4
- data/lib/mongo_mapper/plugins/rails.rb +3 -5
- data/lib/mongo_mapper/plugins/safe.rb +2 -0
- data/lib/mongo_mapper/plugins/sci.rb +2 -0
- data/lib/mongo_mapper/plugins/scopes.rb +2 -0
- data/lib/mongo_mapper/plugins/serialization.rb +67 -46
- data/lib/mongo_mapper/plugins/timestamps.rb +3 -1
- data/lib/mongo_mapper/plugins/userstamps.rb +2 -0
- data/lib/mongo_mapper/plugins/validations.rb +40 -24
- data/lib/mongo_mapper/railtie.rb +49 -0
- data/lib/mongo_mapper/railtie/database.rake +60 -0
- data/lib/mongo_mapper/support/descendant_appends.rb +11 -11
- data/lib/mongo_mapper/translation.rb +10 -0
- data/lib/mongo_mapper/version.rb +1 -1
- data/lib/rails/generators/mongo_mapper/config/config_generator.rb +24 -0
- data/lib/rails/generators/mongo_mapper/config/templates/mongo.yml +18 -0
- data/lib/rails/generators/mongo_mapper/model/model_generator.rb +23 -0
- data/lib/rails/generators/mongo_mapper/model/templates/model.rb +11 -0
- data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +1 -0
- data/test/functional/associations/test_belongs_to_proxy.rb +131 -1
- data/test/functional/associations/test_in_array_proxy.rb +30 -0
- data/test/functional/associations/test_many_documents_proxy.rb +30 -2
- data/test/functional/associations/test_many_embedded_proxy.rb +33 -0
- data/test/functional/associations/test_many_polymorphic_proxy.rb +1 -0
- data/test/functional/associations/test_one_embedded_proxy.rb +21 -2
- data/test/functional/associations/test_one_proxy.rb +49 -9
- data/test/functional/test_associations.rb +2 -0
- data/test/functional/test_caching.rb +3 -2
- data/test/functional/test_callbacks.rb +25 -18
- data/test/functional/test_dirty.rb +123 -1
- data/test/functional/test_document.rb +26 -2
- data/test/functional/test_embedded_document.rb +68 -2
- data/test/functional/test_identity_map.rb +3 -4
- data/test/functional/test_querying.rb +11 -0
- data/test/functional/test_userstamps.rb +2 -2
- data/test/functional/test_validations.rb +31 -29
- data/test/models.rb +10 -0
- data/test/test_active_model_lint.rb +1 -1
- data/test/test_helper.rb +9 -10
- data/test/unit/associations/test_base.rb +24 -100
- data/test/unit/associations/test_belongs_to_association.rb +29 -0
- data/test/unit/associations/test_many_association.rb +63 -0
- data/test/unit/associations/test_one_association.rb +18 -0
- data/test/unit/serializers/test_json_serializer.rb +0 -1
- data/test/unit/test_descendant_appends.rb +8 -16
- data/test/unit/test_document.rb +4 -9
- data/test/unit/test_dynamic_finder.rb +1 -1
- data/test/unit/test_embedded_document.rb +51 -18
- data/test/unit/test_identity_map_middleware.rb +34 -0
- data/test/unit/test_inspect.rb +22 -0
- data/test/unit/test_key.rb +21 -1
- data/test/unit/test_keys.rb +0 -2
- data/test/unit/test_plugins.rb +106 -20
- data/test/unit/test_rails.rb +8 -8
- data/test/unit/test_serialization.rb +116 -1
- data/test/unit/test_translation.rb +27 -0
- data/test/unit/test_validations.rb +66 -81
- metadata +103 -43
- data/examples/identity_map/middleware.rb +0 -14
- data/lib/mongo_mapper/plugins/descendants.rb +0 -17
- data/rails/init.rb +0 -19
data/test/unit/test_keys.rb
CHANGED
data/test/unit/test_plugins.rb
CHANGED
@@ -1,29 +1,35 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
class PluginsTest < Test::Unit::TestCase
|
4
|
+
should "default plugins to empty array" do
|
5
|
+
Class.new { extend MongoMapper::Plugins }.plugins.should == []
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
context "ActiveSupport::Concern" do
|
9
|
+
module MyConcern
|
10
|
+
extend ActiveSupport::Concern
|
11
|
+
|
12
|
+
included do
|
13
|
+
attr_accessor :from_concern
|
14
|
+
end
|
15
|
+
|
16
|
+
module ClassMethods
|
17
|
+
def class_foo
|
18
|
+
'class_foo'
|
19
|
+
end
|
20
|
+
end
|
13
21
|
|
14
|
-
|
15
|
-
|
16
|
-
|
22
|
+
module InstanceMethods
|
23
|
+
def instance_foo
|
24
|
+
'instance_foo'
|
25
|
+
end
|
26
|
+
end
|
17
27
|
end
|
18
|
-
end
|
19
|
-
end
|
20
28
|
|
21
|
-
class PluginsTest < Test::Unit::TestCase
|
22
|
-
context "plugin" do
|
23
29
|
setup do
|
24
30
|
@document = Class.new do
|
25
31
|
extend MongoMapper::Plugins
|
26
|
-
plugin
|
32
|
+
plugin MyConcern
|
27
33
|
end
|
28
34
|
end
|
29
35
|
|
@@ -36,15 +42,95 @@ class PluginsTest < Test::Unit::TestCase
|
|
36
42
|
end
|
37
43
|
|
38
44
|
should "pass model to configure" do
|
39
|
-
@document.new.should respond_to(:
|
45
|
+
@document.new.should respond_to(:from_concern)
|
46
|
+
end
|
47
|
+
|
48
|
+
should "add plugin to plugins" do
|
49
|
+
@document.plugins.should include(MyConcern)
|
50
|
+
end
|
51
|
+
|
52
|
+
context "Document" do
|
53
|
+
setup do
|
54
|
+
MongoMapper::Document.plugins.delete(MyConcern)
|
55
|
+
end
|
56
|
+
|
57
|
+
should 'allow plugins on Document' do
|
58
|
+
MongoMapper::Document.plugin(MyConcern)
|
59
|
+
Doc().should respond_to(:class_foo)
|
60
|
+
Doc().new.should respond_to(:instance_foo)
|
61
|
+
end
|
62
|
+
|
63
|
+
should 'add plugins to classes that include Document before they are added' do
|
64
|
+
article = Doc()
|
65
|
+
MongoMapper::Document.plugin(MyConcern)
|
66
|
+
article.should respond_to(:class_foo)
|
67
|
+
article.new.should respond_to(:instance_foo)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "EmbeddedDocument" do
|
72
|
+
setup do
|
73
|
+
MongoMapper::EmbeddedDocument.plugins.delete(MyConcern)
|
74
|
+
end
|
75
|
+
|
76
|
+
should 'allow plugins on EmbeddedDocument' do
|
77
|
+
MongoMapper::EmbeddedDocument.plugin(MyConcern)
|
78
|
+
article = EDoc()
|
79
|
+
article.should respond_to(:class_foo)
|
80
|
+
article.new.should respond_to(:instance_foo)
|
81
|
+
end
|
82
|
+
|
83
|
+
should 'add plugins to classes that include EmbeddedDocument before they are added' do
|
84
|
+
article = EDoc()
|
85
|
+
MongoMapper::EmbeddedDocument.plugin(MyConcern)
|
86
|
+
article.should respond_to(:class_foo)
|
87
|
+
article.new.should respond_to(:instance_foo)
|
88
|
+
end
|
40
89
|
end
|
90
|
+
end
|
41
91
|
|
42
|
-
|
43
|
-
|
92
|
+
context "deprecated plugin" do
|
93
|
+
module DeprecatedPlugin
|
94
|
+
def self.configure(model)
|
95
|
+
model.class_eval { attr_accessor :from_configure }
|
96
|
+
end
|
97
|
+
|
98
|
+
module ClassMethods
|
99
|
+
def class_foo
|
100
|
+
'class_foo'
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
module InstanceMethods
|
105
|
+
def instance_foo
|
106
|
+
'instance_foo'
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
setup do
|
112
|
+
silence_stderr do
|
113
|
+
@document = Class.new do
|
114
|
+
extend MongoMapper::Plugins
|
115
|
+
plugin DeprecatedPlugin
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
should "include instance methods" do
|
121
|
+
@document.new.instance_foo.should == 'instance_foo'
|
122
|
+
end
|
123
|
+
|
124
|
+
should "extend class methods" do
|
125
|
+
@document.class_foo.should == 'class_foo'
|
126
|
+
end
|
127
|
+
|
128
|
+
should "pass model to configure" do
|
129
|
+
@document.new.should respond_to(:from_configure)
|
44
130
|
end
|
45
131
|
|
46
132
|
should "add plugin to plugins" do
|
47
|
-
@document.plugins.should include(
|
133
|
+
@document.plugins.should include(DeprecatedPlugin)
|
48
134
|
end
|
49
135
|
end
|
50
136
|
end
|
data/test/unit/test_rails.rb
CHANGED
@@ -33,8 +33,8 @@ class TestRails < Test::Unit::TestCase
|
|
33
33
|
write_attribute(:foo, value)
|
34
34
|
end
|
35
35
|
|
36
|
-
def
|
37
|
-
|
36
|
+
def bar_before_type_cast
|
37
|
+
read_attribute_before_type_cast(:foo)
|
38
38
|
end
|
39
39
|
|
40
40
|
def bar
|
@@ -51,8 +51,8 @@ class TestRails < Test::Unit::TestCase
|
|
51
51
|
@klass.new(:foo => 'Bar').bar.should == 'Bar'
|
52
52
|
end
|
53
53
|
|
54
|
-
should "be able to read key before
|
55
|
-
@klass.new(:foo => 21).
|
54
|
+
should "be able to read key before type cast with read_attribute_before_type_cast" do
|
55
|
+
@klass.new(:foo => 21).bar_before_type_cast.should == 21
|
56
56
|
@klass.new(:foo => 21).bar.should == '21'
|
57
57
|
end
|
58
58
|
|
@@ -120,8 +120,8 @@ class TestRails < Test::Unit::TestCase
|
|
120
120
|
write_attribute(:foo, value)
|
121
121
|
end
|
122
122
|
|
123
|
-
def
|
124
|
-
|
123
|
+
def bar_before_type_cast
|
124
|
+
read_attribute_before_type_cast(:foo)
|
125
125
|
end
|
126
126
|
|
127
127
|
def bar
|
@@ -138,8 +138,8 @@ class TestRails < Test::Unit::TestCase
|
|
138
138
|
@klass.new(:foo => 'Bar').bar.should == 'Bar'
|
139
139
|
end
|
140
140
|
|
141
|
-
should "be able to read key before
|
142
|
-
@klass.new(:foo => 21).
|
141
|
+
should "be able to read key before type cast with read_attribute_before_type_cast" do
|
142
|
+
@klass.new(:foo => 21).bar_before_type_cast.should == 21
|
143
143
|
@klass.new(:foo => 21).bar.should == '21'
|
144
144
|
end
|
145
145
|
|
@@ -19,7 +19,122 @@ class SerializationTest < Test::Unit::TestCase
|
|
19
19
|
)
|
20
20
|
end
|
21
21
|
|
22
|
-
|
22
|
+
context "#serializable_hash" do
|
23
|
+
class List
|
24
|
+
include MongoMapper::Document
|
25
|
+
key :name
|
26
|
+
many :items, :class_name => 'SerializationTest::Item'
|
27
|
+
belongs_to :creator, :class_name => 'SerializationTest::User'
|
28
|
+
end
|
29
|
+
|
30
|
+
class Item
|
31
|
+
include MongoMapper::Document
|
32
|
+
|
33
|
+
key :title
|
34
|
+
key :description
|
35
|
+
many :assignments, :class_name => 'SerializationTest::Assignment'
|
36
|
+
|
37
|
+
def a_method
|
38
|
+
1
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class Assignment
|
43
|
+
include MongoMapper::EmbeddedDocument
|
44
|
+
belongs_to :assigned_by, :class_name => 'SerializationTest::User'
|
45
|
+
belongs_to :user, :class_name => 'SerializationTest::User'
|
46
|
+
|
47
|
+
def serializable_hash(options = {})
|
48
|
+
super({:only => :user_id}.merge(options))
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class User
|
53
|
+
include MongoMapper::Document
|
54
|
+
key :name, String
|
55
|
+
end
|
56
|
+
|
57
|
+
setup do
|
58
|
+
@user1 = User.new(:name => 'Brandon')
|
59
|
+
@user2 = User.new(:name => 'John')
|
60
|
+
@item = Item.new(
|
61
|
+
:title => 'Serialization',
|
62
|
+
:description => 'Make it work like magic!',
|
63
|
+
:assignments => [
|
64
|
+
Assignment.new(:assigned_by => @user1, :user => @user2)
|
65
|
+
]
|
66
|
+
)
|
67
|
+
end
|
68
|
+
|
69
|
+
should "only include specified attributes with :only option" do
|
70
|
+
@item.serializable_hash(:only => :title).should == {'title' => 'Serialization'}
|
71
|
+
end
|
72
|
+
|
73
|
+
should "exclude attributes specified with :except option" do
|
74
|
+
hash = @item.serializable_hash(:except => :description)
|
75
|
+
hash['title'].should_not be_nil
|
76
|
+
hash['description'].should be_nil
|
77
|
+
end
|
78
|
+
|
79
|
+
should "add :methods with :only option" do
|
80
|
+
@item.serializable_hash(:only => :title, :methods => :a_method).should == {
|
81
|
+
'title' => 'Serialization',
|
82
|
+
'a_method' => 1
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
86
|
+
should "call #serializable_hash on embedded many docs" do
|
87
|
+
@item.serializable_hash.should == {
|
88
|
+
'id' => @item.id,
|
89
|
+
'title' => 'Serialization',
|
90
|
+
'description' => 'Make it work like magic!',
|
91
|
+
'assignments' => [{'user_id' => @user2.id}]
|
92
|
+
}
|
93
|
+
end
|
94
|
+
|
95
|
+
context "with :include" do
|
96
|
+
setup do
|
97
|
+
@list = List.new(:title => 'MongoMapper', :items => [@item], :creator => @user1)
|
98
|
+
end
|
99
|
+
|
100
|
+
should "add many association" do
|
101
|
+
hash = @list.serializable_hash(:include => :items)
|
102
|
+
hash['items'].should be_instance_of(Array)
|
103
|
+
hash['items'].first['title'].should == 'Serialization'
|
104
|
+
end
|
105
|
+
|
106
|
+
should "add belongs_to association" do
|
107
|
+
hash = @list.serializable_hash(:include => :creator)
|
108
|
+
hash['creator'].should == @user1.serializable_hash
|
109
|
+
end
|
110
|
+
|
111
|
+
should "add one association" do
|
112
|
+
author_class = Doc do
|
113
|
+
key :post_id, ObjectId
|
114
|
+
end
|
115
|
+
post_class = Doc('Post') do
|
116
|
+
one :author, :class => author_class
|
117
|
+
end
|
118
|
+
|
119
|
+
author = author_class.new
|
120
|
+
hash = post_class.new(:author => author).serializable_hash(:include => :author)
|
121
|
+
hash['author'].should == author.serializable_hash
|
122
|
+
end
|
123
|
+
|
124
|
+
should "include multiple associations" do
|
125
|
+
hash = @list.serializable_hash(:include => [:items, :creator])
|
126
|
+
hash['items'].should be_instance_of(Array)
|
127
|
+
hash['creator'].should == @user1.serializable_hash
|
128
|
+
end
|
129
|
+
|
130
|
+
should "include multiple associations with options" do
|
131
|
+
hash = @list.serializable_hash(:include => {:creator => {:only => :name}})
|
132
|
+
hash['creator'].should == @user1.serializable_hash(:only => :name)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
[:json, :xml].each do |format|
|
23
138
|
context format do
|
24
139
|
should "be reversable" do
|
25
140
|
serialized = @instance.send("to_#{format}")
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TranslationTest < Test::Unit::TestCase
|
4
|
+
should "translate add mongo_mapper translations" do
|
5
|
+
I18n.translate("mongo_mapper.errors.messages.taken").should == "has already been taken"
|
6
|
+
end
|
7
|
+
|
8
|
+
should "set i18n_scope" do
|
9
|
+
Doc().i18n_scope.should == :mongo_mapper
|
10
|
+
end
|
11
|
+
|
12
|
+
should "translate document attributes" do
|
13
|
+
I18n.config.backend.store_translations(:en, :mongo_mapper => {:attributes => {:thing => {:foo => 'Bar'}}})
|
14
|
+
doc = Doc('Thing') do
|
15
|
+
key :foo, String
|
16
|
+
end
|
17
|
+
doc.human_attribute_name(:foo).should == 'Bar'
|
18
|
+
end
|
19
|
+
|
20
|
+
should "translate embedded document attributes" do
|
21
|
+
I18n.config.backend.store_translations(:en, :mongo_mapper => {:attributes => {:thing => {:foo => 'Bar'}}})
|
22
|
+
doc = EDoc('Thing') do
|
23
|
+
key :foo, String
|
24
|
+
end
|
25
|
+
doc.human_attribute_name(:foo).should == 'Bar'
|
26
|
+
end
|
27
|
+
end
|
@@ -4,27 +4,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
4
4
|
context "Validations" do
|
5
5
|
context "on a Document" do
|
6
6
|
setup do
|
7
|
-
@document = Doc()
|
8
|
-
end
|
9
|
-
|
10
|
-
context "Validating uniquness of" do
|
11
|
-
should "not validate nil when allow_nil false" do
|
12
|
-
@document.key :name, String
|
13
|
-
@document.validates_uniqueness_of :name, :allow_nil => false
|
14
|
-
doc = @document.new(:name => nil)
|
15
|
-
doc.should have_error_on(:name)
|
16
|
-
doc.name = "Ryan"
|
17
|
-
doc.should_not have_error_on(:name)
|
18
|
-
end
|
19
|
-
|
20
|
-
should "not validate blank when allow_blank false" do
|
21
|
-
@document.key :name, String
|
22
|
-
@document.validates_uniqueness_of :name, :allow_blank => false
|
23
|
-
doc = @document.new(:name => "")
|
24
|
-
doc.should have_error_on(:name)
|
25
|
-
doc.name = "Ryan"
|
26
|
-
doc.should_not have_error_on(:name)
|
27
|
-
end
|
7
|
+
@document = Doc('John')
|
28
8
|
end
|
29
9
|
|
30
10
|
context "Validating acceptance of" do
|
@@ -42,9 +22,13 @@ class ValidationsTest < Test::Unit::TestCase
|
|
42
22
|
should "work with validates_confirmation_of macro" do
|
43
23
|
@document.key :password, String
|
44
24
|
@document.validates_confirmation_of :password
|
25
|
+
|
26
|
+
# NOTE: Api change as ActiveModel passes if password_confirmation is nil
|
45
27
|
doc = @document.new
|
46
28
|
doc.password = 'foobar'
|
29
|
+
doc.password_confirmation = 'foobar1'
|
47
30
|
doc.should have_error_on(:password)
|
31
|
+
|
48
32
|
doc.password_confirmation = 'foobar'
|
49
33
|
doc.should_not have_error_on(:password)
|
50
34
|
end
|
@@ -160,19 +144,19 @@ class ValidationsTest < Test::Unit::TestCase
|
|
160
144
|
end # numericality of
|
161
145
|
|
162
146
|
context "validating presence of" do
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
147
|
+
should "work with validates_presence_of macro" do
|
148
|
+
@document.key :name, String
|
149
|
+
@document.validates_presence_of :name
|
150
|
+
doc = @document.new
|
151
|
+
doc.should have_error_on(:name)
|
152
|
+
end
|
153
|
+
|
154
|
+
should "work with :required shortcut on key definition" do
|
155
|
+
@document.key :name, String, :required => true
|
156
|
+
doc = @document.new
|
157
|
+
doc.should have_error_on(:name)
|
158
|
+
end
|
159
|
+
end
|
176
160
|
|
177
161
|
context "validating exclusion of" do
|
178
162
|
should "throw error if enumerator not provided" do
|
@@ -184,7 +168,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
184
168
|
|
185
169
|
should "work with validates_exclusion_of macro" do
|
186
170
|
@document.key :action, String
|
187
|
-
@document.validates_exclusion_of :action, :
|
171
|
+
@document.validates_exclusion_of :action, :in => %w(kick run)
|
188
172
|
|
189
173
|
doc = @document.new
|
190
174
|
doc.should_not have_error_on(:action)
|
@@ -211,7 +195,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
211
195
|
|
212
196
|
should "not have error if allow nil is true and value is nil" do
|
213
197
|
@document.key :action, String
|
214
|
-
@document.validates_exclusion_of :action, :
|
198
|
+
@document.validates_exclusion_of :action, :in => %w(kick run), :allow_nil => true
|
215
199
|
|
216
200
|
doc = @document.new
|
217
201
|
doc.should_not have_error_on(:action)
|
@@ -219,7 +203,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
219
203
|
|
220
204
|
should "not have error if allow blank is true and value is blank" do
|
221
205
|
@document.key :action, String
|
222
|
-
@document.validates_exclusion_of :action, :
|
206
|
+
@document.validates_exclusion_of :action, :in => %w(kick run), :allow_nil => true
|
223
207
|
|
224
208
|
doc = @document.new(:action => '')
|
225
209
|
doc.should_not have_error_on(:action)
|
@@ -236,13 +220,13 @@ class ValidationsTest < Test::Unit::TestCase
|
|
236
220
|
|
237
221
|
should "work with validates_inclusion_of macro" do
|
238
222
|
@document.key :action, String
|
239
|
-
@document.validates_inclusion_of :action, :
|
223
|
+
@document.validates_inclusion_of :action, :in => %w(kick run)
|
240
224
|
|
241
225
|
doc = @document.new
|
242
|
-
doc.should have_error_on(:action, 'is not in the list')
|
226
|
+
doc.should have_error_on(:action, 'is not included in the list')
|
243
227
|
|
244
228
|
doc.action = 'fart'
|
245
|
-
doc.should have_error_on(:action, 'is not in the list')
|
229
|
+
doc.should have_error_on(:action, 'is not included in the list')
|
246
230
|
|
247
231
|
doc.action = 'kick'
|
248
232
|
doc.should_not have_error_on(:action)
|
@@ -252,10 +236,10 @@ class ValidationsTest < Test::Unit::TestCase
|
|
252
236
|
@document.key :action, String, :in => %w(kick run)
|
253
237
|
|
254
238
|
doc = @document.new
|
255
|
-
doc.should have_error_on(:action, 'is not in the list')
|
239
|
+
doc.should have_error_on(:action, 'is not included in the list')
|
256
240
|
|
257
241
|
doc.action = 'fart'
|
258
|
-
doc.should have_error_on(:action, 'is not in the list')
|
242
|
+
doc.should have_error_on(:action, 'is not included in the list')
|
259
243
|
|
260
244
|
doc.action = 'kick'
|
261
245
|
doc.should_not have_error_on(:action)
|
@@ -263,7 +247,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
263
247
|
|
264
248
|
should "not have error if allow nil is true and value is nil" do
|
265
249
|
@document.key :action, String
|
266
|
-
@document.validates_inclusion_of :action, :
|
250
|
+
@document.validates_inclusion_of :action, :in => %w(kick run), :allow_nil => true
|
267
251
|
|
268
252
|
doc = @document.new
|
269
253
|
doc.should_not have_error_on(:action)
|
@@ -271,7 +255,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
271
255
|
|
272
256
|
should "not have error if allow blank is true and value is blank" do
|
273
257
|
@document.key :action, String
|
274
|
-
@document.validates_inclusion_of :action, :
|
258
|
+
@document.validates_inclusion_of :action, :in => %w(kick run), :allow_blank => true
|
275
259
|
|
276
260
|
doc = @document.new(:action => '')
|
277
261
|
doc.should_not have_error_on(:action)
|
@@ -302,6 +286,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
302
286
|
@embedded_doc.validates_confirmation_of :password
|
303
287
|
doc = @embedded_doc.new
|
304
288
|
doc.password = 'foobar'
|
289
|
+
doc.password_confirmation = 'foobar1'
|
305
290
|
doc.should have_error_on(:password)
|
306
291
|
doc.password_confirmation = 'foobar'
|
307
292
|
doc.should_not have_error_on(:password)
|
@@ -418,19 +403,19 @@ class ValidationsTest < Test::Unit::TestCase
|
|
418
403
|
end # numericality of
|
419
404
|
|
420
405
|
context "validating presence of" do
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
406
|
+
should "work with validates_presence_of macro" do
|
407
|
+
@embedded_doc.key :name, String
|
408
|
+
@embedded_doc.validates_presence_of :name
|
409
|
+
doc = @embedded_doc.new
|
410
|
+
doc.should have_error_on(:name)
|
411
|
+
end
|
412
|
+
|
413
|
+
should "work with :required shortcut on key definition" do
|
414
|
+
@embedded_doc.key :name, String, :required => true
|
415
|
+
doc = @embedded_doc.new
|
416
|
+
doc.should have_error_on(:name)
|
417
|
+
end
|
418
|
+
end
|
434
419
|
|
435
420
|
context "validating exclusion of" do
|
436
421
|
should "throw error if enumerator not provided" do
|
@@ -442,7 +427,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
442
427
|
|
443
428
|
should "work with validates_exclusion_of macro" do
|
444
429
|
@embedded_doc.key :action, String
|
445
|
-
@embedded_doc.validates_exclusion_of :action, :
|
430
|
+
@embedded_doc.validates_exclusion_of :action, :in => %w(kick run)
|
446
431
|
|
447
432
|
doc = @embedded_doc.new
|
448
433
|
doc.should_not have_error_on(:action)
|
@@ -469,7 +454,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
469
454
|
|
470
455
|
should "not have error if allow nil is true and value is nil" do
|
471
456
|
@embedded_doc.key :action, String
|
472
|
-
@embedded_doc.validates_exclusion_of :action, :
|
457
|
+
@embedded_doc.validates_exclusion_of :action, :in => %w(kick run), :allow_nil => true
|
473
458
|
|
474
459
|
doc = @embedded_doc.new
|
475
460
|
doc.should_not have_error_on(:action)
|
@@ -477,7 +462,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
477
462
|
|
478
463
|
should "not have error if allow blank is true and value is blank" do
|
479
464
|
@embedded_doc.key :action, String
|
480
|
-
@embedded_doc.validates_exclusion_of :action, :
|
465
|
+
@embedded_doc.validates_exclusion_of :action, :in => %w(kick run), :allow_nil => true
|
481
466
|
|
482
467
|
doc = @embedded_doc.new(:action => '')
|
483
468
|
doc.should_not have_error_on(:action)
|
@@ -494,13 +479,13 @@ class ValidationsTest < Test::Unit::TestCase
|
|
494
479
|
|
495
480
|
should "work with validates_inclusion_of macro" do
|
496
481
|
@embedded_doc.key :action, String
|
497
|
-
@embedded_doc.validates_inclusion_of :action, :
|
482
|
+
@embedded_doc.validates_inclusion_of :action, :in => %w(kick run)
|
498
483
|
|
499
484
|
doc = @embedded_doc.new
|
500
|
-
doc.should have_error_on(:action, 'is not in the list')
|
485
|
+
doc.should have_error_on(:action, 'is not included in the list')
|
501
486
|
|
502
487
|
doc.action = 'fart'
|
503
|
-
doc.should have_error_on(:action, 'is not in the list')
|
488
|
+
doc.should have_error_on(:action, 'is not included in the list')
|
504
489
|
|
505
490
|
doc.action = 'kick'
|
506
491
|
doc.should_not have_error_on(:action)
|
@@ -510,10 +495,10 @@ class ValidationsTest < Test::Unit::TestCase
|
|
510
495
|
@embedded_doc.key :action, String, :in => %w(kick run)
|
511
496
|
|
512
497
|
doc = @embedded_doc.new
|
513
|
-
doc.should have_error_on(:action, 'is not in the list')
|
498
|
+
doc.should have_error_on(:action, 'is not included in the list')
|
514
499
|
|
515
500
|
doc.action = 'fart'
|
516
|
-
doc.should have_error_on(:action, 'is not in the list')
|
501
|
+
doc.should have_error_on(:action, 'is not included in the list')
|
517
502
|
|
518
503
|
doc.action = 'kick'
|
519
504
|
doc.should_not have_error_on(:action)
|
@@ -521,7 +506,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
521
506
|
|
522
507
|
should "not have error if allow nil is true and value is nil" do
|
523
508
|
@embedded_doc.key :action, String
|
524
|
-
@embedded_doc.validates_inclusion_of :action, :
|
509
|
+
@embedded_doc.validates_inclusion_of :action, :in => %w(kick run), :allow_nil => true
|
525
510
|
|
526
511
|
doc = @embedded_doc.new
|
527
512
|
doc.should_not have_error_on(:action)
|
@@ -529,7 +514,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
529
514
|
|
530
515
|
should "not have error if allow blank is true and value is blank" do
|
531
516
|
@embedded_doc.key :action, String
|
532
|
-
@embedded_doc.validates_inclusion_of :action, :
|
517
|
+
@embedded_doc.validates_inclusion_of :action, :in => %w(kick run), :allow_blank => true
|
533
518
|
|
534
519
|
doc = @embedded_doc.new(:action => '')
|
535
520
|
doc.should_not have_error_on(:action)
|
@@ -541,24 +526,24 @@ class ValidationsTest < Test::Unit::TestCase
|
|
541
526
|
end # Validations
|
542
527
|
|
543
528
|
context "Adding validation errors" do
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
529
|
+
setup do
|
530
|
+
@document = Doc do
|
531
|
+
key :action, String
|
532
|
+
def action_present
|
533
|
+
errors.add(:action, 'is invalid') if action.blank?
|
534
|
+
end
|
549
535
|
end
|
550
536
|
end
|
551
|
-
end
|
552
537
|
|
553
|
-
|
554
|
-
|
538
|
+
should "work with validate callback" do
|
539
|
+
@document.validate :action_present
|
555
540
|
|
556
|
-
|
557
|
-
|
558
|
-
|
541
|
+
doc = @document.new
|
542
|
+
doc.action = nil
|
543
|
+
doc.should have_error_on(:action)
|
559
544
|
|
560
|
-
|
561
|
-
|
545
|
+
doc.action = 'kick'
|
546
|
+
doc.should_not have_error_on(:action)
|
547
|
+
end
|
562
548
|
end
|
563
|
-
end
|
564
549
|
end
|