action_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.
- data/.gitignore +3 -3
- data/Gemfile +4 -0
- data/README.markdown +141 -8
- data/Rakefile +2 -38
- data/action_sms.gemspec +16 -42
- data/lib/action_sms/base.rb +113 -3
- data/lib/action_sms/connection_adapters.rb +4 -1
- data/lib/action_sms/connection_adapters/abstract_adapter.rb +45 -3
- data/lib/action_sms/connection_adapters/sms_global_adapter.rb +76 -0
- data/lib/action_sms/connection_adapters/test_helpers/sms_global.rb +68 -0
- data/lib/action_sms/connection_adapters/test_helpers/tropo.rb +67 -0
- data/lib/action_sms/connection_adapters/tropo_adapter.rb +73 -0
- data/lib/action_sms/version.rb +4 -0
- data/lib/generators/action_sms/initializer/initializer_generator.rb +29 -2
- data/lib/generators/action_sms/initializer/templates/action_sms.rb +28 -8
- data/spec/base_spec.rb +649 -0
- data/spec/connection_adapters/abstract_adapter_spec.rb +58 -0
- data/spec/connection_adapters/sms_global_adapter_spec.rb +259 -0
- data/spec/connection_adapters/test_helpers/sms_global_spec.rb +204 -0
- data/spec/connection_adapters/test_helpers/tropo_spec.rb +135 -0
- data/spec/connection_adapters/tropo_adapter_spec.rb +198 -0
- data/spec/spec_helper.rb +6 -0
- data/todo +0 -2
- metadata +39 -14
- data/VERSION +0 -1
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActionSms::ConnectionAdapters::AbstractAdapter do
|
4
|
+
let(:adapter) { ActionSms::ConnectionAdapters::AbstractAdapter.new }
|
5
|
+
|
6
|
+
# Interesting methods
|
7
|
+
|
8
|
+
describe "#authenticate" do
|
9
|
+
let (:request_params) { {} }
|
10
|
+
context "the incoming message's 'authentication_key' query parameter value is the same as the adapter's authentication key" do
|
11
|
+
before do
|
12
|
+
adapter.authentication_key = "my_secret_key"
|
13
|
+
request_params["authentication_key"] = "my_secret_key"
|
14
|
+
end
|
15
|
+
it "should not be nil" do
|
16
|
+
adapter.authenticate(request_params).should_not be_nil
|
17
|
+
end
|
18
|
+
it "should remove the key from the request params hash" do
|
19
|
+
adapter.authenticate(request_params)
|
20
|
+
request_params["userfield"].should be_nil
|
21
|
+
end
|
22
|
+
end
|
23
|
+
context "the incoming message's 'authentication_key' query parameter value is different from the adapter's authentication key" do
|
24
|
+
before do
|
25
|
+
request_params["authentication_key"] = "invalid_key"
|
26
|
+
end
|
27
|
+
it "should return nil" do
|
28
|
+
adapter.authenticate(request_params).should be_nil
|
29
|
+
end
|
30
|
+
it "should not remove the key from the request params hash" do
|
31
|
+
adapter.authenticate(request_params)
|
32
|
+
request_params["authentication_key"].should_not be_nil
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#authentication_key" do
|
38
|
+
it "should set the authentication key" do
|
39
|
+
adapter.authentication_key = "my_secret_key"
|
40
|
+
adapter.authentication_key.should == "my_secret_key"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#configuration" do
|
45
|
+
it "should set the configuration" do
|
46
|
+
adapter.configuration = {:config_key => "some config value"}
|
47
|
+
adapter.configuration.should == {:config_key => "some config value"}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "#use_ssl" do
|
52
|
+
it "it should use ssl" do
|
53
|
+
adapter.use_ssl = true
|
54
|
+
adapter.use_ssl.should == true
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
@@ -0,0 +1,259 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActionSms::ConnectionAdapters::SMSGlobalAdapter do
|
4
|
+
let(:adapter) { ActionSms::ConnectionAdapters::SMSGlobalAdapter.new }
|
5
|
+
|
6
|
+
describe "#deliver" do
|
7
|
+
let(:sms) { mock("sms").as_null_object }
|
8
|
+
before do
|
9
|
+
adapter.stub!(:send_http_request)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should try to send the sms to the correct url" do
|
13
|
+
adapter.should_receive(:send_http_request).with(
|
14
|
+
"http://smsglobal.com.au/http-api.php",
|
15
|
+
anything
|
16
|
+
)
|
17
|
+
adapter.deliver(sms)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should try to send the sms with the correct 'action' value" do
|
21
|
+
adapter.should_receive(:send_http_request).with(
|
22
|
+
anything,
|
23
|
+
hash_including(:action => "sendsms")
|
24
|
+
)
|
25
|
+
adapter.deliver(sms)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should try to send the sms with the 'user' configuration value" do
|
29
|
+
adapter.should_receive(:send_http_request).with(
|
30
|
+
anything,
|
31
|
+
hash_including(:user)
|
32
|
+
)
|
33
|
+
adapter.deliver(sms)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should try to send the sms with the 'password' configuration value" do
|
37
|
+
adapter.should_receive(:send_http_request).with(
|
38
|
+
anything,
|
39
|
+
hash_including(:password)
|
40
|
+
)
|
41
|
+
adapter.deliver(sms)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should try to send the sms with the correct 'maxsplit' value" do
|
45
|
+
adapter.should_receive(:send_http_request).with(
|
46
|
+
anything,
|
47
|
+
hash_including(:maxsplit => "19")
|
48
|
+
)
|
49
|
+
adapter.deliver(sms)
|
50
|
+
end
|
51
|
+
|
52
|
+
context "sms' responds to '#from'" do
|
53
|
+
before do
|
54
|
+
sms.stub!(:from).and_return("anybody")
|
55
|
+
end
|
56
|
+
it "should try to send the sms with the result from 'sms#from'" do
|
57
|
+
adapter.should_receive(:send_http_request).with(
|
58
|
+
anything,
|
59
|
+
hash_including(:from => "anybody")
|
60
|
+
)
|
61
|
+
adapter.deliver(sms)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context "sms does not respond to '#from'" do
|
66
|
+
before do
|
67
|
+
sms.stub!(:respond_to?).and_return(false)
|
68
|
+
end
|
69
|
+
it "should try to send the sms with 'from' set to 'reply2email'" do
|
70
|
+
adapter.should_receive(:send_http_request).with(
|
71
|
+
anything,
|
72
|
+
hash_including(:from => "reply2email")
|
73
|
+
)
|
74
|
+
adapter.deliver(sms)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should try to send the sms with the result from 'sms#recipient'" do
|
79
|
+
adapter.should_receive(:send_http_request).with(
|
80
|
+
anything,
|
81
|
+
hash_including(:to)
|
82
|
+
)
|
83
|
+
adapter.deliver(sms)
|
84
|
+
end
|
85
|
+
|
86
|
+
context "sms#body is not nil" do
|
87
|
+
it "should try to send the sms with the sms' body" do
|
88
|
+
adapter.should_receive(:send_http_request).with(
|
89
|
+
anything,
|
90
|
+
hash_including(:text)
|
91
|
+
)
|
92
|
+
adapter.deliver(sms)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context "sms#body is nil" do
|
97
|
+
before do
|
98
|
+
sms.stub!(:body).and_return(nil)
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should try to send the sms with blank text" do
|
102
|
+
adapter.should_receive(:send_http_request).with(
|
103
|
+
anything,
|
104
|
+
hash_including(:text => "")
|
105
|
+
)
|
106
|
+
adapter.deliver(sms)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context "sms responds to #userfield" do
|
111
|
+
it "should try to send the sms with the result from 'sms#userfield'" do
|
112
|
+
adapter.should_receive(:send_http_request).with(
|
113
|
+
anything,
|
114
|
+
hash_including(:userfield)
|
115
|
+
)
|
116
|
+
adapter.deliver(sms)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
context "sms does not respond to #userfield" do
|
121
|
+
before do
|
122
|
+
sms.stub!(:respond_to?).and_return(false)
|
123
|
+
end
|
124
|
+
it "should try to send the sms with the 'userfield' parameter" do
|
125
|
+
adapter.should_receive(:send_http_request).with(
|
126
|
+
anything,
|
127
|
+
hash_not_including(:userfield)
|
128
|
+
)
|
129
|
+
adapter.deliver(sms)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
describe "#delivery_request_successful?" do
|
135
|
+
context "the gateway response was successful" do
|
136
|
+
let (:delivery_response) {
|
137
|
+
"OK: 0; Sent queued message ID: 86b1a945370734f4 SMSGlobalMsgID: 6942744494999745"
|
138
|
+
}
|
139
|
+
it "should not return nil" do
|
140
|
+
adapter.delivery_request_successful?(delivery_response).should_not be_nil
|
141
|
+
end
|
142
|
+
end
|
143
|
+
context "the gateway response was not successful" do
|
144
|
+
let (:delivery_response) { "ERROR: No action requested" }
|
145
|
+
it "should return nil" do
|
146
|
+
adapter.delivery_request_successful?(delivery_response).should be_nil
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
describe "#message_id" do
|
152
|
+
context "argument is a String" do
|
153
|
+
context "and includes an SMSGlobal message id" do
|
154
|
+
it "should return the message id with an SMSGlobal prefix" do
|
155
|
+
adapter.message_id("Blah blah blah SMSGlobalMsgID: 123556blah").should == "SMSGlobalMsgID:123556"
|
156
|
+
end
|
157
|
+
end
|
158
|
+
context "but does not include an SMSGlobal message id" do
|
159
|
+
it "should return nil" do
|
160
|
+
adapter.message_id("Blah blah blah SMSGlobalMsID: 123556blah").should be_nil
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
context "argument is a Hash" do
|
165
|
+
context "that includes an SMSGlobal message id" do
|
166
|
+
it "should return the message id with the SMSGlobal prefix" do
|
167
|
+
adapter.message_id(
|
168
|
+
{
|
169
|
+
"msgid" => "12345"
|
170
|
+
}
|
171
|
+
).should == "SMSGlobalMsgID:12345"
|
172
|
+
end
|
173
|
+
end
|
174
|
+
context "that does not include an SMSGlobal message id" do
|
175
|
+
it "should return nil" do
|
176
|
+
adapter.message_id(
|
177
|
+
{
|
178
|
+
"something" => "12345"
|
179
|
+
}
|
180
|
+
).should be_nil
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
describe "#message_text" do
|
187
|
+
let (:request_params) { {} }
|
188
|
+
context "given valid incoming message request params" do
|
189
|
+
before do
|
190
|
+
request_params["msg"] = "ANYTHING"
|
191
|
+
end
|
192
|
+
it "should return the message" do
|
193
|
+
adapter.message_text(request_params).should_not be_nil
|
194
|
+
end
|
195
|
+
end
|
196
|
+
context "given invalid incoming message request params" do
|
197
|
+
it "should return nil" do
|
198
|
+
adapter.message_text(request_params).should be_nil
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
describe "#sender" do
|
204
|
+
let (:request_params) { {} }
|
205
|
+
context "given valid incoming message request params" do
|
206
|
+
before do
|
207
|
+
request_params["from"] = "ANYTHING"
|
208
|
+
end
|
209
|
+
it "should return the message" do
|
210
|
+
adapter.sender(request_params).should_not be_nil
|
211
|
+
end
|
212
|
+
end
|
213
|
+
context "given invalid incoming message request params" do
|
214
|
+
it "should return nil" do
|
215
|
+
adapter.sender(request_params).should be_nil
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
describe "#service_url" do
|
221
|
+
it "should be the SMS Global service url" do
|
222
|
+
adapter.service_url.should == "http://smsglobal.com.au/http-api.php"
|
223
|
+
end
|
224
|
+
context "#use_ssl=false" do
|
225
|
+
before do
|
226
|
+
adapter.use_ssl = false
|
227
|
+
end
|
228
|
+
it "should be 'http'" do
|
229
|
+
URI.parse(adapter.service_url).scheme.should == "http"
|
230
|
+
end
|
231
|
+
end
|
232
|
+
context "#use_ssl=true" do
|
233
|
+
before do
|
234
|
+
adapter.use_ssl = true
|
235
|
+
end
|
236
|
+
it "should be 'https'" do
|
237
|
+
URI.parse(adapter.service_url).scheme.should == "https"
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
describe "#status" do
|
243
|
+
let (:delivery_receipt) { {} }
|
244
|
+
context "given a valid delivery receipt" do
|
245
|
+
before do
|
246
|
+
delivery_receipt["dlrstatus"] = "ANYTHING"
|
247
|
+
end
|
248
|
+
it "should return the delivery status" do
|
249
|
+
adapter.status(delivery_receipt).should_not be_nil
|
250
|
+
end
|
251
|
+
end
|
252
|
+
context "given a invalid delivery receipt" do
|
253
|
+
it "should return nil" do
|
254
|
+
adapter.status(delivery_receipt).should be_nil
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
@@ -0,0 +1,204 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActionSms::ConnectionAdapters::SMSGlobalAdapter do
|
4
|
+
let (:adapter_name) { "sms_global" }
|
5
|
+
context "is not in test mode" do
|
6
|
+
let(:adapter) {
|
7
|
+
ActionSms::Base.sms_global_connection(
|
8
|
+
:adapter => adapter_name
|
9
|
+
)
|
10
|
+
}
|
11
|
+
|
12
|
+
it "should not respond to #sample_configuration" do
|
13
|
+
adapter.should_not be_respond_to(:sample_configuration)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should not respond to #sample_delivery_receipt" do
|
17
|
+
adapter.should_not be_respond_to(:sample_delivery_receipt)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should not respond to #sample_delivery_response" do
|
21
|
+
adapter.should_not be_respond_to(:sample_delivery_response)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should not respond to #sample_delivery_response_with_message_id" do
|
25
|
+
adapter.should_not be_respond_to(:sample_delivery_response_with_message_id)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should not respond to #sample_incoming_sms" do
|
29
|
+
adapter.should_not be_respond_to(:sample_incoming_sms)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should not respond to #sample_message_id" do
|
33
|
+
adapter.should_not be_respond_to(:sample_message_id)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "is in test mode" do
|
38
|
+
let(:adapter) {
|
39
|
+
ActionSms::Base.sms_global_connection(
|
40
|
+
:adapter => adapter_name,
|
41
|
+
:environment => "test"
|
42
|
+
)
|
43
|
+
}
|
44
|
+
|
45
|
+
# Additional methods available in test mode
|
46
|
+
|
47
|
+
describe "#sample_configuration" do
|
48
|
+
it "should contain SMSGlobal specific configuration" do
|
49
|
+
adapter.sample_configuration.should include(
|
50
|
+
:user, :password
|
51
|
+
)
|
52
|
+
end
|
53
|
+
it "should contain the correct adapter name" do
|
54
|
+
adapter.sample_configuration.should include(
|
55
|
+
:adapter => "sms_global"
|
56
|
+
)
|
57
|
+
end
|
58
|
+
context "with options" do
|
59
|
+
context "authentication_key => true" do
|
60
|
+
it "should contain an authentication key" do
|
61
|
+
adapter.sample_configuration(
|
62
|
+
:authentication_key => true
|
63
|
+
).should include(:authentication_key)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "#sample_delivery_receipt" do
|
70
|
+
context "with no options" do
|
71
|
+
it "should return the default values" do
|
72
|
+
adapter.sample_delivery_receipt.should include(
|
73
|
+
"msgid", "dlrstatus", "dlr_err", "donedate"
|
74
|
+
)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
context "with options" do
|
78
|
+
context "'message_id'" do
|
79
|
+
it "should include the option" do
|
80
|
+
adapter.sample_delivery_receipt(
|
81
|
+
:message_id => "SMSGlobalMsgID:12345"
|
82
|
+
).should include("msgid" => "12345")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
context "'status'" do
|
86
|
+
it "should include the option" do
|
87
|
+
adapter.sample_delivery_receipt(
|
88
|
+
:status => "no good"
|
89
|
+
).should include("dlrstatus" => "no good")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
context "'error'" do
|
93
|
+
it "should include the option" do
|
94
|
+
adapter.sample_delivery_receipt(
|
95
|
+
:error => "some error"
|
96
|
+
).should include("dlr_err" => "some error")
|
97
|
+
end
|
98
|
+
end
|
99
|
+
context "'date'" do
|
100
|
+
it "should include the option" do
|
101
|
+
adapter.sample_delivery_receipt(
|
102
|
+
:date => "today"
|
103
|
+
).should include("donedate" => "today")
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe "#sample_delivery_response" do
|
110
|
+
context "with no options" do
|
111
|
+
it "should return a successful delivery response" do
|
112
|
+
adapter.sample_delivery_response.should == "OK: 0; Sent queued message ID: 86b1a945370734f4 SMSGlobalMsgID:6942744494999745"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
context "with options" do
|
116
|
+
context ":failed => true" do
|
117
|
+
it "should return a failed delivery response" do
|
118
|
+
adapter.sample_delivery_response(:failed => true).should == "ERROR: No action requested"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
context "'message_id' => 'anything'" do
|
122
|
+
it "should include the option" do
|
123
|
+
adapter.sample_delivery_response(:message_id => "12345").should =~ /SMSGlobalMsgID:12345/
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe "#sample_delivery_response_with_message_id" do
|
130
|
+
it "should call sample_delivery_response with the message id" do
|
131
|
+
options = {:my_option => "some option"}
|
132
|
+
adapter.should_receive(:sample_message_id).with(
|
133
|
+
hash_including(:message_id => "12345")
|
134
|
+
)
|
135
|
+
adapter.sample_delivery_response_with_message_id(
|
136
|
+
"12345", options
|
137
|
+
)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe "#sample_incoming_sms" do
|
142
|
+
context "with no options" do
|
143
|
+
it "should return the default values" do
|
144
|
+
adapter.sample_incoming_sms.should include(
|
145
|
+
"msg", "to", "from", "date"
|
146
|
+
)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
context "with options" do
|
150
|
+
context "'authentic'" do
|
151
|
+
it "should include an authentication key" do
|
152
|
+
adapter.sample_incoming_sms(:authentic => true).should include(
|
153
|
+
"authentication_key"
|
154
|
+
)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
context "'message'" do
|
158
|
+
it "should include the option" do
|
159
|
+
adapter.sample_incoming_sms(:message => "hello").should include(
|
160
|
+
"msg" => "hello"
|
161
|
+
)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
context "'to'" do
|
165
|
+
it "should include the option" do
|
166
|
+
adapter.sample_incoming_sms(:to => "someone").should include(
|
167
|
+
"to" => "someone"
|
168
|
+
)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
context "'from'" do
|
172
|
+
it "should include the option" do
|
173
|
+
adapter.sample_incoming_sms(:from => "anyone").should include(
|
174
|
+
"from" => "anyone"
|
175
|
+
)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
context "'date'" do
|
179
|
+
it "should include the option" do
|
180
|
+
adapter.sample_incoming_sms(:date => "today").should include(
|
181
|
+
"date" => "today"
|
182
|
+
)
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
describe "#sample_message_id" do
|
189
|
+
context "with no options" do
|
190
|
+
it "should return a default message id" do
|
191
|
+
adapter.sample_message_id.should == "SMSGlobalMsgID:6942744494999745"
|
192
|
+
end
|
193
|
+
end
|
194
|
+
context "with options" do
|
195
|
+
context "'message_id'" do
|
196
|
+
it "should include the option" do
|
197
|
+
adapter.sample_message_id(:message_id => "12345").should == "SMSGlobalMsgID:12345"
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|