minitest-activemodel 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
data/CHANGELOG.md ADDED
@@ -0,0 +1,24 @@
1
+ # 0.0.1 - 10/13/12
2
+
3
+ + Add `validate_presence_of` matcher.
4
+ + Add `validate_acceptance_of` matcher.
5
+ + Add `accepts_with(value)` option to `ValidateAcceptanceMatcher`.
6
+ + Add `validate_confirmation_of` matcher.
7
+ + Add `validate_length_of` matcher.
8
+ + Add `validate_size_of` alias to `validate_length_of`.
9
+ + Add `ensure_length_of` and `ensure_size_of` aliases to `validate_length_of`.
10
+ + Add `with_minimum` option to `ValidateLengthMatcher`.
11
+ + Add `with_min` and `is_at_least` aliases to `ValidateLengthMatcher#with_minimum`.
12
+ + Add `with_maximum` option to `ValidateLengthMatcher`.
13
+ + Add `with_max` and `is_at_most` aliases to `ValidateLengthMatcher#with_maximum`.
14
+ + Add `within` option to `ValidateLengthMatcher`.
15
+ + Add `in` alias to `ValidateLengthMatcher#within`.
16
+ + Raise `ArgumentError` if the given value for `ValidateLengthMatcher#within`
17
+ is not a `Range`.
18
+ + Add `is` option to `ValidateLengthMatcher`.
19
+ + Add `is_equal_to` alias to `ValidateLengthMatcher#is`.
20
+ + Add `validate_format_of` matcher.
21
+ + Raise `ArgumentError` if no option is given for `validate_length_of` matcher.
22
+ + Add `to_allow` and `to_not_allow` options to `ValidateFormatMatcher`.
23
+ + Raise `ArgumentError` if no option is given for `validate_format_of` matcher.
24
+ + Raise error if `to_allow` and `to_not_allow` options are called at once.
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,7 @@
1
+ # Contributing "The Quick Guide"
2
+
3
+ 1. Fork it
4
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
5
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
6
+ 4. Push to the branch (`git push origin my-new-feature`)
7
+ 5. Create new Pull Request
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gemspec
data/LICENSE.md ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Francesco Rodriguez
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # minitest-activemodel
2
+
3
+ [![Build Status](https://secure.travis-ci.org/frodsan/minitest-activemodel.png?branch=master&.png)](http://travis-ci.org/frodsan/minitest-activemodel)
4
+ [![Dependency Status](https://gemnasium.com/frodsan/minitest-activemodel.png)](https://gemnasium.com/frodsan/minitest-activemodel)
5
+ [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/frodsan/minitest-activemodel)
6
+
7
+ MiniTest matchers for ActiveModel::Validations.
8
+
9
+ ## Support
10
+
11
+ This gem supports:
12
+
13
+ + Ruby 1.9.3.
14
+ + ActiveModel 3.2.x.
15
+
16
+ ## Installation
17
+
18
+ Add this line to your application's Gemfile:
19
+
20
+ gem 'minitest-activemodel', group: :test
21
+
22
+ And then execute:
23
+
24
+ $ bundle
25
+
26
+ Or install it yourself as:
27
+
28
+ $ gem install minitest-activemodel
29
+
30
+ ## Usage
31
+
32
+ TODO: In this section, it must appear the Official Documentation link.
33
+
34
+ ## Contributing
35
+
36
+ Read [CONTRIBUTING](https://github.com/frodsan/minitest-activemodel/blob/master/CONTRIBUTING.md).
37
+
38
+ ## License
39
+
40
+ MIT License. Copyright 2012 Francesco Rodriguez. See [LICENSE](https://github.com/frodsan/minitest-activemodel/blob/master/LICENSE.md)
41
+ for more information.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new do |task|
6
+ task.libs << 'test'
7
+ task.pattern = 'test/**/*_test.rb'
8
+ end
9
+
10
+ task default: :test
@@ -0,0 +1,56 @@
1
+ module MiniTest
2
+ module Matchers
3
+ module ActiveModel
4
+ # Ensures that the model is not valid if the given attribute is not accepted.
5
+ #
6
+ # Options:
7
+ # * <tt>accept_with</tt> - value that is considered accepted.
8
+ #
9
+ # it { must validate_acceptance_of(:eula) }
10
+ # it { must validate_acceptance_of(:terms_of_service).accept_with(true) }
11
+ def validate_acceptance_of attr
12
+ ValidateAcceptanceMatcher.new attr
13
+ end
14
+
15
+ private
16
+
17
+ class ValidateAcceptanceMatcher < ValidationMatcher
18
+ def initialize attr
19
+ super attr, :acceptance
20
+ end
21
+
22
+ def accept_with value
23
+ @accepted = value
24
+ self
25
+ end
26
+
27
+ def matches? subject
28
+ return false unless @result = super(subject)
29
+
30
+ check_accepted_value if @accepted
31
+
32
+ @result
33
+ end
34
+
35
+ def description
36
+ desc = ''
37
+ desc = " accept with #{@accepted.inspect}" if @accepted
38
+ super << desc
39
+ end
40
+
41
+ private
42
+
43
+ def check_accepted_value
44
+ actual = @validator.options[:accept]
45
+
46
+ if actual == @accepted
47
+ @positive_message << " accept with #{actual.inspect}."
48
+ else
49
+ @negative_message << " accept with #{actual.inspect}."
50
+ @result = false
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,12 @@
1
+ module MiniTest
2
+ module Matchers
3
+ module ActiveModel
4
+ # Ensures that the model's attribute matches confirmation.
5
+ #
6
+ # it { must validate_confirmation_of :password }
7
+ def validate_confirmation_of attr
8
+ ValidationMatcher.new attr, :confirmation
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,82 @@
1
+ module MiniTest
2
+ module Matchers
3
+ module ActiveModel
4
+ # Ensures that the model is not valid if the given attribute is not
5
+ # formatted correctly.
6
+ #
7
+ # Options:
8
+ # * <tt>to_allow</tt> - string to test against that it is valid.
9
+ # * <tt>to_not_allow</tt> - string to test against that it is not valid.
10
+ #
11
+ # it { must validate_format_of(:email).to_allow('foo@bar.com') }
12
+ # it { must validate_format_of(:email).to_not_allow('foo_bar_com') }
13
+ def validate_format_of attr
14
+ ValidateFormatMatcher.new attr
15
+ end
16
+
17
+ private
18
+
19
+ class ValidateFormatMatcher < ValidationMatcher
20
+ def initialize attr
21
+ super attr, :format
22
+ end
23
+
24
+ def to_allow valid_value
25
+ raise 'You must not call both to_allow and to_not_allow' if @invalid
26
+
27
+ @valid = valid_value
28
+ self
29
+ end
30
+
31
+ def to_not_allow invalid_value
32
+ raise 'You must not call both to_allow and to_not_allow' if @valid
33
+
34
+ @invalid = invalid_value
35
+ self
36
+ end
37
+
38
+ def matches? subject
39
+ validate_invalid_options! @valid, @invalid
40
+
41
+ return false unless @result = super(subject)
42
+
43
+ check_valid_value if @valid
44
+ check_invalid_value if @invalid
45
+
46
+ @result
47
+ end
48
+
49
+ def description
50
+ desc = []
51
+ desc << " allowing the value #{@valid.inspect}" if @valid
52
+ desc << " not allowing the value #{@invalid.inspect}" if @invalid
53
+ super << desc.to_sentence
54
+ end
55
+
56
+ private
57
+
58
+ def check_valid_value
59
+ if format =~ @valid
60
+ @positive_message << " with #{@valid.inspect} as a valid value"
61
+ else
62
+ @negative_message << " with #{@valid.inspect} as an invalid value"
63
+ @result = false
64
+ end
65
+ end
66
+
67
+ def check_invalid_value
68
+ if format !~ @invalid
69
+ @positive_message << " with #{@invalid.inspect} as a invalid value"
70
+ else
71
+ @negative_message << " with #{@invalid.inspect} as a valid value"
72
+ @result = false
73
+ end
74
+ end
75
+
76
+ def format
77
+ @with ||= @validator.options[:with]
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,146 @@
1
+ module MiniTest
2
+ module Matchers
3
+ module ActiveModel
4
+ # Ensures that the length/size of the attribute is validated.
5
+ # You must supply at least one of the following options:
6
+ #
7
+ # Options:
8
+ # * <tt>with_minimum</tt> - ensures the minimum length of the attribute.
9
+ # Aliased as: <tt>with_min</tt> and <tt>is_at_least</tt>.
10
+ # * <tt>with_maximum</tt> - ensures the maximum length of the attribute.
11
+ # Aliased as: <tt>with_max</tt> and <tt>is_at_most</tt>.
12
+ # * <tt>within</tt> - a range specifying the minimum and maximum length
13
+ # of the attribute. Aliased as: <tt>in</tt>.
14
+ # * <tt>is</tt> - ensures the exact length of the attribute.
15
+ # Aliased as: <tt>is_equal_to</tt>.
16
+ #
17
+ # it { must validate_length_of(:name).with_minimum(10) }
18
+ # it { must validate_length_of(:name).with_min(10) }
19
+ # it { must validate_length_of(:name).is_at_least(10) }
20
+ # it { must validate_length_of(:name).with_maximum(100) }
21
+ # it { must validate_length_of(:name).with_max(100) }
22
+ # it { must validate_length_of(:name).is_at_most(100) }
23
+ # it { must validate_length_of(:name).within(10..100) }
24
+ # it { must validate_length_of(:name).in(10..100) }
25
+ # it { must validate_length_of(:password).is(8) }
26
+ # it { must validate_length_of(:password).is_equal_to(8) }
27
+ #
28
+ # This matcher is also aliased as:
29
+ #
30
+ # * <tt>validate_size_of</tt>.
31
+ # * <tt>ensure_length_of</tt>.
32
+ # * <tt>ensure_size_of</tt>.
33
+ #
34
+ # So you can do something like:
35
+ #
36
+ # it { must ensure_length_of(:name).is_at_least(10) }
37
+ # it { must ensure_size_of(:name).is_at_most(100) }
38
+ # it { must validate_size_of(:name).in(10..100) }
39
+ def validate_length_of attr
40
+ ValidateLengthMatcher.new attr
41
+ end
42
+ alias :validate_size_of :validate_length_of
43
+ alias :ensure_length_of :validate_length_of
44
+ alias :ensure_size_of :validate_length_of
45
+
46
+ private
47
+
48
+ class ValidateLengthMatcher < ValidationMatcher
49
+ def initialize attr
50
+ super attr, :length
51
+ end
52
+
53
+ def with_minimum value
54
+ @minimum = value
55
+ self
56
+ end
57
+ alias :with_min :with_minimum
58
+ alias :is_at_least :with_minimum
59
+
60
+ def with_maximum value
61
+ @maximum = value
62
+ self
63
+ end
64
+ alias :with_max :with_maximum
65
+ alias :is_at_most :with_maximum
66
+
67
+ def within value
68
+ raise ArgumentError, 'within must be a Range' unless value.is_a? Range
69
+ @within = value
70
+ self
71
+ end
72
+ alias :in :within
73
+
74
+ def is value
75
+ @is = value
76
+ self
77
+ end
78
+ alias :is_equal_to :is
79
+
80
+ # TODO: add helper methods for :too_long, :too_short
81
+ # and :wrong_length options.
82
+ # See http://api.rubyonrails.org/classes/ActiveModel/Validations/HelperMethods.html#method-i-validates_length_of
83
+
84
+ def matches? subject
85
+ validate_invalid_options! @minimum, @maximum, @within, @is
86
+
87
+ return false unless @result = super(subject)
88
+
89
+ check :minimum if @minimum
90
+ check :maximum if @maximum
91
+ check_range if @within
92
+ check_precision if @is
93
+
94
+ @result
95
+ end
96
+
97
+ def description
98
+ desc = []
99
+ desc << " with minimum #{@minimum}" if @minimum
100
+ desc << " with maximum #{@maximum}" if @maximum
101
+ desc << " within range #{@within}" if @within
102
+ desc << " is equal to #{@is}" if @is
103
+
104
+ super << desc.to_sentence
105
+ end
106
+
107
+ private
108
+
109
+ def check option
110
+ actual = @validator.options[option]
111
+
112
+ if actual == instance_variable_get("@#{option}")
113
+ @positive_message << " with #{option} of #{actual}"
114
+ else
115
+ @negative_message << " with #{option} of #{actual}"
116
+ @result = false
117
+ end
118
+ end
119
+
120
+ def check_range
121
+ min, max = @within.min, @within.max
122
+ actual_min = @validator.options[:minimum]
123
+ actual_max = @validator.options[:maximum]
124
+
125
+ if actual_min == min && actual_max == max
126
+ @positive_message << " with range #{@within}"
127
+ else
128
+ @negative_message << " with range #{actual_min..actual_max}"
129
+ @result = false
130
+ end
131
+ end
132
+
133
+ def check_precision
134
+ actual = @validator.options[:is]
135
+
136
+ if actual == @is
137
+ @positive_message << " is equal to #{@is}"
138
+ else
139
+ @negative_message << " is equal to #{actual}"
140
+ @result = false
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,12 @@
1
+ module MiniTest
2
+ module Matchers
3
+ module ActiveModel
4
+ # Ensures that the model is not valid if the given attribute is not present.
5
+ #
6
+ # it { must validate_presence_of(:name) }
7
+ def validate_presence_of attr
8
+ ValidationMatcher.new attr, :presence
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,52 @@
1
+ module MiniTest
2
+ module Matchers
3
+ module ActiveModel
4
+ class ValidationMatcher # :nodoc:
5
+ def initialize attr, type
6
+ @attr = attr
7
+ @type = type
8
+ end
9
+
10
+ def matches? subject
11
+ @klass = subject.is_a?(Class) ? subject : subject.class
12
+ @validator = @klass.validators_on(@attr).find { |v| v.kind == @type }
13
+ @result = true
14
+
15
+ check_validator
16
+
17
+ @result
18
+ end
19
+
20
+ def failure_message
21
+ "Expected #{@klass} to #{description}; instead got #{@negative_message}"
22
+ end
23
+
24
+ def negative_failure_message
25
+ "Expected #{@klass} to not #{description}; instead got #{@positive_message}"
26
+ end
27
+
28
+ def description
29
+ "validate #{@type} of #{@attr}"
30
+ end
31
+
32
+ private
33
+
34
+ def check_validator
35
+ if @validator
36
+ @positive_message = "#{@type} validator for #{@attr}"
37
+ @negative_message = "#{@type} validator for #{@attr}"
38
+ else
39
+ @negative_message = "no #{@type} validator for #{@attr}"
40
+ @result = false
41
+ end
42
+ end
43
+
44
+ def validate_invalid_options! *options
45
+ if options.all? &:nil?
46
+ raise ArgumentError, 'You have to supply an option for this matcher'
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,7 @@
1
+ module MiniTest
2
+ module Matchers
3
+ module ActiveModel
4
+ VERSION = '0.0.1'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ require 'minitest-activemodel/version'
2
+
3
+ require 'minitest/matchers'
4
+ require 'minitest-activemodel/matchers/validation_matcher.rb'
5
+ require 'minitest-activemodel/matchers/validate_acceptance_matcher'
6
+ require 'minitest-activemodel/matchers/validate_confirmation_matcher'
7
+ require 'minitest-activemodel/matchers/validate_format_matcher'
8
+ require 'minitest-activemodel/matchers/validate_length_matcher'
9
+ require 'minitest-activemodel/matchers/validate_presence_matcher'
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path '../lib/minitest-activemodel/version', __FILE__
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = 'minitest-activemodel'
6
+ gem.version = MiniTest::Matchers::ActiveModel::VERSION
7
+
8
+ gem.authors = ['Francesco Rodriguez']
9
+ gem.email = ['lrodriguezsanc@gmail.com']
10
+ gem.description = %q{MiniTest Matchers for ActiveModel::Validations}
11
+ gem.summary = gem.description
12
+ gem.homepage = 'https://github.com/frodsan/minitest-activemodel'
13
+
14
+ gem.files = `git ls-files`.split "\n"
15
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename f }
16
+ gem.test_files = `git ls-files -- test/*`.split "\n"
17
+ gem.extra_rdoc_files = ['CHANGELOG.md', 'LICENSE.md', 'README.md']
18
+ gem.rdoc_options = ['--charset=UTF-8']
19
+ gem.require_paths = ['lib']
20
+
21
+ gem.add_dependency 'minitest', '>= 4.0.0'
22
+ gem.add_dependency 'minitest-matchers', '~> 1.2.0'
23
+ gem.add_dependency 'activemodel', '~> 3.2.0'
24
+ gem.add_development_dependency 'rake'
25
+ end
@@ -0,0 +1,19 @@
1
+ require 'test_helper'
2
+
3
+ class ValidateAcceptanceTest < MiniTest::Unit::TestCase
4
+ test 'must validate acceptance of an attribute' do
5
+ assert_must validate_acceptance_of(:eula), User
6
+ end
7
+
8
+ test 'must not validate acceptance of an attribute' do
9
+ assert_wont validate_acceptance_of(:not_accepted), User
10
+ end
11
+
12
+ test 'must validate acceptance of an attribute with an accepted value' do
13
+ assert_must validate_acceptance_of(:terms_of_service).accept_with(true), User
14
+ end
15
+
16
+ test 'must not validate acceptance of an attribute with an unaccepted value' do
17
+ assert_wont validate_acceptance_of(:terms_of_service).accept_with('1'), User
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ require 'test_helper'
2
+
3
+ class ValidateConfirmationMatcherTest < MiniTest::Unit::TestCase
4
+ test 'must validate confirmation of an attribute' do
5
+ assert_must validate_confirmation_of(:password), User
6
+ end
7
+
8
+ test 'must not validate confirmation of an optional attribute' do
9
+ assert_wont validate_confirmation_of(:no_confirm), User
10
+ end
11
+ end
@@ -0,0 +1,29 @@
1
+ require 'test_helper'
2
+
3
+ class ValidateFormatMatcherTest < MiniTest::Unit::TestCase
4
+ test 'raises ArgumentError when no option is given' do
5
+ assert_raises(ArgumentError) { assert_must validate_format_of(:email), User}
6
+ end
7
+
8
+ test 'raises if to_allow and to_not_allow are used' do
9
+ assert_raises RuntimeError do
10
+ assert_must validate_format_of(:email).to_allow('').to_not_allow(''), User
11
+ end
12
+ end
13
+
14
+ test 'must validate valid format of an attribute' do
15
+ assert_must validate_format_of(:email).to_allow('foo@bar.com'), User
16
+ end
17
+
18
+ test 'must not validate valid format of an attribute' do
19
+ assert_wont validate_format_of(:email).to_allow('foo_bar_com'), User
20
+ end
21
+
22
+ test 'must validate invalid format of an attribute' do
23
+ assert_must validate_format_of(:email).to_not_allow('foo_bar_com'), User
24
+ end
25
+
26
+ test 'must not validate invalid format of an attribute' do
27
+ assert_wont validate_format_of(:email).to_not_allow('foo@bar.com'), User
28
+ end
29
+ end
@@ -0,0 +1,77 @@
1
+ require 'test_helper'
2
+
3
+ class ValidateLengthMatcher < MiniTest::Unit::TestCase
4
+ test 'raises ArgumentError when no option is given' do
5
+ assert_raises(ArgumentError) { assert_must validate_length_of(:name), User }
6
+ end
7
+
8
+ test 'must validate minimum length of an attribute' do
9
+ assert_must validate_length_of(:name).with_minimum(10), User
10
+ end
11
+
12
+ test 'must not validate minimum length of an attribute' do
13
+ assert_wont validate_length_of(:name).with_minimum(100), User
14
+ end
15
+
16
+ test 'with_minimum must be aliased as with_min' do
17
+ assert_must validate_length_of(:name).with_min(10), User
18
+ end
19
+
20
+ test 'with_minimum must be aliased as is_at_least' do
21
+ assert_must ensure_length_of(:name).is_at_least(10), User
22
+ end
23
+
24
+ test 'must validate maximum length of an attribute' do
25
+ assert_must validate_length_of(:name).with_maximum(100), User
26
+ end
27
+
28
+ test 'must not validate maximum length of an attribute' do
29
+ assert_wont validate_length_of(:name).with_maximum(10), User
30
+ end
31
+
32
+ test 'must validate minimum and maximum length of an attribute' do
33
+ assert_must validate_length_of(:name).within(10..100), User
34
+ end
35
+
36
+ test 'must not validate minimum and maximum length of an attribute' do
37
+ assert_wont validate_length_of(:name).within(100..10), User
38
+ end
39
+
40
+ test 'within must be aliased as in' do
41
+ assert_must validate_length_of(:name).in(10..100), User
42
+ end
43
+
44
+ test 'within must be a range' do
45
+ assert_raises ArgumentError do
46
+ assert_must validate_length_of(:name).within(10), User
47
+ end
48
+ end
49
+
50
+ test 'must validate exact length of an attribute' do
51
+ assert_must validate_length_of(:password).is(8), User
52
+ end
53
+
54
+ test 'must not validate exact length of an attribute' do
55
+ assert_wont validate_length_of(:password).is(7), User
56
+ end
57
+
58
+ test 'is must be aliased as is_equal_to' do
59
+ assert_must validate_length_of(:password).is_equal_to(8), User
60
+ end
61
+
62
+ test 'must be aliased as validate_size_of' do
63
+ assert_must validate_size_of(:name).with_max(100), User
64
+ end
65
+
66
+ test 'must be aliased as ensure_length_of' do
67
+ assert_must ensure_length_of(:name).with_max(100), User
68
+ end
69
+
70
+ test 'must be aliased as ensure_size_of' do
71
+ assert_must ensure_size_of(:name).is_at_most(100), User
72
+ end
73
+
74
+ test 'must be aliased as validates_size_of' do
75
+ assert_must validate_length_of(:lastname).with_max(100), User
76
+ end
77
+ end
@@ -0,0 +1,11 @@
1
+ require 'test_helper'
2
+
3
+ class ValidatePresenceMatcherTest < MiniTest::Unit::TestCase
4
+ test 'must validate presence of a required attribute' do
5
+ assert_must validate_presence_of(:name), User
6
+ end
7
+
8
+ test 'must not validate presence of an optional attribute' do
9
+ assert_wont validate_presence_of(:not_required), User
10
+ end
11
+ end
@@ -0,0 +1,46 @@
1
+ require 'test_helper'
2
+
3
+ class ValidationMatcherTest < MiniTest::Unit::TestCase
4
+ def setup
5
+ @validator = ValidationMatcher.new :attr, :type
6
+ end
7
+
8
+ test 'returns false if validation type not exists' do
9
+ subject = create_subject :attr, :another_type
10
+
11
+ assert !@validator.matches?(subject)
12
+ end
13
+
14
+ test 'returns true if validation type exists' do
15
+ subject = create_subject :attr, :type
16
+
17
+ assert @validator.matches? subject
18
+ end
19
+
20
+ test 'set failure message if validation type not exists' do
21
+ subject = create_subject :attr, :another_type
22
+
23
+ @validator.matches? subject
24
+
25
+ assert_match 'no type validator for attr', @validator.failure_message
26
+ end
27
+
28
+ test 'set negative failure message if validation type exists' do
29
+ subject = create_subject :attr, :type
30
+
31
+ @validator.matches? subject
32
+
33
+ assert_match 'type validator for attr', @validator.negative_failure_message
34
+ end
35
+
36
+ private
37
+
38
+ def create_subject attr, type
39
+ arg = MiniTest::Mock.new
40
+ arg.expect :kind, type
41
+
42
+ subject = MiniTest::Mock.new
43
+ subject.expect :is_a?, true, [Class]
44
+ subject.expect :validators_on, [arg], [attr]
45
+ end
46
+ end
@@ -0,0 +1,18 @@
1
+ require 'active_model'
2
+
3
+ class User
4
+ include ActiveModel::Validations
5
+
6
+ validates_acceptance_of :eula
7
+ validates_acceptance_of :terms_of_service, accept: true
8
+
9
+ validates_confirmation_of :password
10
+
11
+ validates_format_of :email, with: /^([^\s]+)((?:[-a-z0-9]\.)[a-z]{2,})$/i
12
+
13
+ validates_length_of :name, minimum: 10, maximum: 100
14
+ validates_length_of :password, is: 8
15
+ validates_size_of :lastname, maximum: 100
16
+
17
+ validates_presence_of :name
18
+ end
@@ -0,0 +1,9 @@
1
+ require 'minitest/autorun'
2
+ require 'active_support/testing/declarative'
3
+ require 'minitest-activemodel'
4
+ require 'models/user'
5
+
6
+ class MiniTest::Unit::TestCase
7
+ include MiniTest::Matchers::ActiveModel
8
+ extend ActiveSupport::Testing::Declarative
9
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: minitest-activemodel
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Francesco Rodriguez
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-10-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: minitest
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 4.0.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 4.0.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: minitest-matchers
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 1.2.0
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 1.2.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: activemodel
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 3.2.0
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 3.2.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: rake
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: MiniTest Matchers for ActiveModel::Validations
79
+ email:
80
+ - lrodriguezsanc@gmail.com
81
+ executables: []
82
+ extensions: []
83
+ extra_rdoc_files:
84
+ - CHANGELOG.md
85
+ - LICENSE.md
86
+ - README.md
87
+ files:
88
+ - .gitignore
89
+ - .travis.yml
90
+ - CHANGELOG.md
91
+ - CONTRIBUTING.md
92
+ - Gemfile
93
+ - LICENSE.md
94
+ - README.md
95
+ - Rakefile
96
+ - lib/minitest-activemodel.rb
97
+ - lib/minitest-activemodel/matchers/validate_acceptance_matcher.rb
98
+ - lib/minitest-activemodel/matchers/validate_confirmation_matcher.rb
99
+ - lib/minitest-activemodel/matchers/validate_format_matcher.rb
100
+ - lib/minitest-activemodel/matchers/validate_length_matcher.rb
101
+ - lib/minitest-activemodel/matchers/validate_presence_matcher.rb
102
+ - lib/minitest-activemodel/matchers/validation_matcher.rb
103
+ - lib/minitest-activemodel/version.rb
104
+ - minitest-activemodel.gemspec
105
+ - test/cases/validate_acceptance_matcher_test.rb
106
+ - test/cases/validate_confirmation_matcher_test.rb
107
+ - test/cases/validate_format_matcher_test.rb
108
+ - test/cases/validate_length_matcher_test.rb
109
+ - test/cases/validate_presence_matcher_test.rb
110
+ - test/cases/validation_test.rb
111
+ - test/models/user.rb
112
+ - test/test_helper.rb
113
+ homepage: https://github.com/frodsan/minitest-activemodel
114
+ licenses: []
115
+ post_install_message:
116
+ rdoc_options:
117
+ - --charset=UTF-8
118
+ require_paths:
119
+ - lib
120
+ required_ruby_version: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubyforge_project:
134
+ rubygems_version: 1.8.23
135
+ signing_key:
136
+ specification_version: 3
137
+ summary: MiniTest Matchers for ActiveModel::Validations
138
+ test_files:
139
+ - test/cases/validate_acceptance_matcher_test.rb
140
+ - test/cases/validate_confirmation_matcher_test.rb
141
+ - test/cases/validate_format_matcher_test.rb
142
+ - test/cases/validate_length_matcher_test.rb
143
+ - test/cases/validate_presence_matcher_test.rb
144
+ - test/cases/validation_test.rb
145
+ - test/models/user.rb
146
+ - test/test_helper.rb