remarkable_activerecord 3.0.3 → 3.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/remarkable_activerecord/matchers/validate_exclusion_of_matcher.rb +11 -2
- data/lib/remarkable_activerecord/matchers/validate_inclusion_of_matcher.rb +11 -2
- data/lib/remarkable_activerecord/matchers/validate_uniqueness_of_matcher.rb +37 -21
- data/locale/en.yml +3 -5
- data/spec/association_matcher_spec.rb +4 -5
- data/spec/have_scope_matcher_spec.rb +1 -1
- data/spec/validate_exclusion_of_matcher_spec.rb +87 -88
- data/spec/validate_inclusion_of_matcher_spec.rb +84 -84
- data/spec/validate_uniqueness_of_matcher_spec.rb +8 -3
- metadata +3 -3
@@ -10,7 +10,13 @@ module Remarkable
|
|
10
10
|
protected
|
11
11
|
|
12
12
|
def valid_values
|
13
|
-
@in_range
|
13
|
+
if @in_range
|
14
|
+
[ @options[:in].first - 1, @options[:in].last + 1 ]
|
15
|
+
elsif @options[:in].empty?
|
16
|
+
[]
|
17
|
+
else
|
18
|
+
[ @options[:in].map(&:to_s).max.to_s.next ]
|
19
|
+
end
|
14
20
|
end
|
15
21
|
|
16
22
|
def invalid_values
|
@@ -20,7 +26,10 @@ module Remarkable
|
|
20
26
|
end
|
21
27
|
|
22
28
|
# Ensures that given values are not valid for the attribute. If a range
|
23
|
-
# is given, ensures that the attribute is not valid in the given range.
|
29
|
+
# is given, ensures that the attribute is not valid in the given range.
|
30
|
+
#
|
31
|
+
# If you give that :username does not accept ["admin", "user"], it will
|
32
|
+
# test that "uses" (the next of the array max value) is allowed.
|
24
33
|
#
|
25
34
|
# == Options
|
26
35
|
#
|
@@ -14,13 +14,22 @@ module Remarkable
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def invalid_values
|
17
|
-
@in_range
|
17
|
+
if @in_range
|
18
|
+
[ @options[:in].first - 1, @options[:in].last + 1 ]
|
19
|
+
elsif @options[:in].empty?
|
20
|
+
[]
|
21
|
+
else
|
22
|
+
[ @options[:in].map(&:to_s).max.to_s.next ]
|
23
|
+
end
|
18
24
|
end
|
19
25
|
|
20
26
|
end
|
21
27
|
|
22
28
|
# Ensures that given values are valid for the attribute. If a range
|
23
|
-
# is given, ensures that the attribute is valid in the given range.
|
29
|
+
# is given, ensures that the attribute is valid in the given range.
|
30
|
+
#
|
31
|
+
# If you give that :size accepts ["S", "M", "L"], it will test that "T"
|
32
|
+
# (the next of the array max value) is not allowed.
|
24
33
|
#
|
25
34
|
# == Options
|
26
35
|
#
|
@@ -21,20 +21,32 @@ module Remarkable
|
|
21
21
|
|
22
22
|
# Tries to find an object in the database. If allow_nil and/or allow_blank
|
23
23
|
# is given, we must find a record which is not nil or not blank.
|
24
|
+
#
|
25
|
+
# We should also ensure that the object retrieved from the database
|
26
|
+
# is not the @subject.
|
24
27
|
#
|
25
|
-
# If any of these attempts fail,
|
28
|
+
# If any of these attempts fail, an error is raised.
|
26
29
|
#
|
27
|
-
def find_first_object?
|
28
|
-
|
29
|
-
[
|
30
|
+
def find_first_object?
|
31
|
+
conditions, message = if @options[:allow_nil]
|
32
|
+
[ ["#{@attribute} IS NOT NULL"], " with #{@attribute} not nil" ]
|
30
33
|
elsif @options[:allow_blank]
|
31
|
-
[
|
34
|
+
[ ["#{@attribute} != ''"], " with #{@attribute} not blank" ]
|
32
35
|
else
|
33
|
-
[
|
34
|
-
end
|
36
|
+
[ [], "" ]
|
37
|
+
end
|
38
|
+
|
39
|
+
unless @subject.new_record?
|
40
|
+
primary_key = subject_class.primary_key
|
41
|
+
|
42
|
+
message << " which is different from the subject record (the object being validated is the same as the one in the database)"
|
43
|
+
conditions << "#{subject_class.primary_key} != '#{@subject.send(primary_key)}'"
|
44
|
+
end
|
45
|
+
|
46
|
+
options = conditions.empty? ? {} : { :conditions => conditions.join(' AND ') }
|
35
47
|
|
36
|
-
return true if @existing
|
37
|
-
raise ScriptError, "could not find a #{subject_class} in the database" + message
|
48
|
+
return true if @existing = subject_class.find(:first, options)
|
49
|
+
raise ScriptError, "could not find a #{subject_class} record in the database" + message
|
38
50
|
end
|
39
51
|
|
40
52
|
# Set subject scope to be equal to the object found.
|
@@ -94,14 +106,16 @@ module Remarkable
|
|
94
106
|
#
|
95
107
|
def allow_nil?
|
96
108
|
return true unless @options.key?(:allow_nil)
|
109
|
+
|
110
|
+
begin
|
111
|
+
@existing.update_attribute(@attribute, nil)
|
112
|
+
rescue ::ActiveRecord::StatementInvalid => e
|
113
|
+
raise ScriptError, "You declared that #{@attribute} accepts nil values in validate_uniqueness_of, " <<
|
114
|
+
"but I cannot save nil values in the database, got: #{e.message}" if @options[:allow_nil]
|
115
|
+
return true
|
116
|
+
end
|
97
117
|
|
98
|
-
@existing.update_attribute(@attribute, nil)
|
99
118
|
super
|
100
|
-
rescue Exception => e
|
101
|
-
raise ScriptError, "You declared that #{@attribute} accepts nil values in validate_uniqueness_of, " <<
|
102
|
-
"but I cannot save nil values in the database, got: #{e.message}" if @options[:allow_nil]
|
103
|
-
|
104
|
-
true
|
105
119
|
end
|
106
120
|
|
107
121
|
# Change the existing object attribute to blank to run allow blank
|
@@ -109,14 +123,16 @@ module Remarkable
|
|
109
123
|
#
|
110
124
|
def allow_blank?
|
111
125
|
return true unless @options.key?(:allow_blank)
|
126
|
+
|
127
|
+
begin
|
128
|
+
@existing.update_attribute(@attribute, '')
|
129
|
+
rescue ::ActiveRecord::StatementInvalid => e
|
130
|
+
raise ScriptError, "You declared that #{@attribute} accepts blank values in validate_uniqueness_of, " <<
|
131
|
+
"but I cannot save blank values in the database, got: #{e.message}" if @options[:allow_blank]
|
132
|
+
return true
|
133
|
+
end
|
112
134
|
|
113
|
-
@existing.update_attribute(@attribute, '')
|
114
135
|
super
|
115
|
-
rescue Exception => e
|
116
|
-
raise ScriptError, "You declared that #{@attribute} accepts blank values in validate_uniqueness_of, " <<
|
117
|
-
"but I cannot save blank values in the database, got: #{e.message}" if @options[:allow_blank]
|
118
|
-
|
119
|
-
true
|
120
136
|
end
|
121
137
|
|
122
138
|
# Returns a value to be used as new scope. It does a range query in the
|
data/locale/en.yml
CHANGED
@@ -71,8 +71,6 @@ en:
|
|
71
71
|
autosave:
|
72
72
|
positive: "autosaving associated records"
|
73
73
|
negative: "not autosaving associated records"
|
74
|
-
polymorphic:
|
75
|
-
positive: "through a polymorphic interface"
|
76
74
|
as:
|
77
75
|
positive: "through the polymorphic interface {{inspect}}"
|
78
76
|
counter_cache:
|
@@ -91,8 +89,8 @@ en:
|
|
91
89
|
positive: "allowing null values"
|
92
90
|
negative: "not allowing null values"
|
93
91
|
default:
|
94
|
-
positive: "with default {{inspect}}"
|
95
|
-
negative: "with default {{inspect}}"
|
92
|
+
positive: "with default value {{inspect}}"
|
93
|
+
negative: "with default value {{inspect}}"
|
96
94
|
limit:
|
97
95
|
positive: "with limit {{inspect}}"
|
98
96
|
|
@@ -114,7 +112,7 @@ en:
|
|
114
112
|
have_scope:
|
115
113
|
description: "have to scope itself to {{options}} when {{scope_name}} is called"
|
116
114
|
expectations:
|
117
|
-
is_scope: "{{scope_name}} when called on {{subject_name}} return
|
115
|
+
is_scope: "{{scope_name}} when called on {{subject_name}} return an instance of ActiveRecord::NamedScope::Scope"
|
118
116
|
options_match: "{{scope_name}} when called on {{subject_name}} scope to {{options}}, got {{actual}}"
|
119
117
|
optionals:
|
120
118
|
with:
|
@@ -35,13 +35,12 @@ describe 'association_matcher' do
|
|
35
35
|
matcher.readonly
|
36
36
|
matcher.description.should == 'belong to company with dependent :destroy and with readonly records'
|
37
37
|
|
38
|
-
matcher.
|
39
|
-
matcher.description.should == 'belong to company with dependent :destroy, with readonly records
|
40
|
-
'and through a polymorphic interface'
|
38
|
+
matcher.as(:interface)
|
39
|
+
matcher.description.should == 'belong to company with dependent :destroy, through the polymorphic interface :interface, and with readonly records'
|
41
40
|
|
42
41
|
matcher.counter_cache('projects_count')
|
43
|
-
matcher.description.should == 'belong to company with dependent :destroy,
|
44
|
-
|
42
|
+
matcher.description.should == 'belong to company with dependent :destroy, through the polymorphic interface :interface, ' <<
|
43
|
+
'with readonly records, and with counter cache "projects_count"'
|
45
44
|
end
|
46
45
|
|
47
46
|
it 'should set association_exists? message' do
|
@@ -31,7 +31,7 @@ describe 'have_scope' do
|
|
31
31
|
it 'should set is_scope? message' do
|
32
32
|
@matcher = have_scope(:null)
|
33
33
|
@matcher.matches?(@model)
|
34
|
-
@matcher.failure_message.should == 'Expected :null when called on Product return
|
34
|
+
@matcher.failure_message.should == 'Expected :null when called on Product return an instance of ActiveRecord::NamedScope::Scope'
|
35
35
|
end
|
36
36
|
|
37
37
|
it 'should set options_match? message' do
|
@@ -1,88 +1,87 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
describe 'validate_exclusion_of' do
|
4
|
-
include ModelBuilder
|
5
|
-
|
6
|
-
# Defines a model, create a validation and returns a raw matcher
|
7
|
-
def define_and_validate(options={})
|
8
|
-
@model = define_model :product, :title => :string, :size => :string do
|
9
|
-
validates_exclusion_of :title, :size, options
|
10
|
-
end
|
11
|
-
|
12
|
-
validate_exclusion_of(:title, :size)
|
13
|
-
end
|
14
|
-
|
15
|
-
describe 'messages' do
|
16
|
-
|
17
|
-
it 'should contain a description' do
|
18
|
-
@matcher = define_and_validate(:in => 2..10)
|
19
|
-
@matcher.in(2..10)
|
20
|
-
@matcher.description.should == 'ensure exclusion of title and size in 2..10'
|
21
|
-
|
22
|
-
@matcher = validate_exclusion_of(:title, :size).in('X', 'Y', 'Z')
|
23
|
-
@matcher.description.should == 'ensure exclusion of title and size in "X", "Y", and "Z"'
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'should set is_invalid? message' do
|
27
|
-
@matcher = define_and_validate(:in => 2..10)
|
28
|
-
@matcher.in(1..10).matches?(@model)
|
29
|
-
@matcher.failure_message.should == 'Expected Product to be invalid when title is set to 1'
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'should set is_valid? message' do
|
33
|
-
@matcher = define_and_validate(:in => 2..10)
|
34
|
-
@matcher.in(3..10).matches?(@model)
|
35
|
-
@matcher.failure_message.should == 'Expected Product to be valid when title is set to 2'
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'should set allow_nil? message' do
|
39
|
-
@matcher = define_and_validate(:in => [nil])
|
40
|
-
@matcher.allow_nil.matches?(@model)
|
41
|
-
@matcher.failure_message.should == 'Expected Product to allow nil values for title'
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'should set allow_blank? message' do
|
45
|
-
@matcher = define_and_validate(:in => [''])
|
46
|
-
@matcher.allow_blank.matches?(@model)
|
47
|
-
@matcher.failure_message.should == 'Expected Product to allow blank values for title'
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
describe 'matchers' do
|
52
|
-
it {
|
53
|
-
it { should_not define_and_validate(:in => ['X', 'Y', 'Z']).in('A') }
|
54
|
-
|
55
|
-
it { should define_and_validate(:in => 2..3).in(2..3) }
|
56
|
-
it { should define_and_validate(:in => 2..20).in(2..20) }
|
57
|
-
it { should_not define_and_validate(:in => 2..20).in(1..20) }
|
58
|
-
it { should_not define_and_validate(:in => 2..20).in(3..20) }
|
59
|
-
it { should_not define_and_validate(:in => 2..20).in(2..19) }
|
60
|
-
it { should_not define_and_validate(:in => 2..20).in(2..21) }
|
61
|
-
|
62
|
-
it { should define_and_validate(:in => ['X', 'Y', 'Z'], :message => 'valid').in('X', 'Y', 'Z').message('valid') }
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
should_not_validate_exclusion_of :title, :in =>
|
82
|
-
should_not_validate_exclusion_of :title, :in =>
|
83
|
-
should_not_validate_exclusion_of :title, :in => 2..
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe 'validate_exclusion_of' do
|
4
|
+
include ModelBuilder
|
5
|
+
|
6
|
+
# Defines a model, create a validation and returns a raw matcher
|
7
|
+
def define_and_validate(options={})
|
8
|
+
@model = define_model :product, :title => :string, :size => :string do
|
9
|
+
validates_exclusion_of :title, :size, options
|
10
|
+
end
|
11
|
+
|
12
|
+
validate_exclusion_of(:title, :size)
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'messages' do
|
16
|
+
|
17
|
+
it 'should contain a description' do
|
18
|
+
@matcher = define_and_validate(:in => 2..10)
|
19
|
+
@matcher.in(2..10)
|
20
|
+
@matcher.description.should == 'ensure exclusion of title and size in 2..10'
|
21
|
+
|
22
|
+
@matcher = validate_exclusion_of(:title, :size).in('X', 'Y', 'Z')
|
23
|
+
@matcher.description.should == 'ensure exclusion of title and size in "X", "Y", and "Z"'
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should set is_invalid? message' do
|
27
|
+
@matcher = define_and_validate(:in => 2..10)
|
28
|
+
@matcher.in(1..10).matches?(@model)
|
29
|
+
@matcher.failure_message.should == 'Expected Product to be invalid when title is set to 1'
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should set is_valid? message' do
|
33
|
+
@matcher = define_and_validate(:in => 2..10)
|
34
|
+
@matcher.in(3..10).matches?(@model)
|
35
|
+
@matcher.failure_message.should == 'Expected Product to be valid when title is set to 2'
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should set allow_nil? message' do
|
39
|
+
@matcher = define_and_validate(:in => [nil])
|
40
|
+
@matcher.allow_nil.matches?(@model)
|
41
|
+
@matcher.failure_message.should == 'Expected Product to allow nil values for title'
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should set allow_blank? message' do
|
45
|
+
@matcher = define_and_validate(:in => [''])
|
46
|
+
@matcher.allow_blank.matches?(@model)
|
47
|
+
@matcher.failure_message.should == 'Expected Product to allow blank values for title'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe 'matchers' do it { should define_and_validate(:in => ['X', 'Y', 'Z']).in('X', 'Y', 'Z') }
|
52
|
+
it { should_not define_and_validate(:in => ['X', 'Y', 'Z']).in('X', 'Y') }
|
53
|
+
it { should_not define_and_validate(:in => ['X', 'Y', 'Z']).in('A') }
|
54
|
+
|
55
|
+
it { should define_and_validate(:in => 2..3).in(2..3) }
|
56
|
+
it { should define_and_validate(:in => 2..20).in(2..20) }
|
57
|
+
it { should_not define_and_validate(:in => 2..20).in(1..20) }
|
58
|
+
it { should_not define_and_validate(:in => 2..20).in(3..20) }
|
59
|
+
it { should_not define_and_validate(:in => 2..20).in(2..19) }
|
60
|
+
it { should_not define_and_validate(:in => 2..20).in(2..21) }
|
61
|
+
|
62
|
+
it { should define_and_validate(:in => ['X', 'Y', 'Z'], :message => 'not valid').in('X', 'Y', 'Z').message('not valid') }
|
63
|
+
it { should_not define_and_validate(:in => ['X', 'Y', 'Z'], :message => 'not valid').in('X', 'Y', 'Z').message('valid') }
|
64
|
+
end
|
65
|
+
|
66
|
+
describe 'macros' do
|
67
|
+
describe 'with array' do
|
68
|
+
before(:each){ define_and_validate(:in => ['X', 'Y', 'Z']) }
|
69
|
+
|
70
|
+
should_validate_exclusion_of :title, :in => ['X', 'Y', 'Z']
|
71
|
+
should_validate_exclusion_of :title, :size, :in => ['X', 'Y', 'Z']
|
72
|
+
should_not_validate_exclusion_of :title, :in => ['X', 'Y']
|
73
|
+
should_not_validate_exclusion_of :title, :size, :in => ['A']
|
74
|
+
end
|
75
|
+
|
76
|
+
describe 'with range' do
|
77
|
+
before(:each){ define_and_validate(:in => 2..20) }
|
78
|
+
|
79
|
+
should_validate_exclusion_of :title, :in => 2..20
|
80
|
+
should_not_validate_exclusion_of :title, :in => 1..20
|
81
|
+
should_not_validate_exclusion_of :title, :in => 3..20
|
82
|
+
should_not_validate_exclusion_of :title, :in => 2..19
|
83
|
+
should_not_validate_exclusion_of :title, :in => 2..21
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
@@ -1,84 +1,84 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
describe 'validate_inclusion_of' do
|
4
|
-
include ModelBuilder
|
5
|
-
|
6
|
-
# Defines a model, create a validation and returns a raw matcher
|
7
|
-
def define_and_validate(options={})
|
8
|
-
@model = define_model :product, :title => :string, :size => :string do
|
9
|
-
validates_inclusion_of :title, :size, options
|
10
|
-
end
|
11
|
-
|
12
|
-
validate_inclusion_of(:title, :size)
|
13
|
-
end
|
14
|
-
|
15
|
-
describe 'messages' do
|
16
|
-
before(:each){ @matcher = define_and_validate(:in => 2..10) }
|
17
|
-
|
18
|
-
it 'should contain a description' do
|
19
|
-
@matcher.in(2..10)
|
20
|
-
@matcher.description.should == 'ensure inclusion of title and size in 2..10'
|
21
|
-
|
22
|
-
@matcher = validate_inclusion_of(:title, :size).in('X', 'Y', 'Z')
|
23
|
-
@matcher.description.should == 'ensure inclusion of title and size in "X", "Y", and "Z"'
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'should set is_valid? message' do
|
27
|
-
@matcher.in(1..10).matches?(@model)
|
28
|
-
@matcher.failure_message.should == 'Expected Product to be valid when title is set to 1'
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'should set is_invalid? message' do
|
32
|
-
@matcher.in(3..10).matches?(@model)
|
33
|
-
@matcher.failure_message.should == 'Expected Product to be invalid when title is set to 2'
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'should set allow_nil? message' do
|
37
|
-
@matcher.allow_nil.matches?(@model)
|
38
|
-
@matcher.failure_message.should == 'Expected Product to allow nil values for title'
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'should set allow_blank? message' do
|
42
|
-
@matcher.allow_blank.matches?(@model)
|
43
|
-
@matcher.failure_message.should == 'Expected Product to allow blank values for title'
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe 'matchers' do
|
48
|
-
it { should define_and_validate(:in => ['X', 'Y', 'Z']).in('X', 'Y', 'Z') }
|
49
|
-
it { should_not define_and_validate(:in => ['X', 'Y', 'Z']).in('
|
50
|
-
|
51
|
-
|
52
|
-
it { should define_and_validate(:in => 2..
|
53
|
-
it {
|
54
|
-
it { should_not define_and_validate(:in => 2..20).in(
|
55
|
-
it { should_not define_and_validate(:in => 2..20).in(
|
56
|
-
it { should_not define_and_validate(:in => 2..20).in(2..
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
should_validate_inclusion_of :title, :in => ['X']
|
69
|
-
|
70
|
-
should_not_validate_inclusion_of :title, :size, :in => ['A']
|
71
|
-
end
|
72
|
-
|
73
|
-
describe 'with range' do
|
74
|
-
before(:each){ define_and_validate(:in => 2..20) }
|
75
|
-
|
76
|
-
should_validate_inclusion_of :title, :in => 2..20
|
77
|
-
should_not_validate_inclusion_of :title, :in => 1..20
|
78
|
-
should_not_validate_inclusion_of :title, :in => 3..20
|
79
|
-
should_not_validate_inclusion_of :title, :in => 2..19
|
80
|
-
should_not_validate_inclusion_of :title, :in => 2..21
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe 'validate_inclusion_of' do
|
4
|
+
include ModelBuilder
|
5
|
+
|
6
|
+
# Defines a model, create a validation and returns a raw matcher
|
7
|
+
def define_and_validate(options={})
|
8
|
+
@model = define_model :product, :title => :string, :size => :string do
|
9
|
+
validates_inclusion_of :title, :size, options
|
10
|
+
end
|
11
|
+
|
12
|
+
validate_inclusion_of(:title, :size)
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'messages' do
|
16
|
+
before(:each){ @matcher = define_and_validate(:in => 2..10) }
|
17
|
+
|
18
|
+
it 'should contain a description' do
|
19
|
+
@matcher.in(2..10)
|
20
|
+
@matcher.description.should == 'ensure inclusion of title and size in 2..10'
|
21
|
+
|
22
|
+
@matcher = validate_inclusion_of(:title, :size).in('X', 'Y', 'Z')
|
23
|
+
@matcher.description.should == 'ensure inclusion of title and size in "X", "Y", and "Z"'
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should set is_valid? message' do
|
27
|
+
@matcher.in(1..10).matches?(@model)
|
28
|
+
@matcher.failure_message.should == 'Expected Product to be valid when title is set to 1'
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should set is_invalid? message' do
|
32
|
+
@matcher.in(3..10).matches?(@model)
|
33
|
+
@matcher.failure_message.should == 'Expected Product to be invalid when title is set to 2'
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should set allow_nil? message' do
|
37
|
+
@matcher.allow_nil.matches?(@model)
|
38
|
+
@matcher.failure_message.should == 'Expected Product to allow nil values for title'
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should set allow_blank? message' do
|
42
|
+
@matcher.allow_blank.matches?(@model)
|
43
|
+
@matcher.failure_message.should == 'Expected Product to allow blank values for title'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe 'matchers' do
|
48
|
+
it { should define_and_validate(:in => ['X', 'Y', 'Z']).in('X', 'Y', 'Z') }
|
49
|
+
it { should_not define_and_validate(:in => ['X', 'Y', 'Z']).in('X', 'Y') }
|
50
|
+
it { should_not define_and_validate(:in => ['X', 'Y', 'Z']).in('A') }
|
51
|
+
|
52
|
+
it { should define_and_validate(:in => 2..3).in(2..3) }
|
53
|
+
it { should define_and_validate(:in => 2..20).in(2..20) }
|
54
|
+
it { should_not define_and_validate(:in => 2..20).in(1..20) }
|
55
|
+
it { should_not define_and_validate(:in => 2..20).in(3..20) }
|
56
|
+
it { should_not define_and_validate(:in => 2..20).in(2..19) }
|
57
|
+
it { should_not define_and_validate(:in => 2..20).in(2..21) }
|
58
|
+
|
59
|
+
it { should define_and_validate(:in => ['X', 'Y', 'Z'], :message => 'not valid').in('X', 'Y', 'Z').message('not valid') }
|
60
|
+
it { should_not define_and_validate(:in => ['X', 'Y', 'Z'], :message => 'not valid').in('X', 'Y', 'Z').message('valid') }
|
61
|
+
end
|
62
|
+
|
63
|
+
describe 'macros' do
|
64
|
+
describe 'with array' do
|
65
|
+
before(:each){ define_and_validate(:in => ['X', 'Y', 'Z']) }
|
66
|
+
|
67
|
+
should_validate_inclusion_of :title, :in => ['X', 'Y', 'Z']
|
68
|
+
should_validate_inclusion_of :title, :size, :in => ['X', 'Y', 'Z']
|
69
|
+
should_not_validate_inclusion_of :title, :in => ['X', 'Y']
|
70
|
+
should_not_validate_inclusion_of :title, :size, :in => ['A']
|
71
|
+
end
|
72
|
+
|
73
|
+
describe 'with range' do
|
74
|
+
before(:each){ define_and_validate(:in => 2..20) }
|
75
|
+
|
76
|
+
should_validate_inclusion_of :title, :in => 2..20
|
77
|
+
should_not_validate_inclusion_of :title, :in => 1..20
|
78
|
+
should_not_validate_inclusion_of :title, :in => 3..20
|
79
|
+
should_not_validate_inclusion_of :title, :in => 2..19
|
80
|
+
should_not_validate_inclusion_of :title, :in => 2..21
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
@@ -105,7 +105,7 @@ describe 'validate_uniqueness_of' do
|
|
105
105
|
proc { @matcher.matches?(@model) }.should_not raise_error(ScriptError)
|
106
106
|
end
|
107
107
|
|
108
|
-
it 'should raise an error if no object with not
|
108
|
+
it 'should raise an error if no object with not blank attribute is found' do
|
109
109
|
@matcher = define_and_validate.allow_blank
|
110
110
|
User.destroy_all
|
111
111
|
|
@@ -114,6 +114,11 @@ describe 'validate_uniqueness_of' do
|
|
114
114
|
|
115
115
|
User.create(:username => 'jose')
|
116
116
|
proc { @matcher.matches?(@model) }.should_not raise_error(ScriptError)
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should raise an error if @existing record is the same as @subject' do
|
120
|
+
@matcher = define_and_validate
|
121
|
+
proc { @matcher.matches?(User.first) }.should raise_error(ScriptError, /which is different from the subject record/)
|
117
122
|
end
|
118
123
|
|
119
124
|
it 'should raise an error if cannot find a new scope value' do
|
@@ -145,12 +150,12 @@ describe 'validate_uniqueness_of' do
|
|
145
150
|
end
|
146
151
|
|
147
152
|
# Create a model
|
148
|
-
User.create(:username =>
|
153
|
+
User.create(:username => 'jose')
|
149
154
|
validate_uniqueness_of(:username)
|
150
155
|
end
|
151
156
|
|
152
157
|
it { should define_and_validate }
|
153
|
-
it { should define_and_validate.allow_nil(false) }
|
158
|
+
it { should define_and_validate(:allow_nil => false).allow_nil(false) }
|
154
159
|
|
155
160
|
it 'should raise an error if allow nil is true but we cannot save nil values in the database'do
|
156
161
|
proc { should define_and_validate.allow_nil }.should raise_error(ScriptError, /You declared that username accepts nil values in validate_uniqueness_of, but I cannot save nil values in the database, got/)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: remarkable_activerecord
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carlos Brando
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2009-04-
|
14
|
+
date: 2009-04-18 00:00:00 +02:00
|
15
15
|
default_executable:
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
@@ -22,7 +22,7 @@ dependencies:
|
|
22
22
|
requirements:
|
23
23
|
- - ">="
|
24
24
|
- !ruby/object:Gem::Version
|
25
|
-
version: 3.0.
|
25
|
+
version: 3.0.4
|
26
26
|
version:
|
27
27
|
description: "Remarkable ActiveRecord: collection of matchers and macros with I18n for ActiveRecord"
|
28
28
|
email:
|