validates_captcha 0.9.5 → 0.9.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,13 +2,13 @@ require 'active_support'
2
2
 
3
3
  module ValidatesCaptcha
4
4
  module SymmetricEncryptor
5
- # This class is responsible for encrypting and decrypting captcha codes.
6
- # It internally uses ActiveSupport's MessageEncryptor to do the string
5
+ # This class is responsible for encrypting and decrypting captcha codes.
6
+ # It internally uses ActiveSupport's MessageEncryptor to do the string
7
7
  # encryption/decryption.
8
8
  #
9
- # You can implement your own symmetric encryptor by creating a class
10
- # that conforms to the method definitions of the example below and
11
- # assign an instance of it to
9
+ # You can implement your own symmetric encryptor by creating a class
10
+ # that conforms to the method definitions of the example below and
11
+ # assign an instance of it to
12
12
  # ValidatesCaptcha::Provider::DynamicImage#symmetric_encryptor=.
13
13
  #
14
14
  # Example for a custom symmetric encryptor:
@@ -28,19 +28,19 @@ module ValidatesCaptcha
28
28
  # ValidatesCaptcha::Provider::DynamicImage.symmetric_encryptor = ReverseString.new
29
29
  # ValidatesCaptcha.provider = ValidatesCaptcha::Provider::DynamicImage.new
30
30
  #
31
- # Please note: The #decrypt method should return +nil+ if decryption fails.
31
+ # Please note: The #decrypt method should return +nil+ if decryption fails.
32
32
  class Simple
33
33
  KEY = ::ActiveSupport::SecureRandom.hex(64).freeze
34
-
34
+
35
35
  def initialize #:nodoc:
36
36
  @symmetric_encryptor = ::ActiveSupport::MessageEncryptor.new(KEY)
37
37
  end
38
-
39
- # Encrypts a cleartext string.
38
+
39
+ # Encrypts a cleartext string.
40
40
  def encrypt(code)
41
41
  @symmetric_encryptor.encrypt(code).gsub('+', '%2B').gsub('/', '%2F')
42
42
  end
43
-
43
+
44
44
  # Decrypts an encrypted string.
45
45
  def decrypt(encrypted_code)
46
46
  @symmetric_encryptor.decrypt encrypted_code.gsub('%2F', '/').gsub('%2B', '+')
@@ -50,3 +50,4 @@ module ValidatesCaptcha
50
50
  end
51
51
  end
52
52
  end
53
+
@@ -10,3 +10,4 @@ module ValidatesCaptcha #:nodoc:
10
10
  end
11
11
  end
12
12
  end
13
+
@@ -2,8 +2,9 @@ module ValidatesCaptcha #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 9
5
- TINY = 5
6
-
5
+ TINY = 6
6
+
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
9
9
  end
10
+
data/rails/init.rb CHANGED
@@ -10,16 +10,16 @@ end
10
10
  module ::ValidatesCaptcha
11
11
  class MiddlewareWrapper
12
12
  RECOGNIZED_RESPONSE_STATUS_CODES = [200, 422].freeze
13
-
13
+
14
14
  def initialize(app)
15
15
  @app = app
16
16
  end
17
-
17
+
18
18
  def call(env)
19
19
  result = ValidatesCaptcha.provider.call(env)
20
-
20
+
21
21
  return @app.call(env) unless RECOGNIZED_RESPONSE_STATUS_CODES.include?(result.first)
22
-
22
+
23
23
  result
24
24
  end
25
25
  end
@@ -1,29 +1,27 @@
1
- require 'validates_captcha'
2
-
3
1
  namespace :validates_captcha do
4
- desc "Create 3 static captcha images in RAILS_ROOT/public/images/captchas/, specify a different number with COUNT=n"
5
- task :create_static_images => [:create_static_image_dir, :clear_static_image_dir] do
2
+ desc "Create 3 static captcha images in RAILS_ROOT/public/images/captchas/, specify a different number with COUNT=n"
3
+ task :create_static_images => [:create_static_image_dir, :clear_static_image_dir] do
6
4
  count = ENV['COUNT'] ? ENV['COUNT'].to_i : 3
7
-
5
+
8
6
  count.times do
9
7
  path, code = ValidatesCaptcha::Provider::StaticImage.create_image
10
8
  puts "Created #{path} with code #{code}"
11
9
  end
12
10
  end
13
-
11
+
14
12
  task :create_static_image_dir => :environment do
15
13
  image_dir = ValidatesCaptcha::Provider::StaticImage.filesystem_dir
