4info 1.3.4 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,10 +1,12 @@
1
- module FourInfo
1
+ module Txter
2
2
  class << self
3
3
  def gateway
4
- require 'net/http'
5
- URI.parse 'http://gateway.4info.net/msg'
4
+ Txter::Gateway.current
6
5
  end
7
6
 
7
+ delegate :deliver, :to => :gateway
8
+ delegate :unblock, :to => :gateway
9
+
8
10
  def log(msg)
9
11
  if defined?(Rails)
10
12
  Rails.logger.info msg
@@ -43,7 +45,6 @@ module FourInfo
43
45
  end
44
46
 
45
47
  require File.join(File.dirname(__FILE__), 'configuration')
48
+ require File.join(File.dirname(__FILE__), 'gateway')
46
49
  require File.join(File.dirname(__FILE__), 'contactable')
47
50
  require File.join(File.dirname(__FILE__), 'controller')
48
- require File.join(File.dirname(__FILE__), 'request')
49
- require File.join(File.dirname(__FILE__), 'response')
@@ -0,0 +1,75 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ class Gateway4infoTest < ActiveSupport::TestCase
4
+
5
+ Error = Txter::Gateway4info::Response.new('<?xml version="1.0" encoding="UTF-8"?>
6
+ <response>
7
+ <status>
8
+ <id>4</id>
9
+ <message>Error</message>
10
+ </status>
11
+ </response>')
12
+ Success = Txter::Gateway4info::Response.new('<?xml version="1.0" ?>
13
+ <response>
14
+ <requestId>F81D4FAE-7DEC-11D0-A765-00A0C91E6BF6</requestId>
15
+ <status>
16
+ <id>1</id>
17
+ <message>Success</message>
18
+ </status>
19
+ </response>')
20
+
21
+ context "with 4info gateway" do
22
+ setup {
23
+ Txter.configure do |config|
24
+ config.client_id = 12345
25
+ config.client_key = 'ABC123'
26
+ config.gateway = '4info'
27
+ end
28
+ }
29
+ context "with stubbed success" do
30
+ setup {
31
+ Txter::Gateway4info.stubs(:perform).returns(Success)
32
+ }
33
+ should "generate a success response object" do
34
+ assert Txter.deliver("msg", "1-555-867-5309").success?
35
+ end
36
+ end
37
+ context "with stubbed error" do
38
+ setup {
39
+ Txter::Gateway4info.stubs(:perform).returns(Error)
40
+ }
41
+ should "generate a success response object" do
42
+ assert !Txter.deliver("msg", "1-555-867-5309").success?
43
+ end
44
+ end
45
+ should "create proper xml for delivery" do
46
+ expected = <<-EOXML
47
+ <?xml version='1.0' encoding='utf-8' ?>
48
+ <request clientId='12345' clientKey='ABC123' type='MESSAGE'>
49
+ <message>
50
+ <recipient>
51
+ <type>5</type>
52
+ <id>+15558675309</id>
53
+ </recipient>
54
+ <text>msg</text>
55
+ </message>
56
+ </request>
57
+ EOXML
58
+ assert_equal expected, Txter::Gateway4info::Request.new.deliver_message("msg", "1-555-867-5309")
59
+ end
60
+ should "create proper xml for unblock" do
61
+ expected = <<-EOXML
62
+ <?xml version='1.0' encoding='utf-8' ?>
63
+ <request clientId='12345' clientKey='ABC123' type='UNBLOCK'>
64
+ <unblock>
65
+ <recipient>
66
+ <type>5</type>
67
+ <id>+15558675309</id>
68
+ </recipient>
69
+ </unblock>
70
+ </request>
71
+ EOXML
72
+ assert_equal expected, Txter::Gateway4info::Request.new.unblock("1-555-867-5309")
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,15 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ class Gateway4infoTest < ActiveSupport::TestCase
4
+
5
+ context "with twilio gateway" do
6
+ setup {
7
+ Txter.configure do |config|
8
+ config.client_id = 12345
9
+ config.client_key = 'ABC123'
10
+ config.gateway = 'twilio'
11
+ end
12
+ }
13
+ # TODO: figure out what's left to test
14
+ end
15
+ end
@@ -6,15 +6,16 @@ require 'active_support'
6
6
  require 'active_record'
7
7
  require 'active_support/test_case'
8
8
  require 'shoulda'
9
- require File.join(File.dirname(__FILE__), "..", 'lib', 'four_info')
9
+ require File.join(File.dirname(__FILE__), "..", 'lib', 'txter')
10
10
 
11
11
  # default test configuration
12
- FourInfo.configure do |config|
12
+ Txter.configure do |config|
13
13
  config.client_id = '1'
14
14
  config.client_key = 'ABCDEF'
15
+ config.gateway = 'test'
15
16
  end
16
17
 
17
- FourInfo.mode = :test
18
+ Txter.mode = :test
18
19
  config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
19
20
  ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log")
20
21
  ActiveRecord::Base.establish_connection(config[ENV['DB'] || 'sqlite3'])
@@ -32,11 +33,11 @@ ActiveRecord::Schema.define(:version => 1) do
32
33
  end
33
34
 
34
35
  class User < ActiveRecord::Base
35
- include FourInfo::Contactable
36
+ include Txter::Contactable
36
37
  end
37
38
 
38
39
  # kill all network access
39
- module FourInfo
40
+ module Txter
40
41
  class Request
41
42
  def start
42
43
  raise "You forgot to stub out your net requests!"
@@ -1,45 +1,21 @@
1
1
  require File.join(File.dirname(__FILE__), 'test_helper')
2
2
 
3
- class FourInfoContactableTest < ActiveSupport::TestCase
3
+ class TxterContactableTest < ActiveSupport::TestCase
4
4
 
5
- ValidationError = '<?xml version="1.0" encoding="UTF-8"?>
6
- <response>
7
- <status>
8
- <id>4</id>
9
- <message>Validation Error</message>
10
- </status>
11
- </response>'
12
- ValidationSuccess = '<?xml version=”1.0” ?>
13
- <response>
14
- <requestId>F81D4FAE-7DEC-11D0-A765-00A0C91E6BF6</requestId>
15
- <confCode>123ABC</confCode>
16
- <status>
17
- <id>1</id>
18
- <message>Success</message>
19
- </status>
20
- </response>'
21
- SendMsgSuccess = '<?xml version="1.0" ?>
22
- <response>
23
- <requestId>F81D4FAE-7DEC-11D0-A765-00A0C91E6BF6</requestId>
24
- <status>
25
- <id>1</id>
26
- <message>Success</message>
27
- </status>
28
- </response>'
29
- UnblockSuccess = '<?xml version=”1.0” ?>
30
- <response>
31
- <status>
32
- <id>1</id>
33
- <message>Success</message>
34
- </status>
35
- </response>'
5
+ Success = Txter::Gateway::Response.new(:status => :success)
6
+ Error = Txter::Gateway::Response.new(:status => :error)
36
7
 
37
8
  context "contactable class" do
38
9
  setup {
39
10
  @klass = Class.new
40
- @klass.send :include, FourInfo::Contactable
11
+ @klass.send :include, Txter::Contactable
12
+ Txter.configure do |config|
13
+ config.client_id = 12345
14
+ config.client_key = 'ABC123'
15
+ config.gateway = 'test'
16
+ end
41
17
  }
42
- FourInfo::Contactable::Attributes.each do |attribute|
18
+ Txter::Contactable::Attributes.each do |attribute|
43
19
  should "begin with appropriate default for #{attribute}_column" do
44
20
  assert_equal attribute, @klass.send("#{attribute}_column")
45
21
  end
@@ -58,10 +34,10 @@ class FourInfoContactableTest < ActiveSupport::TestCase
58
34
  }
59
35
 
60
36
  should "normalize phone number" do
61
- assert_equal '5551234567', @user.four_info_sms_phone_number
37
+ assert_equal '5551234567', @user.txter_sms_phone_number
62
38
  end
63
39
  context "when phone number is blank" do
64
- setup { @user.four_info_sms_phone_number = nil}
40
+ setup { @user.txter_sms_phone_number = nil}
65
41
  context "confirming phone number" do
66
42
  setup { @user.send_sms_confirmation! }
67
43
  should_not_change "any attributes" do
@@ -70,7 +46,7 @@ class FourInfoContactableTest < ActiveSupport::TestCase
70
46
  end
71
47
  context "sending message" do
72
48
  setup {
73
- FourInfo::Request.any_instance.stubs(:perform).returns(SendMsgSuccess)
49
+ Txter.gateway.stubs(:perform).returns(Success)
74
50
  @worked = @user.send_sms!('message')
75
51
  }
76
52
  should "not work" do assert !@worked end
@@ -81,45 +57,45 @@ class FourInfoContactableTest < ActiveSupport::TestCase
81
57
  end
82
58
 
83
59
  context "when phone number exists" do
84
- setup { @user.four_info_sms_phone_number = "206-555-5555"}
60
+ setup { @user.txter_sms_phone_number = "206-555-5555"}
85
61
  context "confirming phone number" do
86
62
  setup {
87
- FourInfo::Request.any_instance.stubs(:perform).returns(ValidationSuccess)
63
+ Txter::Request.any_instance.stubs(:perform).returns(Success)
88
64
  @worked = @user.send_sms_confirmation!
89
65
  }
90
66
  should "work" do assert @worked end
91
67
  should "save confirmation number in proper attribute" do
92
- assert_equal '123ABC', @user.four_info_sms_confirmation_code
68
+ assert @user.txter_sms_confirmation_code
93
69
  end
94
70
  should "set confirmation attempted time" do
95
- assert @user.four_info_sms_confirmation_attempted > 3.minutes.ago
71
+ assert @user.txter_sms_confirmation_attempted > 3.minutes.ago
96
72
  end
97
73
  should_change "stored code" do
98
- @user.four_info_sms_confirmation_code
74
+ @user.txter_sms_confirmation_code
99
75
  end
100
76
  should "not have number confirmed yet" do
101
77
  assert !@user.sms_confirmed?
102
78
  end
103
79
  context "calling sms_confirm_with(right_code)" do
104
- setup { @user.sms_confirm_with(@user.four_info_sms_confirmation_code) }
80
+ setup { @user.sms_confirm_with(@user.txter_sms_confirmation_code) }
105
81
  should "work" do
106
82
  assert @worked
107
83
  end
108
84
  should "save the phone number into the confirmed attribute" do
109
- assert_equal @user.four_info_sms_confirmed_phone_number,
110
- @user.four_info_sms_phone_number
85
+ assert_equal @user.txter_sms_confirmed_phone_number,
86
+ @user.txter_sms_phone_number
111
87
  end
112
88
  should_change "confirmed phone number attribute" do
113
- @user.four_info_sms_confirmed_phone_number
89
+ @user.txter_sms_confirmed_phone_number
114
90
  end
115
91
  context "and then attempting to confirm another number" do
116
92
  setup {
117
- @user.four_info_sms_phone_number = "206-555-5555"
118
- FourInfo::Request.any_instance.expects(:perform).returns(ValidationSuccess).once
93
+ @user.txter_sms_phone_number = "206-555-5555"
94
+ Txter.stubs(:deliver).returns(Success).once
119
95
  @user.send_sms_confirmation!
120
96
  }
121
97
  should "eliminate the previous confirmed phone number" do
122
- assert @user.four_info_sms_confirmed_phone_number.blank?
98
+ assert @user.txter_sms_confirmed_phone_number.blank?
123
99
  end
124
100
  should "un-confirm the record" do
125
101
  assert !@user.sms_confirmed?
@@ -128,19 +104,19 @@ class FourInfoContactableTest < ActiveSupport::TestCase
128
104
  end
129
105
  context "calling sms_confirm_with(right code, wrong case)" do
130
106
  setup {
131
- @downcased_code = @user.four_info_sms_confirmation_code.downcase
107
+ @downcased_code = @user.txter_sms_confirmation_code.downcase
132
108
  @worked = @user.sms_confirm_with(@downcased_code)
133
109
  }
134
110
  should "have good test data" do
135
111
  assert_not_equal @downcased_code,
136
- @user.four_info_sms_confirmation_code
112
+ @user.txter_sms_confirmation_code
137
113
  end
138
114
  should "work" do
139
115
  assert @worked
140
116
  end
141
117
  should "save the phone number into the confirmed attribute" do
142
- assert_equal @user.four_info_sms_confirmed_phone_number,
143
- @user.four_info_sms_phone_number
118
+ assert_equal @user.txter_sms_confirmed_phone_number,
119
+ @user.txter_sms_phone_number
144
120
  end
145
121
  end
146
122
  context "calling sms_confirm_with(wrong_code)" do
@@ -149,37 +125,39 @@ class FourInfoContactableTest < ActiveSupport::TestCase
149
125
  assert !@worked
150
126
  end
151
127
  should "not save the phone number into the confirmed attribute" do
152
- assert_not_equal @user.four_info_sms_confirmed_phone_number,
153
- @user.four_info_sms_phone_number
128
+ assert_not_equal @user.txter_sms_confirmed_phone_number,
129
+ @user.txter_sms_phone_number
154
130
  end
155
131
  should_not_change "confirmed phone number attribute" do
156
- @user.reload.four_info_sms_confirmed_phone_number
132
+ @user.reload.txter_sms_confirmed_phone_number
157
133
  end
158
134
  end
159
135
  end
160
136
  context "confirming phone number with a custom short code" do
161
137
  context "with expectations" do
162
138
  setup {
163
- FourInfo.configure do |config|
139
+ Txter.configure do |config|
164
140
  config.short_code = '0005'
141
+ config.gateway = 'test'
165
142
  config.client_id = 1
166
143
  config.client_key = 'ABC123'
167
144
  end
168
145
  message = "long message blah blah MYCODE blah"
169
- FourInfo.expects(:generate_confirmation_code).returns('MYCODE').once
170
- FourInfo.expects(:confirmation_message).returns(message).once
171
- FourInfo::Request.any_instance.expects(:deliver_message).with(message, @user.four_info_sms_phone_number).once
146
+ Txter.expects(:generate_confirmation_code).returns('MYCODE').once
147
+ Txter.expects(:confirmation_message).returns(message).once
148
+ Txter::Request.any_instance.expects(:deliver_message).with(message, @user.txter_sms_phone_number).once
172
149
  @user.send_sms_confirmation!
173
150
  }
174
151
  end
175
152
  context "(normal)" do
176
153
  setup {
177
- FourInfo.configure do |config|
154
+ Txter.configure do |config|
178
155
  config.short_code = '0005'
156
+ config.gateway = 'test'
179
157
  config.client_id = 1
180
158
  config.client_key = 'ABC123'
181
159
  end
182
- FourInfo::Request.any_instance.stubs(:perform).returns(SendMsgSuccess)
160
+ Txter::Request.any_instance.stubs(:perform).returns(Success)
183
161
  @worked = @user.send_sms_confirmation!
184
162
  }
185
163
  should "work" do
@@ -189,15 +167,15 @@ class FourInfoContactableTest < ActiveSupport::TestCase
189
167
  end
190
168
  context "confirming phone number when the confirmation fails for some reason" do
191
169
  setup {
192
- FourInfo::Request.any_instance.stubs(:perform).returns(ValidationError)
170
+ Txter.stubs(:deliver).returns(Error)
193
171
  @worked = @user.send_sms_confirmation!
194
172
  }
195
173
  should "not work" do assert !@worked end
196
174
  should "not save confirmation number" do
197
- assert @user.four_info_sms_confirmation_code.blank?
175
+ assert @user.txter_sms_confirmation_code.blank?
198
176
  end
199
177
  should_not_change "stored code" do
200
- @user.four_info_sms_confirmation_code
178
+ @user.txter_sms_confirmation_code
201
179
  end
202
180
  end
203
181
  end
@@ -205,7 +183,7 @@ class FourInfoContactableTest < ActiveSupport::TestCase
205
183
  context "when the number is not confirmed" do
206
184
  context "sending a message" do
207
185
  setup {
208
- FourInfo::Request.any_instance.stubs(:perform).returns(SendMsgSuccess)
186
+ Txter::Request.any_instance.stubs(:perform).returns(Success)
209
187
  @result = @user.send_sms!('message')
210
188
  }
211
189
  should "send send no messages" do
@@ -215,7 +193,7 @@ class FourInfoContactableTest < ActiveSupport::TestCase
215
193
  end
216
194
  context "when the number is blocked" do
217
195
  setup {
218
- @user.four_info_sms_blocked = true
196
+ @user.txter_sms_blocked = true
219
197
  @user.save!
220
198
  }
221
199
  context "sending a message" do
@@ -227,13 +205,13 @@ class FourInfoContactableTest < ActiveSupport::TestCase
227
205
  end
228
206
  context "when the number is confirmed" do
229
207
  setup {
230
- FourInfo::Request.any_instance.stubs(:perform).returns(SendMsgSuccess)
208
+ Txter::Request.any_instance.stubs(:perform).returns(Success)
231
209
  @user.stubs(:sms_confirmed?).returns(true)
232
210
  }
233
211
  context "sending a message" do
234
212
  setup { @result = @user.send_sms!('message') }
235
- should "send send exactly one message messages" do
236
- assert_equal [true], @result
213
+ should "send send exactly one message" do
214
+ assert_equal [7], @result
237
215
  end
238
216
  end
239
217
  context "sending a blank message" do
@@ -253,7 +231,7 @@ class FourInfoContactableTest < ActiveSupport::TestCase
253
231
  context "with the allow_multiple flag" do
254
232
  setup { @result = @user.send_sms!("A"*200, true) }
255
233
  should "send multiple messages" do
256
- assert_equal [true, true], @result
234
+ assert_equal [160, 40], @result
257
235
  end
258
236
  end
259
237
  end
@@ -261,7 +239,7 @@ class FourInfoContactableTest < ActiveSupport::TestCase
261
239
 
262
240
  context "when the number is not blocked" do
263
241
  setup {
264
- FourInfo::Request.any_instance.expects(:perform).never
242
+ Txter::Request.any_instance.expects(:perform).never
265
243
  }
266
244
  context "unblocking" do
267
245
  setup { @worked = @user.unblock_sms! }
@@ -275,7 +253,7 @@ class FourInfoContactableTest < ActiveSupport::TestCase
275
253
  end
276
254
  context "when the number is blocked" do
277
255
  setup {
278
- FourInfo::Request.any_instance.stubs(:perform).returns(UnblockSuccess)
256
+ Txter::Request.any_instance.stubs(:perform).returns(Success)
279
257
  @user.update_attributes!(:sms_blocked => true)
280
258
  }
281
259
  context "unblocking" do
@@ -5,13 +5,13 @@ require 'shoulda/action_controller'
5
5
  require 'shoulda/action_controller/macros'
6
6
  require 'shoulda/action_controller/matchers'
7
7
 
8
- class FourInfoController < ActionController::Base
9
- include FourInfo::Controller
8
+ class TxterController < ActionController::Base
9
+ include Txter::Controller
10
10
 
11
11
  sms_contactable User
12
12
  end
13
13
  ActionController::Routing::Routes.draw do |map|
14
- map.route '*:url', :controller => 'four_info', :action => :index
14
+ map.route '*:url', :controller => 'txter', :action => :index
15
15
  end
16
16
 
17
17
  class UserWithSMSReceiving < User
@@ -19,7 +19,7 @@ class UserWithSMSReceiving < User
19
19
  end
20
20
  end
21
21
 
22
- class FourInfoControllerTest < ActionController::TestCase
22
+ class TxterControllerTest < ActionController::TestCase
23
23
 
24
24
  context "with a user" do
25
25
  setup {
@@ -36,10 +36,10 @@ class FourInfoControllerTest < ActionController::TestCase
36
36
  }
37
37
  should_respond_with :success
38
38
  should "block user" do
39
- assert @user.reload.four_info_sms_blocked?
39
+ assert @user.reload.txter_sms_blocked?
40
40
  end
41
41
  should_change "user block status" do
42
- @user.reload.four_info_sms_blocked?
42
+ @user.reload.txter_sms_blocked?
43
43
  end
44
44
  end
45
45
  context "receiving MESSAGE" do
@@ -55,7 +55,7 @@ class FourInfoControllerTest < ActionController::TestCase
55
55
  }
56
56
  should_respond_with :success
57
57
  should "not block user" do
58
- assert !@user.reload.four_info_sms_blocked?
58
+ assert !@user.reload.txter_sms_blocked?
59
59
  end
60
60
  end
61
61
  context "when the user is set up to receive" do
@@ -68,7 +68,7 @@ class FourInfoControllerTest < ActionController::TestCase
68
68
  }
69
69
  should_respond_with :success
70
70
  should "not block user" do
71
- assert !@new_user.reload.four_info_sms_blocked?
71
+ assert !@new_user.reload.txter_sms_blocked?
72
72
  end
73
73
  end
74
74
  end