shoulda-matchers 2.4.0.rc1 → 2.4.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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -0
  3. data/Appraisals +4 -0
  4. data/Gemfile.lock +1 -1
  5. data/NEWS.md +6 -0
  6. data/README.md +1 -0
  7. data/gemfiles/3.1.gemfile +1 -0
  8. data/gemfiles/3.1.gemfile.lock +2 -0
  9. data/gemfiles/3.2.gemfile +1 -0
  10. data/gemfiles/3.2.gemfile.lock +3 -1
  11. data/gemfiles/4.0.gemfile +2 -0
  12. data/gemfiles/4.0.gemfile.lock +10 -1
  13. data/lib/shoulda/matchers/active_model.rb +1 -0
  14. data/lib/shoulda/matchers/active_model/comparison_matcher.rb +6 -1
  15. data/lib/shoulda/matchers/active_model/have_secure_password_matcher.rb +71 -0
  16. data/lib/shoulda/matchers/active_model/validation_message_finder.rb +2 -2
  17. data/lib/shoulda/matchers/version.rb +1 -1
  18. data/spec/shoulda/matchers/action_controller/redirect_to_matcher_spec.rb +1 -1
  19. data/spec/shoulda/matchers/active_model/allow_mass_assignment_of_matcher_spec.rb +4 -4
  20. data/spec/shoulda/matchers/active_model/allow_value_matcher_spec.rb +5 -5
  21. data/spec/shoulda/matchers/active_model/comparison_matcher_spec.rb +18 -7
  22. data/spec/shoulda/matchers/active_model/disallow_value_matcher_spec.rb +2 -2
  23. data/spec/shoulda/matchers/active_model/ensure_exclusion_of_matcher_spec.rb +1 -1
  24. data/spec/shoulda/matchers/active_model/ensure_inclusion_of_matcher_spec.rb +1 -1
  25. data/spec/shoulda/matchers/active_model/exception_message_finder_spec.rb +6 -7
  26. data/spec/shoulda/matchers/active_model/have_secure_password_matcher_spec.rb +20 -0
  27. data/spec/shoulda/matchers/active_model/odd_even_number_matcher_spec.rb +7 -3
  28. data/spec/shoulda/matchers/active_model/only_integer_matcher_spec.rb +6 -2
  29. data/spec/shoulda/matchers/active_model/validate_confirmation_of_matcher_spec.rb +1 -1
  30. data/spec/shoulda/matchers/active_model/validate_numericality_of_matcher_spec.rb +1 -1
  31. data/spec/shoulda/matchers/active_model/validate_presence_of_matcher_spec.rb +16 -0
  32. data/spec/shoulda/matchers/active_model/validate_uniqueness_of_matcher_spec.rb +46 -1
  33. data/spec/shoulda/matchers/active_model/validation_message_finder_spec.rb +15 -7
  34. data/spec/shoulda/matchers/active_record/accept_nested_attributes_for_matcher_spec.rb +2 -1
  35. data/spec/support/active_resource_builder.rb +27 -0
  36. data/spec/support/shared_examples/numerical_submatcher_spec.rb +23 -0
  37. metadata +12 -7
  38. data/spec/shoulda/active_model/validate_uniqueness_of_matcher_spec.rb +0 -195
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a8d6dec5056a7af853da41e6e4ae08288de002a7
4
- data.tar.gz: ea8954413360434e6ab48488e52f5783398a6e06
3
+ metadata.gz: 1d6e59e41d93f44812d45789d56c5b7dfee4b7fd
4
+ data.tar.gz: a5d9a41130c16ac1f68735ccdf8070f0de86432a
5
5
  SHA512:
6
- metadata.gz: fc71bcd764ed3b1810bcdd5356bda25df166d18ad2d2d2189a6a8d4f7a2795918f477ac6f59bb7ff01fcbc36091bd34c786612247d77bda0475c4f6c6b056a21
7
- data.tar.gz: d76951b81ac17fd5449f1b0e15129805811c581ece8b0ec46a9bdc691dd07a51351f965a9c8cfbb9d71a9691c86fc3ff2977441edb13e027c2cac0ddbc4c8c99
6
+ metadata.gz: d776d5f7772c8330f3f4b3164b7e6131841e437dbe938cb453cc38a7cf63196cb92689d567bc5a51ef17f2f0a675e3b55941c851c1d2489f33ab1af8baa95387
7
+ data.tar.gz: 4eccb03b31c410dc981f85e3af53743a186844d381c0d7408f50c7526d9715398733acd9062476c98a362f81146c27dd7a182d0afc4bf6e15e0bc4eebc9d2179
data/.travis.yml CHANGED
@@ -17,8 +17,12 @@ matrix:
17
17
  - rvm: rbx-19mode
18
18
  - rvm: jruby-19mode
19
19
  include:
20
+ - rvm: 1.9.3
21
+ gemfile: gemfiles/4.0.gemfile
20
22
  - rvm: 2.0.0
21
23
  gemfile: gemfiles/3.2.gemfile
24
+ - rvm: 2.0.0
25
+ gemfile: gemfiles/4.0.gemfile
22
26
  - rvm: rbx-19mode
23
27
  gemfile: gemfiles/3.2.gemfile
24
28
  - rvm: jruby-19mode
data/Appraisals CHANGED
@@ -6,6 +6,7 @@ if RUBY_VERSION < '2.0'
6
6
 
7
7
  appraise '3.1' do
8
8
  gem 'rails', '~> 3.1.8'
9
+ gem 'bcrypt-ruby', '~> 3.0.0'
9
10
  gem 'jquery-rails'
10
11
  gem 'sass-rails'
11
12
  gem 'strong_parameters'
@@ -14,6 +15,7 @@ end
14
15
 
15
16
  appraise '3.2' do
16
17
  gem 'rails', '~> 3.2.13'
18
+ gem 'bcrypt-ruby', '~> 3.0.0'
17
19
  gem 'jquery-rails'
18
20
  gem 'sass-rails'
19
21
  gem 'strong_parameters'
@@ -21,8 +23,10 @@ end
21
23
 
22
24
  appraise '4.0' do
23
25
  gem 'rails', '4.0.0'
26
+ gem 'bcrypt-ruby', '~> 3.0.0' #FIXME: This should be ~> 3.1.0 for Rails 4.0
24
27
  gem 'jquery-rails'
25
28
  gem 'sass-rails', '~> 4.0.0'
29
+ gem 'activeresource', require: 'active_resource'
26
30
 