16
-
14
+
17
15
  unless File.exist?(image_dir)
18
16
  FileUtils.mkdir_p image_dir
19
17
  puts "Created directory #{image_dir}"
20
18
  end
21
19
  end
22
-
20
+
23
21
  task :clear_static_image_dir => :environment do
24
22
  image_dir = ValidatesCaptcha::Provider::StaticImage.filesystem_dir
25
23
  image_files = Dir[File.join(image_dir, '*')]
26
-
24
+
27
25
  if image_files.any?
28
26
  FileUtils.rm image_files
29
27
  puts "Cleared directory #{image_dir}"
@@ -7,31 +7,31 @@ end
7
7
 
8
8
  class WidgetsController < ActionController::Base
9
9
  include ValidatesCaptcha::ControllerValidation
10
-
10
+
11
11
  validates_captcha :except => [:update, :save, :persist, :bingo]
12
12
  validates_captcha_of :widgets, :only => :update
13
13
  validates_captcha_of Widget, :only => [:save, :persist]
14
-
14
+
15
15
  def create
16
16
  begin
17
17
  Widget.new.save!
18
18
  rescue ActiveRecord::RecordInvalid
19
19
  @invalid = true
20
20
  end
21
-
21
+
22
22
  render :nothing => true
23
23
  end
24
-
24
+
25
25
  def update
26
26
  begin
27
27
  Widget.new.save!
28
28
  rescue ActiveRecord::RecordInvalid
29
29
  @invalid = true
30
30
  end
31
-
31
+
32
32
  render :nothing => true
33
33
  end
34
-
34
+
35
35
  def save
36
36
  begin
37
37
  Widget.create! params['widget']
@@ -41,7 +41,7 @@ class WidgetsController < ActionController::Base
41
41
 
42
42
  render :nothing => true
43
43
  end
44
-
44
+
45
45
  def store
46
46
  begin
47
47
  Widget.create! params['widget']
@@ -51,7 +51,7 @@ class WidgetsController < ActionController::Base
51
51
 
52
52
  render :nothing => true
53
53
  end
54
-
54
+
55
55
  def persist
56
56
  begin
57
57
  Widget.create! params['widget']
@@ -61,28 +61,28 @@ class WidgetsController < ActionController::Base
61
61
 
62
62
  render :nothing => true
63
63
  end
64
-
64
+
65
65
  def bingo
66
66
  begin
67
67
  Widget.new.save!
68
68
  rescue ActiveRecord::RecordInvalid
69
69
  @invalid = true
70
70
  end
71
-
71
+
72
72
  render :nothing => true
73
73
  end
74
74
  end
75
75
 
76
76
  class ControllerValidationTest < ActionController::TestCase
77
77
  tests WidgetsController
78
-
78
+
79
79
  def with_dynamic_image_provider(&block)
80
80
  old_provider = ValidatesCaptcha.provider
81
81
  provider = ValidatesCaptcha.provider = ValidatesCaptcha::Provider::DynamicImage.new
82
82
  yield provider
83
83
  ValidatesCaptcha.provider = old_provider
84
84
  end
85
-
85
+
86
86
  def with_static_image_provider(&block)
87
87
  old_provider = ValidatesCaptcha.provider
88
88
  provider = ValidatesCaptcha.provider = ValidatesCaptcha::Provider::StaticImage.new
@@ -90,133 +90,134 @@ class ControllerValidationTest < ActionController::TestCase
90
90
  yield provider
91
91
  ValidatesCaptcha.provider = old_provider
92
92
  end
93
-
93
+
94
94
  def with_question_provider(&block)
95
95
  old_provider = ValidatesCaptcha.provider
96
96
  provider = ValidatesCaptcha.provider = ValidatesCaptcha::Provider::Question.new
97
97
  yield provider
98
98
  ValidatesCaptcha.provider = old_provider
99
99
  end
100
-
100
+
101
101
  test "defines a class level #validates_captcha method" do
102
102
  assert_respond_to WidgetsController, :validates_captcha
103
103
  end
104
-
104
+
105
105
  test "defines a class level #validates_captcha_of method" do
106
106
  assert_respond_to WidgetsController, :validates_captcha_of
107
107
  end
108
-
108
+
109
109
  test "calling #create method of controller should assign @invalid" do
110
110
  post :create
111
111
  assert_not_nil assigns(:invalid)
112
112
  end
113
-
113
+
114
114
  test "calling #update method of controller should assign @invalid" do
115
115
  post :update
