shoulda_matchmakers 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/controller/action_controller/action_controller_controller_sm_model_helper.rb +0 -7
- data/lib/controller/action_controller/matchmakers/permit.rb +14 -14
- data/lib/controller/action_controller/matchmakers/route.rb +0 -383
- data/lib/model/active_record/matchmakers/have_db_index.rb +1 -1
- data/lib/model/active_record/matchmakers/validations.rb +0 -14
- data/lib/shoulda_matchmakers/version.rb +1 -1
- data/lib/support/controller_generator.rb +2 -54
- data/lib/templates/shoulda_matchmakers.rb +2 -2
- metadata +1 -25
- data/lib/support/indefinite_article.rb +0 -70
- data/lib/support/to_discard/belong_to.rb +0 -94
- data/lib/support/to_discard/have_and_belong_to_many.rb +0 -83
- data/lib/support/to_discard/have_many.rb +0 -96
- data/lib/support/to_discard/have_one.rb +0 -98
- data/lib/support/to_discard/permit_refactor.rb +0 -270
- data/lib/support/to_discard/render_template_new.rb +0 -204
- data/lib/support/to_discard/render_template_reconstruction.rb +0 -188
- data/lib/support/to_discard/use_around_action.rb +0 -20
- data/lib/support/to_discard/use_before_action.rb +0 -20
- data/lib/support/to_discard/validate_absence_of.rb +0 -16
- data/lib/support/to_discard/validate_acceptance_of.rb +0 -16
- data/lib/support/to_discard/validate_confirmation_of.rb +0 -16
- data/lib/support/to_discard/validate_exclusion_of.rb +0 -145
- data/lib/support/to_discard/validate_inclusion_of.rb +0 -94
- data/lib/support/to_discard/validate_length_of.rb +0 -16
- data/lib/support/to_discard/validate_numericality_of.rb +0 -16
- data/lib/support/to_discard/validate_presence_of.rb +0 -16
- data/lib/support/to_discard/validate_uniqueness_of.rb +0 -16
- data/lib/support/to_discard/validation_old.rb +0 -37
- data/lib/support/to_discard/validations.rb +0 -41
- data/lib/support/to_discard/validations_conditional.rb +0 -146
- data/lib/support/trace_debug_lines.txt +0 -319
- data/lib/support/util.rb +0 -15
@@ -1,188 +0,0 @@
|
|
1
|
-
module ShouldaMatchmakers
|
2
|
-
module Controller
|
3
|
-
module ActionController
|
4
|
-
module Matchmaker
|
5
|
-
module RenderTemplate
|
6
|
-
|
7
|
-
def render_template_matcher_tests
|
8
|
-
render_template_occurrences = get_render_template_occurrences(@action_controller_controller_sm_model)
|
9
|
-
if render_template_occurrences.present?
|
10
|
-
generate_render_template_matcher_tests(render_template_occurrences)
|
11
|
-
else
|
12
|
-
[]
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
def generate_render_template_matcher_tests(render_template_occurrences)
|
20
|
-
render_template_tests = []
|
21
|
-
render_template_occurrences.sort_by!{ |render_template| [render_template[:view_action], render_template[:view_action_http_method]] }
|
22
|
-
render_template_occurrences.each do |render_template|
|
23
|
-
render_template_test = " describe '#{ render_template[:view_action_http_method] } ##{ render_template[:view_action] }' do\n"
|
24
|
-
render_template_test.concat(" before { #{ render_template[:view_action_http_method].downcase } :#{ render_template[:view_action] } }\n\n")
|
25
|
-
render_template_test.concat(" it { is_expected.to render_template('#{ render_template[:view_action] }') }\n")
|
26
|
-
render_template[:view_action_render_occurrences].sort_by!{ |render_occurrence| [render_occurrence[:render_view_type], render_occurrence[:render_view]] }
|
27
|
-
render_template[:view_action_render_occurrences].each do |render_occurrence|
|
28
|
-
if render_occurrence[:render_view_type] == "partial" && render_occurrence[:render_view].include?("/") ||
|
29
|
-
render_occurrence[:render_view_type] == "file"
|
30
|
-
render_template_test.concat(" it { is_expected.to render_template(#{ render_occurrence[:render_view_type] }: '")
|
31
|
-
elsif render_occurrence[:render_view_type] == "partial"
|
32
|
-
render_template_test.concat(" it { is_expected.to render_template(#{ render_occurrence[:render_view_type] }: '_")
|
33
|
-
elsif render_occurrence[:render_view_type] == "unknown"
|
34
|
-
render_template_test.concat(" # Unknown view type. Remove 'x' from 'xit' once view type identified (e.g. 'partial:', 'file:', etc.)\n")
|
35
|
-
render_template_test.concat(" xit { is_expected.to render_template('")
|
36
|
-
else
|
37
|
-
render_template_test.concat(" it { is_expected.to render_template('")
|
38
|
-
end
|
39
|
-
render_template_test.concat("#{ render_occurrence[:render_view] }') }\n")
|
40
|
-
end
|
41
|
-
render_template_test.concat(" end")
|
42
|
-
render_template_tests << render_template_test
|
43
|
-
end
|
44
|
-
render_template_tests = properly_line_space_tests(render_template_tests)
|
45
|
-
render_template_tests.flatten.compact.uniq.join("\n")
|
46
|
-
end
|
47
|
-
|
48
|
-
|
49
|
-
def get_render_template_occurrences(controller)
|
50
|
-
render_template_occurrences = []
|
51
|
-
app_views_path = Rails.root.join("app", "views").to_s + "/"
|
52
|
-
controller_views_path = app_views_path + controller.underscore.sub(/_controller$/, "/")
|
53
|
-
%w(erb haml slim).each do |view_file_format|
|
54
|
-
render_template_occurrences = render_template_occurrences + get_render_template_occurrences_by_file_type(app_views_path, controller_views_path, view_file_format)
|
55
|
-
end
|
56
|
-
render_template_occurrences
|
57
|
-
end
|
58
|
-
|
59
|
-
def get_render_template_occurrences_by_file_type(app_views_path, controller_views_path, view_file_format)
|
60
|
-
render_template_occurrences_by_file_type = []
|
61
|
-
Dir.glob(controller_views_path + "**/*.html." + view_file_format) do |view_file_path|
|
62
|
-
view_action_render_occurrences = []
|
63
|
-
File.open(view_file_path, 'r') do |view_file|
|
64
|
-
view_file.each_line do |line|
|
65
|
-
if line =~ /(?:\s+render|=render)(?:\s+action:\s+|\s+:action\s+=\>\s+|\s+file:\s+|\s+:file\s+=\>\s+|\s+partial:\s+|\s+:partial\s+=\>\s+|\s+template:\s+|\s+:template\s+=\>\s+|\s+)["':][A-Za-z0-9_\/\.]+"*'*\s*$/
|
66
|
-
render_view_type, render_view_path = line.match(/(?:\s+render|=render)(\s+action:\s+|\s+:action\s+=\>\s+|\s+file:\s+|\s+:file\s+=\>\s+|\s+partial:\s+|\s+:partial\s+=\>\s+|\s+template:\s+|\s+:template\s+=\>\s+|\s+)["':]([A-Za-z0-9_\/\.]+)/).captures
|
67
|
-
if render_view_type.present?
|
68
|
-
render_view_type = render_view_type.gsub(/\s+/,"").gsub(":", "").gsub("=>","")
|
69
|
-
else
|
70
|
-
render_view_type = get_render_view_type(app_views_path, view_file_path, render_view_path)
|
71
|
-
end
|
72
|
-
view_action_render_occurrence = { render_view_type: render_view_type, render_view: render_view_path }
|
73
|
-
view_action_render_occurrences << view_action_render_occurrence
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
if view_action_render_occurrences.present?
|
78
|
-
view_action = get_view_from_path(view_file_path).sub(".html." + view_file_format, "")
|
79
|
-
if render_template_containing_method_is_action(controller, view_action)
|
80
|
-
route_controller = controller.underscore.sub(/_controller$/, "")
|
81
|
-
view_action_route = Rails.application.routes.set.select { |route| route.defaults[:controller] == route_controller && route.defaults[:action] == view_action }
|
82
|
-
view_action_http_method = view_action_route.first.constraints[:request_method].to_s.gsub("(?-mix:^","").gsub("$)","")
|
83
|
-
render_template_occurrence = { view_action: view_action, view_action_http_method: view_action_http_method, view_action_render_occurrences: view_action_render_occurrences }
|
84
|
-
render_template_occurrences_by_file_type << render_template_occurrence
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
render_template_occurrences_by_file_type
|
89
|
-
end
|
90
|
-
|
91
|
-
def get_render_view_type(app_views_path, view_file_path, render_view_path)
|
92
|
-
render_view_and_directory = get_internal_render_view_and_directory(app_views_path, view_file_path, render_view_path)
|
93
|
-
render_view_type = identify_internal_render_view_type(render_view_and_directory, app_views_path)
|
94
|
-
if render_view_type == "unknown" && render_view_path.include?("/")
|
95
|
-
render_view_and_directory = get_external_render_view_and_directory(render_view_path)
|
96
|
-
render_view_type = identify_external_render_view_type(render_view_and_directory)
|
97
|
-
end
|
98
|
-
render_view_type
|
99
|
-
end
|
100
|
-
|
101
|
-
def get_internal_render_view_and_directory(app_views_path, view_file_path, render_view_path)
|
102
|
-
if render_view_path.include?("/")
|
103
|
-
render_view_directory = get_view_directory_prepended(render_view_path,app_views_path)
|
104
|
-
render_view = get_view_from_path(render_view_path).sub(/^\s*_/,"")
|
105
|
-
else
|
106
|
-
render_view_directory = get_view_directory_from_path(view_file_path)
|
107
|
-
render_view = render_view_path.sub(/^\s*_/,"")
|
108
|
-
end
|
109
|
-
{ directory: render_view_directory, view: render_view }
|
110
|
-
end
|
111
|
-
|
112
|
-
|
113
|
-
def get_external_render_view_and_directory(render_view_path)
|
114
|
-
render_view_directory = get_view_directory_from_path(render_view_path)
|
115
|
-
render_view = get_view_from_path(render_view_path)
|
116
|
-
{ directory: render_view_directory, view: render_view }
|
117
|
-
end
|
118
|
-
|
119
|
-
|
120
|
-
def get_view_from_path(view_path)
|
121
|
-
view_path.scan(/\/([a-zA-z0-9.]+)$/).last.first
|
122
|
-
end
|
123
|
-
|
124
|
-
|
125
|
-
def get_view_directory_from_path(view_path)
|
126
|
-
view_path.sub(/\/[a-zA-z0-9.]+$/,"/")
|
127
|
-
end
|
128
|
-
|
129
|
-
|
130
|
-
def get_view_directory_prepended(view_path, prepend_path)
|
131
|
-
view_path.sub(/\/[a-zA-z0-9.]+$/,"/").prepend(prepend_path)
|
132
|
-
end
|
133
|
-
|
134
|
-
|
135
|
-
def identify_internal_render_view_type(render_view_and_directory, app_views_path)
|
136
|
-
render_view_type = "unknown"
|
137
|
-
if view_partial_exist(render_view_and_directory)
|
138
|
-
render_view_type = "partial"
|
139
|
-
elsif view_exist(render_view_and_directory)
|
140
|
-
render_view_controller_name = get_controller_name_from_view_directory_path(render_view_and_directory[:directory], app_views_path)
|
141
|
-
if render_view_controller_name.present? && render_template_containing_method_is_action(render_view_controller_name, render_view_and_directory[:view])
|
142
|
-
render_view_type = "action"
|
143
|
-
else
|
144
|
-
render_view_type = "template"
|
145
|
-
end
|
146
|
-
end
|
147
|
-
render_view_type
|
148
|
-
end
|
149
|
-
|
150
|
-
|
151
|
-
def identify_external_render_view_type(render_view_and_directory)
|
152
|
-
render_view_type = "unknown"
|
153
|
-
if view_partial_exist(render_view_and_directory) || view_exist(render_view_and_directory)
|
154
|
-
render_view_type = "file"
|
155
|
-
end
|
156
|
-
render_view_type
|
157
|
-
end
|
158
|
-
|
159
|
-
|
160
|
-
def view_exist(render_view_and_directory)
|
161
|
-
File.exist?(render_view_and_directory[:directory] + render_view_and_directory[:view] + ".html.erb") ||
|
162
|
-
File.exist?(render_view_and_directory[:directory] + render_view_and_directory[:view] + ".html.haml") ||
|
163
|
-
File.exist?(render_view_and_directory[:directory] + render_view_and_directory[:view] + ".html.slim")
|
164
|
-
end
|
165
|
-
|
166
|
-
|
167
|
-
def view_partial_exist(render_view_and_directory)
|
168
|
-
File.exist?(render_view_and_directory[:directory] + "_" + render_view_and_directory[:view] + ".html.erb") ||
|
169
|
-
File.exist?(render_view_and_directory[:directory] + "_" + render_view_and_directory[:view] + ".html.haml") ||
|
170
|
-
File.exist?(render_view_and_directory[:directory] + "_" + render_view_and_directory[:view] + ".html.slim")
|
171
|
-
end
|
172
|
-
|
173
|
-
|
174
|
-
def get_controller_name_from_view_directory_path(view_directory_path, app_views_path)
|
175
|
-
view_directory_path.sub(app_views_path, "").sub(/\/$/,"").concat("_controller").camelize
|
176
|
-
end
|
177
|
-
|
178
|
-
|
179
|
-
def render_template_containing_method_is_action(controller, action_candidate)
|
180
|
-
controller.constantize.instance_methods(false).include?(action_candidate.to_sym)
|
181
|
-
end
|
182
|
-
|
183
|
-
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module ShouldaMatchmakers
|
2
|
-
module Controller
|
3
|
-
module ActionController
|
4
|
-
module ActionControllerMatcher
|
5
|
-
module UseAroundAction
|
6
|
-
|
7
|
-
def use_around_action_matcher_tests
|
8
|
-
around_action_tests = []
|
9
|
-
around_actions.map do |action|
|
10
|
-
around_action_test = " it { is_expected.to use_around_action(#{ action }) }"
|
11
|
-
around_action_tests << [around_action_test]
|
12
|
-
end
|
13
|
-
around_action_tests.flatten.compact.uniq.join("\n")
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module ShouldaMatchmakers
|
2
|
-
module Controller
|
3
|
-
module ActionController
|
4
|
-
module ActionControllerMatcher
|
5
|
-
module UseBeforeAction
|
6
|
-
|
7
|
-
def use_before_action_matcher_tests
|
8
|
-
before_action_tests = []
|
9
|
-
before_actions.map do |action|
|
10
|
-
before_action_test = " it { is_expected.to use_before_action(#{ action }) }"
|
11
|
-
before_action_tests << [before_action_test]
|
12
|
-
end
|
13
|
-
before_action_tests.flatten.compact.uniq.join("\n")
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module ShouldaMatchmakers
|
2
|
-
module Model
|
3
|
-
module ActiveRecord
|
4
|
-
module ActiveModelMatcher
|
5
|
-
module ValidateAbsenceOf
|
6
|
-
|
7
|
-
def validate_absence_of_matcher_tests
|
8
|
-
absence_validators = extract_validators(@active_record_model_sm_model, ::ActiveModel::Validations::AbsenceValidator).flatten
|
9
|
-
generate_validator_matcher_tests(absence_validators)
|
10
|
-
end
|
11
|
-
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module ShouldaMatchmakers
|
2
|
-
module Model
|
3
|
-
module ActiveRecord
|
4
|
-
module ActiveModelMatcher
|
5
|
-
module ValidateAcceptanceOf
|
6
|
-
|
7
|
-
def validate_acceptance_of_matcher_tests
|
8
|
-
acceptance_validators = extract_validators(@active_record_model_sm_model, ::ActiveModel::Validations::AcceptanceValidator).flatten
|
9
|
-
generate_validator_matcher_tests(acceptance_validators)
|
10
|
-
end
|
11
|
-
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module ShouldaMatchmakers
|
2
|
-
module Model
|
3
|
-
module ActiveRecord
|
4
|
-
module ActiveModelMatcher
|
5
|
-
module ValidateConfirmationOf
|
6
|
-
|
7
|
-
def validate_confirmation_of_matcher_tests
|
8
|
-
confirmation_validators = extract_validators(@active_record_model_sm_model, ::ActiveModel::Validations::ConfirmationValidator).flatten
|
9
|
-
generate_validator_matcher_tests(confirmation_validators)
|
10
|
-
end
|
11
|
-
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,145 +0,0 @@
|
|
1
|
-
module ShouldaMatchmakers
|
2
|
-
module Model
|
3
|
-
module ActiveRecord
|
4
|
-
module Matchmaker
|
5
|
-
module ValidateExclusionOf
|
6
|
-
|
7
|
-
|
8
|
-
def validate_exclusion_of_matcher_tests
|
9
|
-
exclusion_validators = extract_validators(@active_record_model_sm_model, ::ActiveModel::Validations::ExclusionValidator).flatten
|
10
|
-
if exclusion_validators.present?
|
11
|
-
generate_exclusion_validator_matcher_tests(exclusion_validators)
|
12
|
-
else
|
13
|
-
[]
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
def generate_exclusion_validator_matcher_tests(exclusion_validators)
|
21
|
-
exclusion_tests = []
|
22
|
-
exclusion_validators.map do |exclusion_validator|
|
23
|
-
if conditional_options_exist(exclusion_validator.options)
|
24
|
-
exclusion_tests = exclusion_tests + generate_exclusion_conditional_tests(exclusion_validator)
|
25
|
-
else
|
26
|
-
exclusion_tests << generate_exclusion_test(exclusion_validator, exclusion_validator.options)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
exclusion_tests = properly_line_space_tests(exclusion_tests)
|
30
|
-
exclusion_tests.flatten.compact.uniq.join("\n")
|
31
|
-
end
|
32
|
-
|
33
|
-
def generate_exclusion_test(exclusion_validator, exclusion_options)
|
34
|
-
exclusion_test = get_exclusion_test_core(exclusion_options, exclusion_validator.attributes[0])
|
35
|
-
exclusion_options_string = get_options_string(exclusion_options)
|
36
|
-
exclusion_options_string = exclusion_options_string.gsub(".", ".\n ")
|
37
|
-
exclusion_test.concat(exclusion_options_string + "\n end")
|
38
|
-
exclusion_test
|
39
|
-
end
|
40
|
-
|
41
|
-
def generate_exclusion_conditional_tests(exclusion_validator)
|
42
|
-
exclusion_conditional_tests = []
|
43
|
-
exclusion_options = parse_validator_options(exclusion_validator.options.dup)
|
44
|
-
if all_option_values_are_symbols(exclusion_options[:if_option_values]) &&
|
45
|
-
all_option_values_are_symbols(exclusion_options[:unless_option_values])
|
46
|
-
exclusion_conditional_tests << generate_exclusion_validating_test(exclusion_validator, exclusion_options[:non_conditional_options])
|
47
|
-
exclusion_conditional_tests = exclusion_conditional_tests + generate_exclusion_non_validating_tests(exclusion_validator, exclusion_options[:non_conditional_options])
|
48
|
-
# else
|
49
|
-
# Skip tests due to non-symbol conditions (see below)
|
50
|
-
end
|
51
|
-
exclusion_conditional_tests
|
52
|
-
end
|
53
|
-
|
54
|
-
def generate_exclusion_validating_test(exclusion_validator, exclusion_options)
|
55
|
-
exclusion_validating_test = compose_conditional_validating_context_string(exclusion_options)
|
56
|
-
validating_permutation = get_validating_true_false_permutation(exclusion_options)
|
57
|
-
exclusion_validating_test.concat(compose_conditional_before_strings(exclusion_options, validating_permutation))
|
58
|
-
validating_test = generate_exclusion_test(exclusion_validator, exclusion_options[:non_conditional_options])
|
59
|
-
validating_test = adjust_conditional_test_indentation(validating_test)
|
60
|
-
exclusion_validating_test.concat(validating_test + "\n end")
|
61
|
-
end
|
62
|
-
|
63
|
-
def generate_exclusion_non_validating_tests(exclusion_validator, exclusion_options)
|
64
|
-
exclusion_non_validating_tests = []
|
65
|
-
possible_conditional_permutations = get_possible_true_false_permutations(exclusion_options)
|
66
|
-
validating_permutation = get_validating_true_false_permutation(exclusion_options)
|
67
|
-
non_validating_permutations = possible_conditional_permutations - [validating_permutation]
|
68
|
-
non_validating_permutations.each do |non_validating_permutation|
|
69
|
-
exclusion_non_validating_test = generate_exclusion_non_validating_test(exclusion_validator, exclusion_options, non_validating_permutation)
|
70
|
-
exclusion_non_validating_tests << exclusion_non_validating_test
|
71
|
-
end
|
72
|
-
exclusion_non_validating_tests[0] = exclusion_non_validating_tests[0].prepend("#\n# For more natural readability of 'is_expected.not_to' context lines, 'unless' is represented by 'if not'\n# and 'unless not' is represented by 'if'.\n#\n")
|
73
|
-
exclusion_non_validating_tests
|
74
|
-
end
|
75
|
-
|
76
|
-
def generate_exclusion_non_validating_test(exclusion_validator, exclusion_options, non_validating_permutation)
|
77
|
-
exclusion_non_validating_test = compose_conditional_non_validating_context_string(exclusion_options, non_validating_permutation)
|
78
|
-
exclusion_non_validating_test.concat(compose_conditional_before_strings(exclusion_options, non_validating_permutation))
|
79
|
-
non_validating_test = generate_exclusion_test(exclusion_validator, exclusion_options[:non_conditional_options])
|
80
|
-
non_validating_test.sub!("is_expected.to","is_expected.not_to")
|
81
|
-
non_validating_test = adjust_conditional_test_indentation(non_validating_test)
|
82
|
-
exclusion_non_validating_test.concat(non_validating_test)
|
83
|
-
exclusion_non_validating_test.concat("\n end")
|
84
|
-
end
|
85
|
-
|
86
|
-
def get_exclusion_test_core(validator_options, validator_attribute)
|
87
|
-
exclusion_enumerable = validator_options[:in] || validator_options[:within]
|
88
|
-
if exclusion_enumerable.is_a?(Array)
|
89
|
-
" it do\n is_expected.to validate_exclusion_of(:#{ validator_attribute }).\n in_array(#{ exclusion_enumerable })"
|
90
|
-
elsif exclusion_enumerable.is_a?(Range)
|
91
|
-
" it do\n is_expected.to validate_exclusion_of(:#{ validator_attribute }).\n in_range(#{ exclusion_enumerable })"
|
92
|
-
elsif exclusion_enumerable.lambda?
|
93
|
-
" #\n # Note: Your 'in:/within:' configuration option value is a 'Lambda'\n" +
|
94
|
-
" # You will need to implement a customized test.\n" +
|
95
|
-
" it do\n skip(\"Remove this skip line once test customization has been implemented.\")\n is_expected.to validate_exclusion_of(:#{ validator_attribute })"
|
96
|
-
# CONFIRMATION TODO: Confirm whether or not exclusion_enumerable could be a 'Proc' that isn't a 'lambda'
|
97
|
-
elsif exclusion_enumerable.respond_to?(:call)
|
98
|
-
" #\n # Note: Your 'in:/within:' configuration option value is a 'Proc'\n" +
|
99
|
-
" # You will need to implement a customized test.\n" +
|
100
|
-
" it do\n skip(\"Remove this skip line once test customization has been implemented.\")\n is_expected.to validate_exclusion_of(:#{ validator_attribute })"
|
101
|
-
else
|
102
|
-
" #\n # Alert: Invalid 'in:/within:' enumerable object type: '#{ exclusion_enumerable.class.to_s }'\n" +
|
103
|
-
" # Valid exclusion 'in:/within:' enumerable object types: 'Array', 'Range'\n" +
|
104
|
-
" # (or a proc, lambda or symbol which returns an enumerable)\n" +
|
105
|
-
" it do\n skip(\"Remove this skip line once valid enumerable object type is provided.\")\n is_expected.to validate_exclusion_of(:#{ validator_attribute })"
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
|
110
|
-
# def get_exclusion_test_options(options)
|
111
|
-
# exclusion_test_options = ""
|
112
|
-
# options.map do |option, option_value|
|
113
|
-
# exclusion_test_option = get_exclusion_test_option(option, option_value)
|
114
|
-
# exclusion_test_options.concat(".\n " + exclusion_test_option) if exclusion_test_option.present?
|
115
|
-
# end
|
116
|
-
# exclusion_test_options
|
117
|
-
# end
|
118
|
-
#
|
119
|
-
# def get_exclusion_test_option(option, option_value)
|
120
|
-
# case option
|
121
|
-
# # IMPLEMENTATION TODO: Determine if 'allow_blank' is a valid option
|
122
|
-
# # when :allow_blank
|
123
|
-
# # "allow_blank"
|
124
|
-
# # IMPLEMENTATION TODO: Determine if 'allow_nil' is a valid option
|
125
|
-
# # when :allow_nil
|
126
|
-
# # "allow_nil"
|
127
|
-
# when :message
|
128
|
-
# if option_value.include? '"'
|
129
|
-
# "with_message('#{ option_value }')"
|
130
|
-
# else
|
131
|
-
# "with_message(\"#{ option_value }\")"
|
132
|
-
# end
|
133
|
-
# when :on
|
134
|
-
# "on(:#{ option_value })"
|
135
|
-
# else
|
136
|
-
# # IMPLEMENTATION TODO: Possibly handle as an error or modify evaluation of option
|
137
|
-
# ""
|
138
|
-
# end
|
139
|
-
# end
|
140
|
-
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
@@ -1,94 +0,0 @@
|
|
1
|
-
module ShouldaMatchmakers
|
2
|
-
module Model
|
3
|
-
module ActiveRecord
|
4
|
-
module Matchmaker
|
5
|
-
module ValidateInclusionOf
|
6
|
-
|
7
|
-
|
8
|
-
def validate_inclusion_of_matcher_tests
|
9
|
-
inclusion_tests = []
|
10
|
-
extract_validators(@active_record_model_sm_model, ::ActiveModel::Validations::InclusionValidator).flatten.map do |validator|
|
11
|
-
validator_options = validator.options.dup
|
12
|
-
validator_if_option = validator_options.delete(:if)
|
13
|
-
validator_unless_option = validator_options.delete(:unless)
|
14
|
-
validator.attributes.map do |attribute|
|
15
|
-
inclusion_tests << generate_inclusion_test_multiple_lines(validator_options, attribute)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
inclusion_tests.flatten.compact.uniq.join("\n\n")
|
19
|
-
end
|
20
|
-
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def generate_inclusion_test_multiple_lines(validator_options, attribute)
|
25
|
-
inclusion_test = get_inclusion_test_core(validator_options, attribute)
|
26
|
-
inclusion_test_options = get_inclusion_test_options(validator_options)
|
27
|
-
inclusion_test.concat(inclusion_test_options) if inclusion_test_options.present?
|
28
|
-
inclusion_test.concat("\n end")
|
29
|
-
[inclusion_test]
|
30
|
-
end
|
31
|
-
|
32
|
-
|
33
|
-
def get_inclusion_test_core(validator_options, attribute)
|
34
|
-
inclusion_enumerable = validator_options[:in] || validator_options[:within]
|
35
|
-
if inclusion_enumerable.is_a?(Array)
|
36
|
-
" it do\n is_expected.to validate_inclusion_of(:#{ attribute }).\n in_array(#{ inclusion_enumerable })"
|
37
|
-
elsif inclusion_enumerable.is_a?(Range)
|
38
|
-
" it do\n is_expected.to validate_inclusion_of(:#{ attribute }).\n in_range(#{ inclusion_enumerable })"
|
39
|
-
elsif inclusion_enumerable.lambda?
|
40
|
-
" #\n # Note: Your 'in:/within:' configuration option value is a 'Lambda'\n" +
|
41
|
-
" # You will need to implement a customized test.\n" +
|
42
|
-
" it do\n skip(\"Remove this skip line once test customization has been implemented.\")\n is_expected.to validate_inclusion_of(:#{ attribute })"
|
43
|
-
# CONFIRMATION TODO: Confirm whether or not inclusion_enumerable could be a 'Proc' that isn't a 'lambda'
|
44
|
-
elsif inclusion_enumerable.respond_to?(:call)
|
45
|
-
" #\n # Note: Your 'in:/within:' configuration option value is a 'Proc'\n" +
|
46
|
-
" # You will need to implement a customized test.\n" +
|
47
|
-
" it do\n skip(\"Remove this skip line once test customization has been implemented.\")\n is_expected.to validate_inclusion_of(:#{ attribute })"
|
48
|
-
else
|
49
|
-
" #\n # Alert: Invalid 'in:/within:' enumerable object type: '#{ inclusion_enumerable.class.to_s }'\n" +
|
50
|
-
" # Valid inclusion 'in:/within:' enumerable object types: 'Array', 'Range'\n" +
|
51
|
-
" # (or a proc, lambda or symbol which returns an enumerable)\n" +
|
52
|
-
" it do\n skip(\"Remove this skip line once valid enumerable object type is provided.\")\n is_expected.to validate_inclusion_of(:#{ attribute })"
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
|
57
|
-
def get_inclusion_test_options(options)
|
58
|
-
inclusion_test_options = ""
|
59
|
-
options.map do |option, option_value|
|
60
|
-
inclusion_test_option = get_inclusion_test_option(option, option_value)
|
61
|
-
inclusion_test_options.concat(".\n " + inclusion_test_option) if inclusion_test_option.present?
|
62
|
-
end
|
63
|
-
inclusion_test_options
|
64
|
-
end
|
65
|
-
|
66
|
-
|
67
|
-
def get_inclusion_test_option(option, option_value)
|
68
|
-
# IMPLEMENTATION TODO: Determine if it is possible to implement 'with_low_message' and 'with_high_message'
|
69
|
-
case option
|
70
|
-
# IMPLEMENTATION TODO: Determine if 'allow_blank' is a valid option
|
71
|
-
# when :allow_blank
|
72
|
-
# "allow_blank"
|
73
|
-
# IMPLEMENTATION TODO: Determine if 'allow_nil' is a valid option
|
74
|
-
# when :allow_nil
|
75
|
-
# "allow_nil"
|
76
|
-
when :message
|
77
|
-
if option_value.include? '"'
|
78
|
-
"with_message('#{ option_value }')"
|
79
|
-
else
|
80
|
-
"with_message(\"#{ option_value }\")"
|
81
|
-
end
|
82
|
-
when :on
|
83
|
-
"on(:#{ option_value })"
|
84
|
-
else
|
85
|
-
# IMPLEMENTATION TODO: Possibly handle as an error or modify evaluation of option
|
86
|
-
""
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|