soteria 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +21 -0
- data/README.md +77 -0
- data/Rakefile +5 -0
- data/bin/bundler +17 -0
- data/bin/console +17 -0
- data/bin/htmldiff +17 -0
- data/bin/ldiff +17 -0
- data/bin/nokogiri +17 -0
- data/bin/rackup +17 -0
- data/bin/rake +17 -0
- data/bin/rspec +17 -0
- data/bin/setup +17 -0
- data/bin/socksify_ruby +17 -0
- data/lib/soteria.rb +10 -0
- data/lib/soteria/client.rb +326 -0
- data/lib/soteria/credential.rb +154 -0
- data/lib/soteria/credential_types.rb +13 -0
- data/lib/soteria/push.rb +141 -0
- data/lib/soteria/sms.rb +81 -0
- data/lib/soteria/user.rb +409 -0
- data/lib/soteria/utilities.rb +45 -0
- data/lib/soteria/version.rb +4 -0
- data/soteria.gemspec +26 -0
- data/spec/credential_spec.rb +121 -0
- data/spec/fixtures/credential/authenticate_credentials_response.xml +13 -0
- data/spec/fixtures/credential/credential_fail.xml +11 -0
- data/spec/fixtures/credential/credential_success.xml +12 -0
- data/spec/fixtures/credential/get_cred_info_response.xml +40 -0
- data/spec/fixtures/credential/get_server_time_response.xml +11 -0
- data/spec/fixtures/credential/register_sms_response.xml +12 -0
- data/spec/fixtures/push/authenticate_with_push_error.xml +9 -0
- data/spec/fixtures/push/authenticate_with_push_response.xml +14 -0
- data/spec/fixtures/sms/check_otp_success_response.xml +13 -0
- data/spec/fixtures/sms/send_sms_success_response.xml +10 -0
- data/spec/fixtures/user/add_credential_response.xml +9 -0
- data/spec/fixtures/user/clear_temp_password_response.xml +10 -0
- data/spec/fixtures/user/clear_user_pin_response.xml +10 -0
- data/spec/fixtures/user/create_user_response.xml +9 -0
- data/spec/fixtures/user/delete_user_response.xml +10 -0
- data/spec/fixtures/user/get_temp_pass_attr_response.xml +14 -0
- data/spec/fixtures/user/remove_credential_response.xml +10 -0
- data/spec/fixtures/user/set_temp_pass_attr_response.xml +10 -0
- data/spec/fixtures/user/set_temp_pass_response.xml +11 -0
- data/spec/fixtures/user/update_credential_response.xml +10 -0
- data/spec/fixtures/user/update_user_response.xml +10 -0
- data/spec/fixtures/wsdl/vipuserservices-1.7.xsd +1015 -0
- data/spec/fixtures/wsdl/vipuserservices-auth-1.7.wsdl +155 -0
- data/spec/fixtures/wsdl/vipuserservices-mgmt-1.7.wsdl +246 -0
- data/spec/fixtures/wsdl/vipuserservices-query-1.7.wsdl +114 -0
- data/spec/push_spec.rb +148 -0
- data/spec/sms_spec.rb +84 -0
- data/spec/soteria_spec.rb +8 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/user_spec.rb +245 -0
- metadata +206 -0
data/spec/push_spec.rb
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'savon/mock/spec_helper'
|
3
|
+
|
4
|
+
describe Soteria::Push do
|
5
|
+
|
6
|
+
include Savon::SpecHelper
|
7
|
+
|
8
|
+
before :all do
|
9
|
+
savon.mock!
|
10
|
+
|
11
|
+
@push = Soteria::Push.new
|
12
|
+
|
13
|
+
auth_client_wsdl = File.read('spec/fixtures/wsdl/vipuserservices-auth-1.7.wsdl')
|
14
|
+
@auth_client = Savon.client(wsdl: auth_client_wsdl)
|
15
|
+
|
16
|
+
query_client_wsdl = File.read('spec/fixtures/wsdl/vipuserservices-query-1.7.wsdl')
|
17
|
+
@query_client = Savon.client(wsdl: query_client_wsdl)
|
18
|
+
end
|
19
|
+
|
20
|
+
after :all do
|
21
|
+
savon.unmock!
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'sends the push with success' do
|
25
|
+
body = File.read('spec/fixtures/push/authenticate_with_push_response.xml')
|
26
|
+
savon.expects(:authenticate_user_with_push).with(message: :any).returns(body)
|
27
|
+
res = @push.send_push(@auth_client, '', nil)
|
28
|
+
|
29
|
+
expect(res[:id]).to eq 'send_push_request_20161021152920'
|
30
|
+
expect(res[:success]).to eq true
|
31
|
+
expect(res[:transaction_id]).to eq '8d70d18461cc9093'
|
32
|
+
expect(res[:message]).to eq 'Mobile push request sent'
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'sends the push with failure' do
|
37
|
+
body = File.read('spec/fixtures/push/authenticate_with_push_error.xml')
|
38
|
+
savon.expects(:authenticate_user_with_push).with(message: :any).returns(body)
|
39
|
+
res = @push.send_push(@auth_client, '', nil)
|
40
|
+
|
41
|
+
expect(res[:id]).to eq 'send_push_request_20161021152920'
|
42
|
+
expect(res[:success]).to eq false
|
43
|
+
expect(res[:transaction_id]).to eq nil
|
44
|
+
expect(res[:message]).to eq 'User does not exist.'
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'polls for a response' do
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'with no additional options passed' do
|
53
|
+
|
54
|
+
it 'forms the request body with only required fields' do
|
55
|
+
result_hash = @push.get_push_request_body('test_user', nil)
|
56
|
+
result_hash[:'vip:requestId'] = nil
|
57
|
+
|
58
|
+
expected_hash = {
|
59
|
+
'vip:requestId': nil,
|
60
|
+
'vip:userId': 'test_user',
|
61
|
+
'vip:pushAuthData': ''
|
62
|
+
}
|
63
|
+
|
64
|
+
expect(result_hash).to match expected_hash
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'with title and message passed' do
|
70
|
+
|
71
|
+
it 'forms the request body with required fields and title and message' do
|
72
|
+
options = {title: 'push title', message: 'this is a test push'}
|
73
|
+
result_hash = @push.get_push_request_body('test_user', options)
|
74
|
+
result_hash[:'vip:requestId'] = nil
|
75
|
+
|
76
|
+
expected_hash = {
|
77
|
+
'vip:requestId': nil,
|
78
|
+
'vip:userId': 'test_user',
|
79
|
+
'vip:pushAuthData': {
|
80
|
+
'vip:displayParameters': [
|
81
|
+
{'vip:Key': 'display.message.title', 'vip:Value': options[:title]},
|
82
|
+
{'vip:Key': 'display.message.text', 'vip:Value': options[:message]}
|
83
|
+
]
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
expect(result_hash).to match expected_hash
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'with a timeout and no title or message' do
|
93
|
+
|
94
|
+
it 'forms the request body with required fields and timeout' do
|
95
|
+
options = {time_out: 120}
|
96
|
+
|
97
|
+
result_hash = @push.get_push_request_body('test_user', options)
|
98
|
+
result_hash[:'vip:requestId'] = nil
|
99
|
+
|
100
|
+
expected_hash = {
|
101
|
+
'vip:requestId': nil,
|
102
|
+
'vip:userId': 'test_user',
|
103
|
+
'vip:pushAuthData': {
|
104
|
+
'vip:displayParameters': [],
|
105
|
+
'vip:requestParameters':
|
106
|
+
{
|
107
|
+
'vip:Key': 'request.timeout',
|
108
|
+
'vip:Value': options[:time_out]
|
109
|
+
}
|
110
|
+
}
|
111
|
+
}
|
112
|
+
|
113
|
+
expect(result_hash).to match expected_hash
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
context 'with a timeout and a title and a message' do
|
119
|
+
|
120
|
+
it 'forms the request body with required fields along with the title, message and timeout' do
|
121
|
+
options = {time_out: 120, title: 'push title', message: 'this is a test push'}
|
122
|
+
|
123
|
+
result_hash = @push.get_push_request_body('test_user', options)
|
124
|
+
result_hash[:'vip:requestId'] = nil
|
125
|
+
|
126
|
+
expected_hash = {
|
127
|
+
'vip:requestId': nil,
|
128
|
+
'vip:userId': 'test_user',
|
129
|
+
'vip:pushAuthData': {
|
130
|
+
'vip:displayParameters': [
|
131
|
+
{'vip:Key': 'display.message.title', 'vip:Value': options[:title]},
|
132
|
+
{'vip:Key': 'display.message.text', 'vip:Value': options[:message]}
|
133
|
+
],
|
134
|
+
'vip:requestParameters':
|
135
|
+
{
|
136
|
+
'vip:Key': 'request.timeout',
|
137
|
+
'vip:Value': options[:time_out]
|
138
|
+
}
|
139
|
+
}
|
140
|
+
}
|
141
|
+
|
142
|
+
expect(result_hash).to match expected_hash
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
data/spec/sms_spec.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'savon/mock/spec_helper'
|
3
|
+
|
4
|
+
describe Soteria::SMS do
|
5
|
+
|
6
|
+
include Savon::SpecHelper
|
7
|
+
|
8
|
+
before :all do
|
9
|
+
savon.mock!
|
10
|
+
|
11
|
+
@sms = Soteria::SMS.new
|
12
|
+
|
13
|
+
auth_client_wsdl = File.read('spec/fixtures/wsdl/vipuserservices-auth-1.7.wsdl')
|
14
|
+
@auth_client = Savon.client(wsdl: auth_client_wsdl)
|
15
|
+
|
16
|
+
mgmt_client_wsdl = File.read('spec/fixtures/wsdl/vipuserservices-mgmt-1.7.wsdl')
|
17
|
+
@mgmt_client = Savon.client(wsdl: mgmt_client_wsdl)
|
18
|
+
end
|
19
|
+
|
20
|
+
after :all do
|
21
|
+
savon.unmock!
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'creates the request body to send an sms' do
|
25
|
+
result_hash = @sms.create_send_sms_body('test1', 123456789)
|
26
|
+
result_hash[:'vip:requestId'] = nil
|
27
|
+
|
28
|
+
expected_hash = {
|
29
|
+
'vip:requestId': nil,
|
30
|
+
'vip:userId': 'test1',
|
31
|
+
'vip:smsDeliveryInfo':
|
32
|
+
{
|
33
|
+
'vip:phoneNumber': 123456789
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
expect(result_hash). to match expected_hash
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'creates the request body to check an otp' do
|
41
|
+
result_hash = @sms.create_check_otp_body('test1', 'otp123')
|
42
|
+
result_hash[:'vip:requestId'] = nil
|
43
|
+
|
44
|
+
expected_hash = {
|
45
|
+
'vip:requestId': nil,
|
46
|
+
'vip:userId': 'test1',
|
47
|
+
'vip:otpAuthData':
|
48
|
+
{
|
49
|
+
'vip:otp': 'otp123'
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
expect(result_hash). to match expected_hash
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'sends a sms otp' do
|
57
|
+
body = File.read('spec/fixtures/sms/send_sms_success_response.xml')
|
58
|
+
savon.expects(:send_otp).with(message: :any).returns(body)
|
59
|
+
result_hash = @sms.send_sms(@mgmt_client, '', '')
|
60
|
+
|
61
|
+
expected_hash = {
|
62
|
+
success: true,
|
63
|
+
id: 'test123',
|
64
|
+
message: 'Success'
|
65
|
+
}
|
66
|
+
|
67
|
+
expect(result_hash). to match expected_hash
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'checks if a otp is valid' do
|
71
|
+
body = File.read('spec/fixtures/sms/check_otp_success_response.xml')
|
72
|
+
savon.expects(:check_otp).with(message: :any).returns(body)
|
73
|
+
result_hash = @sms.check_otp(@auth_client, '', '')
|
74
|
+
|
75
|
+
expected_hash = {
|
76
|
+
success: true,
|
77
|
+
id: 'test123',
|
78
|
+
message: 'Success'
|
79
|
+
}
|
80
|
+
|
81
|
+
expect(result_hash). to match expected_hash
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
data/spec/spec_helper.rb
ADDED
data/spec/user_spec.rb
ADDED
@@ -0,0 +1,245 @@
|
|
1
|
+
require_relative '../lib/soteria/user'
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'savon/mock/spec_helper'
|
4
|
+
require 'date'
|
5
|
+
|
6
|
+
describe Soteria::User do
|
7
|
+
# include the helper module
|
8
|
+
include Savon::SpecHelper
|
9
|
+
|
10
|
+
before :all do
|
11
|
+
savon.mock!
|
12
|
+
|
13
|
+
@user = Soteria::User.new
|
14
|
+
@mgmt_client = Savon.client(wsdl: File.read("spec/fixtures/wsdl/vipuserservices-mgmt-1.7.wsdl"))
|
15
|
+
@query_client = Savon.client(wsdl: File.read("spec/fixtures/wsdl/vipuserservices-query-1.7.wsdl"))
|
16
|
+
end
|
17
|
+
|
18
|
+
after :all do
|
19
|
+
savon.unmock!
|
20
|
+
end
|
21
|
+
context 'makes a hash with the right return values' do
|
22
|
+
it 'makes a hash when the call succeed' do
|
23
|
+
h = {status: '0000', status_message: 'Success', request_id: 'test1234'}
|
24
|
+
res = @user.get_return_hash(h)
|
25
|
+
expect(res[:success]).to eq true
|
26
|
+
expect(res[:message]).to eq 'Success'
|
27
|
+
expect(res[:id]).to eq 'test1234'
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'makes a hash when the call has errors' do
|
31
|
+
h = {status: '6002', status_message: 'User already exists.', request_id: 'test1234'}
|
32
|
+
res = @user.get_return_hash(h)
|
33
|
+
expect(res[:success]).to eq false
|
34
|
+
expect(res[:message]).to eq 'User already exists.'
|
35
|
+
expect(res[:id]).to eq 'test1234'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'creates a user' do
|
40
|
+
body = File.read("spec/fixtures/user/create_user_response.xml")
|
41
|
+
savon.expects(:create_user).with(message: :any).returns(body)
|
42
|
+
res = @user.create(@mgmt_client, '', nil)
|
43
|
+
|
44
|
+
expect(res[:success]).to be true
|
45
|
+
expect(res[:message]).to eq 'Success'
|
46
|
+
expect(res[:id]).to eq 'test1234'
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'deletes a user' do
|
50
|
+
body = File.read("spec/fixtures/user/delete_user_response.xml")
|
51
|
+
savon.expects(:delete_user).with(message: :any).returns(body)
|
52
|
+
res = @user.delete(@mgmt_client, '')
|
53
|
+
|
54
|
+
expect(res[:success]).to be true
|
55
|
+
expect(res[:message]).to eq 'Success'
|
56
|
+
expect(res[:id]).to eq 'test1234'
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'adds a credential to a user' do
|
60
|
+
|
61
|
+
body = File.read("spec/fixtures/user/add_credential_response.xml")
|
62
|
+
savon.expects(:add_credential).with(message: :any).returns(body)
|
63
|
+
res = @user.add_credential(@mgmt_client, '', '', '', nil)
|
64
|
+
|
65
|
+
expect(res[:success]).to be true
|
66
|
+
expect(res[:message]).to eq 'Success'
|
67
|
+
expect(res[:id]).to eq '4ACCDv2rtj'
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'gets the request body for adding a credential' do
|
72
|
+
|
73
|
+
it 'gets the body with no options' do
|
74
|
+
result_hash = @user.get_add_credential_message('user1', 'credential', 'STANDARD_OTP', nil)
|
75
|
+
|
76
|
+
result_hash[:'vip:requestId'] = nil
|
77
|
+
|
78
|
+
expected_hash = {
|
79
|
+
'vip:requestId': nil,
|
80
|
+
'vip:userId': 'user1',
|
81
|
+
'vip:credentialDetail': {
|
82
|
+
'vip:credentialId': 'credential',
|
83
|
+
'vip:credentialType': 'STANDARD_OTP'
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
expect(result_hash).to match expected_hash
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'gets the body with a friendly name and otp' do
|
92
|
+
|
93
|
+
options = {name: 'testCredential', otp: '123456'}
|
94
|
+
result_hash = @user.get_add_credential_message('user1', 'credential', 'STANDARD_OTP', options)
|
95
|
+
|
96
|
+
# TODO: this is a hack until we mock the utilities class to set the request id
|
97
|
+
result_hash[:'vip:requestId'] = nil
|
98
|
+
|
99
|
+
expected_hash = {
|
100
|
+
'vip:requestId': nil,
|
101
|
+
'vip:userId': 'user1',
|
102
|
+
'vip:otpAuthData': {
|
103
|
+
'vip:otp': '123456'
|
104
|
+
},
|
105
|
+
'vip:credentialDetail': {
|
106
|
+
'vip:credentialId': 'credential',
|
107
|
+
'vip:credentialType': 'STANDARD_OTP',
|
108
|
+
'vip:friendlyName': 'testCredential'
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
expect(result_hash).to match expected_hash
|
113
|
+
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'removes a credential from a user' do
|
117
|
+
|
118
|
+
body = File.read("spec/fixtures/user/remove_credential_response.xml")
|
119
|
+
savon.expects(:remove_credential).with(message: :any).returns(body)
|
120
|
+
|
121
|
+
result_hash = @user.remove_credential(@mgmt_client, '', '', '')
|
122
|
+
|
123
|
+
expected_hash = {
|
124
|
+
success: true,
|
125
|
+
message: 'Success',
|
126
|
+
id: '1234abcd'
|
127
|
+
}
|
128
|
+
|
129
|
+
expect(result_hash).to match expected_hash
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'updates a user' do
|
134
|
+
body = File.read("spec/fixtures/user/update_user_response.xml")
|
135
|
+
savon.expects(:update_user).with(message: :any).returns(body)
|
136
|
+
|
137
|
+
result_hash = @user.update_user(@mgmt_client, '', nil)
|
138
|
+
|
139
|
+
expected_hash = {
|
140
|
+
success: true,
|
141
|
+
message: 'Success',
|
142
|
+
id: '123456'
|
143
|
+
}
|
144
|
+
|
145
|
+
expect(result_hash).to match expected_hash
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'clears a users pin' do
|
149
|
+
body = File.read("spec/fixtures/user/clear_user_pin_response.xml")
|
150
|
+
savon.expects(:clear_user_pin).with(message: :any).returns(body)
|
151
|
+
|
152
|
+
result_hash = @user.clear_user_pin(@mgmt_client, '')
|
153
|
+
|
154
|
+
expected_hash = {
|
155
|
+
success: true,
|
156
|
+
message: 'Success',
|
157
|
+
id: '123edabc'
|
158
|
+
}
|
159
|
+
|
160
|
+
expect(result_hash).to match expected_hash
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'sets temporary password attributes' do
|
164
|
+
body = File.read("spec/fixtures/user/set_temp_pass_attr_response.xml")
|
165
|
+
savon.expects(:set_temporary_password_attributes).with(message: :any).returns(body)
|
166
|
+
|
167
|
+
result_hash = @user.set_temp_pass_attr(@mgmt_client, '', nil)
|
168
|
+
|
169
|
+
expected_hash = {
|
170
|
+
success: true,
|
171
|
+
message: 'Success',
|
172
|
+
id: 'KSOfaUFH52'
|
173
|
+
}
|
174
|
+
|
175
|
+
expect(result_hash).to match expected_hash
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'gets temporary password attributes' do
|
179
|
+
body = File.read("spec/fixtures/user/get_temp_pass_attr_response.xml")
|
180
|
+
savon.expects(:get_temporary_password_attributes).with(message: :any).returns(body)
|
181
|
+
|
182
|
+
result_hash = @user.get_temp_pass_attr(@query_client, '')
|
183
|
+
|
184
|
+
expected_hash = {
|
185
|
+
success: true,
|
186
|
+
message: 'Success',
|
187
|
+
id: '123456',
|
188
|
+
oneTime: true,
|
189
|
+
expiration: Date.parse('2011-04-08T08:17:50.000Z')
|
190
|
+
}
|
191
|
+
|
192
|
+
expect(result_hash).to match expected_hash
|
193
|
+
end
|
194
|
+
|
195
|
+
it 'sets a temporary password' do
|
196
|
+
body = File.read("spec/fixtures/user/set_temp_pass_response.xml")
|
197
|
+
savon.expects(:set_temporary_password).with(message: :any).returns(body)
|
198
|
+
|
199
|
+
result_hash = @user.set_temp_password(@mgmt_client, '', '', nil)
|
200
|
+
|
201
|
+
expected_hash = {
|
202
|
+
success: true,
|
203
|
+
message: 'Success',
|
204
|
+
id: '1234abcd',
|
205
|
+
password: '321345'
|
206
|
+
}
|
207
|
+
|
208
|
+
expect(result_hash).to match expected_hash
|
209
|
+
end
|
210
|
+
|
211
|
+
it 'clears a temporary password' do
|
212
|
+
body = File.read("spec/fixtures/user/clear_temp_password_response.xml")
|
213
|
+
savon.expects(:clear_temporary_password).with(message: :any).returns(body)
|
214
|
+
|
215
|
+
result_hash = @user.clear_temp_pass(@mgmt_client, '')
|
216
|
+
|
217
|
+
expected_hash = {
|
218
|
+
success: true,
|
219
|
+
message: 'Success',
|
220
|
+
id: '0HaNgjq7z9'
|
221
|
+
}
|
222
|
+
|
223
|
+
expect(result_hash).to match expected_hash
|
224
|
+
end
|
225
|
+
|
226
|
+
it 'updates a users credential' do
|
227
|
+
|
228
|
+
body = File.read("spec/fixtures/user/update_credential_response.xml")
|
229
|
+
savon.expects(:update_credential).with(message: :any).returns(body)
|
230
|
+
|
231
|
+
result_hash = @user.update_credential(@mgmt_client, '', '', '', '')
|
232
|
+
|
233
|
+
expected_hash = {
|
234
|
+
success: true,
|
235
|
+
message: 'Success',
|
236
|
+
id: '6dtFnd3qpK'
|
237
|
+
}
|
238
|
+
|
239
|
+
expect(result_hash).to match expected_hash
|
240
|
+
|
241
|
+
end
|
242
|
+
|
243
|
+
end
|
244
|
+
|
245
|
+
end
|