116
116
  assert_not_nil assigns(:invalid)
117
117
  end
118
-
118
+
119
119
  test "calling #save method of controller should not assign @invalid" do
120
120
  with_dynamic_image_provider do |provider|
121
121
  challenge = provider.generate_challenge
122
122
  solution = provider.send(:decrypt, challenge)
123
-
123
+
124
124
  post :save, { 'widget' => { 'captcha_challenge' => challenge, 'captcha_solution' => solution } }
125
125
  assert_nil assigns(:invalid)
126
126
  end
127
-
127
+
128
128
  with_static_image_provider do |provider|
129
129
  challenge = provider.generate_challenge
130
130
  solution = 'hello'
131
-
131
+
132
132
  post :save, { 'widget' => { 'captcha_challenge' => challenge, 'captcha_solution' => solution } }
133
133
  assert_nil assigns(:invalid)
134
134
  end
135
-
135
+
136
136
  with_question_provider do |provider|
137
137
  challenge = provider.generate_challenge
138
138
  solution = provider.send(:solve, challenge)
139
-
139
+
140
140
  post :save, { 'widget' => { 'captcha_challenge' => challenge, 'captcha_solution' => solution } }
141
141
  assert_nil assigns(:invalid)
142
142
  end
143
143
  end
144
-
144
+
145
145
  test "calling #store method of controller should assign @invalid" do
146
146
  with_dynamic_image_provider do |provider|
147
147
  challenge = provider.generate_challenge
148
148
  solution = provider.send(:decrypt, challenge).reverse
149
-
149
+
150
150
  post :store, { 'widget' => { 'captcha_challenge' => challenge, 'captcha_solution' => solution } }
151
151
  assert_not_nil assigns(:invalid)
152
152
  end
153
-
153
+
154
154
  with_static_image_provider do |provider|
155
155
  challenge = provider.generate_challenge
156
156
  solution = '---'
157
-
157
+
158
158
  post :store, { 'widget' => { 'captcha_challenge' => challenge, 'captcha_solution' => solution } }
159
159
  assert_not_nil assigns(:invalid)
160
160
  end
161
-
161
+
162
162
  with_question_provider do |provider|
163
163
  challenge = provider.generate_challenge
164
164
  solution = '---'
165
-
165
+
166
166
  post :store, { 'widget' => { 'captcha_challenge' => challenge, 'captcha_solution' => solution } }
167
167
  assert_not_nil assigns(:invalid)
168
168
  end
169
169
  end
170
-
170
+
171
171
  test "calling #persist method of controller should assign @invalid" do
172
172
  with_dynamic_image_provider do |provider|
173
173
  challenge = provider.generate_challenge
174
174
  solution = provider.send(:decrypt, challenge).reverse
175
-
175
+
176
176
  post :persist, { 'widget' => { 'captcha_challenge' => challenge, 'captcha_solution' => solution } }
177
177
  assert_not_nil assigns(:invalid)
178
178
  end
179
-
179
+
180
180
  with_static_image_provider do |provider|
181
181
  challenge = provider.generate_challenge
182
182
  solution = '---'
183
-
183
+
184
184
  post :persist, { 'widget' => { 'captcha_challenge' => challenge, 'captcha_solution' => solution } }
185
185
  assert_not_nil assigns(:invalid)
186
186
  end
187
-
187
+
188
188
  with_question_provider do |provider|
189
189
  challenge = provider.generate_challenge
190
190
  solution = '---'
191
-
191
+
192
192
  post :persist, { 'widget' => { 'captcha_challenge' => challenge, 'captcha_solution' => solution } }
193
193
  assert_not_nil assigns(:invalid)
194
194
  end
195
195
  end
196
-
196
+
197
197
  test "calling #bingo method of controller should not assign @invalid" do
198
198
  with_dynamic_image_provider do |provider|
199
199
  challenge = provider.generate_challenge
200
200
  solution = provider.send(:decrypt, challenge).reverse
201
-
201
+
202
202
  post :bingo, { 'widget' => { 'captcha_challenge' => challenge, 'captcha_solution' => solution } }
203
203
  assert_nil assigns(:invalid)
204
204
  end
205
-
205
+
206
206
  with_static_image_provider do |provider|
207
207
  challenge = provider.generate_challenge
208
208
  solution = '---'
209
-
209
+
210
210
  post :bingo, { 'widget' => { 'captcha_challenge' => challenge, 'captcha_solution' => solution } }
211
211
  assert_nil assigns(:invalid)
