smart_sms 0.0.3 → 0.1.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +1 -1
- data/Gemfile +1 -1
- data/Gemfile.lock +97 -24
- data/README.md +245 -3
- data/Rakefile +1 -1
- data/lib/generators/smart_sms/install_generator.rb +7 -2
- data/lib/generators/smart_sms/templates/smart_sms_config.rb +1 -1
- data/lib/smart_sms.rb +2 -2
- data/lib/smart_sms/account.rb +6 -4
- data/lib/smart_sms/config.rb +4 -3
- data/lib/smart_sms/has_sms_verification.rb +39 -34
- data/lib/smart_sms/helpers/fake_sms.rb +14 -13
- data/lib/smart_sms/helpers/verification_code.rb +15 -7
- data/lib/smart_sms/message_service.rb +15 -13
- data/lib/smart_sms/model/message.rb +2 -0
- data/lib/smart_sms/request.rb +9 -8
- data/lib/smart_sms/template.rb +8 -7
- data/lib/smart_sms/version.rb +2 -2
- data/smart_sms.gemspec +11 -8
- data/spec/account_spec.rb +80 -0
- data/spec/config/config_spec.rb +172 -0
- data/spec/fake_app/active_record/config.rb +9 -0
- data/spec/fake_app/active_record/models.rb +42 -0
- data/spec/fake_app/initializers/smart_sms.rb +15 -0
- data/spec/fake_app/rails_app.rb +23 -0
- data/spec/has_sms_verificaton_spec.rb +275 -0
- data/spec/helpers/fake_sms_spec.rb +15 -0
- data/spec/helpers/verification_code_spec.rb +62 -0
- data/spec/smart_sms_spec.rb +260 -0
- data/spec/spec_helper.rb +15 -2
- data/spec/support/database_cleaner.rb +13 -0
- data/spec/template_spec.rb +168 -0
- metadata +69 -3
data/lib/smart_sms/template.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
module SmartSMS
|
4
|
+
# module that handle `Template`
|
4
5
|
module Template
|
5
|
-
|
6
|
+
module_function
|
6
7
|
|
7
8
|
# 取默认模板
|
8
9
|
# Options:
|
9
10
|
# tpl_id: 指定tpl_id时返回tpl_id对应的默认模板. 未指定时返回所有默认模板
|
10
11
|
#
|
11
|
-
def find_default
|
12
|
+
def find_default(tpl_id = '')
|
12
13
|
Request.post 'tpl/get_default.json', tpl_id: tpl_id
|
13
14
|
end
|
14
15
|
|
@@ -16,26 +17,26 @@ module SmartSMS
|
|
16
17
|
# Options:
|
17
18
|
# tpl_id: 指定tpl_id时返回tpl_id对应的自定义模板. 未指定时返回所有自定义模板
|
18
19
|
#
|
19
|
-
def find
|
20
|
+
def find(tpl_id = '')
|
20
21
|
Request.post 'tpl/get.json', tpl_id: tpl_id
|
21
22
|
end
|
22
23
|
|
23
24
|
# 创建新模板
|
24
25
|
# 规则请参见: <http://www.yunpian.com/api/tpl.html>
|
25
26
|
#
|
26
|
-
def create
|
27
|
+
def create(tpl_content = '')
|
27
28
|
Request.post 'tpl/add.json', tpl_content: tpl_content
|
28
29
|
end
|
29
30
|
|
30
31
|
# 更新模板, 需指定id和content
|
31
32
|
#
|
32
|
-
def update
|
33
|
+
def update(tpl_id = '', tpl_content = '')
|
33
34
|
Request.post 'tpl/update.json', tpl_id: tpl_id, tpl_content: tpl_content
|
34
35
|
end
|
35
36
|
|
36
37
|
# 删除模板, 需指定id
|
37
|
-
def destroy
|
38
|
+
def destroy(tpl_id = '')
|
38
39
|
Request.post 'tpl/del.json', tpl_id: tpl_id
|
39
40
|
end
|
40
41
|
end
|
41
|
-
end
|
42
|
+
end
|
data/lib/smart_sms/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module SmartSMS
|
2
|
-
VERSION = '0.0
|
3
|
-
end
|
2
|
+
VERSION = '0.1.0'
|
3
|
+
end
|
data/smart_sms.gemspec
CHANGED
@@ -5,26 +5,29 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
5
|
require 'smart_sms/version'
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
|
-
s.name =
|
8
|
+
s.name = 'smart_sms'
|
9
9
|
s.version = SmartSMS::VERSION
|
10
|
-
s.authors = [
|
11
|
-
s.email = [
|
10
|
+
s.authors = ['lyfeyaj']
|
11
|
+
s.email = ['lyfeyaj@gmail.com']
|
12
12
|
s.description = %q{A smart sms verification tool}
|
13
13
|
s.summary = %q{A smart sms verification tool used in China and integrate with yunpian.com}
|
14
|
-
s.homepage =
|
15
|
-
s.license =
|
14
|
+
s.homepage = 'https://github.com/lyfeyaj/smart_sms'
|
15
|
+
s.license = 'MIT'
|
16
16
|
|
17
17
|
s.files = `git ls-files`.split($/)
|
18
18
|
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
19
|
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
20
|
-
s.require_paths = [
|
20
|
+
s.require_paths = ['lib']
|
21
21
|
|
22
22
|
s.add_dependency 'activerecord', ['>= 3.0', '< 5.0']
|
23
23
|
s.add_dependency 'activesupport', ['>= 3.0', '< 5.0']
|
24
24
|
|
25
25
|
s.add_development_dependency 'bundler', ['>= 1.0.0']
|
26
26
|
s.add_development_dependency 'rake', ['>= 0']
|
27
|
-
s.add_development_dependency 'rspec', ['>= 0']
|
27
|
+
s.add_development_dependency 'rspec-rails', ['>= 0']
|
28
28
|
s.add_development_dependency 'database_cleaner', ['~> 1.2.0']
|
29
|
-
s.add_development_dependency
|
29
|
+
s.add_development_dependency 'webmock', ['~> 1.17.0']
|
30
|
+
s.add_development_dependency 'rails', ['>= 3.1.0']
|
31
|
+
s.add_development_dependency 'sqlite3', ['>= 0']
|
32
|
+
s.add_development_dependency 'pry', ['>= 0']
|
30
33
|
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe SmartSMS::Template do
|
5
|
+
|
6
|
+
describe '#info' do
|
7
|
+
let(:url) { 'http://yunpian.com/v1/user/get.json' }
|
8
|
+
subject { SmartSMS::Account.info }
|
9
|
+
|
10
|
+
before do
|
11
|
+
stub_request(:post, url).with(
|
12
|
+
body: {
|
13
|
+
'apikey' => SmartSMS.config.api_key
|
14
|
+
},
|
15
|
+
headers: {
|
16
|
+
'Content-Type' => 'application/x-www-form-urlencoded'
|
17
|
+
}
|
18
|
+
).to_return(
|
19
|
+
body: {
|
20
|
+
'code' => 0,
|
21
|
+
'msg' => 'OK',
|
22
|
+
'user' => {
|
23
|
+
'nick' => 'LYFEYAJ',
|
24
|
+
'gmt_created' => '2014-04-01 14:00:52',
|
25
|
+
'mobile' => '13096953122',
|
26
|
+
'email' => 'lyfeyaj@gmail.com',
|
27
|
+
'ip_whitelist' => nil,
|
28
|
+
'api_version' => 'v1',
|
29
|
+
'alarm_balance' => 150,
|
30
|
+
'emergency_contact' => '',
|
31
|
+
'emergency_mobile' => '',
|
32
|
+
'balance' => 676
|
33
|
+
}
|
34
|
+
}.to_json
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
its(['code']) { should eq 0 }
|
39
|
+
its(['msg']) { should eq 'OK' }
|
40
|
+
its(:keys) { should include 'user' }
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '#set' do
|
44
|
+
let(:url) { 'http://yunpian.com/v1/user/set.json' }
|
45
|
+
let(:emergency_contact) { 'Felix Liu' }
|
46
|
+
let(:emergency_mobile) { '13394738283' }
|
47
|
+
let(:alarm_balance) { '100' }
|
48
|
+
subject do
|
49
|
+
SmartSMS::Account.set(
|
50
|
+
emergency_contact: emergency_contact,
|
51
|
+
emergency_mobile: emergency_mobile,
|
52
|
+
alarm_balance: alarm_balance
|
53
|
+
)
|
54
|
+
end
|
55
|
+
|
56
|
+
before do
|
57
|
+
stub_request(:post, url).with(
|
58
|
+
body: {
|
59
|
+
'apikey' => SmartSMS.config.api_key,
|
60
|
+
'emergency_contact' => emergency_contact,
|
61
|
+
'emergency_mobile' => emergency_mobile,
|
62
|
+
'alarm_balance' => alarm_balance
|
63
|
+
},
|
64
|
+
headers: {
|
65
|
+
'Content-Type' => 'application/x-www-form-urlencoded'
|
66
|
+
}
|
67
|
+
).to_return(
|
68
|
+
body: {
|
69
|
+
'code' => 0,
|
70
|
+
'msg' => 'OK',
|
71
|
+
'detail' => nil
|
72
|
+
}.to_json
|
73
|
+
)
|
74
|
+
end
|
75
|
+
|
76
|
+
its(['code']) { should eq 0 }
|
77
|
+
its(['msg']) { should eq 'OK' }
|
78
|
+
its(:keys) { should include 'detail' }
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe SmartSMS::Configuration do
|
6
|
+
subject { SmartSMS.config }
|
7
|
+
|
8
|
+
describe 'api_key' do
|
9
|
+
context 'by_default' do
|
10
|
+
its(:api_key) { should == 'fake_api_key' }
|
11
|
+
end
|
12
|
+
context 'configured via config block' do
|
13
|
+
before do
|
14
|
+
SmartSMS.configure { |c| c.api_key = 'fdswerfsffsdfdvdsrr23432' }
|
15
|
+
end
|
16
|
+
its(:api_key) { should == 'fdswerfsffsdfdvdsrr23432' }
|
17
|
+
after do
|
18
|
+
SmartSMS.configure { |c| c.api_key = 'fake_api_key' }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'api_version' do
|
24
|
+
context 'by_default' do
|
25
|
+
its(:api_version) { should == :v1 }
|
26
|
+
end
|
27
|
+
context 'configured via config block' do
|
28
|
+
before do
|
29
|
+
SmartSMS.configure { |c| c.api_version = :v2 }
|
30
|
+
end
|
31
|
+
its(:api_version) { should == :v2 }
|
32
|
+
after do
|
33
|
+
SmartSMS.configure { |c| c.api_version = :v1 }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe 'template_id' do
|
39
|
+
context 'by_default' do
|
40
|
+
its(:template_id) { should == '2' }
|
41
|
+
end
|
42
|
+
context 'configured via config block' do
|
43
|
+
before do
|
44
|
+
SmartSMS.configure { |c| c.template_id = '1' }
|
45
|
+
end
|
46
|
+
its(:template_id) { should == '1' }
|
47
|
+
after do
|
48
|
+
SmartSMS.configure { |c| c.template_id = '2' }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe 'template_value' do
|
54
|
+
context 'by_default' do
|
55
|
+
its(:template_value) { should == [:code, :company] }
|
56
|
+
end
|
57
|
+
context 'configured via config block' do
|
58
|
+
before do
|
59
|
+
SmartSMS.configure { |c| c.template_value = [:code] }
|
60
|
+
end
|
61
|
+
its(:template_value) { should == [:code] }
|
62
|
+
after do
|
63
|
+
SmartSMS.configure { |c| c.template_value = [:code, :company] }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe 'page_num' do
|
69
|
+
context 'by_default' do
|
70
|
+
its(:page_num) { should == 1 }
|
71
|
+
end
|
72
|
+
context 'configured via config block' do
|
73
|
+
before do
|
74
|
+
SmartSMS.configure { |c| c.page_num = 2 }
|
75
|
+
end
|
76
|
+
its(:page_num) { should == 2 }
|
77
|
+
after do
|
78
|
+
SmartSMS.configure { |c| c.page_num = 1 }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe 'page_size' do
|
84
|
+
context 'by_default' do
|
85
|
+
its(:page_size) { should == 20 }
|
86
|
+
end
|
87
|
+
context 'configured via config block' do
|
88
|
+
before do
|
89
|
+
SmartSMS.configure { |c| c.page_size = 50 }
|
90
|
+
end
|
91
|
+
its(:page_size) { should == 50 }
|
92
|
+
after do
|
93
|
+
SmartSMS.configure { |c| c.page_size = 20 }
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe 'company' do
|
99
|
+
context 'by_default' do
|
100
|
+
its(:company) { should == 'Smart SMS' }
|
101
|
+
end
|
102
|
+
context 'configured via config block' do
|
103
|
+
before do
|
104
|
+
SmartSMS.configure { |c| c.company = 'Edgepeek' }
|
105
|
+
end
|
106
|
+
its(:company) { should == 'Edgepeek' }
|
107
|
+
after do
|
108
|
+
SmartSMS.configure { |c| c.company = 'Smart SMS' }
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe 'expires_in' do
|
114
|
+
context 'by_default' do
|
115
|
+
its(:expires_in) { should == 1.hour }
|
116
|
+
end
|
117
|
+
context 'configured via config block' do
|
118
|
+
before do
|
119
|
+
SmartSMS.configure { |c| c.expires_in = 45.minutes }
|
120
|
+
end
|
121
|
+
its(:expires_in) { should == 45.minutes }
|
122
|
+
after do
|
123
|
+
SmartSMS.configure { |c| c.expires_in = 1.hour }
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe 'default_interval' do
|
129
|
+
context 'by_default' do
|
130
|
+
its(:default_interval) { should == 1.day }
|
131
|
+
end
|
132
|
+
context 'configured via config block' do
|
133
|
+
before do
|
134
|
+
SmartSMS.configure { |c| c.default_interval = 2.day }
|
135
|
+
end
|
136
|
+
its(:default_interval) { should == 2.day }
|
137
|
+
after do
|
138
|
+
SmartSMS.configure { |c| c.default_interval = 1.day }
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
describe 'store_sms_in_local' do
|
144
|
+
context 'by_default' do
|
145
|
+
its(:store_sms_in_local) { should == true }
|
146
|
+
end
|
147
|
+
context 'configured via config block' do
|
148
|
+
before do
|
149
|
+
SmartSMS.configure { |c| c.store_sms_in_local = false }
|
150
|
+
end
|
151
|
+
its(:store_sms_in_local) { should == false }
|
152
|
+
after do
|
153
|
+
SmartSMS.configure { |c| c.store_sms_in_local = true }
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
describe 'verification_code_algorithm' do
|
159
|
+
context 'by_default' do
|
160
|
+
its(:verification_code_algorithm) { should == :simple }
|
161
|
+
end
|
162
|
+
context 'configured via config block' do
|
163
|
+
before do
|
164
|
+
SmartSMS.configure { |c| c.verification_code_algorithm = :middle }
|
165
|
+
end
|
166
|
+
its(:verification_code_algorithm) { should == :middle }
|
167
|
+
after do
|
168
|
+
SmartSMS.configure { |c| c.verification_code_algorithm = :simple }
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# Model
|
2
|
+
class User < ActiveRecord::Base
|
3
|
+
has_sms_verification
|
4
|
+
end
|
5
|
+
|
6
|
+
# Model with customized columns
|
7
|
+
class Account < ActiveRecord::Base
|
8
|
+
has_sms_verification :mobile, :confirmed_at
|
9
|
+
end
|
10
|
+
|
11
|
+
# Migrations
|
12
|
+
class CreateAllTables < ActiveRecord::Migration
|
13
|
+
def self.up
|
14
|
+
create_table(:users) do |t|
|
15
|
+
t.string :phone
|
16
|
+
t.datetime :verified_at
|
17
|
+
end
|
18
|
+
|
19
|
+
create_table(:accounts) do |t|
|
20
|
+
t.string :mobile
|
21
|
+
t.datetime :confirmed_at
|
22
|
+
end
|
23
|
+
|
24
|
+
create_table :smart_sms_messages do |t|
|
25
|
+
t.string :sid
|
26
|
+
t.string :mobile
|
27
|
+
t.datetime :send_time
|
28
|
+
t.text :text
|
29
|
+
t.string :code
|
30
|
+
t.string :send_status
|
31
|
+
t.string :report_status
|
32
|
+
t.string :fee
|
33
|
+
t.datetime :user_receive_time
|
34
|
+
t.text :error_msg
|
35
|
+
t.belongs_to :smsable, polymorphic: true
|
36
|
+
end
|
37
|
+
add_index :smart_sms_messages, :sid
|
38
|
+
add_index :smart_sms_messages, [:smsable_id, :smsable_type]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
ActiveRecord::Migration.verbose = false
|
42
|
+
CreateAllTables.up
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
SmartSMS.configure do |config|
|
4
|
+
config.api_key = 'fake_api_key'
|
5
|
+
config.api_version = :v1
|
6
|
+
config.template_id = '2'
|
7
|
+
config.template_value = [:code, :company]
|
8
|
+
config.page_num = 1
|
9
|
+
config.page_size = 20
|
10
|
+
config.company = 'Smart SMS'
|
11
|
+
config.expires_in = 1.hour
|
12
|
+
config.default_interval = 1.day
|
13
|
+
config.store_sms_in_local = true
|
14
|
+
config.verification_code_algorithm = :simple
|
15
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# require 'rails/all'
|
2
|
+
require 'action_controller/railtie'
|
3
|
+
require 'action_view/railtie'
|
4
|
+
|
5
|
+
require 'fake_app/active_record/config' if defined? ActiveRecord
|
6
|
+
|
7
|
+
# Config
|
8
|
+
app = Class.new(Rails::Application)
|
9
|
+
app.config.secret_token = '3b7cd727ee24e8444053437c36cc66c4'
|
10
|
+
app.config.session_store :cookie_store, key: '_myapp_session'
|
11
|
+
app.config.active_support.deprecation = :log
|
12
|
+
app.config.eager_load = false
|
13
|
+
|
14
|
+
# Rais.root
|
15
|
+
app.config.root = File.dirname(__FILE__)
|
16
|
+
Rails.backtrace_cleaner.remove_silencers!
|
17
|
+
app.initialize!
|
18
|
+
|
19
|
+
# Initializer
|
20
|
+
require 'fake_app/initializers/smart_sms'
|
21
|
+
|
22
|
+
# Model
|
23
|
+
require 'fake_app/active_record/models' if defined? ActiveRecord
|
@@ -0,0 +1,275 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe 'SmartSMS::HasSmsVerification' do
|
5
|
+
let(:user) { User.create phone: '13764071479' }
|
6
|
+
let(:account) { Account.create mobile: '13764071479' }
|
7
|
+
|
8
|
+
context '#verify!' do
|
9
|
+
let(:verification_code) { SmartSMS::VerificationCode.simple }
|
10
|
+
|
11
|
+
describe 'Model User with default columns' do
|
12
|
+
before do
|
13
|
+
3.times { user.deliver_fake_sms }
|
14
|
+
user.deliver_fake_sms verification_code
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'with correct verification_code' do
|
18
|
+
before { user.verify! verification_code }
|
19
|
+
|
20
|
+
it 'should be verified' do
|
21
|
+
expect { user.verify! verification_code }.to be_true
|
22
|
+
expect(user.reload.verified?).to be_true
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should have right verification code' do
|
26
|
+
expect(user.latest_message.code).to eq verification_code
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should have 4 messages' do
|
30
|
+
expect(user.messages.count).to eq 4
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should not be verified by using expired verification code' do
|
34
|
+
user.verified_at = nil
|
35
|
+
user.save
|
36
|
+
expect(user.verify!(user.messages.first.code)).to be_nil
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should be the latest_message' do
|
40
|
+
expect(user.latest_message).to eq user.messages.last
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'with incorrect verification_code' do
|
45
|
+
before { user.verify! 'kfdsfd' }
|
46
|
+
|
47
|
+
it 'should not be verified' do
|
48
|
+
expect(user.verify!('kfdsfd')).to be_nil
|
49
|
+
expect(user.reload.verified?).to be_false
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should not have right verification code' do
|
53
|
+
expect(user.latest_message.code).not_to eq 'kfdsfd'
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should have 4 messages' do
|
57
|
+
expect(user.messages.count).to eq 4
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should not be verified by using expired verification code' do
|
61
|
+
user.verified_at = nil
|
62
|
+
user.save
|
63
|
+
expect(user.verify!(user.messages.first.code)).to be_nil
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should be the latest_message' do
|
67
|
+
expect(user.latest_message).to eq user.messages.last
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe 'Model Account with custom columns' do
|
73
|
+
before do
|
74
|
+
3.times { account.deliver_fake_sms }
|
75
|
+
account.deliver_fake_sms verification_code
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'with correct verification_code' do
|
79
|
+
before { account.verify! verification_code }
|
80
|
+
|
81
|
+
it 'should be verified' do
|
82
|
+
expect { account.verify! verification_code }.to be_true
|
83
|
+
expect(account.reload.verified?).to be_true
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'should have right verification code' do
|
87
|
+
expect(account.latest_message.code).to eq verification_code
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'should have 4 messages' do
|
91
|
+
expect(account.messages.count).to eq 4
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'should not be verified by using expired verification code' do
|
95
|
+
account.confirmed_at = nil
|
96
|
+
account.save
|
97
|
+
expect(account.verify!(account.messages.first.code)).to be_nil
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'should be the latest_message' do
|
101
|
+
expect(account.latest_message).to eq account.messages.last
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'should be the same value for verified_at and confirmed_at' do
|
105
|
+
expect(account.verified_at).to eq account.confirmed_at
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context 'with incorrect verification_code' do
|
110
|
+
before { account.verify! 'kfdsfd' }
|
111
|
+
|
112
|
+
it 'should not be verified' do
|
113
|
+
expect(account.verify!('kfdsfd')).to be_nil
|
114
|
+
expect(account.reload.verified?).to be_false
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'should not have right verification code' do
|
118
|
+
expect(account.latest_message.code).not_to eq 'kfdsfd'
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'should have 4 messages' do
|
122
|
+
expect(account.messages.count).to eq 4
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'should not be verified by using expired verification code' do
|
126
|
+
account.confirmed_at = nil
|
127
|
+
account.save
|
128
|
+
expect(account.verify!(account.messages.first.code)).to be_nil
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'should be the latest_message' do
|
132
|
+
expect(account.latest_message).to eq account.messages.last
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'should be the same value for verified_at and confirmed_at' do
|
136
|
+
expect(account.verified_at).to eq account.confirmed_at
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
context '#verify' do
|
143
|
+
let(:verification_code) { SmartSMS::VerificationCode.simple }
|
144
|
+
|
145
|
+
describe 'Model User with default columns' do
|
146
|
+
before do
|
147
|
+
3.times { user.deliver_fake_sms }
|
148
|
+
user.deliver_fake_sms verification_code
|
149
|
+
end
|
150
|
+
|
151
|
+
context 'with correct verification_code' do
|
152
|
+
before { user.verify verification_code }
|
153
|
+
|
154
|
+
it 'should be verified' do
|
155
|
+
expect { user.verify verification_code }.to be_true
|
156
|
+
expect(user.reload.verified?).to be_false
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'should have right verification code' do
|
160
|
+
expect(user.latest_message.code).to eq verification_code
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'should have 4 messages' do
|
164
|
+
expect(user.messages.count).to eq 4
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'should not be verified by using expired verification code' do
|
168
|
+
user.verified_at = nil
|
169
|
+
user.save
|
170
|
+
expect(user.verify(user.messages.first.code)).to be_false
|
171
|
+
end
|
172
|
+
|
173
|
+
it 'should be the latest_message' do
|
174
|
+
expect(user.latest_message).to eq user.messages.last
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
context 'with incorrect verification_code' do
|
179
|
+
before { user.verify 'kfdsfd' }
|
180
|
+
|
181
|
+
it 'should not be verified' do
|
182
|
+
expect(user.verify('kfdsfd')).to be_false
|
183
|
+
expect(user.reload.verified?).to be_false
|
184
|
+
end
|
185
|
+
|
186
|
+
it 'should not have right verification code' do
|
187
|
+
expect(user.latest_message.code).not_to eq 'kfdsfd'
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'should have 4 messages' do
|
191
|
+
expect(user.messages.count).to eq 4
|
192
|
+
end
|
193
|
+
|
194
|
+
it 'should not be verified by using expired verification code' do
|
195
|
+
user.verified_at = nil
|
196
|
+
user.save
|
197
|
+
expect(user.verify(user.messages.first.code)).to be_false
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'should be the latest_message' do
|
201
|
+
expect(user.latest_message).to eq user.messages.last
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
describe 'Model Account with custom columns' do
|
207
|
+
before do
|
208
|
+
3.times { account.deliver_fake_sms }
|
209
|
+
account.deliver_fake_sms verification_code
|
210
|
+
end
|
211
|
+
|
212
|
+
context 'with correct verification_code' do
|
213
|
+
before { account.verify verification_code }
|
214
|
+
|
215
|
+
it 'should be verified' do
|
216
|
+
expect { account.verify verification_code }.to be_true
|
217
|
+
expect(account.reload.verified?).to be_false
|
218
|
+
end
|
219
|
+
|
220
|
+
it 'should have right verification code' do
|
221
|
+
expect(account.latest_message.code).to eq verification_code
|
222
|
+
end
|
223
|
+
|
224
|
+
it 'should have 4 messages' do
|
225
|
+
expect(account.messages.count).to eq 4
|
226
|
+
end
|
227
|
+
|
228
|
+
it 'should not be verified by using expired verification code' do
|
229
|
+
account.confirmed_at = nil
|
230
|
+
account.save
|
231
|
+
expect(user.verify(account.messages.first.code)).to be_false
|
232
|
+
end
|
233
|
+
|
234
|
+
it 'should be the latest_message' do
|
235
|
+
expect(account.latest_message).to eq account.messages.last
|
236
|
+
end
|
237
|
+
|
238
|
+
it 'should be the same value for verified_at and confirmed_at' do
|
239
|
+
expect(account.verified_at).to eq account.confirmed_at
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
context 'with incorrect verification_code' do
|
244
|
+
before { account.verify 'kfdsfd' }
|
245
|
+
|
246
|
+
it 'should not be verified' do
|
247
|
+
expect(account.verify('kfdsfd')).to be_false
|
248
|
+
expect(account.reload.verified?).to be_false
|
249
|
+
end
|
250
|
+
|
251
|
+
it 'should not have right verification code' do
|
252
|
+
expect(account.latest_message.code).not_to eq 'kfdsfd'
|
253
|
+
end
|
254
|
+
|
255
|
+
it 'should have 4 messages' do
|
256
|
+
expect(account.messages.count).to eq 4
|
257
|
+
end
|
258
|
+
|
259
|
+
it 'should not be verified by using expired verification code' do
|
260
|
+
account.confirmed_at = nil
|
261
|
+
account.save
|
262
|
+
expect(account.verify(account.messages.first.code)).to be_false
|
263
|
+
end
|
264
|
+
|
265
|
+
it 'should be the latest_message' do
|
266
|
+
expect(account.latest_message).to eq account.messages.last
|
267
|
+
end
|
268
|
+
|
269
|
+
it 'should be the same value for verified_at and confirmed_at' do
|
270
|
+
expect(account.verified_at).to eq account.confirmed_at
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|