twilio_contactable 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.markdown +144 -0
- data/Rakefile +46 -0
- data/VERSION +1 -0
- data/init.rb +3 -0
- data/lib/configuration.rb +41 -0
- data/lib/contactable.rb +204 -0
- data/lib/controller.rb +78 -0
- data/lib/gateway.rb +105 -0
- data/lib/twilio_contactable.rb +40 -0
- data/test/.gitignore +1 -0
- data/test/database.yml +18 -0
- data/test/test_helper.rb +63 -0
- data/test/twilio_contactable_contactable_test.rb +308 -0
- data/test/twilio_contactable_controller_test.rb +97 -0
- data/test/twilio_module_test.rb +56 -0
- data/twilio_contactable.gemspec +68 -0
- metadata +118 -0
@@ -0,0 +1,97 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
|
2
|
+
|
3
|
+
class TwilioContactableController < ActionController::Base
|
4
|
+
include TwilioContactable::Controller
|
5
|
+
|
6
|
+
twilio_contactable User
|
7
|
+
end
|
8
|
+
|
9
|
+
begin
|
10
|
+
ActionController::Routing::Routes
|
11
|
+
rescue
|
12
|
+
Rails.application.routes
|
13
|
+
end.draw do |map|
|
14
|
+
map.route ':controller/:action', :controller => 'twilio_contactable'
|
15
|
+
end
|
16
|
+
|
17
|
+
class UserWithSMSReceiving < User
|
18
|
+
def receive_sms(message)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class TwilioContactableControllerTest < ActionController::TestCase
|
23
|
+
|
24
|
+
context "with a user" do
|
25
|
+
setup {
|
26
|
+
User.delete_all
|
27
|
+
@user = User.create! :phone_number => '(206) 335-1596'
|
28
|
+
# and we should be able to find @user by this formatted version
|
29
|
+
@formatted_phone_number = "2063351596"
|
30
|
+
}
|
31
|
+
context "receiving sms message" do
|
32
|
+
context "receiving BLOCK" do
|
33
|
+
setup {
|
34
|
+
post :receive_sms_message,
|
35
|
+
# this is what an xml request will parse to:
|
36
|
+
"request"=>{"block"=>{"recipient"=>{"property"=>{"name"=>"CARRIER", "value"=>"3"}, "id"=>"+1#{@formatted_phone_number}", "type"=>"5"}}, "type" => "BLOCK"}
|
37
|
+
}
|
38
|
+
should_respond_with :success
|
39
|
+
should "block user" do
|
40
|
+
assert @user.reload.sms_blocked?
|
41
|
+
end
|
42
|
+
should_change "user block status" do
|
43
|
+
@user.reload.sms_blocked?
|
44
|
+
end
|
45
|
+
end
|
46
|
+
context "receiving MESSAGE" do
|
47
|
+
setup {
|
48
|
+
# this is what an xml request will parse to:
|
49
|
+
@receive_params = {"request"=>{"message"=>{"id" => "ABCDEFG", "recipient"=>{"type"=> "6", "id"=>"12345"}, "sender" => {"type" => "5", "id" => "+1#{@formatted_phone_number}", "property" => {"name" => "CARRIER", "value" => "5"}}, "text" => "This is a text message."}, "type" => "MESSAGE"}}
|
50
|
+
}
|
51
|
+
context "when the user is not set up to receive" do
|
52
|
+
setup {
|
53
|
+
@user.expects(:receive_sms).with("This is a text message.").never
|
54
|
+
post :receive_sms_message, @receive_params
|
55
|
+
}
|
56
|
+
should_respond_with :success
|
57
|
+
should "not block user" do
|
58
|
+
assert !@user.reload.sms_blocked?
|
59
|
+
end
|
60
|
+
end
|
61
|
+
context "when the user is set up to receive" do
|
62
|
+
setup {
|
63
|
+
User.delete_all
|
64
|
+
@new_user = UserWithSMSReceiving.create!(:phone_number => @user.phone_number)
|
65
|
+
UserWithSMSReceiving.any_instance.expects(:receive_sms).with("This is a text message.").once
|
66
|
+
post :receive_sms_message, @receive_params
|
67
|
+
}
|
68
|
+
should_respond_with :success
|
69
|
+
should "not block user" do
|
70
|
+
assert !@new_user.reload.sms_blocked?
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
context "initiating a digit-gathering call from Twilio" do
|
76
|
+
setup {
|
77
|
+
@receive_params = {"FromState"=>"WA", "CallerCountry"=>"US", "CallerZip"=>"98077", "ToState"=>"WA", "Caller"=>"+#{@formatted_phone_number}", "AccountSid"=>"SOME_ACCOUNT", "contactable_type"=>"User", "Direction"=>"outbound-api", "FromCity"=>"WOODINVILLE", "From"=>"+5555555555", "contactable_id"=>"1", "CallerCity"=>"WOODINVILLE", "FromCountry"=>"US", "FromZip"=>"98077", "CallStatus"=>"in-progress", "To"=>"+12069305710", "ToCity"=>"SEATTLE", "Called"=>"+12069305710", "CalledCountry"=>"US", "CalledZip"=>"98188", "ApiVersion"=>"2010-04-01", "CalledCity"=>"SEATTLE", "CallSid"=>"CA76af6e953077fc478c9f2eb330484ea7", "CalledState"=>"WA", "ToCountry"=>"US", "ToZip"=>"98188", "CallerState"=>"WA"}
|
78
|
+
get :start_voice_confirmation, @receive_params
|
79
|
+
}
|
80
|
+
should_respond_with :success
|
81
|
+
should_respond_with_content_type :xml
|
82
|
+
should "render Gather TwiML node with a Say inside" do
|
83
|
+
assert_dom_equal %q{
|
84
|
+
<response>
|
85
|
+
<gather
|
86
|
+
action="http://test.host/twilio_contactable/receive_voice_confirmation?contactable_id=1&contactable_type=User"
|
87
|
+
>
|
88
|
+
<say>
|
89
|
+
Please type the numbers that appear on your screen, followed by the pound sign
|
90
|
+
</say>
|
91
|
+
</gather>
|
92
|
+
</response>
|
93
|
+
}, @response.body
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
|
2
|
+
|
3
|
+
class TwilioContactableModuleTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
context "standardizing numbers" do
|
6
|
+
context "to digits" do
|
7
|
+
should "remove all but integers" do
|
8
|
+
assert_equal '12345', TwilioContactable.numerize('1-2-3-4-5')
|
9
|
+
assert_equal '12345', TwilioContactable.numerize('1 2 3 4 5')
|
10
|
+
assert_equal '12345', TwilioContactable.numerize('1,2(3)4.5')
|
11
|
+
assert_equal '12345', TwilioContactable.numerize('1,2(3)4.5')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
context "to international format" do
|
15
|
+
should "add a '+' to all 11 digit numbers" do
|
16
|
+
assert_equal '+12345678901', TwilioContactable.internationalize('12345678901')
|
17
|
+
assert_equal '+72345678901', TwilioContactable.internationalize('72345678901')
|
18
|
+
end
|
19
|
+
should "add a '+1' to any 10 digit number" do
|
20
|
+
assert_equal '+12345678901', TwilioContactable.internationalize('2345678901')
|
21
|
+
assert_equal '+17345678901', TwilioContactable.internationalize('7345678901')
|
22
|
+
end
|
23
|
+
should "leave 12 digit numbers unchanged" do
|
24
|
+
[ '+' + ('3'*11),
|
25
|
+
'+' + ('8'*11),
|
26
|
+
'+' + ('4'*11) ].each do |number|
|
27
|
+
assert_equal number, TwilioContactable.internationalize(number)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
should "return nil for all bad numbers" do
|
31
|
+
assert_equal nil, TwilioContactable.internationalize(nil)
|
32
|
+
assert_equal nil, TwilioContactable.internationalize('nil')
|
33
|
+
assert_equal nil, TwilioContactable.internationalize('1234')
|
34
|
+
assert_equal nil, TwilioContactable.internationalize('11111111111111111111111')
|
35
|
+
assert_equal nil, TwilioContactable.internationalize('what?')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "generating codes" do
|
41
|
+
setup { @code = TwilioContactable.generate_confirmation_code }
|
42
|
+
should "be 6 digits" do
|
43
|
+
assert_equal 6, @code.length
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "confirmation message" do
|
48
|
+
setup {
|
49
|
+
@code = 'ABC123'
|
50
|
+
@message = TwilioContactable.confirmation_message(@code)
|
51
|
+
}
|
52
|
+
should "include code" do
|
53
|
+
assert @message.include?(@code)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{twilio_contactable}
|
8
|
+
s.version = "0.7.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Jack Danger Canty"]
|
12
|
+
s.date = %q{2010-09-01}
|
13
|
+
s.description = %q{Does all the hard work with letting you confirm your user's phone numbers for Voice or TXT over the Twilio API}
|
14
|
+
s.email = %q{gitcommit@6brand.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.markdown"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
"MIT-LICENSE",
|
20
|
+
"README.markdown",
|
21
|
+
"Rakefile",
|
22
|
+
"VERSION",
|
23
|
+
"init.rb",
|
24
|
+
"lib/configuration.rb",
|
25
|
+
"lib/contactable.rb",
|
26
|
+
"lib/controller.rb",
|
27
|
+
"lib/gateway.rb",
|
28
|
+
"lib/twilio_contactable.rb",
|
29
|
+
"test/.gitignore",
|
30
|
+
"test/database.yml",
|
31
|
+
"test/test_helper.rb",
|
32
|
+
"test/twilio_contactable_contactable_test.rb",
|
33
|
+
"test/twilio_contactable_controller_test.rb",
|
34
|
+
"test/twilio_module_test.rb",
|
35
|
+
"twilio_contactable.gemspec"
|
36
|
+
]
|
37
|
+
s.homepage = %q{http://github.com/JackDanger/twilio_contactable}
|
38
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
39
|
+
s.require_paths = ["lib"]
|
40
|
+
s.rubygems_version = %q{1.3.6}
|
41
|
+
s.summary = %q{Help authorize the users of your Rails apps to confirm and use their phone numbers}
|
42
|
+
s.test_files = [
|
43
|
+
"test/test_helper.rb",
|
44
|
+
"test/twilio_contactable_contactable_test.rb",
|
45
|
+
"test/twilio_contactable_controller_test.rb",
|
46
|
+
"test/twilio_module_test.rb"
|
47
|
+
]
|
48
|
+
|
49
|
+
if s.respond_to? :specification_version then
|
50
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
51
|
+
s.specification_version = 3
|
52
|
+
|
53
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
54
|
+
s.add_runtime_dependency(%q<twiliolib>, [">= 2.0.5"])
|
55
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
56
|
+
s.add_development_dependency(%q<mocha>, [">= 0"])
|
57
|
+
else
|
58
|
+
s.add_dependency(%q<twiliolib>, [">= 2.0.5"])
|
59
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
60
|
+
s.add_dependency(%q<mocha>, [">= 0"])
|
61
|
+
end
|
62
|
+
else
|
63
|
+
s.add_dependency(%q<twiliolib>, [">= 2.0.5"])
|
64
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
65
|
+
s.add_dependency(%q<mocha>, [">= 0"])
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
metadata
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: twilio_contactable
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 7
|
8
|
+
- 1
|
9
|
+
version: 0.7.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Jack Danger Canty
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-09-01 00:00:00 -07:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: twiliolib
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 2
|
29
|
+
- 0
|
30
|
+
- 5
|
31
|
+
version: 2.0.5
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: shoulda
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
version: "0"
|
44
|
+
type: :development
|
45
|
+
version_requirements: *id002
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: mocha
|
48
|
+
prerelease: false
|
49
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
segments:
|
54
|
+
- 0
|
55
|
+
version: "0"
|
56
|
+
type: :development
|
57
|
+
version_requirements: *id003
|
58
|
+
description: Does all the hard work with letting you confirm your user's phone numbers for Voice or TXT over the Twilio API
|
59
|
+
email: gitcommit@6brand.com
|
60
|
+
executables: []
|
61
|
+
|
62
|
+
extensions: []
|
63
|
+
|
64
|
+
extra_rdoc_files:
|
65
|
+
- README.markdown
|
66
|
+
files:
|
67
|
+
- MIT-LICENSE
|
68
|
+
- README.markdown
|
69
|
+
- Rakefile
|
70
|
+
- VERSION
|
71
|
+
- init.rb
|
72
|
+
- lib/configuration.rb
|
73
|
+
- lib/contactable.rb
|
74
|
+
- lib/controller.rb
|
75
|
+
- lib/gateway.rb
|
76
|
+
- lib/twilio_contactable.rb
|
77
|
+
- test/.gitignore
|
78
|
+
- test/database.yml
|
79
|
+
- test/test_helper.rb
|
80
|
+
- test/twilio_contactable_contactable_test.rb
|
81
|
+
- test/twilio_contactable_controller_test.rb
|
82
|
+
- test/twilio_module_test.rb
|
83
|
+
- twilio_contactable.gemspec
|
84
|
+
has_rdoc: true
|
85
|
+
homepage: http://github.com/JackDanger/twilio_contactable
|
86
|
+
licenses: []
|
87
|
+
|
88
|
+
post_install_message:
|
89
|
+
rdoc_options:
|
90
|
+
- --charset=UTF-8
|
91
|
+
require_paths:
|
92
|
+
- lib
|
93
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
segments:
|
98
|
+
- 0
|
99
|
+
version: "0"
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
segments:
|
105
|
+
- 0
|
106
|
+
version: "0"
|
107
|
+
requirements: []
|
108
|
+
|
109
|
+
rubyforge_project:
|
110
|
+
rubygems_version: 1.3.6
|
111
|
+
signing_key:
|
112
|
+
specification_version: 3
|
113
|
+
summary: Help authorize the users of your Rails apps to confirm and use their phone numbers
|
114
|
+
test_files:
|
115
|
+
- test/test_helper.rb
|
116
|
+
- test/twilio_contactable_contactable_test.rb
|
117
|
+
- test/twilio_contactable_controller_test.rb
|
118
|
+
- test/twilio_module_test.rb
|