212
212
  end
213
-
213
+
214
214
  with_question_provider do |provider|
215
215
  challenge = provider.generate_challenge
216
216
  solution = '---'
217
-
217
+
218
218
  post :bingo, { 'widget' => { 'captcha_challenge' => challenge, 'captcha_solution' => solution } }
219
219
  assert_nil assigns(:invalid)
220
220
  end
221
221
  end
222
222
  end
223
+
@@ -1,32 +1,32 @@
1
1
  require 'test_helper'
2
-
2
+
3
3
  IG = ValidatesCaptcha::ImageGenerator::Simple
4
-
4
+
5
5
  class ImageGeneratorTest < ValidatesCaptcha::TestCase
6
6
  test "defines an instance level #generate method" do
7
7
  assert_respond_to IG.new, :generate
8
8
  end
9
-
9
+
10
10
  test "instance level #generate method accepts an argument" do
11
11
  assert_nothing_raised { IG.new.generate('abc') }
12
12
  end
13
-
13
+
14
14
  test "instance level #generate method returns a string" do
15
15
  assert_kind_of String, IG.new.generate('abc')
16
16
  end
17
-
17
+
18
18
  test "defines an instance level #file_extension method" do
19
19
  assert_respond_to IG.new, :file_extension
20
20
  end
21
-
21
+
22
22
  test "instance level #file_extension method returns a string" do
23
23
  assert_kind_of String, IG.new.file_extension
24
24
  end
25
-
25
+
26
26
  test "defines an instance level #mime_type method" do
27
27
  assert_respond_to IG.new, :mime_type
28
28
  end
29
-
29
+
30
30
  test "instance level #mime_type method returns a string" do
31
31
  assert_kind_of String, IG.new.mime_type
32
32
  end
@@ -7,7 +7,7 @@ class ModelValidationTest < ValidatesCaptcha::TestCase
7
7
  yield provider
8
8
  ValidatesCaptcha.provider = old_provider
9
9
  end
10
-
10
+
11
11
  def with_static_image_provider(&block)
12
12
  old_provider = ValidatesCaptcha.provider
13
13
  provider = ValidatesCaptcha.provider = ValidatesCaptcha::Provider::StaticImage.new
@@ -15,244 +15,259 @@ class ModelValidationTest < ValidatesCaptcha::TestCase
15
15
  yield provider
16
16
  ValidatesCaptcha.provider = old_provider
17
17
  end
18
-
18
+
19
19
  def with_question_provider(&block)
20
20
  old_provider = ValidatesCaptcha.provider
21
21
  provider = ValidatesCaptcha.provider = ValidatesCaptcha::Provider::Question.new
22
22
  yield provider
23
23
  ValidatesCaptcha.provider = old_provider
24
24
  end
25
-
26
- test "defines an accessible attribute named +captcha_solution+" do
27
- assert Widget.accessible_attributes.include?('captcha_solution')
28
- end
29
-
25
+
30
26
  test "defines an instance level #captcha_solution method" do
31
27
  assert_respond_to Widget.new, :captcha_solution
32
28
  end
33
-
29
+
34
30
  test "defines a instance level #captcha_solution= method" do
35
31
  assert_respond_to Widget.new, :captcha_solution=
36
32
  end
37
-
33
+
38
34
  test "assigned value to #captcha_solution= should equal return value of #captcha_solution" do
39
35
  widget = Widget.new
40
36
  widget.captcha_solution = 'abc123'
41
-
37
+
42
38
  assert_equal 'abc123', widget.captcha_solution
43
39
  end
44
-
45
- test "defines an accessible attribute named +captcha_challenge+" do
46
- assert Widget.accessible_attributes.include?('captcha_challenge')
47
- end
48
-
40
+
49
41
  test "defines an instance level #captcha_challenge method" do
50
42
  assert_respond_to Widget.new, :captcha_challenge
51
43
  end
52
-
44
+
53
45
  test "defines an instance level #captcha_challenge= method" do
54
46
  assert_respond_to Widget.new, :captcha_challenge=
55
47
  end
56
-
48
+
57
49
  test "value assigned to #captcha_challenge= should equal return value of #captcha_challenge" do
58
50
  widget = Widget.new
59
51
  widget.captcha_challenge = 'asdfghjk3456789'
60
-
52
+
61
53
  assert_equal 'asdfghjk3456789', widget.captcha_challenge
62
54
  end