27
31
  # Test suite makes heavy use of attr_accessible
28
32
  gem 'protected_attributes'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- shoulda-matchers (2.4.0.rc1)
4
+ shoulda-matchers (2.4.0)
5
5
  activesupport (>= 3.0.0)
6
6
 
7
7
  GEM
data/NEWS.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # HEAD
2
2
 
3
+ # v 2.4.0
4
+ * Fix a bug with the `validate_numericality_of` matcher that would not allow the
5
+ `with_message` option on certain submatchers.
6
+
7
+ * Fix a regression with context-dependent validations in ActiveResource
8
+
3
9
  * shoulda-matchers is now fully compatible with Rails 4.
4
10
 
5
11
  * When not using RSpec, shoulda-matchers is now auto-included into
data/README.md CHANGED
@@ -42,6 +42,7 @@ describe User do
42
42
  it { should allow_value("a@b.com").for(:email) }
43
43
  it { should ensure_inclusion_of(:age).in_range(1..100) }
44
44
  it { should_not allow_mass_assignment_of(:password) }
45
+ it { should have_secure_password }
45
46
  end
46
47
  ```
47
48
 
data/gemfiles/3.1.gemfile CHANGED
@@ -10,6 +10,7 @@ gem "jdbc-sqlite3", :platform=>:jruby
10
10
  gem "jruby-openssl", :platform=>:jruby
11
11
  gem "therubyrhino", :platform=>:jruby
12
12
  gem "rails", "~> 3.1.8"
13
+ gem "bcrypt-ruby", "~> 3.0.0"
13
14
  gem "jquery-rails"
14
15
  gem "sass-rails"
15
16
  gem "strong_parameters"
@@ -43,6 +43,7 @@ GEM
43
43
  childprocess (~> 0.3.6)
44
44
  cucumber (>= 1.1.1)
45
45
  rspec-expectations (>= 2.7.0)
46
+ bcrypt-ruby (3.0.1)
46
47
  bourne (1.4.0)
47
48
  mocha (~> 0.13.2)
48
49
  builder (3.0.4)
@@ -143,6 +144,7 @@ DEPENDENCIES
143
144
  activerecord-jdbcsqlite3-adapter
144
145
  appraisal (~> 0.4)
145
146
  aruba
147
+ bcrypt-ruby (~> 3.0.0)
146
148
  bourne (~> 1.3)
147
149
  bundler (~> 1.1)
148
150
  cucumber (~> 1.1)
data/gemfiles/3.2.gemfile CHANGED
@@ -10,6 +10,7 @@ gem "jdbc-sqlite3", :platform=>:jruby
10
10
  gem "jruby-openssl", :platform=>:jruby
11
11
  gem "therubyrhino", :platform=>:jruby
12
12
  gem "rails", "~> 3.2.13"
13
+ gem "bcrypt-ruby", "~> 3.0.0"
13
14
  gem "jquery-rails"
14
15
  gem "sass-rails"
15
16
  gem "strong_parameters"
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../
3
3
  specs:
4
- shoulda-matchers (2.4.0.rc1)
4
+ shoulda-matchers (2.4.0)
5
5
  activesupport (>= 3.0.0)
6
6
 
7
7
  GEM
@@ -42,6 +42,7 @@ GEM
42
42
  childprocess (~> 0.3.6)
43
43
  cucumber (>= 1.1.1)
44
44
  rspec-expectations (>= 2.7.0)
45
+ bcrypt-ruby (3.0.1)
45
46
  bourne (1.4.0)
46
47
  mocha (~> 0.13.2)
47
48
  builder (3.0.4)
@@ -141,6 +142,7 @@ DEPENDENCIES
141
142
  activerecord-jdbcsqlite3-adapter
142
143
  appraisal (~> 0.4)
143
144
  aruba
145
+ bcrypt-ruby (~> 3.0.0)
144
146
  bourne (~> 1.3)
145
147
  bundler (~> 1.1)
146
148
  cucumber (~> 1.1)
data/gemfiles/4.0.gemfile CHANGED
@@ -10,8 +10,10 @@ gem "jdbc-sqlite3", :platform=>:jruby
10
10
  gem "jruby-openssl", :platform=>:jruby
11
11
  gem "therubyrhino", :platform=>:jruby
12
12
  gem "rails", "4.0.0"
13
+ gem "bcrypt-ruby", "~> 3.0.0"
13
14
  gem "jquery-rails"
14
15
  gem "sass-rails", "~> 4.0.0"
16
+ gem "activeresource", :require=>"active_resource"
15
17
  gem "protected_attributes"
16
18
 
17
19
  gemspec :path=>"../"
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../
3
3
  specs:
4
- shoulda-matchers (2.4.0.rc1)
4
+ shoulda-matchers (2.4.0)
5
5
  activesupport (>= 3.0.0)
6
6
 
7
7
  GEM
@@ -25,6 +25,10 @@ GEM
25
25
  activesupport (= 4.0.0)
26
26
  arel (~> 4.0.0)
27
27
  activerecord-deprecated_finders (1.0.3)
28
+ activeresource (4.0.0)
29
+ activemodel (~> 4.0)
30
+ activesupport (~> 4.0)
31
+ rails-observers (~> 0.1.1)
28
32
  activesupport (4.0.0)
29
33
  i18n (~> 0.6, >= 0.6.4)
30
34
  minitest (~> 4.2)
@@ -40,6 +44,7 @@ GEM
40
44
  cucumber (>= 1.1.1)
41
45
  rspec-expectations (>= 2.7.0)
42
46
  atomic (1.1.13)
47
+ bcrypt-ruby (3.0.1)
43
48
  bourne (1.5.0)
44
49
  mocha (>= 0.13.2, < 0.15)
45
50
  builder (3.1.4)
@@ -85,6 +90,8 @@ GEM
85
90
  bundler (>= 1.3.0, < 2.0)
86
91
  railties (= 4.0.0)
87
92
  sprockets-rails (~> 2.0.0)
93
+ rails-observers (0.1.2)
94
+ activemodel (~> 4.0)
88
95
  railties (4.0.0)
89
96
  actionpack (= 4.0.0)
90
97
  activesupport (= 4.0.0)
@@ -133,8 +140,10 @@ PLATFORMS
133
140
  DEPENDENCIES
134
141
  activerecord-jdbc-adapter
135
142
  activerecord-jdbcsqlite3-adapter
143
+ activeresource
136
144
  appraisal (~> 0.4)
137
145
  aruba
146
+ bcrypt-ruby (~> 3.0.0)
138
147
  bourne (~> 1.3)
139
148
  bundler (~> 1.1)
140
149
  cucumber (~> 1.1)
@@ -17,6 +17,7 @@ require 'shoulda/matchers/active_model/validate_confirmation_of_matcher'
17
17
  require 'shoulda/matchers/active_model/validate_numericality_of_matcher'
18
18
  require 'shoulda/matchers/active_model/allow_mass_assignment_of_matcher'
19
19
  require 'shoulda/matchers/active_model/errors'
20
+ require 'shoulda/matchers/active_model/have_secure_password_matcher'
20
21
 
21
22
 
22
23
  module Shoulda
@@ -9,6 +9,7 @@ module Shoulda # :nodoc:
9
9
  def initialize(value, operator)
10
10
  @value = value
11
11
  @operator = operator
12
+ @message = nil
12
13
  end
13
14
 
14
15
  def for(attribute)
@@ -18,13 +19,17 @@ module Shoulda # :nodoc:
18
19
 
19
20
  def matches?(subject)
20
21
  @subject = subject
21
- disallows_value_of(value_to_compare)
22
+ disallows_value_of(value_to_compare, @message)
22
23
  end
23
24
 
24
25
  def allowed_types
25
26
  'integer'
26
27
  end
27
28
 
29
+ def with_message(message)
30
+ @message = message
31
+ end
32
+
28
33
  private
29
34
 
30
35
  def value_to_compare
@@ -0,0 +1,71 @@
1
+ module Shoulda # :nodoc:
2
+ module Matchers
3
+ module ActiveModel # :nodoc:
4
+
5
+ # Ensures that the model exhibits behavior added by has_secure_password.
6
+ #
7
+ # Example:
8
+ # it { should have_secure_password }
9
+ def have_secure_password
10
+ HaveSecurePasswordMatcher.new
11
+ end
12
+
13
+ class HaveSecurePasswordMatcher # :nodoc:
14
+ attr_reader :failure_message_for_should
15
+
16
+ CORRECT_PASSWORD = "aBcDe12345"
17
+ INCORRECT_PASSWORD = "password"
18
+
19
+ EXPECTED_METHODS = [
20
+ :authenticate,
21
+ :password=,
22
+ :password_confirmation=,
23
+ :password_digest,
24
+ :password_digest=,
25
+ ]
26
+
27
+ MESSAGES = {
28
+ authenticated_incorrect_password: "expected %{subject} to not authenticate an incorrect password",
29
+ did_not_authenticate_correct_password: "expected %{subject} to authenticate the correct password",
30
+ method_not_found: "expected %{subject} to respond to %{methods}"
31
+ }
32
+
33
+ def description
34
+ "have a secure password"
35
+ end
36
+
37
+ def matches?(subject)
38
+ @subject = subject
39
+
40
+ if failure = validate
41
+ key, params = failure
42
+ @failure_message_for_should = MESSAGES[key] % { subject: subject.class }.merge(params)
43
+ end
44
+
45
+ failure.nil?
46
+ end
47
+
48
+ private
49
+
50
+ attr_reader :subject
51
+
52
+ def validate
53
+ missing_methods = EXPECTED_METHODS.select {|m| !subject.respond_to?(m) }
54
+
55
+ if missing_methods.present?
56
+ [:method_not_found, { methods: missing_methods.to_sentence }]
57
+ else
58
+ subject.password = CORRECT_PASSWORD
59
+ subject.password_confirmation = CORRECT_PASSWORD
60
+
61
+ if not subject.authenticate(CORRECT_PASSWORD)
62
+ [:did_not_authenticate_correct_password, {}]
63
+ elsif subject.authenticate(INCORRECT_PASSWORD)
64
+ [:authenticated_incorrect_password, {}]
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -37,7 +37,7 @@ module Shoulda
37
37
  end
38
38
 
39
39
  def messages
40
- Array.wrap(messages_for_attribute)
40
+ Array(messages_for_attribute)
41
41
  end
42
42
 
43
43
  private
@@ -59,7 +59,7 @@ module Shoulda
59
59
  end
60
60
 
61
61
  def validate_instance
62
- @instance.valid?(@context)
62
+ @instance.valid?(*@context)
63
63
  @instance
64
64
  end
65
65
  end
@@ -1,5 +1,5 @@
1
1
  module Shoulda
2
2
  module Matchers
3
- VERSION = '2.4.0.rc1'.freeze
3
+ VERSION = '2.4.0'.freeze
4
4
  end
5
5
  end
@@ -37,6 +37,6 @@ describe Shoulda::Matchers::ActionController::RedirectToMatcher do
37
37
  it 'provides the correct description when provided a block' do
38
38
  matcher = redirect_to('somewhere else') { '/some/other/url' }
39
39
 
40
- matcher.description.should == 'redirect to somewhere else'
40
+ matcher.description.should eq 'redirect to somewhere else'
41
41
  end
42
42
  end
@@ -4,16 +4,16 @@ describe Shoulda::Matchers::ActiveModel::AllowMassAssignmentOfMatcher do
4
4
  context '#description' do
5
5
  context 'without a role' do
6
6
  it 'includes the attribute name' do
7
- described_class.new(:attr).description.should ==
8
- 'allow mass assignment of attr'
7
+ described_class.new(:attr).description.
8
+ should eq 'allow mass assignment of attr'
9
9
  end
10
10
  end
11
11
 
12
12
  if active_model_3_1?
13
13
  context 'with a role' do
14
14
  it 'includes the attribute name and the role' do
15
- described_class.new(:attr).as(:admin).description.should ==
16
- 'allow mass assignment of attr as admin'
15
+ described_class.new(:attr).as(:admin).description.
16
+ should eq 'allow mass assignment of attr as admin'
17
17
  end
18
18
  end
19
19
  end
@@ -5,21 +5,21 @@ describe Shoulda::Matchers::ActiveModel::AllowValueMatcher do
5
5
  it 'describes itself with multiple values' do
6
6
  matcher = allow_value('foo', 'bar').for(:baz)
7
7
 
8
- matcher.description.should == 'allow baz to be set to any of ["foo", "bar"]'
8
+ matcher.description.should eq 'allow baz to be set to any of ["foo", "bar"]'
9
9
  end
10
10
 
11
11
  it 'describes itself with a single value' do
12
12
  matcher = allow_value('foo').for(:baz)
13
13
 
14
- matcher.description.should == 'allow baz to be set to "foo"'
14
+ matcher.description.should eq 'allow baz to be set to "foo"'
15
15
  end
16
16
 
17
17
  if active_model_3_2?
18
18
  it 'describes itself with a strict validation' do
19
19
  strict_matcher = allow_value('xyz').for(:attr).strict
20
20
 
21
- strict_matcher.description.should ==
22
- %q(doesn't raise when attr is set to "xyz")
21
+ strict_matcher.description.
22
+ should eq %q(doesn't raise when attr is set to "xyz")
23
23
  end
24
24
  end
25
25
  end
@@ -162,7 +162,7 @@ describe Shoulda::Matchers::ActiveModel::AllowValueMatcher do
162
162
 
163
163
  matcher.matches?(validating_format(:with => /abc/, :strict => true))
164
164
 
165
- matcher.failure_message_for_should_not.should == 'Expected exception to include /abc/ ' +
165
+ matcher.failure_message_for_should_not.should eq 'Expected exception to include /abc/ ' +
166
166
  'when attr is set to "xyz", got Attr is invalid'
167
167
  end
168
168
  end
@@ -1,40 +1,51 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Shoulda::Matchers::ActiveModel::ComparisonMatcher do
4
+ it_behaves_like 'a numerical submatcher' do
5
+ subject { Shoulda::Matchers::ActiveModel::ComparisonMatcher.new(0, :>) }
6
+ end
7
+
4
8
  context 'is_greater_than' do
5
- it { instance_with_validations(:greater_than => 2).should matcher.is_greater_than(2) }
9
+ it { instance_with_validations(greater_than: 2).should matcher.is_greater_than(2) }
6
10
  it { instance_without_validations.should_not matcher.is_greater_than(2) }
7
11
  end
8
12
 
9
13
  context 'greater_than_or_equal_to' do
10
- it { instance_with_validations(:greater_than_or_equal_to => 2).should matcher.is_greater_than_or_equal_to(2) }
14
+ it { instance_with_validations(greater_than_or_equal_to: 2).should matcher.is_greater_than_or_equal_to(2) }
11
15
  it { instance_without_validations.should_not matcher.is_greater_than_or_equal_to(2) }
12
16
  end
13
17
 
14
18
  context 'less_than' do
15
- it { instance_with_validations(:less_than => 2).should matcher.is_less_than(2) }
19
+ it { instance_with_validations(less_than: 2).should matcher.is_less_than(2) }
16
20
  it { instance_without_validations.should_not matcher.is_less_than(2) }
17
21
  end
18
22
 
19
23
  context 'less_than_or_equal_to' do
20
- it { instance_with_validations(:less_than_or_equal_to => 2).should matcher.is_less_than_or_equal_to(2) }
24
+ it { instance_with_validations(less_than_or_equal_to: 2).should matcher.is_less_than_or_equal_to(2) }
21
25
  it { instance_without_validations.should_not matcher.is_less_than_or_equal_to(2) }
22
26
  end
23
27
 
24
28
  context 'is_equal_to' do
25
- it { instance_with_validations(:equal_to => 0).should matcher.is_equal_to(0) }
29
+ it { instance_with_validations(equal_to: 0).should matcher.is_equal_to(0) }
26
30
  it { instance_without_validations.should_not matcher.is_equal_to(0) }
27
31
  end
28
32
 
33
+ context 'with_message' do
34
+ it 'verifies the message for the validation' do
35
+ instance = instance_with_validations(equal_to: 0, message: 'Must be zero')
36
+ instance.should matcher.is_equal_to(0).with_message('Must be zero')
37
+ end
38
+ end
39
+
29
40
  def instance_with_validations(options = {})
30
- define_model :example, :attr => :string do
41
+ define_model :example, attr: :string do
31
42
  validates_numericality_of :attr, options
32
43
  attr_accessible :attr
33
44
  end.new
34
45
  end
35
46
 
36
47
  def instance_without_validations
37
- define_model :example, :attr => :string do
48
+ define_model :example, attr: :string do
38
49
  attr_accessible :attr
39
50
  end.new
40
51
  end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe Shoulda::Matchers::ActiveModel::DisallowValueMatcher do
4
4
  it 'does not allow any types' do
5
- matcher('abcde').allowed_types.should == ''
5
+ matcher('abcde').allowed_types.should eq ''
6
6
  end
7
7
 
8
8
  context 'an attribute with a format validation' do
@@ -46,7 +46,7 @@ describe Shoulda::Matchers::ActiveModel::DisallowValueMatcher do
46
46
  matcher = matcher('abcde').for(:attr).with_message('good message')
47
47
  matcher.matches?(validating_format(:with => /abc/, :message => 'good message'))
48
48
 
49
- matcher.failure_message_for_should.should == 'allow matcher failure'
49
+ matcher.failure_message_for_should.should eq 'allow matcher failure'
50
50
  end
51
51
 
52
52
  it 'matches if the message is correct but the value is not' do
@@ -77,7 +77,7 @@ describe Shoulda::Matchers::ActiveModel::EnsureExclusionOfMatcher do
77
77
 
78
78
  it 'has correct description' do
79
79
  ensure_exclusion_of(:attr).in_array([true, 'dog']).description.
80
- should == 'ensure exclusion of attr in [true, "dog"]'
80
+ should eq 'ensure exclusion of attr in [true, "dog"]'
81
81
  end
82
82
 
83
83
  def validating_exclusion(options)
@@ -129,7 +129,7 @@ describe Shoulda::Matchers::ActiveModel::EnsureInclusionOfMatcher do
129
129
 
130
130
  it 'has correct description' do
131
131
  ensure_inclusion_of(:attr).in_array([true, "dog"]).description.
132
- should == 'ensure inclusion of attr in [true, "dog"]'
132
+ should eq 'ensure inclusion of attr in [true, "dog"]'
133
133
  end
134
134
 
135
135
  it 'rejects allow_blank' do
@@ -8,7 +8,7 @@ describe Shoulda::Matchers::ActiveModel::ExceptionMessageFinder do
8
8
 
9
9
  description = finder.allow_description('allowed values')
10
10
 
11
- description.should == %q(doesn't raise when attr is set to allowed values)
11
+ description.should eq %q(doesn't raise when attr is set to allowed values)
12
12
  end
13
13
  end
14
14
 
@@ -18,7 +18,7 @@ describe Shoulda::Matchers::ActiveModel::ExceptionMessageFinder do
18
18
 
19
19
  message = finder.expected_message_from('some message')
20
20
 
21
- message.should == 'Attr some message'
21
+ message.should eq 'Attr some message'
22
22
  end
23
23
  end
24
24
 
@@ -50,7 +50,7 @@ describe Shoulda::Matchers::ActiveModel::ExceptionMessageFinder do
50
50
 
51
51
  messages = finder.messages
52
52
 
53
- messages.should == ['Attr is invalid']
53
+ messages.should eq ['Attr is invalid']
54
54
  end
55
55
  end
56
56
 
@@ -64,7 +64,7 @@ describe Shoulda::Matchers::ActiveModel::ExceptionMessageFinder do
64
64
 
65
65
  description = finder.messages_description
66
66
 
67
- description.should == 'Attr is invalid'
67
+ description.should eq 'Attr is invalid'
68
68
  end
69
69
 
70
70
  it 'describes errors when there are none' do
@@ -72,7 +72,7 @@ describe Shoulda::Matchers::ActiveModel::ExceptionMessageFinder do
72
72
 
73
73
  description = finder.messages_description
74
74
 
75
- description.should == 'no exception'
75
+ description.should eq 'no exception'
76
76
  end
77
77
  end
78
78
 
@@ -82,7 +82,7 @@ describe Shoulda::Matchers::ActiveModel::ExceptionMessageFinder do
82
82
 
83
83
  description = finder.source_description
84
84
 
85
- description.should == 'exception'
85
+ description.should eq 'exception'
86
86
  end
87
87
  end
88
88
  end
@@ -109,4 +109,3 @@ describe Shoulda::Matchers::ActiveModel::ExceptionMessageFinder do
109
109
  model_class.new(attribute => value)
110
110
  end
111
111
  end
112
-
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe Shoulda::Matchers::ActiveModel::HaveSecurePasswordMatcher do
4
+ if active_model_3_1?
5
+ it 'matches when the subject configures has_secure_password with default options' do
6
+ working_model = define_model(:example, password_digest: :string) { has_secure_password }
7
+ expect(working_model.new).to have_secure_password
8
+ end
9
+
10
+ it 'does not match when the subject does not authenticate a password' do
11
+ no_secure_password = define_model(:example)
12
+ expect(no_secure_password.new).not_to have_secure_password
13
+ end
14
+
15
+ it 'does not match when the subject is missing the password_digest attribute' do
16
+ no_digest_column = define_model(:example) { has_secure_password }
17
+ expect(no_digest_column.new).not_to have_secure_password
18
+ end
19
+ end
20
+ end
@@ -1,6 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Shoulda::Matchers::ActiveModel::OddEvenNumberMatcher do
4
+ it_behaves_like 'a numerical submatcher' do
5
+ subject { Shoulda::Matchers::ActiveModel::OddEvenNumberMatcher.new(:attr) }
6
+ end
7
+
4
8
  context 'given an attribute that only allows odd number values' do
5
9
  it 'matches' do
6
10
  validating_odd_number.should new_odd_matcher
@@ -8,7 +12,7 @@ describe Shoulda::Matchers::ActiveModel::OddEvenNumberMatcher do
8
12
 
9
13
  it 'returns itself when given a message' do
10
14
  matcher = new_odd_matcher
11
- matcher.with_message('some message').should == matcher
15
+ matcher.with_message('some message').should eq matcher
12
16
  end
13
17
  end
14
18
 
@@ -19,7 +23,7 @@ describe Shoulda::Matchers::ActiveModel::OddEvenNumberMatcher do
19
23
 
20
24
  it 'returns itself when given a message' do
21
25
  matcher = new_even_matcher
22
- matcher.with_message('some message').should == matcher
26
+ matcher.with_message('some message').should eq matcher
23
27
  end
24
28
  end
25
29
 
@@ -85,7 +89,7 @@ describe Shoulda::Matchers::ActiveModel::OddEvenNumberMatcher do
85
89
  end.new
86
90
  end
87
91
 
88
- def validating_even_number(options = {})
92
+ def validating_even_number(options = {})
89
93
  define_model :example, :attr => :string do
90
94
  validates_numericality_of :attr, { :even => true }.merge(options)
91
95
  end.new
@@ -1,18 +1,22 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Shoulda::Matchers::ActiveModel::OnlyIntegerMatcher do
4
+ it_behaves_like 'a numerical submatcher' do
5
+ subject { Shoulda::Matchers::ActiveModel::OnlyIntegerMatcher.new(:attr) }
6
+ end
7
+
4
8
  context 'given an attribute that only allows integer values' do
5
9
  it 'matches' do
6
10
  validating_only_integer.should new_matcher
7
11
  end
8
12
 
9
13
  it 'allows integer types' do
10
- new_matcher.allowed_types.should == 'integer'
14
+ new_matcher.allowed_types.should eq 'integer'
11
15
  end
12
16
 
13
17
  it 'returns itself when given a message' do
14
18
  matcher = new_matcher
15
- matcher.with_message('some message').should == matcher
19
+ matcher.with_message('some message').should eq matcher
16
20
  end
17
21
  end
18
22
 
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe Shoulda::Matchers::ActiveModel::ValidateConfirmationOfMatcher do
4
4
  context '#description' do
5
5
  it 'states that the confirmation must match its base attribute' do
6
- matcher.description.should == 'require attr_confirmation to match attr'
6
+ matcher.description.should eq 'require attr_confirmation to match attr'
7
7
  end
8
8
  end
9
9
 
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe Shoulda::Matchers::ActiveModel::ValidateNumericalityOfMatcher do
4
4
  context '#description' do
5
5
  it 'states that it allows only numeric values' do
6
- matcher.description.should == 'only allow numeric values for attr'
6
+ matcher.description.should eq 'only allow numeric values for attr'
7
7
  end
8
8
  end
9
9
 
@@ -134,6 +134,16 @@ describe Shoulda::Matchers::ActiveModel::ValidatePresenceOfMatcher do
134
134
  end
135
135
  end
136
136
 
137
+ context 'an active_resource model' do
138
+ context 'with the validation context' do
139
+ it 'does not raise an exception' do
140
+ expect {
141
+ active_resource_model.should validate_presence_of(:attr)
142
+ }.to_not raise_exception
143
+ end
144
+ end
145
+ end
146
+
137
147
  def matcher
138
148
  validate_presence_of(:attr)
139
149
  end
@@ -161,4 +171,10 @@ describe Shoulda::Matchers::ActiveModel::ValidatePresenceOfMatcher do
161
171
  end
162
172
  end.new
163
173
  end
174
+
175
+ def active_resource_model
176
+ define_active_resource_class :foo, :attr => :string do
177
+ validates_presence_of :attr
178
+ end.new
179
+ end
164
180
  end
@@ -34,7 +34,7 @@ describe Shoulda::Matchers::ActiveModel::ValidateUniquenessOfMatcher do
34
34
  context 'without an existing record' do
35
35
  it 'does not require a created instance' do
36
36
  define_model_with_other
37
- Example.count.should == 0
37
+ Example.count.should eq 0
38
38
  validating_uniqueness_with_other.should matcher
39
39
  end
40
40
  end
@@ -274,6 +274,51 @@ describe Shoulda::Matchers::ActiveModel::ValidateUniquenessOfMatcher do
274
274
  end
275
275
  end
276
276
 
277
+ context "when the validation allows nil" do
278
+ context "when there is an existing entry with a nil" do
279
+ it "should allow_nil" do
280
+ model = define_model_with_allow_nil
281
+ Example.create!(:attr => nil)
282
+ model.should matcher.allow_nil
283
+ end
284
+ end
285
+
286
+ it "should create a nil and verify that it is allowed" do
287
+ model = define_model_with_allow_nil
288
+ model.should matcher.allow_nil
289
+ Example.all.any?{ |instance| instance.attr.nil? }
290
+ end
291
+
292
+ def define_model_with_allow_nil
293
+ define_model(:example, :attr => :integer) do
294
+ attr_accessible :attr
295
+ validates_uniqueness_of :attr, :allow_nil => true
296
+ end.new
297
+ end
298
+ end
299
+
300
+ context "when the validation does not allow a nil" do
301
+ context "when there is an existing entry with a nil" do
302
+ it "should not allow_nil" do
303
+ model = define_model_without_allow_nil
304
+ Example.create!(:attr => nil)
305
+ model.should_not matcher.allow_nil
306
+ end
307
+ end
308
+
309
+ it "should not allow_nil" do
310
+ model = define_model_without_allow_nil
311
+ model.should_not matcher.allow_nil
312
+ end
313
+
314
+ def define_model_without_allow_nil
315
+ define_model(:example, :attr => :integer) do
316
+ attr_accessible :attr
317
+ validates_uniqueness_of :attr
318
+ end.new
319
+ end
320
+ end
321
+
277
322
  def case_sensitive_validation_with_existing_value(attr_type)
278
323
  model = define_model(:example, :attr => attr_type) do
279
324
  attr_accessible :attr
@@ -7,7 +7,7 @@ describe Shoulda::Matchers::ActiveModel::ValidationMessageFinder do
7
7
 
8
8
  description = finder.allow_description('allowed values')
9
9
 
10
- description.should == 'allow attr to be set to allowed values'
10
+ description.should eq 'allow attr to be set to allowed values'
11
11
  end
12
12
  end
13
13
 
@@ -17,7 +17,7 @@ describe Shoulda::Matchers::ActiveModel::ValidationMessageFinder do
17
17
 
18
18
  message = finder.expected_message_from('some message')
19
19
 
20
- message.should == 'some message'
20
+ message.should eq 'some message'
21
21
  end
22
22
  end
23
23
 
@@ -45,7 +45,15 @@ describe Shoulda::Matchers::ActiveModel::ValidationMessageFinder do
45
45
 
46
46
  messages = finder.messages
47
47
 
48
- messages.should == ['is invalid']
48
+ messages.should eq ['is invalid']
49
+ end
50
+
51
+ it 'returns an empty array if there are no errors for the given attribute' do
52
+ finder = build_finder
53
+
54
+ messages = finder.messages
55
+
56
+ messages.should == []
49
57
  end
50
58
  end
51
59
 
@@ -60,7 +68,7 @@ describe Shoulda::Matchers::ActiveModel::ValidationMessageFinder do
60
68
  description = finder.messages_description
61
69
 
62
70
  expected_messages = ['attr is invalid ("xyz")']
63
- description.should == "errors: #{expected_messages}"
71
+ description.should eq "errors: #{expected_messages}"
64
72
  end
65
73
 
66
74
  it 'describes errors when there are none' do
@@ -68,7 +76,7 @@ describe Shoulda::Matchers::ActiveModel::ValidationMessageFinder do
68
76
 
69
77
  description = finder.messages_description
70
78
 
71
- description.should == 'no errors'
79
+ description.should eq 'no errors'
72
80
  end
73
81
 
74
82
  it 'should not fetch attribute values for errors that were copied from an autosaved belongs_to association' do
@@ -80,7 +88,7 @@ describe Shoulda::Matchers::ActiveModel::ValidationMessageFinder do
80
88
  finder = Shoulda::Matchers::ActiveModel::ValidationMessageFinder.new(instance, :attribute)
81
89
 
82
90
  expected_messages = ['association.association_attribute is invalid']
83
- finder.messages_description.should == "errors: #{expected_messages}"
91
+ finder.messages_description.should eq "errors: #{expected_messages}"
84
92
  end
85
93
 
86
94
  end
@@ -91,7 +99,7 @@ describe Shoulda::Matchers::ActiveModel::ValidationMessageFinder do
91
99
 
92
100
  description = finder.source_description
93
101
 
94
- description.should == 'errors'
102
+ description.should eq 'errors'
95
103
  end
96
104
  end
97
105
 
@@ -10,7 +10,8 @@ describe Shoulda::Matchers::ActiveRecord::AcceptNestedAttributesForMatcher do
10
10
 
11
11
  matcher.matches?(rejecting_children).should be_false
12
12
 
13
- matcher.failure_message_for_should.should == 'Expected Parent to accept nested attributes for children (is not declared)'
13
+ matcher.failure_message_for_should.
14
+ should eq 'Expected Parent to accept nested attributes for children (is not declared)'
14
15
  end
15
16
 
16
17
  context 'allow_destroy' do
@@ -0,0 +1,27 @@
1
+ module ActiveResourceBuilder
2
+ def self.included(example_group)
3
+ example_group.class_eval do
4
+ after do
5
+ ActiveSupport::Dependencies.clear
6
+ end
7
+ end
8
+ end
9
+
10
+ def define_active_resource_class(class_name, attributes = {}, &block)
11
+ define_class(class_name, ActiveResource::Base) do
12
+ schema do
13
+ attributes.each do |attr, type|
14
+ attribute attr, type
15
+ end
16
+ end
17
+
18
+ if block_given?
19
+ class_eval(&block)
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ RSpec.configure do |config|
26
+ config.include ActiveResourceBuilder
27
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples 'a numerical submatcher' do
4
+ it 'implements the with_message method' do
5
+ subject.should respond_to(:with_message).with(1).arguments
6
+ end
7
+
8
+ it 'implements the allowed_types method' do
9
+ subject.should respond_to(:allowed_types).with(0).arguments
10
+ end
11
+
12
+ it 'implements the matches? method' do
13
+ subject.should respond_to(:matches?).with(1).arguments
14
+ end
15
+
16
+ it 'implements the failure_message_for_should method' do
17
+ subject.should respond_to(:failure_message_for_should).with(0).arguments
18
+ end
19
+
20
+ it 'implements the failure_message_for_should_not method' do
21
+ subject.should respond_to(:failure_message_for_should_not).with(0).arguments
22
+ end
23
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shoulda-matchers
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0.rc1
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tammer Saleh
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2013-08-16 00:00:00.000000000 Z
16
+ date: 2013-09-20 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: activesupport
@@ -196,6 +196,7 @@ files:
196
196
  - lib/shoulda/matchers/active_model/ensure_length_of_matcher.rb
197
197
  - lib/shoulda/matchers/active_model/errors.rb
198
198
  - lib/shoulda/matchers/active_model/exception_message_finder.rb
199
+ - lib/shoulda/matchers/active_model/have_secure_password_matcher.rb
199
200
  - lib/shoulda/matchers/active_model/helpers.rb
200
201
  - lib/shoulda/matchers/active_model/odd_even_number_matcher.rb
201
202
  - lib/shoulda/matchers/active_model/only_integer_matcher.rb
@@ -225,7 +226,6 @@ files:
225
226
  - lib/shoulda/matchers/rails_shim.rb
226
227
  - lib/shoulda/matchers/version.rb
227
228
  - shoulda-matchers.gemspec
228
- - spec/shoulda/active_model/validate_uniqueness_of_matcher_spec.rb
229
229
  - spec/shoulda/matchers/action_controller/filter_param_matcher_spec.rb
230
230
  - spec/shoulda/matchers/action_controller/redirect_to_matcher_spec.rb
231
231
  - spec/shoulda/matchers/action_controller/render_template_matcher_spec.rb
@@ -243,6 +243,7 @@ files:
243
243
  - spec/shoulda/matchers/active_model/ensure_inclusion_of_matcher_spec.rb
244
244
  - spec/shoulda/matchers/active_model/ensure_length_of_matcher_spec.rb
245
245
  - spec/shoulda/matchers/active_model/exception_message_finder_spec.rb
246
+ - spec/shoulda/matchers/active_model/have_secure_password_matcher_spec.rb
246
247
  - spec/shoulda/matchers/active_model/helpers_spec.rb
247
248
  - spec/shoulda/matchers/active_model/odd_even_number_matcher_spec.rb
248
249
  - spec/shoulda/matchers/active_model/only_integer_matcher_spec.rb
@@ -260,6 +261,7 @@ files:
260
261
  - spec/shoulda/matchers/active_record/serialize_matcher_spec.rb
261
262
  - spec/spec_helper.rb
262
263
  - spec/support/active_model_versions.rb
264
+ - spec/support/active_resource_builder.rb
263
265
  - spec/support/activemodel_helpers.rb
264
266
  - spec/support/class_builder.rb
265
267
  - spec/support/controller_builder.rb
@@ -267,6 +269,7 @@ files:
267
269
  - spec/support/i18n_faker.rb
268
270
  - spec/support/mailer_builder.rb
269
271
  - spec/support/model_builder.rb
272
+ - spec/support/shared_examples/numerical_submatcher_spec.rb
270
273
  homepage: http://thoughtbot.com/community/
271
274
  licenses:
272
275
  - MIT
@@ -282,12 +285,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
282
285
  version: 1.9.2
283
286
  required_rubygems_version: !ruby/object:Gem::Requirement
284
287
  requirements:
285
- - - '>'
288
+ - - '>='
286
289
  - !ruby/object:Gem::Version
287
- version: 1.3.1
290
+ version: '0'
288
291
  requirements: []
289
292
  rubyforge_project:
290
- rubygems_version: 2.0.2
293
+ rubygems_version: 2.0.0
291
294
  signing_key:
292
295
  specification_version: 4
293
296
  summary: Making tests easy on the fingers and eyes
@@ -295,7 +298,6 @@ test_files:
295
298
  - features/rails_integration.feature
296
299
  - features/step_definitions/rails_steps.rb
297
300
  - features/support/env.rb
298
- - spec/shoulda/active_model/validate_uniqueness_of_matcher_spec.rb
299
301
  - spec/shoulda/matchers/action_controller/filter_param_matcher_spec.rb
300
302
  - spec/shoulda/matchers/action_controller/redirect_to_matcher_spec.rb
301
303
  - spec/shoulda/matchers/action_controller/render_template_matcher_spec.rb
@@ -313,6 +315,7 @@ test_files:
313
315
  - spec/shoulda/matchers/active_model/ensure_inclusion_of_matcher_spec.rb
314
316
  - spec/shoulda/matchers/active_model/ensure_length_of_matcher_spec.rb
315
317
  - spec/shoulda/matchers/active_model/exception_message_finder_spec.rb
318
+ - spec/shoulda/matchers/active_model/have_secure_password_matcher_spec.rb
316
319
  - spec/shoulda/matchers/active_model/helpers_spec.rb
317
320
  - spec/shoulda/matchers/active_model/odd_even_number_matcher_spec.rb
318
321
  - spec/shoulda/matchers/active_model/only_integer_matcher_spec.rb
@@ -330,6 +333,7 @@ test_files:
330
333
  - spec/shoulda/matchers/active_record/serialize_matcher_spec.rb
331
334
  - spec/spec_helper.rb
332
335
  - spec/support/active_model_versions.rb
336
+ - spec/support/active_resource_builder.rb
333
337
  - spec/support/activemodel_helpers.rb
334
338
  - spec/support/class_builder.rb
335
339
  - spec/support/controller_builder.rb
@@ -337,3 +341,4 @@ test_files:
337
341
  - spec/support/i18n_faker.rb
338
342
  - spec/support/mailer_builder.rb
339
343
  - spec/support/model_builder.rb
344
+ - spec/support/shared_examples/numerical_submatcher_spec.rb
@@ -1,195 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Shoulda::Matchers::ActiveModel::ValidateUniquenessOfMatcher do
4
- context "a unique attribute" do
5
- before do
6
- @model = define_model(:example, :attr => :string,
7
- :other => :integer) do
8
- attr_accessible :attr, :other
9
- validates_uniqueness_of :attr
10
- end.new
11
- end
12
-
13
- context "with an existing value" do
14
- before do
15
- @existing = Example.create!(:attr => 'value', :other => 1)
16
- end
17
-
18
- it "should require a unique value for that attribute" do
19
- @model.should validate_uniqueness_of(:attr)
20
- end
21
-
22
- it "should pass when the subject is an existing record" do
23
- @existing.should validate_uniqueness_of(:attr)
24
- end
25
-
26
- it "should fail when a scope is specified" do
27
- @model.should_not validate_uniqueness_of(:attr).scoped_to(:other)
28
- end
29
- end
30
-
31
- context "without an existing value" do
32
- before do
33
- Example.first.should be_nil
34
- @matcher = validate_uniqueness_of(:attr)
35
- end
36
-
37
- it "does not not require a created instance" do
38
- @model.should @matcher
39
- end
40
- end
41
- end
42
-
43
- context "a unique attribute with a custom error and an existing value" do
44
- before do
45
- @model = define_model(:example, :attr => :string) do
46
- attr_accessible :attr
47
- validates_uniqueness_of :attr, :message => 'Bad value'
48
- end.new
49
- Example.create!(:attr => 'value')
50
- end
51
-
52
- it "should fail when checking the default message" do
53
- @model.should_not validate_uniqueness_of(:attr)
54
- end
55
-
56
- it "should fail when checking a message that doesn't match" do
57
- @model.should_not validate_uniqueness_of(:attr).with_message(/abc/i)
58
- end
59
-
60
- it "should pass when checking a message that matches" do
61
- @model.should validate_uniqueness_of(:attr).with_message(/bad/i)
62
- end
63
- end
64
-
65
- context "a scoped unique attribute with an existing value" do
66
- before do
67
- @model = define_model(:example, :attr => :string,
68
- :scope1 => :integer,
69
- :scope2 => :integer,
70
- :other => :integer) do
71
- attr_accessible :attr, :scope1, :scope2, :other
72
- validates_uniqueness_of :attr, :scope => [:scope1, :scope2]
73
- end.new
74
- @existing = Example.create!(:attr => 'value', :scope1 => 1, :scope2 => 2, :other => 3)
75
- end
76
-
77
- it "should pass when the correct scope is specified" do
78
- @model.should validate_uniqueness_of(:attr).scoped_to(:scope1, :scope2)
79
- end
80
-
81
- it "should pass when the subject is an existing record" do
82
- @existing.should validate_uniqueness_of(:attr).scoped_to(:scope1, :scope2)
83
- end
84
-
85
- it "should fail when too narrow of a scope is specified" do
86
- @model.should_not validate_uniqueness_of(:attr).scoped_to(:scope1, :scope2, :other)
87
- end
88
-
89
- it "should fail when too broad of a scope is specified" do
90
- @model.should_not validate_uniqueness_of(:attr).scoped_to(:scope1)
91
- end
92
-
93
- it "should fail when a different scope is specified" do
94
- @model.should_not validate_uniqueness_of(:attr).scoped_to(:other)
95
- end
96
-
97
- it "should fail when no scope is specified" do
98
- @model.should_not validate_uniqueness_of(:attr)
99
- end
100
-
101
- it "should fail when a non-existent attribute is specified as a scope" do
102
- @model.should_not validate_uniqueness_of(:attr).scoped_to(:fake)
103
- end
104
- end
105
-
106
- context "a non-unique attribute with an existing value" do
107
- before do
108
- @model = define_model(:example, :attr => :string) do
109
- attr_accessible :attr
110
- end.new
111
- Example.create!(:attr => 'value')
112
- end
113
-
114
- it "should not require a unique value for that attribute" do
115
- @model.should_not validate_uniqueness_of(:attr)
116
- end
117
- end
118
-
119
- context "a case sensitive unique attribute with an existing value" do
120
- before do
121
- @model = define_model(:example, :attr => :string) do
122
- attr_accessible :attr
123
- validates_uniqueness_of :attr, :case_sensitive => true
124
- end.new
125
- Example.create!(:attr => 'value')
126
- end
127
-
128
- it "should not require a unique, case-insensitive value for that attribute" do
129
- @model.should_not validate_uniqueness_of(:attr).case_insensitive
130
- end
131
-
132
- it "should require a unique, case-sensitive value for that attribute" do
133
- @model.should validate_uniqueness_of(:attr)
134
- end
135
- end
136
-
137
- context "a case sensitive unique integer attribute with an existing value" do
138
- before do
139
- @model = define_model(:example, :attr => :integer) do
140
- attr_accessible :attr
141
- validates_uniqueness_of :attr, :case_sensitive => true
142
- end.new
143
- Example.create!(:attr => 'value')
144
- end
145
-
146
- it "should require a unique, case-insensitive value for that attribute" do
147
- @model.should validate_uniqueness_of(:attr).case_insensitive
148
- end
149
-
150
- it "should require a unique, case-sensitive value for that attribute" do
151
- @model.should validate_uniqueness_of(:attr)
152
- end
153
- end
154
-
155
- context "when the validation allows nil" do
156
- before do
157
- @model = define_model(:example, :attr => :integer) do
158
- attr_accessible :attr
159
- validates_uniqueness_of :attr, :allow_nil => true
160
- end.new
161
- end
162
-
163
- context "when there is an existing entry with a nil" do
164
- it "should allow_nil" do
165
- Example.create!(:attr => nil)
166
- @model.should validate_uniqueness_of(:attr).allow_nil
167
- end
168
- end
169
-
170
- it "should create a nil and verify that it is allowed" do
171
- @model.should validate_uniqueness_of(:attr).allow_nil
172
- Example.all.any?{ |instance| instance.attr.nil? }
173
- end
174
- end
175
-
176
- context "when the validation does not allow a nil" do
177
- before do
178
- @model = define_model(:example, :attr => :integer) do
179
- attr_accessible :attr
180
- validates_uniqueness_of :attr
181
- end.new
182
- end
183
-
184
- context "when there is an existing entry with a nil" do
185
- it "should not allow_nil" do
186
- Example.create!(:attr => nil)
187
- @model.should_not validate_uniqueness_of(:attr).allow_nil
188
- end
189
- end
190
-
191
- it "should not allow_nil" do
192
- @model.should_not validate_uniqueness_of(:attr).allow_nil
193
- end
194
- end
195
- end