webficient-twilio 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +24 -0
  3. data/Rakefile +49 -0
  4. data/VERSION.yml +4 -0
  5. data/lib/twilio.rb +42 -0
  6. data/lib/twilio/account.rb +11 -0
  7. data/lib/twilio/call.rb +27 -0
  8. data/lib/twilio/connection.rb +17 -0
  9. data/lib/twilio/incoming_phone_number.rb +11 -0
  10. data/lib/twilio/local_phone_number.rb +16 -0
  11. data/lib/twilio/notification.rb +15 -0
  12. data/lib/twilio/outgoing_caller_id.rb +27 -0
  13. data/lib/twilio/recording.rb +19 -0
  14. data/lib/twilio/toll_free_phone_number.rb +16 -0
  15. data/lib/twilio/twilio_object.rb +11 -0
  16. data/lib/twilio/verb.rb +50 -0
  17. data/test/fixtures/xml/account.xml +11 -0
  18. data/test/fixtures/xml/account_renamed.xml +11 -0
  19. data/test/fixtures/xml/call.xml +18 -0
  20. data/test/fixtures/xml/call_new.xml +14 -0
  21. data/test/fixtures/xml/calls.xml +36 -0
  22. data/test/fixtures/xml/incoming_phone_number.xml +12 -0
  23. data/test/fixtures/xml/incoming_phone_numbers.xml +24 -0
  24. data/test/fixtures/xml/notification.xml +19 -0
  25. data/test/fixtures/xml/notifications.xml +32 -0
  26. data/test/fixtures/xml/outgoing_caller_id.xml +10 -0
  27. data/test/fixtures/xml/outgoing_caller_id_new.xml +7 -0
  28. data/test/fixtures/xml/outgoing_caller_ids.xml +20 -0
  29. data/test/fixtures/xml/recording.xml +10 -0
  30. data/test/fixtures/xml/recordings.xml +20 -0
  31. data/test/fixtures/xml/transcription.xml +13 -0
  32. data/test/fixtures/xml/transcriptions.xml +26 -0
  33. data/test/fixtures/yml/verb_responses.yml +8 -0
  34. data/test/test_helper.rb +29 -0
  35. data/test/twilio/account_test.rb +23 -0
  36. data/test/twilio/call_test.rb +59 -0
  37. data/test/twilio/connection_test.rb +15 -0
  38. data/test/twilio/incoming_phone_number_test.rb +22 -0
  39. data/test/twilio/local_phone_number_test.rb +23 -0
  40. data/test/twilio/notification_test.rb +28 -0
  41. data/test/twilio/outgoing_caller_id_test.rb +42 -0
  42. data/test/twilio/recording_test.rb +42 -0
  43. data/test/twilio/toll_free_phone_number_test.rb +23 -0
  44. data/test/twilio/verb_test.rb +34 -0
  45. metadata +126 -0
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Phil Misiowiec, Webficient LLC
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,24 @@
1
+ = twilio
2
+
3
+ This wrapper defines each of the interfaces currently supported by Twilio REST API.
4
+
5
+ Sample Usage:
6
+
7
+ First create a connection object:
8
+
9
+ c = Twilio::Connection.new('my_twilio_sid', 'my_auth_token')
10
+
11
+ Now instantiate other objects by passing in the connection:
12
+
13
+ a = Twilio::Account.new(c)
14
+ a.update_name('sparky')
15
+
16
+ call = Twilio::Call.new(c)
17
+ call.make('1234567890', '9876543210', 'http://mysite.com/connected_call')
18
+
19
+ recording = Twilio::Recording.new(c)
20
+ recording.list
21
+
22
+ == Copyright
23
+
24
+ Copyright (c) 2009 Phil Misiowiec, Webficient LLC. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,49 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "twilio"
8
+ gem.summary = %Q{Twilio API Client}
9
+ gem.email = "github@webficient.com"
10
+ gem.homepage = "http://github.com/webficient/twilio"
11
+ gem.authors = ["Phil Misiowiec"]
12
+ gem.add_dependency 'builder'
13
+ gem.add_dependency 'httparty'
14
+ end
15
+ rescue LoadError
16
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
17
+ end
18
+
19
+ require 'rake/rdoctask'
20
+ Rake::RDocTask.new do |rdoc|
21
+ rdoc.rdoc_dir = 'rdoc'
22
+ rdoc.title = 'twilio'
23
+ rdoc.options << '--line-numbers' << '--inline-source'
24
+ rdoc.rdoc_files.include('README*')
25
+ rdoc.rdoc_files.include('lib/**/*.rb')
26
+ end
27
+
28
+ require 'rake/testtask'
29
+ Rake::TestTask.new(:test) do |test|
30
+ test.libs << 'lib' << 'test'
31
+ test.pattern = 'test/**/*_test.rb'
32
+ test.verbose = false
33
+ end
34
+
35
+ begin
36
+ require 'rcov/rcovtask'
37
+ Rcov::RcovTask.new do |test|
38
+ test.libs << 'test'
39
+ test.pattern = 'test/**/*_test.rb'
40
+ test.verbose = true
41
+ end
42
+ rescue LoadError
43
+ task :rcov do
44
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
45
+ end
46
+ end
47
+
48
+
49
+ task :default => :test
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :patch: 0
3
+ :major: 1
4
+ :minor: 1
data/lib/twilio.rb ADDED
@@ -0,0 +1,42 @@
1
+ $:.unshift(File.dirname(__FILE__))
2
+
3
+ #--
4
+ # Copyright (c) 2009 Phil Misiowiec, phil@webficient.com
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining
7
+ # a copy of this software and associated documentation files (the
8
+ # "Software"), to deal in the Software without restriction, including
9
+ # without limitation the rights to use, copy, modify, merge, publish,
10
+ # distribute, sublicense, and/or sell copies of the Software, and to
11
+ # permit persons to whom the Software is furnished to do so, subject to
12
+ # the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be
15
+ # included in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+ #++
25
+
26
+ require 'rubygems'
27
+ gem 'httparty', '>= 0.4.3'
28
+ require 'httparty'
29
+ gem 'builder', '>= 2.1.2'
30
+ require 'builder'
31
+
32
+ require 'twilio/twilio_object'
33
+ require 'twilio/account'
34
+ require 'twilio/call'
35
+ require 'twilio/connection'
36
+ require 'twilio/incoming_phone_number'
37
+ require 'twilio/local_phone_number'
38
+ require 'twilio/notification'
39
+ require 'twilio/outgoing_caller_id'
40
+ require 'twilio/recording'
41
+ require 'twilio/toll_free_phone_number'
42
+ require 'twilio/verb'
@@ -0,0 +1,11 @@
1
+ module Twilio
2
+ class Account < TwilioObject
3
+ def get
4
+ self.connection.class.get('')
5
+ end
6
+
7
+ def update_name(name)
8
+ self.connection.class.put('', :body => {:FriendlyName => name})
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,27 @@
1
+ module Twilio
2
+ class Call < TwilioObject
3
+ def make(caller, called, url, optional = {})
4
+ self.connection.class.post("/Calls", :body => {:Caller => caller, :Called => called, :Url => url}.merge(optional))
5
+ end
6
+
7
+ def list(optional = {})
8
+ self.connection.class.get("/Calls", :query => optional)
9
+ end
10
+
11
+ def get(call_sid)
12
+ self.connection.class.get("/Calls/#{call_sid}")
13
+ end
14
+
15
+ def segments(call_sid, call_segment_sid = nil)
16
+ self.connection.class.get("/Calls/#{call_sid}/Segments#{ '/' + call_segment_sid if call_segment_sid }")
17
+ end
18
+
19
+ def recordings(call_sid)
20
+ self.connection.class.get("/Calls/#{call_sid}/Recordings")
21
+ end
22
+
23
+ def notifications(call_sid)
24
+ self.connection.class.get("/Calls/#{call_sid}/Notifications")
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ module Twilio
2
+ #The Connection class caches the Twilio API base path and authentication credentials.
3
+ #It is passed into the constructor of other TwilioObject's, avoiding the need to
4
+ #explicitly set credentials with each API call.
5
+ #
6
+ # Example:
7
+ # c = Twilio::Connection.new('my_twilio_sid', 'my_auth_token')
8
+ class Connection
9
+ include HTTParty
10
+ TWILIO_URL = "https://api.twilio.com/2008-08-01/Accounts"
11
+
12
+ def initialize(account_sid, auth_token)
13
+ self.class.base_uri "#{TWILIO_URL}/#{account_sid}"
14
+ self.class.basic_auth account_sid, auth_token
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ module Twilio
2
+ class IncomingPhoneNumber < TwilioObject
3
+ def list(optional = {})
4
+ self.connection.class.get("/IncomingPhoneNumbers", :query => optional)
5
+ end
6
+
7
+ def get(incoming_sid)
8
+ self.connection.class.get("/IncomingPhoneNumbers/#{incoming_sid}")
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ module Twilio
2
+ class LocalPhoneNumber < TwilioObject
3
+ def create(url, area_code = nil, method = 'POST', friendly_name = nil)
4
+ self.connection.class.post("/IncomingPhoneNumbers/Local", :body => {
5
+ :Url => url,
6
+ :AreaCode => area_code,
7
+ :Method => method,
8
+ :FriendlyName => friendly_name
9
+ })
10
+ end
11
+
12
+ def list
13
+ self.connection.class.get("/IncomingPhoneNumbers/Local")
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ module Twilio
2
+ class Notification < TwilioObject
3
+ def list(optional = {})
4
+ self.connection.class.get('/Notifications', :query => optional)
5
+ end
6
+
7
+ def get(notification_sid)
8
+ self.connection.class.get("/Notifications/#{notification_sid}")
9
+ end
10
+
11
+ def delete(notification_sid)
12
+ self.connection.class.delete("/Notifications/#{notification_sid}")
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,27 @@
1
+ module Twilio
2
+ class OutgoingCallerId < TwilioObject
3
+ def create(phone_number, friendly_name = phone_number, call_delay = 0)
4
+ self.connection.class.post("/OutgoingCallerIds", :body => {
5
+ :PhoneNumber => phone_number,
6
+ :FriendlyName => friendly_name,
7
+ :CallDelay => call_delay
8
+ })
9
+ end
10
+
11
+ def list(optional = {})
12
+ self.connection.class.get("/OutgoingCallerIds", :query => optional)
13
+ end
14
+
15
+ def get(callerid_sid)
16
+ self.connection.class.get("/OutgoingCallerIds/#{callerid_sid}")
17
+ end
18
+
19
+ def update_name(callerid_sid, name)
20
+ self.connection.class.put("/OutgoingCallerIds/#{callerid_sid}", :body => {:FriendlyName => name})
21
+ end
22
+
23
+ def delete(callerid_sid)
24
+ self.connection.class.delete("/OutgoingCallerIds/#{callerid_sid}")
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ module Twilio
2
+ class Recording < TwilioObject
3
+ def list(optional = {})
4
+ self.connection.class.get("/Recordings", :query => optional)
5
+ end
6
+
7
+ def get(recording_sid)
8
+ self.connection.class.get("/Recordings/#{recording_sid}")
9
+ end
10
+
11
+ def delete(recording_sid)
12
+ self.connection.class.delete("/Recordings/#{recording_sid}")
13
+ end
14
+
15
+ def transcriptions(recording_sid, transcription_sid = nil)
16
+ self.connection.class.get("/Recordings/#{recording_sid}/Transcriptions#{ '/' + transcription_sid if transcription_sid }")
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,16 @@
1
+ module Twilio
2
+ class TollFreePhoneNumber < TwilioObject
3
+ def create(url, area_code = nil, method = 'POST', friendly_name = nil)
4
+ self.connection.class.post("/IncomingPhoneNumbers/TollFree", :body => {
5
+ :Url => url,
6
+ :AreaCode => area_code,
7
+ :Method => method,
8
+ :FriendlyName => friendly_name
9
+ })
10
+ end
11
+
12
+ def list
13
+ self.connection.class.get("/IncomingPhoneNumbers/TollFree")
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ module Twilio
2
+ class TwilioObject
3
+ include HTTParty
4
+
5
+ attr_reader :connection
6
+
7
+ def initialize(connection)
8
+ @connection = connection
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,50 @@
1
+ module Twilio
2
+ class Verb
3
+ class << self
4
+ def say(text, options = {})
5
+ voice = options[:voice] || 'woman'
6
+ language = options[:language] || 'en'
7
+ loop_count = Integer(options[:loop] || 1)
8
+ pause = options[:pause]
9
+
10
+ xml = Builder::XmlMarkup.new
11
+ xml.instruct!
12
+ xml.Response {
13
+ if pause
14
+ loop_count.times do |i|
15
+ xml.Say(text, :voice => voice, :language => language, :loop => 1)
16
+ xml.Pause unless i+1 == loop_count
17
+ end
18
+ else
19
+ xml.Say(text, :voice => voice, :language => language, :loop => loop_count)
20
+ end
21
+ }
22
+ end
23
+
24
+ def play(audio_url, options = {})
25
+ raise NotImplementedError.new 'Not yet implemented - coming soon'
26
+ end
27
+
28
+ def gather(options = {})
29
+ raise NotImplementedError.new 'Not yet implemented - coming soon'
30
+ end
31
+
32
+ def record(options = {})
33
+ raise NotImplementedError.new 'Not yet implemented - coming soon'
34
+ end
35
+
36
+ def dial(phone_number, options = {})
37
+ raise NotImplementedError.new 'Not yet implemented - coming soon'
38
+ end
39
+
40
+ def method_missing(method_id, *args)
41
+ if match = /(say|play|gather|record|dial)_(\d+)_times(_with_pause$*)/.match(method_id.to_s)
42
+ verb = match.captures.first
43
+ how_many_times = match.captures[1]
44
+ pause = match.captures[2] == '_with_pause'
45
+ self.send(verb, args.first, { :loop => how_many_times, :pause => pause})
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,11 @@
1
+ <TwilioResponse>
2
+ <Account>
3
+ <Sid>mysid</Sid>
4
+ <FriendlyName>My Nice Twilio Account</FriendlyName>
5
+ <Status>2</Status>
6
+ <StatusText>Active</StatusText>
7
+ <DateCreated>Wed, 02 Apr 2008 17:33:38 -0700</DateCreated>
8
+ <DateUpdated>Wed, 02 Apr 2008 17:34:18 -0700</DateUpdated>
9
+ <AuthToken>mytoken</AuthToken>
10
+ </Account>
11
+ </TwilioResponse>
@@ -0,0 +1,11 @@
1
+ <TwilioResponse>
2
+ <Account>
3
+ <Sid>mysid</Sid>
4
+ <FriendlyName>Bubba</FriendlyName>
5
+ <Status>2</Status>
6
+ <StatusText>Active</StatusText>
7
+ <DateCreated>Wed, 02 Apr 2008 17:33:38 -0700</DateCreated>
8
+ <DateUpdated>Wed, 02 Apr 2008 17:34:18 -0700</DateUpdated>
9
+ <AuthToken>mytoken</AuthToken>
10
+ </Account>
11
+ </TwilioResponse>
@@ -0,0 +1,18 @@
1
+ <TwilioResponse>
2
+ <Call>
3
+ <Sid>CA42ed11f93dc08b952027ffbc406d0868</Sid>
4
+ <DateCreated>Sat, 07 Feb 2009 13:15:19 -0800</DateCreated>
5
+ <DateUpdated>Sat, 07 Feb 2009 13:15:19 -0800</DateUpdated>
6
+ <CallSegmentSid/>
7
+ <AccountSid>mysid</AccountSid>
8
+ <Called>4159633717</Called>
9
+ <Caller>4156767925</Caller>
10
+ <PhoneNumberSid>PN01234567890123456789012345678900</PhoneNumberSid>
11
+ <Status>2</Status>
12
+ <StartTime>Thu, 03 Apr 2008 04:36:33 -0400</StartTime>
13
+ <EndTime>Thu, 03 Apr 2008 04:36:47 -0400</EndTime>
14
+ <Duration>14</Duration>
15
+ <Price/>
16
+ <Flags>1</Flags>
17
+ </Call>
18
+ </TwilioResponse>
@@ -0,0 +1,14 @@
1
+ <TwilioResponse>
2
+ <Call>
3
+ <Sid>CA42ed11f93dc08b952027ffbc406d0868</Sid>
4
+ <CallSegmentSid/> <AccountSid>AC309475e5fede1b49e100272a8640f438</AccountSid>
5
+ <Called>4155551212</Called>
6
+ <Caller>4158675309</Caller>
7
+ <PhoneNumberSid>PN01234567890123456789012345678900</PhoneNumberSid>
8
+ <Status>0</Status>
9
+ <StartTime>Thu, 03 Apr 2008 04:36:33 -0400</StartTime>
10
+ <EndTime/>
11
+ <Price/>
12
+ <Flags>1</Flags>
13
+ </Call>
14
+ </TwilioResponse>
@@ -0,0 +1,36 @@
1
+ <TwilioResponse>
2
+ <Calls page="0" numpages="1" pagesize="50" total="38" start="0" end="37">
3
+ <Call>
4
+ <Sid>CA42ed11f93dc08b952027ffbc406d0868</Sid>
5
+ <DateCreated>Sat, 07 Feb 2009 13:15:19 -0800</DateCreated>
6
+ <DateUpdated>Sat, 07 Feb 2009 13:15:19 -0800</DateUpdated>
7
+ <CallSegmentSid/>
8
+ <AccountSid>mysid</AccountSid>
9
+ <Called>4159633717</Called>
10
+ <Caller>4156767925</Caller>
11
+ <PhoneNumberSid>PN01234567890123456789012345678900</PhoneNumberSid>
12
+ <Status>2</Status>
13
+ <StartTime>Thu, 03 Apr 2008 04:36:33 -0400</StartTime>
14
+ <EndTime>Thu, 03 Apr 2008 04:36:47 -0400</EndTime>
15
+ <Duration>14</Duration>
16
+ <Price/>
17
+ <Flags>1</Flags>
18
+ </Call>
19
+ <Call>
20
+ <Sid>CA751e8fa0a0105cf26a0d7a9775fb4bfb</Sid>
21
+ <DateCreated>Sat, 07 Feb 2009 13:15:19 -0800</DateCreated>
22
+ <DateUpdated>Sat, 07 Feb 2009 13:15:19 -0800</DateUpdated>
23
+ <CallSegmentSid/>
24
+ <AccountSid>mysid</AccountSid>
25
+ <Called>2064287985</Called>
26
+ <Caller>4156767925</Caller>
27
+ <PhoneNumberSid>PNd59c2ba27ef48264773edb90476d1674</PhoneNumberSid>
28
+ <Status>2</Status>
29
+ <StartTime>Thu, 03 Apr 2008 01:37:05 -0400</StartTime>
30
+ <EndTime>Thu, 03 Apr 2008 01:37:40 -0400</EndTime>
31
+ <Duration>35</Duration>
32
+ <Price/>
33
+ <Flags>1</Flags>
34
+ </Call>
35
+ </Calls>
36
+ </TwilioResponse>
@@ -0,0 +1,12 @@
1
+ <TwilioResponse>
2
+ <IncomingPhoneNumber>
3
+ <Sid>PNe536dfda7c6184afab78d980cb8cdf43</Sid>
4
+ <AccountSid>mysid</AccountSid>
5
+ <FriendlyName>My Home Phone Number</FriendlyName>
6
+ <PhoneNumber>4158675309</PhoneNumber>
7
+ <Url>http://mycompany.com/handleMainLineCall.asp</Url>
8
+ <Method>GET</Method>
9
+ <DateCreated>Tue, 01 Apr 2008 11:26:32 -0700</DateCreated>
10
+ <DateUpdated>Tue, 01 Apr 2008 11:26:32 -0700</DateUpdated>
11
+ </IncomingPhoneNumber>
12
+ </TwilioResponse>
@@ -0,0 +1,24 @@
1
+ <TwilioResponse>
2
+ <IncomingPhoneNumbers page="0" numpages="1" pagesize="50" total="2" start="0" end="0">
3
+ <IncomingPhoneNumber>
4
+ <Sid>PNe536dfda7c6184afab78d980cb8cdf43</Sid>
5
+ <AccountSid>mysid</AccountSid>
6
+ <FriendlyName>Company Main Line</FriendlyName>
7
+ <PhoneNumber>4158675309</PhoneNumber>
8
+ <Url>http://mycompany.com/handleMainLineCall.asp</Url>
9
+ <Method>GET</Method>
10
+ <DateCreated>Tue, 01 Apr 2008 11:26:32 -0700</DateCreated>
11
+ <DateUpdated>Tue, 01 Apr 2008 11:26:32 -0700</DateUpdated>
12
+ </IncomingPhoneNumber>
13
+ <IncomingPhoneNumber>
14
+ <Sid>PNe536dfda7c6DDd455fed980cb83345FF</Sid>
15
+ <AccountSid>mysid</AccountSid>
16
+ <FriendlyName>Company Support Line</FriendlyName>
17
+ <PhoneNumber>4158675310</PhoneNumber>
18
+ <Url>http://mycompany.com/handleSupportCall.php</Url>
19
+ <Method>POST</Method>
20
+ <DateCreated>Tue, 01 Apr 2008 11:26:32 -0700</DateCreated>
21
+ <DateUpdated>Tue, 01 Apr 2008 11:26:32 -0700</DateUpdated>
22
+ </IncomingPhoneNumber>
23
+ </IncomingPhoneNumbers>
24
+ </TwilioResponse>
@@ -0,0 +1,19 @@
1
+ <TwilioResponse>
2
+ <Notification>
3
+ <Sid>NO1fb7086ceb85caed2265f17d7bf7981c</Sid>
4
+ <DateCreated>Sat, 07 Feb 2009 13:15:19 -0800</DateCreated>
5
+ <DateUpdated>Sat, 07 Feb 2009 13:15:19 -0800</DateUpdated>
6
+ <AccountSid>mysid</AccountSid>
7
+ <CallSid>CA42ed11f93dc08b952027ffbc406d0868</CallSid>
8
+ <Log>0</Log>
9
+ <ErrorCode>12345</ErrorCode>
10
+ <MoreInfo>http://www.twilio.com/docs/errors/12345</MoreInfo>
11
+ <MessageText>Unable to parse XML response</MessageText>
12
+ <MessageDate>Thu, 03 Apr 2008 04:36:32 -0400</MessageDate>
13
+ <RequestURL>http://yourserver.com/handleCall.php</RequestURL>
14
+ <RequestMethod>POST</RequestMethod>
15
+ <RequestVariables>Caller=4158675309&Called=4155551212...</RequestVariables>
16
+ <ResponseHeaders>Content-Length: 500</ResponseHeaders>
17
+ <ResponseBody>&lt;h1&gt;Error parsing PHP script&lt;/h1&gt;</ResponseBody>
18
+ </Notification>
19
+ </TwilioResponse>
@@ -0,0 +1,32 @@
1
+ <TwilioResponse>
2
+ <Notifications page="0" numpages="10" pagesize="50" total="498" start="0" end="49">
3
+ <Notification>
4
+ <Sid>NO1fb7086ceb85caed2265f17d7bf7981c</Sid>
5
+ <DateCreated>Sat, 07 Feb 2009 13:15:19 -0800</DateCreated>
6
+ <DateUpdated>Sat, 07 Feb 2009 13:15:19 -0800</DateUpdated>
7
+ <AccountSid>mysid</AccountSid>
8
+ <CallSid>CA42ed11f93dc08b952027ffbc406d0868</CallSid>
9
+ <Log>0</Log>
10
+ <ErrorCode>12345</ErrorCode>
11
+ <MoreInfo>http://www.twilio.com/docs/errors/12345</MoreInfo>
12
+ <RequestURL>http://yourserver.com/handleCall.php</RequestURL>
13
+ <RequestMethod>POST</RequestMethod>
14
+ <MessageText>Unable to parse XML response</MessageText>
15
+ <MessageDate>Thu, 03 Apr 2008 04:36:32 -0400</MessageDate>
16
+ </Notification>
17
+ <Notification>
18
+ <Sid>NOe936fdac57d238e56fd346b89820d342</Sid>
19
+ <DateCreated>Sat, 07 Feb 2009 13:15:19 -0800</DateCreated>
20
+ <DateUpdated>Sat, 07 Feb 2009 13:15:19 -0800</DateUpdated>
21
+ <AccountSid>mysid</AccountSid>
22
+ <CallSid></CallSid>
23
+ <Log>1</Log>
24
+ <ErrorCode>67890</ErrorCode>
25
+ <MoreInfo>http://www.twilio.com/docs/errors/67890</MoreInfo>
26
+ <RequestURL>http://api.twilio.com/2008-08-01/Accounts/AC309475e5fede1b49e100272a8640f438/Calls</RequestURL>
27
+ <RequestMethod>POST</RequestMethod>
28
+ <MessageText>Unknown parameter received by the REST API: foo=bar</MessageText>
29
+ <MessageDate>Thu, 03 Apr 2008 04:36:32 -0400</MessageDate>
30
+ </Notification>
31
+ </Notifications>
32
+ </TwilioResponse>
@@ -0,0 +1,10 @@
1
+ <TwilioResponse>
2
+ <OutgoingCallerId>
3
+ <Sid>PNe536dfda7c6184afab78d980cb8cdf43</Sid>
4
+ <AccountSid>mysid</AccountSid>
5
+ <FriendlyName>My Home Phone Number</FriendlyName>
6
+ <PhoneNumber>4158675309</PhoneNumber>
7
+ <DateCreated>Tue, 01 Apr 2008 11:26:32 -0700</DateCreated>
8
+ <DateUpdated>Tue, 01 Apr 2008 11:26:32 -0700</DateUpdated>
9
+ </OutgoingCallerId>
10
+ </TwilioResponse>
@@ -0,0 +1,7 @@
1
+ <TwilioResponse>
2
+ <ValidationRequest>
3
+ <AccountSid>mysid</AccountSid>
4
+ <PhoneNumber>4158675309</PhoneNumber>
5
+ <ValidationCode>123456</ValidationCode>
6
+ </ValidationRequest>
7
+ </TwilioResponse>
@@ -0,0 +1,20 @@
1
+ <TwilioResponse>
2
+ <OutgoingCallerIds page="0" numpages="1" pagesize="50" total="2" start="0" end="0">
3
+ <OutgoingCallerId>
4
+ <Sid>PNe536dfda7c6184afab78d980cb8cdf43</Sid>
5
+ <AccountSid>mysid</AccountSid>
6
+ <FriendlyName>Bob Cell Phone</FriendlyName>
7
+ <PhoneNumber>4158675309</PhoneNumber>
8
+ <DateCreated>Tue, 01 Apr 2008 11:26:32 -0700</DateCreated>
9
+ <DateUpdated>Tue, 01 Apr 2008 11:26:32 -0700</DateUpdated>
10
+ </OutgoingCallerId>
11
+ <OutgoingCallerId>
12
+ <Sid>PNe536dfda7c6DDd455fed980cb83345FF</Sid>
13
+ <AccountSid>mysid</AccountSid>
14
+ <FriendlyName>Company Main Line</FriendlyName>
15
+ <PhoneNumber>4158675310</PhoneNumber>
16
+ <DateCreated>Tue, 01 Apr 2008 11:26:32 -0700</DateCreated>
17
+ <DateUpdated>Tue, 01 Apr 2008 11:26:32 -0700</DateUpdated>
18
+ </OutgoingCallerId>
19
+ </OutgoingCallerIds>
20
+ </TwilioResponse>
@@ -0,0 +1,10 @@
1
+ <TwilioResponse>
2
+ <Recording>
3
+ <Sid>RE41331862605f3d662488fdafda2e175f</Sid>
4
+ <AccountSid>mysid</AccountSid>
5
+ <CallSid>CAcd420fcb3c4b86e360ea0cc27ebc8698</CallSid>
6
+ <Duration>15</Duration>
7
+ <DateCreated>Tue, 01 Apr 2008 01:07:15 -0400</DateCreated>
8
+ <DateUpdated>Tue, 01 Apr 2008 01:07:15 -0400</DateUpdated>
9
+ </Recording>
10
+ </TwilioResponse>
@@ -0,0 +1,20 @@
1
+ <TwilioResponse>
2
+ <Recordings page="0" numpages="1" pagesize="50" total="16" start="0" end="15">
3
+ <Recording>
4
+ <Sid>RE41331862605f3d662488fdafda2e175f</Sid>
5
+ <AccountSid>mysid</AccountSid>
6
+ <CallSid>CAcd420fcb3c4b86e360ea0cc27ebc8698</CallSid>
7
+ <Duration>123</Duration>
8
+ <DateCreated>Tue, 01 Apr 2008 01:07:15 -0400</DateCreated>
9
+ <DateUpdated>Tue, 01 Apr 2008 01:07:15 -0400</DateUpdated>
10
+ </Recording>
11
+ <Recording>
12
+ <Sid>RE50358f2565ad3c542e004161c3aecfd2</Sid>
13
+ <AccountSid>mysid</AccountSid>
14
+ <CallSid>CAcd420fcb3c4b86e360ea0cc27ebc8698</CallSid>
15
+ <Duration>45</Duration>
16
+ <DateCreated>Tue, 01 Apr 2008 01:07:10 -0400</DateCreated>
17
+ <DateUpdated>Tue, 01 Apr 2008 01:07:10 -0400</DateUpdated>
18
+ </Recording>
19
+ </Recordings>
20
+ </TwilioResponse>
@@ -0,0 +1,13 @@
1
+ <TwilioResponse>
2
+ <Transcription>
3
+ <Sid>TRbdece5b75f2cd8f6ef38e0a10f5c4447</Sid>
4
+ <DateCreated>1235986685</DateCreated>
5
+ <DateUpdated>1235957924</DateUpdated>
6
+ <AccountSid>mysid</AccountSid>
7
+ <Status>completed</Status>
8
+ <RecordingSid>RE3870404da563592ef6a72136438a879c</RecordingSid>
9
+ <Duration>9</Duration>
10
+ <TranscriptionText>This is the body a transcribed recording</TranscriptionText>
11
+ <Price>-0.03000</Price>
12
+ </Transcription>
13
+ </TwilioResponse>
@@ -0,0 +1,26 @@
1
+ <TwilioResponse>
2
+ <Transcriptions page="0" numpages="1" pagesize="50" total="2" start="0" end="1">
3
+ <Transcription>
4
+ <Sid>TR685e9a2bdf89b978491b1afada63f078</Sid>
5
+ <DateCreated>1235986685</DateCreated>
6
+ <DateUpdated>1235957975</DateUpdated>
7
+ <AccountSid>mysid</AccountSid>
8
+ <Status>completed</Status>
9
+ <RecordingSid>RE3870404da563592ef6a72136438a879c</RecordingSid>
10
+ <Duration>9</Duration>
11
+ <TranscriptionText>This is the body of one transcribed recording</TranscriptionText>
12
+ <Price>-0.25000</Price>
13
+ </Transcription>
14
+ <Transcription>
15
+ <Sid>TRbdece5b75f2cd8f6ef38e0a10f5c4447</Sid>
16
+ <DateCreated>1235986685</DateCreated>
17
+ <DateUpdated>1235957924</DateUpdated>
18
+ <AccountSid>mysid</AccountSid>
19
+ <Status>completed</Status>
20
+ <RecordingSid>RE3870404da563592ef6a72136438a879c</RecordingSid>
21
+ <Duration>9</Duration>
22
+ <TranscriptionText>This is the body of another transcribed recording</TranscriptionText>
23
+ <Price>-0.03000</Price>
24
+ </Transcription>
25
+ </Transcriptions>
26
+ </TwilioResponse>
@@ -0,0 +1,8 @@
1
+ say_hi:
2
+ response: <?xml version="1.0" encoding="UTF-8"?><Response><Say loop="1" language="en" voice="woman">hi</Say></Response>
3
+
4
+ say_hi_three_times:
5
+ response: <?xml version="1.0" encoding="UTF-8"?><Response><Say loop="3" language="en" voice="woman">hi</Say></Response>
6
+
7
+ say_hi_three_times_with_pause:
8
+ response: <?xml version="1.0" encoding="UTF-8"?><Response><Say loop="1" language="en" voice="woman">hi</Say><Pause/><Say loop="1" language="en" voice="woman">hi</Say><Pause/><Say loop="1" language="en" voice="woman">hi</Say></Response>
@@ -0,0 +1,29 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'fakeweb'
4
+ require 'shoulda'
5
+ require 'matchy'
6
+ require 'yaml'
7
+
8
+ FakeWeb.allow_net_connect = false
9
+
10
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
11
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
12
+ require 'twilio'
13
+
14
+ class Test::Unit::TestCase
15
+ end
16
+
17
+ def fixture(filename)
18
+ path = File.join(File.dirname(__FILE__), "fixtures/xml/#{filename}.xml")
19
+ File.read path
20
+ end
21
+
22
+ def twilio_url(url=nil)
23
+ "https://mysid:mytoken@api.twilio.com:443/2008-08-01/Accounts/mysid#{'/' + url if url}"
24
+ end
25
+
26
+ def verb_response(verb)
27
+ path = File.join(File.dirname(__FILE__), "fixtures/yml/verb_responses.yml")
28
+ YAML.load_file(path)[verb.to_s]['response']
29
+ end
@@ -0,0 +1,23 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class AccountTest < Test::Unit::TestCase
4
+ context "An account" do
5
+ setup do
6
+ @connection = Twilio::Connection.new('mysid', 'mytoken')
7
+ @account = Twilio::Account.new(@connection)
8
+ end
9
+
10
+ should "be retrievable" do
11
+ fake_response = fixture(:account)
12
+ FakeWeb.register_uri(:get, twilio_url, :string => fake_response)
13
+ assert_equal @account.get, fake_response
14
+ end
15
+
16
+ should "be able to update name" do
17
+ fake_response = fixture(:account_renamed)
18
+ FakeWeb.register_uri(:put, twilio_url, :string => fake_response)
19
+ response = @account.update_name('Bubba')
20
+ assert_equal response, fake_response
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,59 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class CallTest < Test::Unit::TestCase
4
+ context "A call" do
5
+ setup do
6
+ @connection = Twilio::Connection.new('mysid', 'mytoken')
7
+ @call = Twilio::Call.new(@connection)
8
+ end
9
+
10
+ should "be retrievable as a list" do
11
+ fake_response = fixture(:calls)
12
+ FakeWeb.register_uri(:get, twilio_url('Calls'), :string => fake_response)
13
+ assert_equal @call.list, fake_response
14
+ end
15
+
16
+ should "be retrievable individually" do
17
+ fake_response = fixture(:call)
18
+ FakeWeb.register_uri(:get, twilio_url('Calls/CA42ed11f93dc08b952027ffbc406d0868'), :string => fake_response)
19
+ assert_equal @call.get('CA42ed11f93dc08b952027ffbc406d0868'), fake_response
20
+ end
21
+
22
+ should "be made" do
23
+ fake_response = fixture(:call_new)
24
+ FakeWeb.register_uri(:post, twilio_url('Calls'), :string => fake_response)
25
+ response = @call.make('4158675309', '4155551212', 'http://test.local/call_handler')
26
+ assert_equal response, fake_response
27
+ end
28
+
29
+ context "with segments" do
30
+ should "returns a list of Call resources that were segments created in the same call" do
31
+ fake_response = fixture(:calls)
32
+ FakeWeb.register_uri(:get, twilio_url('Calls/CA42ed11f93dc08b952027ffbc406d0868/Segments'), :string => fake_response)
33
+ assert_equal @call.segments('CA42ed11f93dc08b952027ffbc406d0868'), fake_response
34
+ end
35
+
36
+ should "returns a single Call resource for the CallSid and CallSegmentSid provided" do
37
+ fake_response = fixture(:calls)
38
+ FakeWeb.register_uri(:get, twilio_url('Calls/CA42ed11f93dc08b952027ffbc406d0868/Segments/abc123'), :string => fake_response)
39
+ assert_equal @call.segments('CA42ed11f93dc08b952027ffbc406d0868', 'abc123'), fake_response
40
+ end
41
+ end
42
+
43
+ context "with recordings" do
44
+ should "returns a list of recordings that were generated during the call" do
45
+ fake_response = fixture(:recordings)
46
+ FakeWeb.register_uri(:get, twilio_url('Calls/CA42ed11f93dc08b952027ffbc406d0868/Recordings'), :string => fake_response)
47
+ assert_equal @call.recordings('CA42ed11f93dc08b952027ffbc406d0868'), fake_response
48
+ end
49
+ end
50
+
51
+ context "with notifications" do
52
+ should "description" do
53
+ fake_response = fixture(:notifications)
54
+ FakeWeb.register_uri(:get, twilio_url('Calls/CA42ed11f93dc08b952027ffbc406d0868/Notifications'), :string => fake_response)
55
+ assert_equal @call.notifications('CA42ed11f93dc08b952027ffbc406d0868'), fake_response
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class ConnectionTest < Test::Unit::TestCase
4
+ context "A Twilio connection" do
5
+ setup do
6
+ @connection = Twilio::Connection.new('mysid', 'mytoken')
7
+ end
8
+
9
+ context "when initializing" do
10
+ should "have correct url" do
11
+ assert_equal "#{Twilio::Connection::TWILIO_URL}/mysid", @connection.class.base_uri
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,22 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class IncomingPhoneNumberTest < Test::Unit::TestCase
4
+ context "An incoming phone number" do
5
+ setup do
6
+ @connection = Twilio::Connection.new('mysid', 'mytoken')
7
+ @incoming = Twilio::IncomingPhoneNumber.new(@connection)
8
+ end
9
+
10
+ should "be retrievable as a list" do
11
+ fake_response = fixture(:incoming_phone_numbers)
12
+ FakeWeb.register_uri(:get, twilio_url('IncomingPhoneNumbers'), :string => fake_response)
13
+ assert_equal @incoming.list, fake_response
14
+ end
15
+
16
+ should "be retrievable individually" do
17
+ fake_response = fixture(:incoming_phone_number)
18
+ FakeWeb.register_uri(:get, twilio_url('IncomingPhoneNumbers/PNe536dfda7c6184afab78d980cb8cdf43'), :string => fake_response)
19
+ assert_equal @incoming.get('PNe536dfda7c6184afab78d980cb8cdf43'), fake_response
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class LocalPhoneNumberTest < Test::Unit::TestCase
4
+ context "A local phone number" do
5
+ setup do
6
+ @connection = Twilio::Connection.new('mysid', 'mytoken')
7
+ @local = Twilio::LocalPhoneNumber.new(@connection)
8
+ end
9
+
10
+ should "be retrievable as a list" do
11
+ fake_response = fixture(:incoming_phone_numbers)
12
+ FakeWeb.register_uri(:get, twilio_url('IncomingPhoneNumbers/Local'), :string => fake_response)
13
+ assert_equal @local.list, fake_response
14
+ end
15
+
16
+ should "be created" do
17
+ fake_response = fixture(:incoming_phone_number)
18
+ FakeWeb.register_uri(:post, twilio_url('IncomingPhoneNumbers/Local'), :string => fake_response)
19
+ response = @local.create('http://test.local/call_handler')
20
+ assert_equal response, fake_response
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,28 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class NotificationTest < Test::Unit::TestCase
4
+ context "A recording" do
5
+ setup do
6
+ @connection = Twilio::Connection.new('mysid', 'mytoken')
7
+ @notification = Twilio::Notification.new(@connection)
8
+ end
9
+
10
+ should "be retrievable as a list" do
11
+ fake_response = fixture(:notifications)
12
+ FakeWeb.register_uri(:get, twilio_url('Notifications'), :string => fake_response)
13
+ assert_equal @notification.list, fake_response
14
+ end
15
+
16
+ should "be retrievable individually" do
17
+ fake_response = fixture(:notification)
18
+ FakeWeb.register_uri(:get, twilio_url('Notifications/NO1fb7086ceb85caed2265f17d7bf7981c'), :string => fake_response)
19
+ assert_equal @notification.get('NO1fb7086ceb85caed2265f17d7bf7981c'), fake_response
20
+ end
21
+
22
+ should "be deleted" do
23
+ FakeWeb.register_uri(:delete, twilio_url('Notifications/NO1fb7086ceb85caed2265f17d7bf7981c'), :status => [ 204, "HTTPNoContent" ])
24
+ response = @notification.delete('NO1fb7086ceb85caed2265f17d7bf7981c')
25
+ assert response
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,42 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class OutgoingCallerIdTest < Test::Unit::TestCase
4
+ context "An outgoing caller id" do
5
+ setup do
6
+ @connection = Twilio::Connection.new('mysid', 'mytoken')
7
+ @caller_id = Twilio::OutgoingCallerId.new(@connection)
8
+ end
9
+
10
+ should "be retrievable as a list" do
11
+ fake_response = fixture(:outgoing_caller_ids)
12
+ FakeWeb.register_uri(:get, twilio_url('OutgoingCallerIds'), :string => fake_response)
13
+ assert_equal @caller_id.list, fake_response
14
+ end
15
+
16
+ should "be retrievable individually" do
17
+ fake_response = fixture(:outgoing_caller_id)
18
+ FakeWeb.register_uri(:get, twilio_url('OutgoingCallerIds/PNe536dfda7c6184afab78d980cb8cdf43'), :string => fake_response)
19
+ assert_equal @caller_id.get('PNe536dfda7c6184afab78d980cb8cdf43'), fake_response
20
+ end
21
+
22
+ should "be created" do
23
+ fake_response = fixture(:outgoing_caller_id_new)
24
+ FakeWeb.register_uri(:post, twilio_url('OutgoingCallerIds'), :string => fake_response)
25
+ response = @caller_id.create('4158675309', 'My Home Phone')
26
+ assert_equal response, fake_response
27
+ end
28
+
29
+ should "be able to update name" do
30
+ fake_response = fixture(:outgoing_caller_id)
31
+ FakeWeb.register_uri(:put, twilio_url('OutgoingCallerIds/PNe536dfda7c6184afab78d980cb8cdf43'), :string => fake_response)
32
+ response = @caller_id.update_name('PNe536dfda7c6184afab78d980cb8cdf43', 'My office line')
33
+ assert_equal response, fake_response
34
+ end
35
+
36
+ should "be deleted" do
37
+ FakeWeb.register_uri(:delete, twilio_url('OutgoingCallerIds/PNe536dfda7c6184afab78d980cb8cdf43'), :status => [ 204, "HTTPNoContent" ])
38
+ response = @caller_id.delete('PNe536dfda7c6184afab78d980cb8cdf43')
39
+ assert response
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,42 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class RecordingTest < Test::Unit::TestCase
4
+ context "A recording" do
5
+ setup do
6
+ @connection = Twilio::Connection.new('mysid', 'mytoken')
7
+ @recording = Twilio::Recording.new(@connection)
8
+ end
9
+
10
+ should "be retrievable as a list" do
11
+ fake_response = fixture(:recordings)
12
+ FakeWeb.register_uri(:get, twilio_url('Recordings'), :string => fake_response)
13
+ assert_equal @recording.list, fake_response
14
+ end
15
+
16
+ should "be retrievable individually" do
17
+ fake_response = fixture(:recording)
18
+ FakeWeb.register_uri(:get, twilio_url('Recordings/RE41331862605f3d662488fdafda2e175f'), :string => fake_response)
19
+ assert_equal @recording.get('RE41331862605f3d662488fdafda2e175f'), fake_response
20
+ end
21
+
22
+ should "be deleted" do
23
+ FakeWeb.register_uri(:delete, twilio_url('Recordings/RE41331862605f3d662488fdafda2e175f'), :status => [ 204, "HTTPNoContent" ])
24
+ response = @recording.delete('RE41331862605f3d662488fdafda2e175f')
25
+ assert response
26
+ end
27
+
28
+ context "with transcriptions" do
29
+ should "be retrievable as a list" do
30
+ fake_response = fixture(:transcriptions)
31
+ FakeWeb.register_uri(:get, twilio_url('Recordings/RE41331862605f3d662488fdafda2e175f/Transcriptions'), :string => fake_response)
32
+ assert_equal @recording.transcriptions('RE41331862605f3d662488fdafda2e175f'), fake_response
33
+ end
34
+
35
+ should "be retrievable individually" do
36
+ fake_response = fixture(:transcription)
37
+ FakeWeb.register_uri(:get, twilio_url('Recordings/RE41331862605f3d662488fdafda2e175f/Transcriptions/TRbdece5b75f2cd8f6ef38e0a10f5c4447'), :string => fake_response)
38
+ assert_equal @recording.transcriptions('RE41331862605f3d662488fdafda2e175f', 'TRbdece5b75f2cd8f6ef38e0a10f5c4447'), fake_response
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,23 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class TollFreePhoneNumberTest < Test::Unit::TestCase
4
+ context "A toll free phone number" do
5
+ setup do
6
+ @connection = Twilio::Connection.new('mysid', 'mytoken')
7
+ @toll_free = Twilio::TollFreePhoneNumber.new(@connection)
8
+ end
9
+
10
+ should "be retrievable as a list" do
11
+ fake_response = fixture(:incoming_phone_numbers)
12
+ FakeWeb.register_uri(:get, twilio_url('IncomingPhoneNumbers/TollFree'), :string => fake_response)
13
+ assert_equal @toll_free.list, fake_response
14
+ end
15
+
16
+ should "be created" do
17
+ fake_response = fixture(:incoming_phone_number)
18
+ FakeWeb.register_uri(:post, twilio_url('IncomingPhoneNumbers/TollFree'), :string => fake_response)
19
+ response = @toll_free.create('http://test.local/call_handler')
20
+ assert_equal response, fake_response
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,34 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class VerbTest < Test::Unit::TestCase
4
+ context "A Twilio Verb" do
5
+ should "say 'Hi'" do
6
+ assert_equal verb_response(:say_hi), Twilio::Verb.say('hi')
7
+ end
8
+
9
+ should "say 'Hi' three times" do
10
+ assert_equal verb_response(:say_hi_three_times), Twilio::Verb.say_3_times('hi')
11
+ end
12
+
13
+ should "say 'Hi' three times with pause" do
14
+ assert_equal verb_response(:say_hi_three_times_with_pause), Twilio::Verb.say_3_times_with_pause('hi')
15
+ end
16
+
17
+ should "raise not implemented error with play" do
18
+ assert_raise(NotImplementedError) { Twilio::Verb.play('something') }
19
+ end
20
+
21
+ should "raise not implemented error with gather" do
22
+ assert_raise(NotImplementedError) { Twilio::Verb.gather('something') }
23
+ end
24
+
25
+ should "raise not implemented error with record" do
26
+ assert_raise(NotImplementedError) { Twilio::Verb.record('something') }
27
+ end
28
+
29
+ should "raise not implemented error with dial" do
30
+ assert_raise(NotImplementedError) { Twilio::Verb.record('dial') }
31
+ end
32
+ end
33
+
34
+ end
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: webficient-twilio
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Phil Misiowiec
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-06-04 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: builder
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: httparty
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ description:
36
+ email: github@webficient.com
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - LICENSE
43
+ - README.rdoc
44
+ files:
45
+ - LICENSE
46
+ - README.rdoc
47
+ - Rakefile
48
+ - VERSION.yml
49
+ - lib/twilio.rb
50
+ - lib/twilio/account.rb
51
+ - lib/twilio/call.rb
52
+ - lib/twilio/connection.rb
53
+ - lib/twilio/incoming_phone_number.rb
54
+ - lib/twilio/local_phone_number.rb
55
+ - lib/twilio/notification.rb
56
+ - lib/twilio/outgoing_caller_id.rb
57
+ - lib/twilio/recording.rb
58
+ - lib/twilio/toll_free_phone_number.rb
59
+ - lib/twilio/twilio_object.rb
60
+ - lib/twilio/verb.rb
61
+ - test/fixtures/xml/account.xml
62
+ - test/fixtures/xml/account_renamed.xml
63
+ - test/fixtures/xml/call.xml
64
+ - test/fixtures/xml/call_new.xml
65
+ - test/fixtures/xml/calls.xml
66
+ - test/fixtures/xml/incoming_phone_number.xml
67
+ - test/fixtures/xml/incoming_phone_numbers.xml
68
+ - test/fixtures/xml/notification.xml
69
+ - test/fixtures/xml/notifications.xml
70
+ - test/fixtures/xml/outgoing_caller_id.xml
71
+ - test/fixtures/xml/outgoing_caller_id_new.xml
72
+ - test/fixtures/xml/outgoing_caller_ids.xml
73
+ - test/fixtures/xml/recording.xml
74
+ - test/fixtures/xml/recordings.xml
75
+ - test/fixtures/xml/transcription.xml
76
+ - test/fixtures/xml/transcriptions.xml
77
+ - test/fixtures/yml/verb_responses.yml
78
+ - test/test_helper.rb
79
+ - test/twilio/account_test.rb
80
+ - test/twilio/call_test.rb
81
+ - test/twilio/connection_test.rb
82
+ - test/twilio/incoming_phone_number_test.rb
83
+ - test/twilio/local_phone_number_test.rb
84
+ - test/twilio/notification_test.rb
85
+ - test/twilio/outgoing_caller_id_test.rb
86
+ - test/twilio/recording_test.rb
87
+ - test/twilio/toll_free_phone_number_test.rb
88
+ - test/twilio/verb_test.rb
89
+ has_rdoc: true
90
+ homepage: http://github.com/webficient/twilio
91
+ post_install_message:
92
+ rdoc_options:
93
+ - --charset=UTF-8
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: "0"
101
+ version:
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: "0"
107
+ version:
108
+ requirements: []
109
+
110
+ rubyforge_project:
111
+ rubygems_version: 1.2.0
112
+ signing_key:
113
+ specification_version: 2
114
+ summary: Twilio API Client
115
+ test_files:
116
+ - test/test_helper.rb
117
+ - test/twilio/account_test.rb
118
+ - test/twilio/call_test.rb
119
+ - test/twilio/connection_test.rb
120
+ - test/twilio/incoming_phone_number_test.rb
121
+ - test/twilio/local_phone_number_test.rb
122
+ - test/twilio/notification_test.rb
123
+ - test/twilio/outgoing_caller_id_test.rb
124
+ - test/twilio/recording_test.rb
125
+ - test/twilio/toll_free_phone_number_test.rb
126
+ - test/twilio/verb_test.rb