mock-twilio 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1da1ec05dd743344d3013c3f39a42923a3169f1712f5888379d404d29c437f0f
4
- data.tar.gz: 59529b53405a1ea90813af0d41174a98a197a19c05b1b38968883e98fb7c8284
3
+ metadata.gz: 310cc33586ef04e160217a0dfd84d974ac767e6f81d9af3f09d051f9fd802114
4
+ data.tar.gz: e8e3391a767e0e5ba9270e4615df0dba90174b9715c8260c25c390155176829b
5
5
  SHA512:
6
- metadata.gz: 5663f1c128513d140c75d2505c85e1e77c71c226889d1aa3a230df2764f7d4010964f2781c895508c5a2eb3df2d60225aa7f74e64df1c3d0e6583e5fff4e8659
7
- data.tar.gz: 07ef35f9b4ee075fb4af82ffb03e02b5e6bb4af1dc9d324c9a0c4de7590a4c29314c58933798ab53bc0bd3859bdec6410c6d506eb03171207381b343467b90ac
6
+ metadata.gz: dcd5088423808878c3ba15bc7c2e36be36600ab2d4dc735d3f5d89ea9c37e29d0dc8a485b186ab01261bdcd3fb2d9f688f0f27ac9e9245930017883647cb41c2
7
+ data.tar.gz: 428a6a44af8c26c0f3e06dd53863be5a68fd4efe94bc616f7bb3f712d8661853932a26171c15a69abff45174bee648800e25ce3d255f13e4d06cff8b3b0f978f
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## [1.2.0] - 2024-09-30
2
+ - Add direct calls voicemail support
3
+
4
+ ## [1.1.0] - 2024-08-08
5
+ - Add conference call no-answer use case webhooks flow
6
+
1
7
  ## [1.0.0] - 2024-08-06
2
8
  - Support Webhooks::InboundMessages
3
9
 
data/README.md CHANGED
@@ -28,22 +28,22 @@ OR
28
28
 
29
29
  ## Features Support
30
30
 
31
- | Mock::Twilio::Client | Support |
31
+ | Support | Mock::Twilio::Client |
32
32
  | ------------- | ------------- |
