bandwidth-sdk 2.1.1 → 6.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +85 -70
  4. data/lib/bandwidth.rb +31 -2
  5. data/lib/bandwidth/api_helper.rb +14 -9
  6. data/lib/bandwidth/client.rb +22 -2
  7. data/lib/bandwidth/configuration.rb +67 -12
  8. data/lib/bandwidth/http/api_response.rb +2 -0
  9. data/lib/bandwidth/http/auth/two_factor_auth_basic_auth.rb +22 -0
  10. data/lib/bandwidth/http/auth/web_rtc_basic_auth.rb +22 -0
  11. data/lib/bandwidth/http/faraday_client.rb +5 -2
  12. data/lib/bandwidth/messaging_lib/messaging.rb +5 -3
  13. data/lib/bandwidth/messaging_lib/messaging/client.rb +13 -2
  14. data/lib/bandwidth/messaging_lib/messaging/controllers/api_controller.rb +191 -113
  15. data/lib/bandwidth/messaging_lib/messaging/controllers/base_controller.rb +1 -1
  16. data/lib/bandwidth/messaging_lib/messaging/exceptions/{generic_client_exception.rb → messaging_exception.rb} +2 -14
  17. data/lib/bandwidth/messaging_lib/messaging/models/bandwidth_message.rb +23 -13
  18. data/lib/bandwidth/messaging_lib/messaging/models/bandwidth_message_item.rb +125 -0
  19. data/lib/bandwidth/messaging_lib/messaging/models/bandwidth_messages_list.rb +60 -0
  20. data/lib/bandwidth/messaging_lib/messaging/models/media.rb +4 -4
  21. data/lib/bandwidth/messaging_lib/messaging/models/message_request.rb +21 -8
  22. data/lib/bandwidth/messaging_lib/messaging/models/page_info.rb +62 -0
  23. data/lib/bandwidth/messaging_lib/messaging/models/priority_enum.rb +19 -0
  24. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth.rb +22 -0
  25. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/client.rb +51 -0
  26. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/controllers/base_controller.rb +49 -0
  27. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/controllers/mfa_controller.rb +209 -0
  28. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/exceptions/error_with_request_exception.rb +34 -0
  29. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/exceptions/forbidden_request_exception.rb +29 -0
  30. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/exceptions/unauthorized_request_exception.rb +29 -0
  31. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/models/two_factor_code_request_schema.rb +88 -0
  32. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/models/two_factor_messaging_response.rb +35 -0
  33. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/models/two_factor_verify_code_response.rb +35 -0
  34. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/models/two_factor_verify_request_schema.rb +75 -0
  35. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/models/two_factor_voice_response.rb +35 -0
  36. data/lib/bandwidth/utilities/file_wrapper.rb +17 -0
  37. data/lib/bandwidth/voice_lib/bxml/verbs/bridge.rb +28 -0
  38. data/lib/bandwidth/voice_lib/bxml/verbs/conference.rb +32 -0
  39. data/lib/bandwidth/voice_lib/bxml/verbs/gather.rb +13 -1
  40. data/lib/bandwidth/voice_lib/bxml/verbs/phone_number.rb +7 -1
  41. data/lib/bandwidth/voice_lib/bxml/verbs/record.rb +9 -1
  42. data/lib/bandwidth/voice_lib/bxml/verbs/redirect.rb +5 -1
  43. data/lib/bandwidth/voice_lib/bxml/verbs/ring.rb +15 -0
  44. data/lib/bandwidth/voice_lib/bxml/verbs/send_dtmf.rb +4 -1
  45. data/lib/bandwidth/voice_lib/bxml/verbs/sip_uri.rb +25 -0
  46. data/lib/bandwidth/voice_lib/bxml/verbs/start_gather.rb +20 -0
  47. data/lib/bandwidth/voice_lib/bxml/verbs/start_recording.rb +4 -1
  48. data/lib/bandwidth/voice_lib/bxml/verbs/stop_gather.rb +14 -0
  49. data/lib/bandwidth/voice_lib/bxml/verbs/tag.rb +13 -0
  50. data/lib/bandwidth/voice_lib/bxml/verbs/transfer.rb +14 -3
  51. data/lib/bandwidth/voice_lib/voice.rb +19 -4
  52. data/lib/bandwidth/voice_lib/voice/client.rb +13 -2
  53. data/lib/bandwidth/voice_lib/voice/controllers/api_controller.rb +1219 -133
  54. data/lib/bandwidth/voice_lib/voice/controllers/base_controller.rb +1 -1
  55. data/lib/bandwidth/voice_lib/voice/exceptions/{error_response_exception.rb → api_error_response_exception.rb} +3 -3
  56. data/lib/bandwidth/voice_lib/voice/models/answer_fallback_method_enum.rb +17 -0
  57. data/lib/bandwidth/voice_lib/voice/models/api_call_response.rb +56 -2
  58. data/lib/bandwidth/voice_lib/voice/models/api_call_state_response.rb +164 -0
  59. data/lib/bandwidth/voice_lib/voice/models/api_create_call_request.rb +135 -12
  60. data/lib/bandwidth/voice_lib/voice/models/api_modify_call_request.rb +37 -1
  61. data/lib/bandwidth/voice_lib/voice/models/api_modify_conference_request.rb +107 -0
  62. data/lib/bandwidth/voice_lib/voice/models/api_transcribe_recording_request.rb +80 -0
  63. data/lib/bandwidth/voice_lib/voice/models/callback_method_enum.rb +35 -0
  64. data/lib/bandwidth/voice_lib/voice/models/conference_detail.rb +108 -0
  65. data/lib/bandwidth/voice_lib/voice/models/conference_event_method_enum.rb +35 -0
  66. data/lib/bandwidth/voice_lib/voice/models/conference_member_detail.rb +80 -0
  67. data/lib/bandwidth/voice_lib/voice/models/conference_recording_metadata_response.rb +126 -0
  68. data/lib/bandwidth/voice_lib/voice/models/disconnect_cause_enum.rb +47 -0
  69. data/lib/bandwidth/voice_lib/voice/models/modify_call_recording_state.rb +1 -1
  70. data/lib/bandwidth/voice_lib/voice/models/recording_metadata_response.rb +66 -28
  71. data/lib/bandwidth/voice_lib/voice/models/redirect_fallback_method_enum.rb +17 -0
  72. data/lib/bandwidth/voice_lib/voice/models/state1_enum.rb +4 -7
  73. data/lib/bandwidth/voice_lib/voice/models/state2_enum.rb +20 -0
  74. data/lib/bandwidth/voice_lib/voice/models/state_enum.rb +7 -4
  75. data/lib/bandwidth/voice_lib/voice/models/status1_enum.rb +29 -0
  76. data/lib/bandwidth/voice_lib/voice/models/status3_enum.rb +32 -0
  77. data/lib/bandwidth/voice_lib/voice/models/status_enum.rb +17 -0
  78. data/lib/bandwidth/{messaging_lib/messaging/models/field_error.rb → voice_lib/voice/models/transcript.rb} +15 -15
  79. data/lib/bandwidth/voice_lib/voice/models/transcription.rb +62 -0
  80. data/lib/bandwidth/voice_lib/voice/models/transcription_response.rb +42 -0
  81. data/lib/bandwidth/web_rtc_lib/utils/web_rtc_transfer.rb +13 -0
  82. data/lib/bandwidth/web_rtc_lib/web_rtc.rb +22 -0
  83. data/lib/bandwidth/web_rtc_lib/web_rtc/client.rb +51 -0
  84. data/lib/bandwidth/web_rtc_lib/web_rtc/controllers/api_controller.rb +692 -0
  85. data/lib/bandwidth/web_rtc_lib/web_rtc/controllers/base_controller.rb +49 -0
  86. data/lib/bandwidth/{messaging_lib/messaging/exceptions/path_client_exception.rb → web_rtc_lib/web_rtc/exceptions/error_exception.rb} +4 -19
  87. data/lib/bandwidth/web_rtc_lib/web_rtc/models/accounts_participants_response.rb +47 -0
  88. data/lib/bandwidth/web_rtc_lib/web_rtc/models/device_api_version_enum.rb +17 -0
  89. data/lib/bandwidth/web_rtc_lib/web_rtc/models/participant.rb +92 -0
  90. data/lib/bandwidth/web_rtc_lib/web_rtc/models/participant_subscription.rb +35 -0
  91. data/lib/bandwidth/web_rtc_lib/web_rtc/models/publish_permission_enum.rb +17 -0
  92. data/lib/bandwidth/web_rtc_lib/web_rtc/models/session.rb +44 -0
  93. data/lib/bandwidth/web_rtc_lib/web_rtc/models/subscriptions.rb +54 -0
  94. data/test/integration/test_integration.rb +570 -0
  95. metadata +132 -19
  96. data/lib/bandwidth/voice_lib/voice/models/api_get_account_recordings_metadata_request.rb +0 -65
  97. data/lib/bandwidth/voice_lib/voice/models/transcription_status_enum.rb +0 -20
  98. data/lib/bandwidth/voice_lib/voice/models/type_enum.rb +0 -32