63
-
55
+
56
+ test "should not add captcha_challenge as attr_accessible" do
57
+ assert !(Widget.accessible_attributes || []).include?('captcha_challenge')
58
+ end
59
+
60
+ test "should not add captcha_solution as attr_accessible" do
61
+ assert !(Widget.accessible_attributes || []).include?('captcha_solution')
62
+ end
63
+
64
+ test "should also assign non-attr_accessible captcha fields when mass assigning attributes" do
65
+ widget = Widget.new
66
+
67
+ widget.attributes = { :name => 'foo', :captcha_challenge => 'bar', :captcha_solution => 'baz' }
68
+ assert_equal 'foo', widget.name
69
+ assert_equal 'bar', widget.captcha_challenge
70
+ assert_equal 'baz', widget.captcha_solution
71
+
72
+ widget.attributes = { 'name' => 'bar', 'captcha_challenge' => 'baz', 'captcha_solution' => 'foo' }
73
+ assert_equal 'bar', widget.name
74
+ assert_equal 'baz', widget.captcha_challenge
75
+ assert_equal 'foo', widget.captcha_solution
76
+ end
77
+
64
78
  test "defines #validate_captcha method callback of kind +validate+" do
65
79
  assert Widget.validate_callback_chain.any? { |callback| callback.method == :validate_captcha && callback.kind == :validate }
66
80
  end
67
-
81
+
68
82
  test "defines a class level with_captcha_validation method" do
69
83
  assert_respond_to Widget, :with_captcha_validation
70
84
  end
71
-
85
+
72
86
  test "not within a #with_captcha_validation block, calling valid? should return true if no captcha_solution is set" do
73
87
  widget = Widget.new
74
88
  widget.captcha_solution = nil
75
-
89
+
76
90
  assert widget.valid?
77
91
  end
78
-
92
+
79
93
  test "not within a #with_captcha_validation block, calling valid? should return true if an empty captcha_solution is set" do
80
94
  widget = Widget.new
81
95
  widget.captcha_solution = ' '
82
-
96
+
83
97
  assert widget.valid?
84
98
  end
85
-
99
+
86
100
  test "not within a #with_captcha_validation block, calling valid? should return true if an invalid captcha_solution is set" do
87
101
  with_dynamic_image_provider do |provider|
88
102
  widget = Widget.new
89
103
  widget.captcha_solution = provider.send(:decrypt, widget.captcha_challenge).reverse
90
-
104
+
91
105
  assert widget.valid?
92
106
  end
93
-
107
+
94
108
  with_static_image_provider do |provider|
95
109
  widget = Widget.new
96
110
  widget.captcha_solution = '---'
97
-
111
+
98
112
  assert widget.valid?
99
113
  end
100
-
114
+
101
115
  with_question_provider do |provider|
102
116
  widget = Widget.new
103
117
  widget.captcha_solution = '---'
104
-
118
+
105
119
  assert widget.valid?
106
120
  end
107
121
  end
108
-
122
+
109
123
  test "not within a #with_captcha_validation block, calling valid? should return true if a valid captcha_solution is set" do
110
124
  with_dynamic_image_provider do |provider|
111
125
  widget = Widget.new
112
126
  widget.captcha_solution = provider.send(:decrypt, widget.captcha_challenge)
113
-
127
+
114
128
  assert widget.valid?
115
129
  end
116
-
130
+
117
131
  with_static_image_provider do |provider|
118
132
  widget = Widget.new
119
133
  widget.captcha_solution = 'hello'
120
-
134
+
121
135
  assert widget.valid?
122
136
  end
123
-
137
+
124
138
  with_question_provider do |provider|
125
139
  widget = Widget.new
126
140
  widget.captcha_solution = provider.send(:solve, widget.captcha_challenge)
127
-
141
+
128
142
  assert widget.valid?
129
143
  end
130
144
  end
131
-
145
+
132
146
  test "within a #with_captcha_validation block, calling valid? should return false if no captcha_solution is set" do
133
147
  Widget.with_captcha_validation do
134
148
  widget = Widget.new
135
149
  widget.captcha_solution = nil
136
-
150
+
137
151
  assert !widget.valid?
138
152
  assert_equal 1, Array.wrap(widget.errors[:captcha_solution]).size
139
153
  assert Array.wrap(widget.errors[:captcha_solution]).first.include?('blank')
140
154
  end
141
155
  end
142
-
156
+
143
157
  test "within a #with_captcha_validation block, calling valid? should return false if an empty captcha_solution is set" do
144
158
  Widget.with_captcha_validation do
145
159
  widget = Widget.new
