acts_as_textcaptcha 2.2.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +2 -1
- data/Gemfile +1 -3
- data/LICENSE +2 -2
- data/README.rdoc +86 -88
- data/Rakefile +17 -7
- data/acts_as_textcaptcha.gemspec +9 -10
- data/config/textcaptcha.yml +11 -11
- data/init.rb +2 -2
- data/lib/acts_as_textcaptcha.rb +1 -1
- data/lib/acts_as_textcaptcha/framework/{rails3.rb → rails.rb} +2 -2
- data/lib/acts_as_textcaptcha/framework/rails2.rb +1 -1
- data/lib/acts_as_textcaptcha/textcaptcha.rb +85 -67
- data/lib/acts_as_textcaptcha/textcaptcha_helper.rb +20 -4
- data/lib/acts_as_textcaptcha/version.rb +2 -2
- data/lib/tasks/textcaptcha.rake +14 -11
- data/{spec → test}/schema.rb +1 -1
- data/test/test_helper.rb +27 -0
- data/test/test_models.rb +42 -0
- data/test/textcaptcha_helper_test.rb +50 -0
- data/test/textcaptcha_test.rb +188 -0
- metadata +34 -52
- data/spec/acts_as_textcaptcha_spec.rb +0 -227
- data/spec/database.yml +0 -21
- data/spec/spec.opts +0 -2
- data/spec/spec_helper.rb +0 -8
@@ -1,227 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
class Widget < ActiveRecord::Base
|
4
|
-
# uses textcaptcha.yml file for configuration
|
5
|
-
acts_as_textcaptcha
|
6
|
-
end
|
7
|
-
|
8
|
-
class Comment < ActiveRecord::Base
|
9
|
-
# inline options with api_key only
|
10
|
-
acts_as_textcaptcha({'api_key' => '8u5ixtdnq9csc84cok0owswgo'})
|
11
|
-
end
|
12
|
-
|
13
|
-
class Review < ActiveRecord::Base
|
14
|
-
# inline options with all possible options
|
15
|
-
acts_as_textcaptcha({'api_key' => '8u5ixtdnq9csc84cok0owswgo',
|
16
|
-
'bcrypt_salt' => '$2a$10$j0bmycH.SVfD1b5mpEGPpe',
|
17
|
-
'bcrypt_cost' => '3',
|
18
|
-
'questions' => [{'question' => '1+1', 'answers' => '2,two'},
|
19
|
-
{'question' => 'The green hat is what color?', 'answers' => 'green'},
|
20
|
-
{'question' => 'Which is bigger: 67, 14 or 6', 'answers' => '67,sixtyseven,sixty seven,sixty-seven'}]})
|
21
|
-
end
|
22
|
-
|
23
|
-
class Note < ActiveRecord::Base
|
24
|
-
# inline options with user defined questions only (no textcaptcha service)
|
25
|
-
acts_as_textcaptcha('questions' => [{'question' => '1+1', 'answers' => '2,two'}])
|
26
|
-
end
|
27
|
-
|
28
|
-
class Contact
|
29
|
-
# non active record object
|
30
|
-
include ActiveModel::Validations
|
31
|
-
include ActiveModel::Conversion
|
32
|
-
extend ActsAsTextcaptcha::Textcaptcha
|
33
|
-
acts_as_textcaptcha(:questions => [{:question => '1+1', :answers => '2,two'}])
|
34
|
-
end
|
35
|
-
|
36
|
-
|
37
|
-
describe 'ActsAsTextcaptcha' do
|
38
|
-
|
39
|
-
before(:each) do
|
40
|
-
@comment = Comment.new
|
41
|
-
@review = Review.new
|
42
|
-
@note = Note.new
|
43
|
-
@contact = Contact.new
|
44
|
-
end
|
45
|
-
|
46
|
-
describe 'validations' do
|
47
|
-
|
48
|
-
before(:each) do
|
49
|
-
@note.generate_spam_question
|
50
|
-
@note.validate_textcaptcha.should be_false
|
51
|
-
@note.should_not be_valid
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should validate non ActiveRecord object" do
|
55
|
-
@contact.generate_spam_question
|
56
|
-
@contact.spam_answer = 'wrong'
|
57
|
-
@contact.validate_textcaptcha.should be_false
|
58
|
-
@contact.should_not be_valid
|
59
|
-
|
60
|
-
@contact.spam_answer = 'two'
|
61
|
-
@contact.validate_textcaptcha.should be_true
|
62
|
-
@contact.should be_valid
|
63
|
-
end
|
64
|
-
|
65
|
-
it 'should validate spam answer with possible answers' do
|
66
|
-
@note.spam_answer = '2'
|
67
|
-
@note.validate_textcaptcha.should be_true
|
68
|
-
@note.should be_valid
|
69
|
-
|
70
|
-
@note.spam_answer = 'two'
|
71
|
-
@note.validate_textcaptcha.should be_true
|
72
|
-
@note.should be_valid
|
73
|
-
|
74
|
-
@note.spam_answer = 'wrong'
|
75
|
-
@note.validate_textcaptcha.should be_false
|
76
|
-
@note.errors[:spam_answer].should eql(['is incorrect, try another question instead'])
|
77
|
-
@note.should_not be_valid
|
78
|
-
end
|
79
|
-
|
80
|
-
it 'should strip whitespace and downcase spam answer' do
|
81
|
-
@note.spam_answer = ' tWo '
|
82
|
-
@note.validate_textcaptcha.should be_true
|
83
|
-
@note.should be_valid
|
84
|
-
|
85
|
-
@note.spam_answer = ' 2 '
|
86
|
-
@note.validate_textcaptcha.should be_true
|
87
|
-
@note.should be_valid
|
88
|
-
end
|
89
|
-
|
90
|
-
it 'should always validate if not a new record' do
|
91
|
-
@note.spam_answer = '2'
|
92
|
-
@note.save!
|
93
|
-
@note.generate_spam_question
|
94
|
-
|
95
|
-
@note.new_record?.should be_false
|
96
|
-
@note.validate_textcaptcha.should be_true
|
97
|
-
@note.should be_valid
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
describe 'encryption' do
|
102
|
-
|
103
|
-
it 'should encrypt answers' do
|
104
|
-
@review.encrypt_answers(['123', '456']).should eql(['$2a$10$j0bmycH.SVfD1b5mpEGPperNj9IlIHoieNk38UDQFdtREOmRFKgou',
|
105
|
-
'$2a$10$j0bmycH.SVfD1b5mpEGPpeqf88jqdV6gIgeJLQNjUnufIn8dys1fW'])
|
106
|
-
end
|
107
|
-
|
108
|
-
it 'should encrypt a single answer' do
|
109
|
-
@review.encrypt_answer('123').should eql('$2a$10$j0bmycH.SVfD1b5mpEGPperNj9IlIHoieNk38UDQFdtREOmRFKgou')
|
110
|
-
end
|
111
|
-
|
112
|
-
it 'should not encrypt if no bycrpt-salt set' do
|
113
|
-
@comment.encrypt_answer('123').should eql('123')
|
114
|
-
@comment.encrypt_answers(['123', '456']).should eql(['123', '456'])
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
describe 'flags' do
|
119
|
-
|
120
|
-
it 'should always be valid if skip_spam_check? is true' do
|
121
|
-
@comment.generate_spam_question
|
122
|
-
@comment.validate_textcaptcha.should be_false
|
123
|
-
@comment.should_not be_valid
|
124
|
-
|
125
|
-
@comment.stub!(:perform_spam_check?).and_return(false)
|
126
|
-
@comment.validate_textcaptcha.should be_true
|
127
|
-
@comment.should be_valid
|
128
|
-
end
|
129
|
-
|
130
|
-
it 'should always fail validation if allowed? is false' do
|
131
|
-
@comment.validate_textcaptcha.should be_true
|
132
|
-
@comment.stub!(:allowed?).and_return(false)
|
133
|
-
|
134
|
-
@comment.validate_textcaptcha.should be_false
|
135
|
-
@comment.errors[:base].should eql(['Sorry, adding a Comment is currently disabled'])
|
136
|
-
@comment.should_not be_valid
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
describe 'with inline options hash' do
|
141
|
-
|
142
|
-
it 'should be configurable from inline options with keys as symbols' do
|
143
|
-
@comment.textcaptcha_config.should eql({:api_key => '8u5ixtdnq9csc84cok0owswgo'})
|
144
|
-
@review.textcaptcha_config.should eql({:bcrypt_cost =>'3', :questions => [{'question' => '1+1', 'answers' => '2,two'},
|
145
|
-
{'question' => 'The green hat is what color?', 'answers' => 'green'},
|
146
|
-
{'question' => 'Which is bigger: 67, 14 or 6', 'answers' => '67,sixtyseven,sixty seven,sixty-seven'}],
|
147
|
-
:bcrypt_salt => '$2a$10$j0bmycH.SVfD1b5mpEGPpe',
|
148
|
-
:api_key => '8u5ixtdnq9csc84cok0owswgo'})
|
149
|
-
@note.textcaptcha_config.should eql({:questions => [{:question => '1+1', :answers => '2,two'}]})
|
150
|
-
@contact.textcaptcha_config.should eql({:questions => [{:question => '1+1', :answers => '2,two'}]})
|
151
|
-
end
|
152
|
-
|
153
|
-
it 'should generate spam question from textcaptcha service' do
|
154
|
-
@comment.generate_spam_question
|
155
|
-
@comment.spam_question.should_not be_nil
|
156
|
-
@comment.possible_answers.should_not be_nil
|
157
|
-
@comment.possible_answers.should be_an(Array)
|
158
|
-
|
159
|
-
@comment.validate_textcaptcha.should be_false
|
160
|
-
@comment.should_not be_valid
|
161
|
-
end
|
162
|
-
|
163
|
-
describe 'and textcaptcha unavailable' do
|
164
|
-
|
165
|
-
before(:each) do
|
166
|
-
Net::HTTP.stub(:get).and_raise(SocketError)
|
167
|
-
end
|
168
|
-
|
169
|
-
it 'should fall back to random user defined question when set' do
|
170
|
-
@review.generate_spam_question
|
171
|
-
@review.spam_question.should_not be_nil
|
172
|
-
@review.possible_answers.should_not be_nil
|
173
|
-
@review.possible_answers.should be_an(Array)
|
174
|
-
|
175
|
-
@review.validate_textcaptcha.should be_false
|
176
|
-
@review.should_not be_valid
|
177
|
-
end
|
178
|
-
|
179
|
-
it 'should not generate any spam question/answer if no user defined questions set' do
|
180
|
-
@comment.generate_spam_question
|
181
|
-
@comment.spam_question.should be_nil
|
182
|
-
@comment.possible_answers.should be_nil
|
183
|
-
@comment.validate_textcaptcha.should be_true
|
184
|
-
@comment.should be_valid
|
185
|
-
end
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
describe 'with textcaptcha yaml config file' do
|
190
|
-
|
191
|
-
before(:each) do
|
192
|
-
@widget = Widget.new
|
193
|
-
end
|
194
|
-
|
195
|
-
it 'should be configurable from config/textcaptcha.yml file' do
|
196
|
-
@widget.textcaptcha_config[:api_key].should eql('8u5ixtdnq9csc84cok0owswgo')
|
197
|
-
@widget.textcaptcha_config[:bcrypt_salt].should eql('$2a$10$j0bmycH.SVfD1b5mpEGPpe')
|
198
|
-
@widget.textcaptcha_config[:bcrypt_cost].should eql(10)
|
199
|
-
@widget.textcaptcha_config[:questions].length.should eql(10)
|
200
|
-
end
|
201
|
-
|
202
|
-
it 'should generate spam question' do
|
203
|
-
@widget.generate_spam_question
|
204
|
-
@widget.spam_question.should_not be_nil
|
205
|
-
@widget.possible_answers.should_not be_nil
|
206
|
-
@widget.possible_answers.should be_an(Array)
|
207
|
-
@widget.validate_textcaptcha.should be_false
|
208
|
-
@widget.should_not be_valid
|
209
|
-
end
|
210
|
-
|
211
|
-
describe 'and textcaptcha unavailable' do
|
212
|
-
|
213
|
-
before(:each) do
|
214
|
-
Net::HTTP.stub(:get).and_raise(SocketError)
|
215
|
-
end
|
216
|
-
|
217
|
-
it 'should fall back to a random user defined question' do
|
218
|
-
@widget.generate_spam_question
|
219
|
-
@widget.spam_question.should_not be_nil
|
220
|
-
@widget.possible_answers.should_not be_nil
|
221
|
-
@widget.possible_answers.should be_an(Array)
|
222
|
-
@widget.validate_textcaptcha.should be_false
|
223
|
-
@widget.should_not be_valid
|
224
|
-
end
|
225
|
-
end
|
226
|
-
end
|
227
|
-
end
|
data/spec/database.yml
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
sqlite:
|
2
|
-
:adapter: sqlite
|
3
|
-
:database: acts_as_textcaptcha.sqlite.db
|
4
|
-
|
5
|
-
sqlite3:
|
6
|
-
:adapter: sqlite3
|
7
|
-
:database: acts_as_textcaptcha.sqlite3.db
|
8
|
-
|
9
|
-
postgresql:
|
10
|
-
:adapter: postgresql
|
11
|
-
:username: postgres
|
12
|
-
:password: postgres
|
13
|
-
:database: acts_as_textcaptcha_test
|
14
|
-
:min_messages: ERROR
|
15
|
-
|
16
|
-
mysql:
|
17
|
-
:adapter: mysql
|
18
|
-
:host: localhost
|
19
|
-
:username: root
|
20
|
-
:password:
|
21
|
-
:database: acts_as_textcaptcha_test
|
data/spec/spec.opts
DELETED
data/spec/spec_helper.rb
DELETED
@@ -1,8 +0,0 @@
|
|
1
|
-
require 'bundler'
|
2
|
-
require 'active_record'
|
3
|
-
require 'rails'
|
4
|
-
require 'acts_as_textcaptcha'
|
5
|
-
|
6
|
-
# setup db
|
7
|
-
ActiveRecord::Base.establish_connection(YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))[ENV['DB'] || 'sqlite3'])
|
8
|
-
load(File.dirname(__FILE__) + "/schema.rb")
|