@@ -0,0 +1,49 @@
1
+ # bandwidth
2
+ #
3
+ # This file was automatically generated by APIMATIC v2.0
4
+ # ( https://apimatic.io ).
5
+
6
+ module Bandwidth
7
+ # BaseController.
8
+ class BaseController
9
+ attr_accessor :config, :http_call_back
10
+
11
+ def initialize(config, http_call_back: nil)
12
+ @config = config
13
+ @http_call_back = http_call_back
14
+
15
+ @global_headers = {
16
+ 'user-agent' => 'ruby-sdk'
17
+ }
18
+ end
19
+
20
+ def validate_parameters(args)
21
+ args.each do |_name, value|
22
+ if value.nil?
23
+ raise ArgumentError, "Required parameter #{_name} cannot be nil."
24
+ end
25
+ end
26
+ end
27
+
28
+ def execute_request(request, binary: false)
29
+ @http_call_back.on_before_request(request) if @http_call_back
30
+
31
+ APIHelper.clean_hash(request.headers)
32
+ request.headers.merge!(@global_headers)
33
+
34
+ response = if binary
35
+ config.http_client.execute_as_binary(request)
36
+ else
37
+ config.http_client.execute_as_string(request)
38
+ end
39
+ @http_call_back.on_after_response(response) if @http_call_back
40
+
41
+ response
42
+ end
43
+
44
+ def validate_response(response)
45
+ raise APIException.new 'HTTP Response Not OK', response unless
46
+ response.status_code.between?(200, 208) # [200,208] = HTTP OK
47
+ end
48
+ end
49
+ end
@@ -4,28 +4,16 @@
4
4
  # ( https://apimatic.io ).
5
5
 
6
6
  module Bandwidth
7
- # PathClientException class.
8
- class PathClientException < APIException
9
- # TODO: Write general description for this method
10
- # @return [String]
11
- attr_accessor :timestamp
12
-
7
+ # Error class.
8
+ class ErrorException < APIException
13
9
  # TODO: Write general description for this method
14
10
  # @return [Integer]
15
- attr_accessor :status
16
-
17
- # TODO: Write general description for this method
18
- # @return [String]
19
- attr_accessor :error
11
+ attr_accessor :code
20
12
 
21
13
  # TODO: Write general description for this method
22
14
  # @return [String]
23
15
  attr_accessor :message
24
16
 
25
- # TODO: Write general description for this method
26
- # @return [String]
27
- attr_accessor :path
28
-
29
17
  # The constructor.
30
18
  # @param [String] The reason for raising an exception.
31
19
  # @param [HttpResponse] The HttpReponse of the API call.
@@ -39,11 +27,8 @@ module Bandwidth
39
27
  # @param [Hash] The deserialized response sent by the server in the
40
28
  # response body.
41
29
  def unbox(hash)
42
- @timestamp = hash['timestamp']
43
- @status = hash['status']
44
- @error = hash['error']
30
+ @code = hash['code']
45
31
  @message = hash['message']
46
- @path = hash['path']
47
32
  end
48
33
  end
49
34
  end