146
160
  widget.captcha_solution = ' '
147
-
161
+
148
162
  assert !widget.valid?
149
163
  assert_equal 1, Array.wrap(widget.errors[:captcha_solution]).size
150
164
  assert Array.wrap(widget.errors[:captcha_solution]).first.include?('blank')
151
165
  end
152
166
  end
153
-
167
+
154
168
  test "within a #with_captcha_validation block, calling valid? should return false if an invalid captcha_solution is set" do
155
169
  with_dynamic_image_provider do |provider|
156
170
  Widget.with_captcha_validation do
157
171
  widget = Widget.new
158
172
  widget.captcha_solution = provider.send(:decrypt, widget.captcha_challenge).reverse
159
-
173
+
160
174
  assert !widget.valid?
161
175
  assert_equal 1, Array.wrap(widget.errors[:captcha_solution]).size
162
176
  assert Array.wrap(widget.errors[:captcha_solution]).first.include?('invalid')
163
177
  end
164
178
  end
165
-
179
+
166
180
  with_static_image_provider do |provider|
167
181
  Widget.with_captcha_validation do
168
182
  widget = Widget.new
169
183
  widget.captcha_solution = '---'
170
-
184
+
171
185
  assert !widget.valid?
172
186
  assert_equal 1, Array.wrap(widget.errors[:captcha_solution]).size
173
187
  assert Array.wrap(widget.errors[:captcha_solution]).first.include?('invalid')
174
188
  end
175
189
  end
176
-
190
+
177
191
  with_question_provider do |provider|
178
192
  Widget.with_captcha_validation do
179
193
  widget = Widget.new
180
194
  widget.captcha_solution = '---'
181
-
195
+
182
196
  assert !widget.valid?
183
197
  assert_equal 1, Array.wrap(widget.errors[:captcha_solution]).size
184
198
  assert Array.wrap(widget.errors[:captcha_solution]).first.include?('invalid')
185
199
  end
186
200
  end
187
201
  end
188
-
202
+
189
203
  test "within a #with_captcha_validation block, calling valid? should return true if a valid captcha_solution is set" do
190
204
  with_dynamic_image_provider do |provider|
191
205
  Widget.with_captcha_validation do
192
206
  widget = Widget.new
193
207
  widget.captcha_solution = provider.send(:decrypt, widget.captcha_challenge)
194
-
208
+
195
209
  assert widget.valid?
196
210
  end
197
211
  end
198
-
212
+
199
213
  with_static_image_provider do |provider|
200
214
  Widget.with_captcha_validation do
201
215
  widget = Widget.new
202
216
  widget.captcha_solution = 'hello'
203
-
217
+
204
218
  assert widget.valid?
205
219
  end
206
220
  end
207
-
221
+
208
222
  with_question_provider do |provider|
209
223
  Widget.with_captcha_validation do
210
224
  widget = Widget.new
211
225
  widget.captcha_solution = provider.send(:solve, widget.captcha_challenge)
212
-
226
+
213
227
  assert widget.valid?
214
228
  end
215
229
  end
216
230
  end
217
-
231
+
218
232
  test "with #with_captcha_validation block, calling valid? before and after the block should return true if valid? returned false within block" do
219
233
  with_dynamic_image_provider do |provider|
220
234
  widget = Widget.new
221
235
  widget.captcha_solution = provider.send(:decrypt, widget.captcha_challenge).reverse
222
-
236
+
223
237
  assert widget.valid?
224
-
238
+
225
239
  Widget.with_captcha_validation do
226
240
  assert !widget.valid?
227
241
  end
228
-
242
+
229
243
  assert widget.valid?
230
244
  end
231
-
245
+
232
246
  with_static_image_provider do |provider|
233
247
  widget = Widget.new
234
248
  widget.captcha_solution = '---'
235
-
249
+
236
250
  assert widget.valid?
237
-
251
+
238
252
  Widget.with_captcha_validation do
239
253
  assert !widget.valid?
240
254
  end
241
-
255
+
242
256
  assert widget.valid?
243
257
  end
244
-
258
+
245
259
  with_question_provider do |provider|
246
260
  widget = Widget.new
247
261
  widget.captcha_solution = '---'
248
-
262
+
249
263
  assert widget.valid?
250
-
264
+
251
265
  Widget.with_captcha_validation do
252
266
  assert !widget.valid?
253
267
  end
254
-
268
+
255
269
  assert widget.valid?
256
270
  end
257
271
  end
258
272
  end
273
+