mongoid-minitest 0.1.5 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +18 -0
- data/.travis.yml +12 -0
- data/CHANGELOG.md +79 -2
- data/Gemfile +3 -0
- data/Gemfile.edge +6 -0
- data/{LICENSE → LICENSE.md} +1 -1
- data/README.md +46 -53
- data/Rakefile +13 -0
- data/lib/matchers/associations/associations.rb +20 -20
- data/lib/matchers/document/be_stored_in.rb +4 -4
- data/lib/matchers/document/document.rb +9 -7
- data/lib/matchers/document/have_field.rb +12 -13
- data/lib/matchers/document/have_index.rb +4 -4
- data/lib/matchers/matcher.rb +1 -3
- data/lib/mongoid-minitest.rb +2 -15
- data/mongoid-minitest.gemspec +28 -0
- data/test/matchers/associations_test.rb +32 -0
- data/test/matchers/document_test.rb +28 -0
- data/test/models/models.rb +48 -0
- data/test/test_helper.rb +15 -0
- metadata +49 -26
- data/lib/matchers/helpers.rb +0 -13
- data/lib/matchers/validations/acceptance.rb +0 -47
- data/lib/matchers/validations/associated.rb +0 -19
- data/lib/matchers/validations/confirmation.rb +0 -9
- data/lib/matchers/validations/exclusion.rb +0 -52
- data/lib/matchers/validations/format.rb +0 -65
- data/lib/matchers/validations/inclusion.rb +0 -52
- data/lib/matchers/validations/length.rb +0 -86
- data/lib/matchers/validations/presence.rb +0 -9
- data/lib/matchers/validations/uniqueness.rb +0 -64
- data/lib/matchers/validations/validations.rb +0 -91
- data/lib/mongoid-minitest/version.rb +0 -5
data/lib/matchers/helpers.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
module Mongoid
|
2
|
-
module Matchers
|
3
|
-
module Validations
|
4
|
-
class ValidateAcceptanceMatcher < HaveValidationMatcher
|
5
|
-
def initialize(field)
|
6
|
-
super(field, :acceptance)
|
7
|
-
end
|
8
|
-
|
9
|
-
def accept_with(value)
|
10
|
-
@accepted = value
|
11
|
-
self
|
12
|
-
end
|
13
|
-
|
14
|
-
def matches?(subject)
|
15
|
-
return false unless @result = super(subject)
|
16
|
-
|
17
|
-
check_accepted_value if @accepted
|
18
|
-
|
19
|
-
@result
|
20
|
-
end
|
21
|
-
|
22
|
-
def description
|
23
|
-
desc = []
|
24
|
-
desc << " accept with #{@accepted.inspect}" if @accepted
|
25
|
-
super << desc.to_sentence
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def check_accepted_value
|
31
|
-
actual = @validator.options[:accept]
|
32
|
-
|
33
|
-
if actual == @accepted
|
34
|
-
@positive_message << " accept with #{actual.inspect}"
|
35
|
-
else
|
36
|
-
@negative_message << " accept with #{actual.inspect}"
|
37
|
-
@result = false
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def validate_acceptance_of(field)
|
43
|
-
ValidateAcceptanceMatcher.new(field)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module Mongoid
|
2
|
-
module Matchers
|
3
|
-
module Validations
|
4
|
-
class ValidateAssociated < HaveValidationMatcher
|
5
|
-
def initialize(association_name)
|
6
|
-
super(association_name, :associated)
|
7
|
-
end
|
8
|
-
|
9
|
-
def description
|
10
|
-
"validate associated #{@field.inspect}"
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def validate_associated(association_name)
|
15
|
-
ValidateAssociated.new(association_name)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
module Mongoid
|
2
|
-
module Matchers
|
3
|
-
module Validations
|
4
|
-
class ValidateExclusionMatcher < HaveValidationMatcher
|
5
|
-
def initialize(field)
|
6
|
-
super(field, :exclusion)
|
7
|
-
end
|
8
|
-
|
9
|
-
def to_not_allow(*values)
|
10
|
-
@not_allowed_values = (values.length > 1) ? values.flatten : values[0]
|
11
|
-
self
|
12
|
-
end
|
13
|
-
|
14
|
-
def matches?(subject)
|
15
|
-
return false unless result = super(subject)
|
16
|
-
|
17
|
-
if Array === @not_allowed_values
|
18
|
-
allowed_values = @not_allowed_values - @validator.options[:in].to_a
|
19
|
-
if allowed_values.empty?
|
20
|
-
@positive_message << ' not allowing all values mentioned'
|
21
|
-
else
|
22
|
-
@negative_message << ' allowing the values:'
|
23
|
-
@negative_message << " #{to_sentence(allowed_values)}"
|
24
|
-
result = false
|
25
|
-
end
|
26
|
-
elsif @not_allowed_values
|
27
|
-
if @not_allowed_values == @validator.options[:in]
|
28
|
-
@positive_message << " not allowing values in #{@not_allowed_values.inspect}"
|
29
|
-
else
|
30
|
-
@negative_message << " not allowing values in #{@validator.options[:in].inspect}"
|
31
|
-
result = false
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
result
|
36
|
-
end
|
37
|
-
|
38
|
-
def description
|
39
|
-
if Array === @not_allowed_values
|
40
|
-
super << " not allowing the values: #{to_sentence(@not_allowed_values)}"
|
41
|
-
elsif @not_allowed_values
|
42
|
-
super << " not allowing the values in #{@not_allowed_values.inspect}"
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def validate_exclusion_of(field)
|
48
|
-
ValidateExclusionMatcher.new(field)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
@@ -1,65 +0,0 @@
|
|
1
|
-
module Mongoid
|
2
|
-
module Matchers
|
3
|
-
module Validations
|
4
|
-
class ValidateFormatMatcher < HaveValidationMatcher
|
5
|
-
def initialize field
|
6
|
-
super field, :format
|
7
|
-
end
|
8
|
-
|
9
|
-
def to_allow valid_value
|
10
|
-
@valid = valid_value
|
11
|
-
self
|
12
|
-
end
|
13
|
-
|
14
|
-
def to_not_allow invalid_value
|
15
|
-
@invalid = invalid_value
|
16
|
-
self
|
17
|
-
end
|
18
|
-
|
19
|
-
def matches? subject
|
20
|
-
return false unless @result = super(subject)
|
21
|
-
|
22
|
-
check_valid_value if @valid
|
23
|
-
check_invalid_value if @invalid
|
24
|
-
|
25
|
-
@result
|
26
|
-
end
|
27
|
-
|
28
|
-
def description
|
29
|
-
desc = []
|
30
|
-
desc << " allowing the value #{@valid.inspect}" if @valid
|
31
|
-
desc << " not allowing the value #{@invalid.inspect}" if @invalid
|
32
|
-
super << desc.to_sentence
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def check_valid_value
|
38
|
-
if format == @valid || format =~ @valid
|
39
|
-
@positive_message << " with #{@valid.inspect} as a valid value"
|
40
|
-
else
|
41
|
-
@negative_message << " with #{@valid.inspect} as an invalid value"
|
42
|
-
@result = false
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def check_invalid_value
|
47
|
-
if format !~ @invalid
|
48
|
-
@positive_message << " with #{@invalid.inspect} as a invalid value"
|
49
|
-
else
|
50
|
-
@negative_message << " with #{@invalid.inspect} as a valid value"
|
51
|
-
@result = false
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def format
|
56
|
-
@validator.options[:with]
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def validate_format_of field
|
61
|
-
ValidateFormatMatcher.new field
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
module Mongoid
|
2
|
-
module Matchers
|
3
|
-
module Validations
|
4
|
-
class ValidateInclusionMatcher < HaveValidationMatcher
|
5
|
-
def initialize(field)
|
6
|
-
super(field, :inclusion)
|
7
|
-
end
|
8
|
-
|
9
|
-
def to_allow(*values)
|
10
|
-
@allowed_values = (values.length > 1) ? values.flatten : values[0]
|
11
|
-
self
|
12
|
-
end
|
13
|
-
|
14
|
-
def matches?(subject)
|
15
|
-
return false unless result = super(subject)
|
16
|
-
|
17
|
-
if Array === @allowed_values
|
18
|
-
not_allowed_values = @allowed_values - @validator.options[:in].to_a
|
19
|
-
if not_allowed_values.empty?
|
20
|
-
@positive_message << ' allowing all values mentioned'
|
21
|
-
else
|
22
|
-
@negative_message << ' not allowing the following the values:'
|
23
|
-
@negative_message << " #{not_allowed_values.inspect}"
|
24
|
-
result = false
|
25
|
-
end
|
26
|
-
elsif @allowed_values
|
27
|
-
if @allowed_values == @validator.options[:in]
|
28
|
-
@positive_message << " allowing values in #{@allowed_values.inspect}"
|
29
|
-
else
|
30
|
-
@negative_message << " allowing values in #{@validator.options[:in].inspect}"
|
31
|
-
result = false
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
result
|
36
|
-
end
|
37
|
-
|
38
|
-
def description
|
39
|
-
if Array === @allowed_values
|
40
|
-
super << " allowing the values: #{to_sentence(@allowed_values)}"
|
41
|
-
elsif @allowed_values
|
42
|
-
super << " allowing the values in #{@allowed_values.inspect}"
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def validate_inclusion_of(field)
|
48
|
-
ValidateInclusionMatcher.new(field)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
@@ -1,86 +0,0 @@
|
|
1
|
-
module Mongoid
|
2
|
-
module Matchers
|
3
|
-
module Validations
|
4
|
-
class ValidateLengthMatcher < HaveValidationMatcher
|
5
|
-
def initialize(field)
|
6
|
-
super(field, :length)
|
7
|
-
end
|
8
|
-
|
9
|
-
def with_minimum(value)
|
10
|
-
@minimum = value
|
11
|
-
self
|
12
|
-
end
|
13
|
-
alias :with_min :with_minimum
|
14
|
-
|
15
|
-
def with_maximum(value)
|
16
|
-
@maximum = value
|
17
|
-
self
|
18
|
-
end
|
19
|
-
alias :with_max :with_maximum
|
20
|
-
|
21
|
-
def within(value)
|
22
|
-
@within = value
|
23
|
-
self
|
24
|
-
end
|
25
|
-
alias :in :within
|
26
|
-
|
27
|
-
def matches?(subject)
|
28
|
-
return false unless @result = super(subject)
|
29
|
-
|
30
|
-
check_minimum if @minimum
|
31
|
-
check_maximum if @maximum
|
32
|
-
check_range if @within
|
33
|
-
|
34
|
-
@result
|
35
|
-
end
|
36
|
-
|
37
|
-
def description
|
38
|
-
desc = []
|
39
|
-
desc << " with minimum #{@minimum}" if @minimum
|
40
|
-
desc << " with maximum #{@maximum}" if @maximum
|
41
|
-
desc << " within range #{@within}" if @within
|
42
|
-
super << desc.to_sentence
|
43
|
-
end
|
44
|
-
|
45
|
-
private
|
46
|
-
|
47
|
-
def check_minimum
|
48
|
-
actual = @validator.options[:minimum]
|
49
|
-
if actual == @minimum
|
50
|
-
@positive_message << " with minimum of #{actual}"
|
51
|
-
else
|
52
|
-
@negative_message << " with minimum of #{actual}"
|
53
|
-
@result = false
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def check_maximum
|
58
|
-
actual = @validator.options[:maximum]
|
59
|
-
if actual == @maximum
|
60
|
-
@positive_message << " with maximum of #{actual}"
|
61
|
-
else
|
62
|
-
@negative_message << " with maximum of #{actual}"
|
63
|
-
@result = false
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def check_range
|
68
|
-
min, max = [@within.min, @within.max]
|
69
|
-
actual_min = @validator.options[:minimum]
|
70
|
-
actual_max = @validator.options[:maximum]
|
71
|
-
|
72
|
-
if actual_min == min && actual_max == max
|
73
|
-
@positive_message << " with range #{@within}"
|
74
|
-
else
|
75
|
-
@negative_message << " with range #{actual_min..actual_max}"
|
76
|
-
@result = false
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
def validate_length_of(field)
|
82
|
-
ValidateLengthMatcher.new(field)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
module Mongoid
|
2
|
-
module Matchers
|
3
|
-
module Validations
|
4
|
-
class ValidateUniquenessMatcher < HaveValidationMatcher
|
5
|
-
def initialize(field)
|
6
|
-
super(field, :uniqueness)
|
7
|
-
end
|
8
|
-
|
9
|
-
def case_insensitive
|
10
|
-
@case_insensitive = true
|
11
|
-
self
|
12
|
-
end
|
13
|
-
|
14
|
-
def scoped_to(*scope)
|
15
|
-
@scope = [scope].flatten.map(&:to_s)
|
16
|
-
self
|
17
|
-
end
|
18
|
-
|
19
|
-
def matches?(subject)
|
20
|
-
return false unless @result = super(subject)
|
21
|
-
|
22
|
-
check_scope if @scope
|
23
|
-
check_case_sensivity if @case_insensitive
|
24
|
-
|
25
|
-
@result
|
26
|
-
end
|
27
|
-
|
28
|
-
def description
|
29
|
-
desc = []
|
30
|
-
desc << " scoped to #{to_sentence(@scope)}" if @scope
|
31
|
-
desc << ' allowing case insensitive values' if @case_insensitive
|
32
|
-
super << desc.to_sentence
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def check_scope
|
38
|
-
actual_scope = [@validator.options[:scope]].flatten.map(&:to_s)
|
39
|
-
message = " scoped to #{to_sentence(actual_scope)}"
|
40
|
-
|
41
|
-
if actual_scope == @scope
|
42
|
-
@positive_message << message
|
43
|
-
else
|
44
|
-
@negative_message << message
|
45
|
-
@result = false
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def check_case_sensivity
|
50
|
-
if @validator.options[:case_sensitive] == false
|
51
|
-
@positive_message << ' with case insensitive values'
|
52
|
-
else
|
53
|
-
@negative_message << ' without case insensitive values'
|
54
|
-
@result = false
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def validate_uniqueness_of(field)
|
60
|
-
ValidateUniquenessMatcher.new(field)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
@@ -1,91 +0,0 @@
|
|
1
|
-
module Mongoid
|
2
|
-
module Matchers
|
3
|
-
module Validations
|
4
|
-
class HaveValidationMatcher < Matcher
|
5
|
-
def initialize(field, validation_type)
|
6
|
-
@field = field.to_s
|
7
|
-
@type = validation_type.to_s
|
8
|
-
end
|
9
|
-
|
10
|
-
def with_message(expected_message)
|
11
|
-
@expected_message = expected_message
|
12
|
-
self
|
13
|
-
end
|
14
|
-
|
15
|
-
def on(*contexts)
|
16
|
-
@expected_on = clean_contexts(contexts)
|
17
|
-
self
|
18
|
-
end
|
19
|
-
|
20
|
-
def matches?(subject)
|
21
|
-
@klass = class_of(subject)
|
22
|
-
@validator = detect_validator
|
23
|
-
@result = true
|
24
|
-
|
25
|
-
check_validator
|
26
|
-
check_message if @expected_message
|
27
|
-
check_on if @expected_on
|
28
|
-
|
29
|
-
@result
|
30
|
-
end
|
31
|
-
|
32
|
-
def failure_message
|
33
|
-
"#{@klass} to #{description}; instead got #{@negative_message}"
|
34
|
-
end
|
35
|
-
|
36
|
-
def negative_failure_message
|
37
|
-
"#{@klass} to not #{description}; instead got #{@positive_message}"
|
38
|
-
end
|
39
|
-
|
40
|
-
def description
|
41
|
-
desc = "validate #{@type.inspect} of #{@field.inspect}"
|
42
|
-
desc << " with message: #{@expected_message.inspect}" if @expected_message
|
43
|
-
desc << " on #{@expected_on.empty? ? 'all actions' : to_sentence(@expected_on)}" if @expected_on
|
44
|
-
|
45
|
-
desc
|
46
|
-
end
|
47
|
-
|
48
|
-
private
|
49
|
-
|
50
|
-
# Make sure contexts is always an array + normalize AR 2.x and AR 3.x differences
|
51
|
-
def clean_contexts(contexts)
|
52
|
-
[contexts].flatten.reject{|ctx| ctx == :save}.compact
|
53
|
-
end
|
54
|
-
|
55
|
-
def check_validator
|
56
|
-
if @validator
|
57
|
-
@negative_message = "#{@type.inspect} validator for #{@field.inspect}"
|
58
|
-
@positive_message = "#{@type.inspect} validator for #{@field.inspect}"
|
59
|
-
else
|
60
|
-
@negative_message = "no #{@type.inspect} validator for #{@field.inspect}"
|
61
|
-
@result = false
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def check_message
|
66
|
-
error_message = @validator.options[:message]
|
67
|
-
if @expected_message == error_message
|
68
|
-
@positive_message << " with message: #{error_message.inspect}"
|
69
|
-
else
|
70
|
-
@negative_message << " with message: #{error_message.inspect}"
|
71
|
-
@result = false
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def check_on
|
76
|
-
on = clean_contexts(@validator.options[:on])
|
77
|
-
if on.sort == @expected_on.sort
|
78
|
-
@positive_message << " on #{on.empty? ? 'all actions' : to_sentence(on)}"
|
79
|
-
else
|
80
|
-
@negative_message << " on #{on.empty? ? 'all actions' : to_sentence(on)}"
|
81
|
-
@result = false
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def detect_validator
|
86
|
-
@klass.validators_on(@field).detect { |v| v.kind.to_s == @type }
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|