33
- | `client.messages.create(to: "+593978613041", body: "Testing SMS", from: "+13212855389")` | :white_check_mark: |
34
- | `client.messaging.v1.services("MG"+"F"*32).phone_numbers.create(phone_number_sid: @phone_number_sid)` | :white_check_mark: |
35
- | `client.available_phone_numbers('US').local.list(limit: 20)` | :white_check_mark: |
36
- | `client.incoming_phone_numbers.create(phone_number: "+1987654321", voice_url: "#{BASE_URL}/api/v1/twilio_calls/incoming", sms_url: "#{BASE_URL}/api/v1/twilio_requests/inbound")` | :white_check_mark: |
37
- | `client.lookups.v2.phone_numbers("+14159929960").fetch(fields: :line_type_intelligence)` | :white_check_mark: |
38
- | `client.calls.create(url: '<http://demo.twilio.com/docs/voice.xml>', to: '+14155551212', from: '+15017122661', status_callback: '<https://myapp.com/events>', status_callback_event: ['ringing'], status_callback_method: 'POST')` | :white_check_mark: |
39
- | `client.conferences("CF"+("F")*32).participants.create(label: 'customer', early_media: true, beep: 'onEnter', status_callback: '<https://myapp.com/events>', status_callback_event: ['ringing'], record: true, from: '+15017122661', to: '+15558675310')` | :white_check_mark: |
40
- | `client.trusthub.v1.customer_profiles.create(**twilio_attributes)` | :white_check_mark: |
41
- | `client.trusthub.v1.customer_profiles(customer_profile_sid).customer_profiles_entity_assignments.create(object_sid:)` | :white_check_mark: |
42
- | `client.trusthub.v1.end_users.create(**twilio_parameters)` | :white_check_mark: |
43
- | `client.trusthub.v1.supporting_documents.create(**twilio_parameters)` | :white_check_mark: |
44
- | `client.addresses.create(**twilio_parameters)` | :white_check_mark: |
45
- | `client.trusthub.v1.customer_profiles.create(**twilio_attributes)` | :white_check_mark: |
46
- | `client.trusthub.v1.customer_profiles(customer_profile.sid).customer_profiles_evaluations.create(policy_sid:)` | :white_check_mark: |
33
+ | :white_check_mark: | `client.messages.create(to: "+593978613041", body: "Testing SMS", from: "+13212855389")` |
34
+ | :white_check_mark: | `client.messaging.v1.services("MG"+"F"*32).phone_numbers.create(phone_number_sid: @phone_number_sid)` |
35
+ | :white_check_mark: | `client.available_phone_numbers('US').local.list(limit: 20)` |
36
+ | :white_check_mark: | `client.incoming_phone_numbers.create(phone_number: "+1987654321", voice_url: "#{BASE_URL}/api/v1/twilio_calls/incoming", sms_url: "#{BASE_URL}/api/v1/twilio_requests/inbound")` |
37
+ | :white_check_mark: | `client.lookups.v2.phone_numbers("+14159929960").fetch(fields: :line_type_intelligence)` |
38
+ | :white_check_mark: | `client.calls.create(url: '<http://demo.twilio.com/docs/voice.xml>', to: '+14155551212', from: '+15017122661', status_callback: '<https://myapp.com/events>', status_callback_event: ['ringing'], status_callback_method: 'POST')` |
39
+ | :white_check_mark: | `client.conferences("CF"+("F")*32).participants.create(label: 'customer', early_media: true, beep: 'onEnter', status_callback: '<https://myapp.com/events>', status_callback_event: ['ringing'], record: true, from: '+15017122661', to: '+15558675310')` |
40
+ | :white_check_mark: | `client.trusthub.v1.customer_profiles.create(**twilio_attributes)` |
41
+ | :white_check_mark: | `client.trusthub.v1.customer_profiles(customer_profile_sid).customer_profiles_entity_assignments.create(object_sid:)` |
42
+ | :white_check_mark: | `client.trusthub.v1.end_users.create(**twilio_parameters)`
43
+ | :white_check_mark: | `client.trusthub.v1.supporting_documents.create(**twilio_parameters)` |
44
+ | :white_check_mark: | `client.addresses.create(**twilio_parameters)` |
45
+ | :white_check_mark: | `client.trusthub.v1.customer_profiles.create(**twilio_attributes)` |
46
+ | :white_check_mark: | `client.trusthub.v1.customer_profiles(customer_profile.sid).customer_profiles_evaluations.create(policy_sid:)` |
47
47
 
48
48
 
49
49
  ## Trigger resources updates
@@ -54,6 +54,7 @@ OR
54
54
  | `Webhooks::InboundMessages` | :white_check_mark: |
55
55
  | `Webhooks::Calls` | :white_check_mark: |
56
56
  | `Webhooks::CallStatusUpdates` | :white_check_mark: |
57
+ | `Webhooks::Voicemail` | :white_check_mark: |
57
58
  | `Webhooks::Conferences` | :white_check_mark: |
58
59
  | `Webhooks::CustomerProfiles` | :white_check_mark: |
59
60
  | `Webhooks::Brands` | :white_check_mark: |
@@ -30,15 +30,20 @@ module Mock
30
30
  scheduler.in '2s' do
31
31
  conference_uuid = request.data["Url"].split("conference_uuid=").last
32
32
  begin
33
- response = Mock::Twilio::Webhooks::CallStatusUpdates.trigger(sid, conference_uuid)
33
+ response = Mock::Twilio::Webhooks::CallStatusUpdates.trigger(sid, conference_uuid, 'unknown', 'ringing')
34
34
 
35
- conference_response = if response.status == 200
35
+ conference_response = if response.success?
36
36
  twiMl_xml = Nokogiri::XML response.body
37
37
  friendly_name = twiMl_xml.at_xpath('//Dial').at_xpath('//Conference').children.text
38
38
  Mock::Twilio::Webhooks::Conferences.trigger(friendly_name)
39
39
  end
40
40
 