@@ -0,0 +1,47 @@
1
+ # bandwidth
2
+ #
3
+ # This file was automatically generated by APIMATIC v2.0
4
+ # ( https://apimatic.io ).
5
+
6
+ module Bandwidth
7
+ # AccountsParticipantsResponse Model.
8
+ class AccountsParticipantsResponse < BaseModel
9
+ # A participant object
10
+ # @return [Participant]
11
+ attr_accessor :participant
12
+
13
+ # Auth token for the returned participant
14
+ # This should be passed to the participant so that they can connect to the
15
+ # platform
16
+ # @return [String]
17
+ attr_accessor :token
18
+
19
+ # A mapping from model property names to API property names.
20
+ def self.names
21
+ @_hash = {} if @_hash.nil?
22
+ @_hash['participant'] = 'participant'
23
+ @_hash['token'] = 'token'
24
+ @_hash
25
+ end
26
+
27
+ def initialize(participant = nil,
28
+ token = nil)
29
+ @participant = participant
30
+ @token = token
31
+ end
32
+
33
+ # Creates an instance of the object from a hash.
34
+ def self.from_hash(hash)
35
+ return nil unless hash
36
+
37
+ # Extract variables from the hash.
38
+ participant = Participant.from_hash(hash['participant']) if
39
+ hash['participant']
40
+ token = hash['token']
41
+
42
+ # Create object from extracted values.
43
+ AccountsParticipantsResponse.new(participant,
44
+ token)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,17 @@
1
+ # bandwidth
2
+ #
3
+ # This file was automatically generated by APIMATIC v2.0
4
+ # ( https://apimatic.io ).
5
+
6
+ module Bandwidth
7
+ # Optional field to define the device api version of this participant
8
+ class DeviceApiVersionEnum
9
+ DEVICE_API_VERSION_ENUM = [
10
+ # TODO: Write general description for V3
11
+ V3 = 'v3'.freeze,
12
+
13
+ # TODO: Write general description for V2
14
+ V2 = 'v2'.freeze
15
+ ].freeze
16
+ end
17
+ end
@@ -0,0 +1,92 @@
1
+ # bandwidth
2
+ #
3
+ # This file was automatically generated by APIMATIC v2.0
4
+ # ( https://apimatic.io ).
5
+
6
+ module Bandwidth
7
+ # A participant object
8
+ class Participant < BaseModel
9
+ # Unique id of the participant
10
+ # @return [String]
11
+ attr_accessor :id
12
+
13
+ # Full callback url to use for notifications about this participant
14
+ # @return [String]
15
+ attr_accessor :callback_url
16
+
17
+ # Defines if this participant can publish audio or video
18
+ # @return [List of PublishPermissionEnum]
19
+ attr_accessor :publish_permissions
20
+
21
+ # List of session ids this participant is associated with
22
+ # Capped to one
23
+ # @return [List of String]
24
+ attr_accessor :sessions
25
+
26
+ # List of session ids this participant is associated with
27
+ # Capped to one
28
+ # @return [Subscriptions]
29
+ attr_accessor :subscriptions
30
+
31
+ # User defined tag to associate with the participant
32
+ # @return [String]
33
+ attr_accessor :tag
34
+
35
+ # Optional field to define the device api version of this participant
36
+ # @return [DeviceApiVersionEnum]
37
+ attr_accessor :device_api_version
38
+
39
+ # A mapping from model property names to API property names.
40
+ def self.names
41
+ @_hash = {} if @_hash.nil?
42
+ @_hash['id'] = 'id'
43
+ @_hash['callback_url'] = 'callbackUrl'
44
+ @_hash['publish_permissions'] = 'publishPermissions'
45
+ @_hash['sessions'] = 'sessions'
46
+ @_hash['subscriptions'] = 'subscriptions'
47
+ @_hash['tag'] = 'tag'
48
+ @_hash['device_api_version'] = 'deviceApiVersion'
49
+ @_hash
50
+ end
51
+
52
+ def initialize(id = nil,
53
+ callback_url = nil,
54
+ publish_permissions = nil,
55
+ sessions = nil,
56
+ subscriptions = nil,
57
+ tag = nil,
58
+ device_api_version = DeviceApiVersionEnum::V2)
59
+ @id = id
60
+ @callback_url = callback_url
61
+ @publish_permissions = publish_permissions
62
+ @sessions = sessions
63
+ @subscriptions = subscriptions
64
+ @tag = tag
65
+ @device_api_version = device_api_version
66
+ end
67
+
68
+ # Creates an instance of the object from a hash.
69
+ def self.from_hash(hash)
70
+ return nil unless hash
71
+
72
+ # Extract variables from the hash.
73
+ id = hash['id']
74
+ callback_url = hash['callbackUrl']
75
+ publish_permissions = hash['publishPermissions']
76
+ sessions = hash['sessions']
77
+ subscriptions = Subscriptions.from_hash(hash['subscriptions']) if
78
+ hash['subscriptions']
79
+ tag = hash['tag']
80
+ device_api_version = hash['deviceApiVersion'] ||= DeviceApiVersionEnum::V2
81
+
82
+ # Create object from extracted values.
83
+ Participant.new(id,
84
+ callback_url,
85
+ publish_permissions,
86
+ sessions,
87
+ subscriptions,
88
+ tag,
89
+ device_api_version)
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,35 @@
1
+ # bandwidth
2
+ #
3
+ # This file was automatically generated by APIMATIC v2.0
4
+ # ( https://apimatic.io ).
5
+
6
+ module Bandwidth
7
+ # ParticipantSubscription Model.
8
+ class ParticipantSubscription < BaseModel
9
+ # Participant the subscriber should be subscribed to
10
+ # @return [String]
11
+ attr_accessor :participant_id
12
+
13
+ # A mapping from model property names to API property names.
14
+ def self.names
15
+ @_hash = {} if @_hash.nil?
16
+ @_hash['participant_id'] = 'participantId'
17
+ @_hash
18
+ end
19
+
20
+ def initialize(participant_id = nil)
21
+ @participant_id = participant_id
22
+ end
23
+
24
+ # Creates an instance of the object from a hash.
25
+ def self.from_hash(hash)
26
+ return nil unless hash
27
+
28
+ # Extract variables from the hash.
29
+ participant_id = hash['participantId']
30
+
31
+ # Create object from extracted values.
32
+ ParticipantSubscription.new(participant_id)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,17 @@
1
+ # bandwidth
2
+ #
3
+ # This file was automatically generated by APIMATIC v2.0
4
+ # ( https://apimatic.io ).
5
+
6
+ module Bandwidth
7
+ # PublishPermission.
8
+ class PublishPermissionEnum
9
+ PUBLISH_PERMISSION_ENUM = [
10
+ # TODO: Write general description for AUDIO
11
+ AUDIO = 'AUDIO'.freeze,
12
+
13
+ # TODO: Write general description for VIDEO
14
+ VIDEO = 'VIDEO'.freeze
15
+ ].freeze
16
+ end
17
+ end
@@ -0,0 +1,44 @@
1
+ # bandwidth
2
+ #
3
+ # This file was automatically generated by APIMATIC v2.0
4
+ # ( https://apimatic.io ).
5
+
6
+ module Bandwidth
7
+ # A session object
8
+ class Session < BaseModel
9
+ # Unique id of the session
10
+ # @return [String]
11
+ attr_accessor :id
12
+
13
+ # User defined tag to associate with the session
14
+ # @return [String]
15
+ attr_accessor :tag
16
+
17
+ # A mapping from model property names to API property names.
18
+ def self.names
19
+ @_hash = {} if @_hash.nil?
20
+ @_hash['id'] = 'id'
21
+ @_hash['tag'] = 'tag'
22
+ @_hash
23
+ end
24
+
25
+ def initialize(id = nil,
26
+ tag = nil)
27
+ @id = id
28
+ @tag = tag
29
+ end
30
+
31
+ # Creates an instance of the object from a hash.
32
+ def self.from_hash(hash)
33
+ return nil unless hash
34
+
35
+ # Extract variables from the hash.
36
+ id = hash['id']
37
+ tag = hash['tag']
38
+
39
+ # Create object from extracted values.
40
+ Session.new(id,
41
+ tag)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,54 @@
1
+ # bandwidth
2
+ #
3
+ # This file was automatically generated by APIMATIC v2.0
4
+ # ( https://apimatic.io ).
5
+
6
+ module Bandwidth
7
+ # Subscriptions Model.
8
+ class Subscriptions < BaseModel
9
+ # Session the subscriptions are associated with
10
+ # If this is the only field, the subscriber will be subscribed to all
11
+ # participants in the session (including any participants that are later
12
+ # added to the session)
13
+ # @return [String]
14
+ attr_accessor :session_id
15
+
16
+ # Subset of participants to subscribe to in the session. Optional.
17
+ # @return [List of ParticipantSubscription]
18
+ attr_accessor :participants
19
+
20
+ # A mapping from model property names to API property names.
21
+ def self.names
22
+ @_hash = {} if @_hash.nil?
23
+ @_hash['session_id'] = 'sessionId'
24
+ @_hash['participants'] = 'participants'
25
+ @_hash
26
+ end
27
+
28
+ def initialize(session_id = nil,
29
+ participants = nil)
30
+ @session_id = session_id
31
+ @participants = participants
32
+ end
33
+
34
+ # Creates an instance of the object from a hash.
35
+ def self.from_hash(hash)
36
+ return nil unless hash
37
+
38
+ # Extract variables from the hash.
39
+ session_id = hash['sessionId']
40
+ # Parameter is an array, so we need to iterate through it
41
+ participants = nil
42
+ unless hash['participants'].nil?
43
+ participants = []
44
+ hash['participants'].each do |structure|
45
+ participants << (ParticipantSubscription.from_hash(structure) if structure)
46
+ end
47
+ end
48
+
49
+ # Create object from extracted values.
50
+ Subscriptions.new(session_id,
51
+ participants)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,570 @@
1
+ # test_integration.rb
2
+ #
3
+ # A simple integration test against Bandwidth's APIs
4
+
5
+ require 'test/unit'
6
+ require_relative '../../lib/bandwidth.rb'
7
+
8
+ include Bandwidth
9
+ include Bandwidth::Voice
10
+ include Bandwidth::Messaging
11
+ include Bandwidth::TwoFactorAuth
12
+
13
+ begin
14
+ USERNAME = ENV.fetch("USERNAME")
15
+ PASSWORD = ENV.fetch("PASSWORD")
16
+ ACCOUNT_ID = ENV.fetch("ACCOUNT_ID")
17
+ VOICE_APPLICATION_ID = ENV.fetch("VOICE_APPLICATION_ID")
18
+ MESSAGING_APPLICATION_ID = ENV.fetch("MESSAGING_APPLICATION_ID")
19
+ CALLBACK_URL = ENV.fetch("CALLBACK_URL")
20
+ PHONE_NUMBER_OUTBOUND = ENV.fetch("PHONE_NUMBER_OUTBOUND")
21
+ PHONE_NUMBER_INBOUND = ENV.fetch("PHONE_NUMBER_INBOUND")
22
+ MFA_MESSAGING_APPLICATION_ID = ENV.fetch("MFA_MESSAGING_APPLICATION_ID")
23
+ MFA_VOICE_APPLICATION_ID = ENV.fetch("MFA_VOICE_APPLICATION_ID")
24
+ PHONE_NUMBER_MFA = ENV.fetch("PHONE_NUMBER_MFA")
25
+ rescue
26
+ puts "Environmental variables not found"
27
+ exit(-1)
28
+ end
29
+
30
+ class IntegrationTest < Test::Unit::TestCase
31
+ def setup
32
+ @bandwidth_client = Bandwidth::Client.new(
33
+ voice_basic_auth_user_name: USERNAME,
34
+ voice_basic_auth_password: PASSWORD,
35
+ messaging_basic_auth_user_name: USERNAME,
36
+ messaging_basic_auth_password: PASSWORD,
37
+ two_factor_auth_basic_auth_user_name: USERNAME,
38
+ two_factor_auth_basic_auth_password: PASSWORD
39
+ )
40
+ end
41
+
42
+ def test_create_message
43
+ body = MessageRequest.new
44
+ body.application_id = MESSAGING_APPLICATION_ID
45
+ body.to = [PHONE_NUMBER_INBOUND]
46
+ body.from = PHONE_NUMBER_OUTBOUND
47
+ body.text = "Ruby Integration"
48
+ response = @bandwidth_client.messaging_client.client.create_message(ACCOUNT_ID, body)
49
+ assert(response.data.id.length > 0, "id value not set") #validate that _some_ id was returned
50
+ end
51
+
52
+ def test_create_message_invalid_phone_number
53
+ body = MessageRequest.new
54
+ body.application_id = MESSAGING_APPLICATION_ID
55
+ body.to = ["+1invalid"]
56
+ body.from = PHONE_NUMBER_OUTBOUND
57
+ body.text = "Ruby Integration"
58
+ begin
59
+ @bandwidth_client.messaging_client.client.create_message(ACCOUNT_ID, :body => body)
60
+ #workaround to make sure that if the above error is not raised, the build will fail
61
+ assert(false, "Expected exception not raised")
62
+ rescue MessagingException => e
63
+ assert(e.description.length > 0, "description value not set")
64
+ end
65
+ end
66
+
67
+ def test_upload_download_media
68
+ #define constants for upload media and download media
69
+ media_file_name = 'ruby_integration' #future update to add special symbols
70
+ media_file = '12345' #todo: check a binary string
71
+
72
+ #media upload
73
+ @bandwidth_client.messaging_client.client.upload_media(ACCOUNT_ID, media_file_name, media_file.length.to_s, media_file, :content_type => "application/octet-stream", :cache_control => "no-cache")
74
+
75
+ #media download
76
+ downloaded_media_file = @bandwidth_client.messaging_client.client.get_media(ACCOUNT_ID, media_file_name).data
77
+
78
+ assert_equal(downloaded_media_file, media_file, "Downloaded media file not equal to upload")
79
+ end
80
+
81
+ def test_create_call_and_get_call_state
82
+ body = ApiCreateCallRequest.new
83
+ body.from = PHONE_NUMBER_OUTBOUND
84
+ body.to = PHONE_NUMBER_INBOUND
85
+ body.application_id = VOICE_APPLICATION_ID
86
+ body.answer_url = CALLBACK_URL
87
+ response = @bandwidth_client.voice_client.client.create_call(ACCOUNT_ID, :body => body)
88
+ assert(response.data.call_id.length > 0, "call_id value not set")
89
+
90
+ #Get phone call information
91
+ response = @bandwidth_client.voice_client.client.get_call_state(ACCOUNT_ID, response.data.call_id)
92
+ assert(response.data.state.length > 0, "state value not set")
93
+ end
94
+
95
+ def test_create_call_invalid_phone_number
96
+ body = ApiCreateCallRequest.new
97
+ body.from = PHONE_NUMBER_OUTBOUND
98
+ body.to = "+1invalid"
99
+ body.application_id = VOICE_APPLICATION_ID
100
+ body.answer_url = CALLBACK_URL
101
+
102
+ begin
103
+ @bandwidth_client.voice_client.client.create_call(ACCOUNT_ID, :body => body)
104
+ #workaround to make sure that if the above error is not raised, the build will fail
105
+ assert(false, "Expected exception not raised")
106
+ rescue ApiErrorResponseException => e
107
+ assert(e.description.length > 0, "description value not set")
108
+ end
109
+ end
110
+
111
+ def test_forward
112
+ forward = Bandwidth::Voice::Forward.new({
113
+ :to => "+15554443333",
114
+ :from => "+13334445555",
115
+ :call_timeout => 25,
116
+ :diversion_treatment => "none",
117
+ :diversion_reason => "away"
118
+ })
119
+
120
+ response = Bandwidth::Voice::Response.new()
121
+ response.push(forward)
122
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><Forward to="+15554443333" from="+13334445555" callTimeout="25" diversionTreatment="none" diversionReason="away"/></Response>'
123
+ actual = response.to_bxml()
124
+ assert_equal(expected, actual)
125
+ end
126
+
127
+ def test_gather
128
+ gather = Bandwidth::Voice::Gather.new({
129
+ :gather_url => "https://test.com",
130
+ :gather_method => "POST",
131
+ :username => "user",
132
+ :password => "pass",
133
+ :tag => "tag",
134
+ :terminating_digits => "#",
135
+ :max_digits => 3,
136
+ :inter_digit_timeout => 5,
137
+ :first_digit_timeout => "10",
138
+ :repeat_count => 1,
139
+ :gather_fallback_url => "https://test.com",
140
+ :gather_fallback_method => "GET",
141
+ :fallback_username => "fuser",
142
+ :fallback_password => "fpass"
143
+ })
144
+
145
+ response = Bandwidth::Voice::Response.new()
146
+ response.push(gather)
147
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><Gather gatherUrl="https://test.com" gatherMethod="POST" terminatingDigits="#" tag="tag" maxDigits="3" interDigitTimeout="5" username="user" password="pass" firstDigitTimeout="10" repeatCount="1" gatherFallbackUrl="https://test.com" gatherFallbackMethod="GET" fallbackUsername="fuser" fallbackPassword="fpass"></Gather></Response>'
148
+ actual = response.to_bxml()
149
+ assert_equal(expected, actual)
150
+ end
151
+
152
+ def test_gather_nested_speak_sentence
153
+ speak_sentence = Bandwidth::Voice::SpeakSentence.new({
154
+ :sentence => "test"
155
+ })
156
+ gather = Bandwidth::Voice::Gather.new({
157
+ :speak_sentence => speak_sentence
158
+ })
159
+
160
+ response = Bandwidth::Voice::Response.new()
161
+ response.push(gather)
162
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><Gather><SpeakSentence>test</SpeakSentence></Gather></Response>'
163
+ actual = response.to_bxml()
164
+ assert_equal(expected, actual)
165
+ end
166
+
167
+ def test_gather_nested_play_audio
168
+ play_audio = Bandwidth::Voice::PlayAudio.new({
169
+ :url => "https://test.com"
170
+ })
171
+ gather = Bandwidth::Voice::Gather.new({
172
+ :play_audio => play_audio
173
+ })
174
+
175
+ response = Bandwidth::Voice::Response.new()
176
+ response.push(gather)
177
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><Gather><PlayAudio>https://test.com</PlayAudio></Gather></Response>'
178
+ actual = response.to_bxml()
179
+ assert_equal(expected, actual)
180
+ end
181
+
182
+ def test_gather_multiple_nested_verbs
183
+ play_audio = Bandwidth::Voice::PlayAudio.new({
184
+ :url => "https://test.com"
185
+ })
186
+ speak_sentence = Bandwidth::Voice::SpeakSentence.new({
187
+ :sentence => "test"
188
+ })
189
+ gather = Bandwidth::Voice::Gather.new({
190
+ :nested_verbs => [play_audio, speak_sentence]
191
+ })
192
+
193
+ response = Bandwidth::Voice::Response.new()
194
+ response.push(gather)
195
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><Gather><PlayAudio>https://test.com</PlayAudio><SpeakSentence>test</SpeakSentence></Gather></Response>'
196
+ actual = response.to_bxml()
197
+ assert_equal(expected, actual)
198
+ end
199
+
200
+ def test_hangup
201
+ hangup = Bandwidth::Voice::Hangup.new()
202
+
203
+ response = Bandwidth::Voice::Response.new()
204
+ response.push(hangup)
205
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><Hangup/></Response>'
206
+ actual = response.to_bxml()
207
+ assert_equal(expected, actual)
208
+ end
209
+
210
+ def test_pause
211
+ pause = Bandwidth::Voice::Pause.new({
212
+ :duration => 2
213
+ })
214
+
215
+ response = Bandwidth::Voice::Response.new()
216
+ response.push(pause)
217
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><Pause duration="2"/></Response>'
218
+ actual = response.to_bxml()
219
+ assert_equal(expected, actual)
220
+ end
221
+
222
+ def test_pause_recording
223
+ pause_recording = Bandwidth::Voice::PauseRecording.new()
224
+
225
+ response = Bandwidth::Voice::Response.new()
226
+ response.push(pause_recording)
227
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><PauseRecording/></Response>'
228
+ actual = response.to_bxml()
229
+ assert_equal(expected, actual)
230
+ end
231
+
232
+ def test_play_audio
233
+ play_audio = Bandwidth::Voice::PlayAudio.new({
234
+ :url => "https://test.com",
235
+ :username => "user",
236
+ :password => "pass"
237
+ })
238
+
239
+ response = Bandwidth::Voice::Response.new()
240
+ response.push(play_audio)
241
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><PlayAudio username="user" password="pass">https://test.com</PlayAudio></Response>'
242
+ actual = response.to_bxml()
243
+ assert_equal(expected, actual)
244
+ end
245
+
246
+ def test_record
247
+ record = Bandwidth::Voice::Record.new({
248
+ :record_complete_url => "https://complete.com",
249
+ :record_complete_method => "POST",
250
+ :recording_available_url => "https://available.com",
251
+ :recording_available_method => "GET",
252
+ :transcribe => false,
253
+ :transcription_available_url => "https://transcribe.com",
254
+ :transcription_available_method => "POST",
255
+ :username => "user",
256
+ :password => "pass",
257
+ :tag => "tag",
258
+ :terminating_digits => "#",
259
+ :max_duration => 3,
260
+ :silence_timeout => 5,
261
+ :file_format => "wav",
262
+ :record_complete_fallback_url => "https://test.com",
263
+ :record_complete_fallback_method => "GET",
264
+ :fallback_username => "fuser",
265
+ :fallback_password => "fpass"
266
+ })
267
+
268
+ response = Bandwidth::Voice::Response.new()
269
+ response.push(record)
270
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><Record tag="tag" username="user" password="pass" recordCompleteUrl="https://complete.com" recordCompleteMethod="POST" recordingAvailableUrl="https://available.com" recordingAvailableMethod="GET" terminatingDigits="#" maxDuration="3" fileFormat="wav" transcribe="false" transcriptionAvailableUrl="https://transcribe.com" transcriptionAvailableMethod="POST" silenceTimeout="5" recordCompleteFallbackUrl="https://test.com" recordCompleteFallbackMethod="GET" fallbackUsername="fuser" fallbackPassword="fpass"/></Response>'
271
+ actual = response.to_bxml()
272
+ assert_equal(expected, actual)
273
+ end
274
+
275
+ def test_redirect
276
+ redirect = Bandwidth::Voice::Redirect.new({
277
+ :redirect_url => "https://redirect.com",
278
+ :redirect_method => "GET",
279
+ :username => "user",
280
+ :password => "pass",
281
+ :tag => "tag",
282
+ :redirect_fallback_url => "https://test.com",
283
+ :redirect_fallback_method => "GET",
284
+ :fallback_username => "fuser",
285
+ :fallback_password => "fpass"
286
+ })
287
+
288
+ response = Bandwidth::Voice::Response.new()
289
+ response.push(redirect)
290
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><Redirect redirectUrl="https://redirect.com" redirectMethod="GET" tag="tag" username="user" password="pass" redirectFallbackUrl="https://test.com" redirectFallbackMethod="GET" fallbackUsername="fuser" fallbackPassword="fpass"/></Response>'
291
+ actual = response.to_bxml()
292
+ assert_equal(expected, actual)
293
+ end
294
+
295
+ def test_resume_recording
296
+ resume_recording = Bandwidth::Voice::ResumeRecording.new()
297
+
298
+ response = Bandwidth::Voice::Response.new()
299
+ response.push(resume_recording)
300
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><ResumeRecording/></Response>'
301
+ actual = response.to_bxml()
302
+ assert_equal(expected, actual)
303
+ end
304
+
305
+ def test_send_dtmf
306
+ send_dtmf = Bandwidth::Voice::SendDtmf.new({
307
+ :dtmf => "12w34",
308
+ :tone_duration => 75,
309
+ :tone_interval => 65
310
+ })
311
+
312
+ response = Bandwidth::Voice::Response.new()
313
+ response.push(send_dtmf)
314
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><SendDtmf toneDuration="75" toneInterval="65">12w34</SendDtmf></Response>'
315
+ actual = response.to_bxml()
316
+ assert_equal(expected, actual)
317
+ end
318
+
319
+ def test_speak_sentence
320
+ speak_sentence = Bandwidth::Voice::SpeakSentence.new({
321
+ :sentence => "test",
322
+ :voice => "julie",
323
+ :gender => "female",
324
+ :locale => "en_US"
325
+ })
326
+
327
+ response = Bandwidth::Voice::Response.new()
328
+ response.push(speak_sentence)
329
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><SpeakSentence voice="julie" locale="en_US" gender="female">test</SpeakSentence></Response>'
330
+ actual = response.to_bxml()
331
+ assert_equal(expected, actual)
332
+ end
333
+
334
+ def test_speak_sentence_ssml
335
+ speak_sentence = Bandwidth::Voice::SpeakSentence.new({
336
+ :sentence => 'Hello, you have reached the home of <lang xml:lang="es-MX">Antonio Mendoza</lang>.Please leave a message.',
337
+ })
338
+
339
+ response = Bandwidth::Voice::Response.new()
340
+ response.push(speak_sentence)
341
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><SpeakSentence>Hello, you have reached the home of <lang xml:lang="es-MX">Antonio Mendoza</lang>.Please leave a message.</SpeakSentence></Response>'
342
+ actual = response.to_bxml()
343
+ assert_equal(expected, actual)
344
+ end
345
+
346
+ def test_start_recording
347
+ start_recording = Bandwidth::Voice::StartRecording.new({
348
+ :recording_available_url => "https://available.com",
349
+ :recording_available_method => "POST",
350
+ :transcribe => false,
351
+ :transcription_available_url => "https://transcribe.com",
352
+ :transcription_available_method => "GET",
353
+ :username => "user",
354
+ :password => "pass",
355
+ :tag => "tag",
356
+ :file_format => "mp3",
357
+ :multi_channel => true
358
+ })
359
+
360
+ response = Bandwidth::Voice::Response.new()
361
+ response.push(start_recording)
362
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><StartRecording tag="tag" username="user" password="pass" recordingAvailableUrl="https://available.com" recordingAvailableMethod="POST" fileFormat="mp3" multiChannel="true" transcribe="false" transcriptionAvailableUrl="https://transcribe.com" transcriptionAvailableMethod="GET"/></Response>'
363
+ actual = response.to_bxml()
364
+ assert_equal(expected, actual)
365
+ end
366
+
367
+ def test_stop_recording
368
+ stop_recording = Bandwidth::Voice::StopRecording.new()
369
+
370
+ response = Bandwidth::Voice::Response.new()
371
+ response.push(stop_recording)
372
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><StopRecording/></Response>'
373
+ actual = response.to_bxml()
374
+ assert_equal(expected, actual)
375
+ end
376
+
377
+ def test_transfer
378
+ phone_number = Bandwidth::Voice::PhoneNumber.new({
379
+ :number => "+15554443333",
380
+ :transfer_answer_url => "https://phoneanswer.com",
381
+ :transfer_answer_method => "GET",
382
+ :transfer_disconnect_url => "https://phonedisconnect.com",
383
+ :transfer_disconnect_method => "POST",
384
+ :username => "phoneuser",
385
+ :password => "phonepassword",
386
+ :tag => "phonetag",
387
+ :transfer_answer_fallback_url => "https://test.com",
388
+ :transfer_answer_fallback_method => "GET",
389
+ :fallback_username => "fuser",
390
+ :fallback_password => "fpass"
391
+ })
392
+ transfer = Bandwidth::Voice::Transfer.new({
393
+ :transfer_caller_id => "+13334445555",
394
+ :call_timeout => 3,
395
+ :transfer_complete_url => "https://transfercomplete.com",
396
+ :transfer_complete_method => "POST",
397
+ :username => "transferuser",
398
+ :password => "transferpass",
399
+ :tag => "transfertag",
400
+ :diversion_treatment => "none",
401
+ :diversion_reason => "away",
402
+ :phone_numbers => [phone_number],
403
+ :transfer_complete_fallback_url => "https://test.com",
404
+ :transfer_complete_fallback_method => "GET",
405
+ :fallback_username => "fusern",
406
+ :fallback_password => "fpassw"
407
+ })
408
+
409
+ response = Bandwidth::Voice::Response.new()
410
+ response.push(transfer)
411
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><Transfer transferCallerId="+13334445555" callTimeout="3" tag="transfertag" transferCompleteUrl="https://transfercomplete.com" transferCompleteMethod="POST" username="transferuser" password="transferpass" diversionTreatment="none" diversionReason="away" transferCompleteFallbackUrl="https://test.com" transferCompleteFallbackMethod="GET" fallbackUsername="fusern" fallbackPassword="fpassw"><PhoneNumber transferAnswerUrl="https://phoneanswer.com" transferAnswerMethod="GET" transferDisconnectUrl="https://phonedisconnect.com" transferDisconnectMethod="POST" username="phoneuser" password="phonepassword" tag="phonetag" transferAnswerFallbackUrl="https://test.com" transferAnswerFallbackMethod="GET" fallbackUsername="fuser" fallbackPassword="fpass">+15554443333</PhoneNumber></Transfer></Response>'
412
+ actual = response.to_bxml()
413
+ assert_equal(expected, actual)
414
+ end
415
+
416
+ def test_conference
417
+ conference = Bandwidth::Voice::Conference.new({
418
+ :conference_name => 'my-conference',
419
+ :mute => false,
420
+ :hold => true,
421
+ :call_ids_to_coach => "c-123,c-234",
422
+ :conference_event_url => "https://test.com",
423
+ :conference_event_method => "POST",
424
+ :username => "user",
425
+ :password => "pass",
426
+ :tag => "tag",
427
+ :conference_event_fallback_url => "https://test2.com",
428
+ :conference_event_fallback_method => "POST",
429
+ :fallback_username => "fuser",
430
+ :fallback_password => "fpass"
431
+ })
432
+ response = Bandwidth::Voice::Response.new()
433
+ response.push(conference)
434
+
435
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><Conference mute="false" hold="true" callIdsToCoach="c-123,c-234" conferenceEventUrl="https://test.com" conferenceEventMethod="POST" username="user" password="pass" tag="tag" conferenceEventFallbackUrl="https://test2.com" conferenceEventFallbackMethod="POST" fallbackUsername="fuser" fallbackPassword="fpass">my-conference</Conference></Response>'
436
+ actual = response.to_bxml()
437
+ assert_equal(expected, actual)
438
+ end
439
+
440
+ def test_conference_coach_ids_array
441
+ conference = Bandwidth::Voice::Conference.new({
442
+ :conference_name => 'my-conference',
443
+ :call_ids_to_coach => ["c-123", "c-234"],
444
+ })
445
+ response = Bandwidth::Voice::Response.new()
446
+ response.push(conference)
447
+
448
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><Conference callIdsToCoach="c-123,c-234">my-conference</Conference></Response>'
449
+ actual = response.to_bxml()
450
+ assert_equal(expected, actual)
451
+ end
452
+
453
+ def test_conference_no_coach
454
+ conference = Bandwidth::Voice::Conference.new({
455
+ :conference_name => 'my-conference'
456
+ })
457
+ response = Bandwidth::Voice::Response.new()
458
+ response.push(conference)
459
+
460
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><Conference>my-conference</Conference></Response>'
461
+ actual = response.to_bxml()
462
+ assert_equal(expected, actual)
463
+ end
464
+
465
+ def test_mfa_messaging
466
+ body = TwoFactorCodeRequestSchema.new
467
+ body.from = PHONE_NUMBER_MFA
468
+ body.to = PHONE_NUMBER_INBOUND
469
+ body.application_id = MFA_MESSAGING_APPLICATION_ID
470
+ body.scope = "scope"
471
+ body.digits = 6
472
+ body.message = "Your temporary {NAME} {SCOPE} code is {CODE}"
473
+
474
+ response = @bandwidth_client.two_factor_auth_client.mfa.create_messaging_two_factor(ACCOUNT_ID, body)
475
+ assert(response.data.message_id.length > 0, "message id value not set")
476
+ end
477
+
478
+ def test_mfa_voice
479
+ body = TwoFactorCodeRequestSchema.new
480
+ body.from = PHONE_NUMBER_MFA
481
+ body.to = PHONE_NUMBER_INBOUND
482
+ body.application_id = MFA_VOICE_APPLICATION_ID
483
+ body.scope = "scope"
484
+ body.digits = 6
485
+ body.message = "Your temporary {NAME} {SCOPE} code is {CODE}"
486
+
487
+ response = @bandwidth_client.two_factor_auth_client.mfa.create_voice_two_factor(ACCOUNT_ID, body)
488
+ assert(response.data.call_id.length > 0, "call id value not set")
489
+ end
490
+
491
+ def test_mfa_verify
492
+ body = TwoFactorVerifyRequestSchema.new
493
+ body.to = PHONE_NUMBER_INBOUND
494
+ body.application_id = MFA_VOICE_APPLICATION_ID
495
+ body.scope = "scope"
496
+ body.code = "123456"
497
+ body.expiration_time_in_minutes = 3
498
+ response = @bandwidth_client.two_factor_auth_client.mfa.create_verify_two_factor(ACCOUNT_ID, body)
499
+ #Ruby has no check to see if variables are of type boolean
500
+ #An explicit true/false check is required
501
+ assert(response.data.valid == true || response.data.valid == false, "'valid' variable is not a boolean")
502
+ end
503
+
504
+ def test_bridge
505
+ bridge = Bandwidth::Voice::Bridge.new({
506
+ :call_id => "c-c-95ac8d6e-1a31c52e-b38f-4198-93c1-51633ec68f8d",
507
+ :bridge_complete_url => "https://test.com",
508
+ :bridge_complete_method => "POST",
509
+ :bridge_target_complete_url => "https://test2.com",
510
+ :bridge_target_complete_method => "GET",
511
+ :username => "user",
512
+ :password => "pass",
513
+ :tag => "custom tag",
514
+ :bridge_complete_fallback_url => "https://test3.com",
515
+ :bridge_complete_fallback_method => "GET",
516
+ :bridge_target_complete_fallback_url => "https://test4.com",
517
+ :bridge_target_complete_fallback_method => "POST",
518
+ :fallback_username => "fuser",
519
+ :fallback_password => "fpass"
520
+ })
521
+
522
+ response = Bandwidth::Voice::Response.new()
523
+ response.push(bridge)
524
+
525
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><Bridge bridgeCompleteUrl="https://test.com" bridgeCompleteMethod="POST" bridgeTargetCompleteUrl="https://test2.com" bridgeTargetCompleteMethod="GET" username="user" password="pass" tag="custom tag" bridgeCompleteFallbackUrl="https://test3.com" bridgeCompleteFallbackMethod="GET" bridgeTargetCompleteFallbackUrl="https://test4.com" bridgeTargetCompleteFallbackMethod="POST" fallbackUsername="fuser" fallbackPassword="fpass">c-c-95ac8d6e-1a31c52e-b38f-4198-93c1-51633ec68f8d</Bridge></Response>'
526
+ actual = response.to_bxml()
527
+ assert_equal(expected, actual)
528
+ end
529
+
530
+ def test_ring
531
+ ring = Bandwidth::Voice::Ring.new({
532
+ :duration => 5
533
+ })
534
+
535
+ response = Bandwidth::Voice::Response.new()
536
+ response.push(ring)
537
+
538
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><Ring duration="5"/></Response>'
539
+ actual = response.to_bxml()
540
+ assert_equal(expected, actual)
541
+ end
542
+
543
+ def test_start_gather
544
+ start_gather = Bandwidth::Voice::StartGather.new({
545
+ :username => "user",
546
+ :password => "pass",
547
+ :tag => "custom tag",
548
+ :dtmf_url => "https://test.com",
549
+ :dtmf_method => "GET"
550
+ })
551
+
552
+ response = Bandwidth::Voice::Response.new()
553
+ response.push(start_gather)
554
+
555
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><StartGather username="user" password="pass" tag="custom tag" dtmfUrl="https://test.com" dtmfMethod="GET"/></Response>'
556
+ actual = response.to_bxml()
557
+ assert_equal(expected, actual)
558
+ end
559
+
560
+ def test_stop_gather
561
+ stop_gather = Bandwidth::Voice::StopGather.new()
562
+
563
+ response = Bandwidth::Voice::Response.new()
564
+ response.push(stop_gather)
565
+
566
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Response><StopGather/></Response>'
567
+ actual = response.to_bxml()
568
+ assert_equal(expected, actual)
569
+ end
570
+ end