41
- Mock::Twilio::Webhooks::Calls.trigger(sid) if conference_response.status == 200
41
+ # Participant
42
+ participant_ringing = Mock::Twilio::Webhooks::Calls.trigger(sid, 'ringing') if conference_response.success?
43
+ participant_completed = Mock::Twilio::Webhooks::Calls.trigger(sid, 'completed') if participant_ringing.success?
44
+
45
+ call_completed = Mock::Twilio::Webhooks::CallStatusUpdates.trigger(sid, conference_uuid, 'human', 'completed') if participant_completed.success?
46
+ Mock::Twilio::Webhooks::Voicemail.trigger(sid) if call_completed.success? && [true,false].sample
42
47
  rescue => e
43
48
  puts e
44
49
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Mock
4
4
  module Twilio
5
- VERSION = "1.0.0"
5
+ VERSION = "1.2.0"
6
6
  end
7
7
  end
@@ -6,13 +6,13 @@ module Mock
6
6
  class CallStatusUpdates < Base
7
7
  URL = "/api/v1/twilio_calls/voice_responses"
8
8
 
9
- def self.trigger(sid, conference_uuid)
9
+ def self.trigger(sid, conference_uuid, answered_by, call_status)
10
10
  # Wait simulation from twilio
11
11
  sleep DELAY.sample
12
12
 
13
13
  request_url = Mock::Twilio.proto + "://" + Mock::Twilio.forwarded_host + URL
14
14
 
15
- data = call_status_updates_data(sid, conference_uuid)
15
+ data = call_status_updates_data(sid, conference_uuid, answered_by, call_status)
16
16
 
17
17
  signature = build_signature_for_request(request_url, data)
18
18
 
@@ -33,7 +33,7 @@ module Mock
33
33
  end
34
34
  end
35
35
 
36
- def self.call_status_updates_data(sid, conference_uuid)
36
+ def self.call_status_updates_data(sid, conference_uuid, answered_by, call_status)
37
37
  {
38
38
  :AccountSid=> twilio_client.account_sid,
39
39
  :ApiVersion=> "2010-04-01",
@@ -50,7 +50,7 @@ module Mock
50
50
  :CallerState=> "CA",
51
51
  :CallerZip=> "no value",
52
52
  :CallSid=> sid,
53
- :CallStatus=> "in-progress",
53
+ :CallStatus=> call_status,
54
54
  :Direction=> "outbound-api",
55
55
  :Duration=> "0",
56
56
  :From=> "+18111111111",
@@ -68,7 +68,7 @@ module Mock
68
68
  :ToZip=> "33605",
69
69
  :StirStatus=> "B",
70
70
  :StirVerstat=> "TN-Validation-Passed-B",
71
- :AnsweredBy=> "unknown",
71
+ :AnsweredBy=> answered_by,
72
72
  :conference_uuid=> conference_uuid
73
73
  }
74
74
  end
@@ -6,13 +6,13 @@ module Mock
6
6
  class Calls < Base
7
7
  URL = "/api/v1/twilio_calls/participant_status_changes"
8
8
 
9
- def self.trigger(sid)
9
+ def self.trigger(sid, participant_status)
10
10
  # Wait simulation from twilio
11
11
  sleep DELAY.sample
12
12
 
13
13
  request_url = Mock::Twilio.proto + "://" + Mock::Twilio.forwarded_host + URL
14
14
 
15
- data = call_data(sid)
15
+ data = call_data(sid, participant_status)
16
16
 
17
17
  signature = build_signature_for_request(request_url, data)
18
18
 
@@ -33,7 +33,7 @@ module Mock
33
33
  end
34
34
  end
35
35
 
36
- def self.call_data(sid)
36
+ def self.call_data(sid, participant_status)
37
37
  {
38
38
  :AccountSid=> twilio_client.account_sid,
39
39
  :ApiVersion=> "2010-04-01",
@@ -50,7 +50,7 @@ module Mock
50
50
  :CallerState=> "CA",
51
51
  :CallerZip=> "no value",
52
52
  :CallSid=> sid,
53
- :CallStatus=> "in-progress",
53
+ :CallStatus=> participant_status,
54
54
  :Direction=> "outbound-api",
55
55
  :Duration=> "0",
56
56
  :From=> "+18111111111",
@@ -41,7 +41,7 @@ module Mock
41
41
  :FriendlyName=> friendly_name,
42
42
  :SequenceNumber=> "6",
43
43
  :ConferenceSid=> sid,
44
- :StatusCallbackEvent=> "conference-start",
44
+ :StatusCallbackEvent=> "conference-end",
45
45
  :Timestamp=> "2024-06-17 16:49:31 UTC",
46
46
  :AccountSid=> twilio_client.account_sid,
47
47
  :Reason=> "Participant from mock twilio"
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mock
4
+ module Twilio
5
+ module Webhooks
6
+ class Voicemail < Base
7
+ URL = "/api/v1/twilio_calls/create_voicemail"
8
+
9
+ def self.trigger(call_sid)
10
+ # Wait simulation from twilio
11
+ sleep DELAY.sample
12
+
13
+ request_url = Mock::Twilio.proto + "://" + Mock::Twilio.forwarded_host + URL
14
+
15
+ data = voicemail_data(call_sid)
16
+
17
+ signature = build_signature_for_request(request_url, data)
18
+
19
+ response = webhook_client.request(Mock::Twilio.host,
20
+ Mock::Twilio.port,
21
+ 'POST',
22
+ URL,
23
+ nil,
24
+ data,
25
+ headers.merge!({ 'X-Twilio-Signature': signature }),
26
+ auth_twilio,
27
+ nil)
28
+ case response.status
29
+ when 200..204
30
+ response
31
+ when 400..600
32
+ raise Webhooks::RestError, Mock::Twilio::ErrorHandler.new(response).raise
33
+ end
34
+ end
35
+
36
+ def self.voicemail_data(call_sid)
37
+ prefix = "RE"
38
+ recording_sid = prefix + SecureRandom.hex(16)
39
+ {
40
+ :RecordingSource=> "RecordVerb",
41
+ :RecordingSid=> recording_sid,
42
+ :RecordingUrl=> "https://cdn.pixabay.com/download/audio/2022/03/24/audio_4ff823c44c.mp3?filename=ding-101492.mp3",
43
+ :RecordingStatus=> "completed",
44
+ :RecordingChannels=> "1",
45
+ :ErrorCode=> "0",
46
+ :CallSid=> call_sid,
47
+ :RecordingStartTime=> Time.current.rfc2822,
48
+ :AccountSid=> twilio_client.account_sid,
49
+ :RecordingDuration=> "4"
50
+ }
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
data/lib/mock/twilio.rb CHANGED
@@ -14,6 +14,7 @@ require_relative "twilio/webhooks/conferences"
14
14
  require_relative "twilio/webhooks/customer_profiles"
15
15
  require_relative "twilio/webhooks/brands"
16
16
  require_relative "twilio/webhooks/inbound_messages"
17
+ require_relative "twilio/webhooks/voicemail"
17
18
  require_relative "twilio/util/configuration"
18
19
  require_relative "twilio/util/error_handler"
19
20
  require_relative "twilio/util/generator"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mock-twilio
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - SchoolStatus Platform Team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-08-05 00:00:00.000000000 Z
11
+ date: 2024-09-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -119,6 +119,7 @@ files:
119
119
  - lib/mock/twilio/webhooks/customer_profiles.rb
120
120
  - lib/mock/twilio/webhooks/inbound_messages.rb
121
121
  - lib/mock/twilio/webhooks/messages.rb
122
+ - lib/mock/twilio/webhooks/voicemail.rb
122
123
  - lib/twilio/rest/messaging/v1/service/phone_number_decorator.rb
123
124
  - sig/mock/twilio.rbs
124
125
  homepage: https://github.com/schoolstatus/mock-twilio
@@ -143,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
144
  - !ruby/object:Gem::Version
144
145
  version: '0'
145
146
  requirements: []
146
- rubygems_version: 3.5.12
147
+ rubygems_version: 3.4.19
147
148
  signing_key:
148
149
  specification_version: 4
149
150
  summary: This repository contains Mock::Twilio::Client and Webhooks for Twilio's API.