mock-twilio 0.1.0 → 0.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: 3ab342d529e8d1886517cdffe112de027d4faa800e999f1761d70cacf91da958
4
- data.tar.gz: 42f3e99d12fe4b0e88160d52437a32c8cf20786abaebb32a4ad084579a223d4f
3
+ metadata.gz: fbb843efbd1e8b54602d0463971c24a502b20b42ec9085530f624549190bee40
4
+ data.tar.gz: 40d24741f57296220aaa3ca36b21c2b5fd429a08c4669c2ce2cf0f636696889a
5
5
  SHA512:
6
- metadata.gz: a74c263e59ca0f944ef427387e60c6ec1d9a30e0e02d0583b1993171f286f58e3b6178cf9eed13fa0db68c88e2071f4512e6d18cbace5d04120c51c7bbb24759
7
- data.tar.gz: b1782b5d6da621259f3b3d0633623b1c9cfed90993ff613f73485bf169f22317da1396f73ca1f7102fa7456261a8d2752272ac6f44f10c2452cc9f669b2660cb
6
+ metadata.gz: 570376720a4f739d537bdb4285cfd8aaadea578d3d076089b849a8d7f66b603a0b0562a116c0fc9ecb6462ee64d8f8fdf3cb957d2c8a4a82575111354ba16670
7
+ data.tar.gz: 41dc6b8fcd7b6e2b58b85d81eb43e75defc1969a7c8a349ef4546a4a7c9114a35e4e9d85e3e4dc804b95ea7f9de827551a2a1724dd82e52eaa8d8d0ed712f9d4
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## [0.2.0] - 2024-06-09
2
+ - Support MessageSid SMS and MMS
3
+ - Support Webhooks::Messages SMS and MMS
4
+
5
+ - Initial release
1
6
  ## [0.1.0] - 2024-05-29
2
7
 
3
8
  - Initial release
data/Gemfile CHANGED
@@ -8,3 +8,5 @@ gemspec
8
8
  gem "rake", "~> 13.0"
9
9
 
10
10
  gem "minitest", "~> 5.0"
11
+ gem "webmock"
12
+ gem "pry"
data/README.md CHANGED
@@ -5,16 +5,10 @@ This is a SchoolStatus implementation to mock twilio client to perform requests
5
5
 
6
6
  # Installation
7
7
 
8
- To install using [Bundler][bundler] grab the latest stable version:
8
+ To install using bundler grab the latest stable version:
9
9
 
10
10
  ```ruby
11
- gem 'mock-twilio', '~> 0.1.0'
12
- ```
13
-
14
- To manually install `twilio-ruby` via [Rubygems][rubygems] simply gem install:
15
-
16
- ```bash
17
- gem install mock-twilio
11
+ gem "mock-twilio", "~> 0.2.0", git: "https://github.com/schoolstatus/mock-twilio.git"
18
12
  ```
19
13
 
20
14
  ## Requirements
@@ -31,7 +25,18 @@ OR
31
25
  - `proxy_protocol = http`
32
26
 
33
27
  ## How to use
28
+ Initializer sample
29
+ ```ruby
30
+ Mock::Twilio.configure do |config|
31
+ config.host = "http://shunkan-ido-service"
32
+ config.forwarded_host = "shunkan-ido-service"
33
+ config.port = "3000"
34
+ config.proto = "http"
35
+ end
34
36
 
37
+ ```
38
+
39
+ Example
35
40
  ```ruby
36
41
  export TWILIO_ACCOUNT_SID=ACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
37
42
  export TWILIO_API_KEY=SKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@@ -42,6 +47,11 @@ client = Twilio::REST::Client.new(nil, nil, nil, nil, mock_client)
42
47
  client.messages.create(to: "+593978613041", body: "RB This is the ship that made the Kesssssel Run in fourteen parsecs?", from: "+13212855389")
43
48
  ```
44
49
 
50
+ ## Run tests
51
+ ```unix
52
+ rake test
53
+ ```
54
+
45
55
  ## Swagger - OpenApi Issues
46
56
 
47
57
  - Array and Boolean validations due open api formats, ie params as `status_callback_event`, `early_media`. Validations removed for them on json files.
@@ -7,7 +7,7 @@ module Mock
7
7
  # client.messages.create(to: "+593978613041", body: "RB This is the ship that made the Kesssssel Run in fourteen parsecs?", from: "+13212855389")
8
8
  class Client
9
9
  attr_accessor :adapter
10
- attr_reader :timeout, :last_response, :last_request
10
+ attr_reader :timeout, :last_response, :last_request, :proxy_addr, :proxy_port, :proxy_prot
11
11
 
12
12
  def initialize(proxy_prot = nil, proxy_addr = nil, proxy_port = nil, timeout: nil)
13
13
  @proxy_prot = proxy_prot || 'http'
@@ -11,9 +11,15 @@ module Mock
11
11
  class << self
12
12
  def call(body, request)
13
13
  body = JSON.parse(body)
14
+
15
+ case body["status"]
16
+ when 400..600
17
+ return body
18
+ end
19
+
14
20
  schema = url_from(body, request)
15
- # return body decorataor if needed
16
- return ENDPOINTS[schema].decorate(body) if schema
21
+ # return body decorate if needed
22
+ return ENDPOINTS[schema].decorate(body, request) if schema
17
23
 
18
24
  body
19
25
  end
@@ -19,14 +19,16 @@ module Mock
19
19
  "uri"
20
20
  ].freeze
21
21
 
22
- def decorate(body)
22
+ def decorate(body, request)
23
23
  body["date_updated"] = Time.current.rfc2822 if body["date_updated"]
24
24
  body["date_sent"] = Time.current.rfc2822 if body["date_sent"]
25
25
  body["date_created"] = Time.current.rfc2822 if body["date_created"]
26
26
  body["start_time"] = Time.current.rfc2822 if body["start_time"]
27
27
  body["end_time"] = Time.current.rfc2822 if body["end_time"]
28
28
 
29
+ message_sid(body, request) if body["sid"]
29
30
  pagination(body) if body["available_phone_numbers"]
31
+
30
32
  body
31
33
  end
32
34
 
@@ -37,6 +39,16 @@ module Mock
37
39
  body.delete(key) if body[key]
38
40
  end
39
41
  end
42
+
43
+ def message_sid(body, request)
44
+ prefix = request.data["MediaUrl"] ? "MM" : "SM"
45
+ sid = prefix + SecureRandom.hex(16)
46
+ scheduler = Rufus::Scheduler.new
47
+ scheduler.in '2s' do
48
+ Mock::Twilio::Webhooks::Messages.trigger(sid)
49
+ end
50
+ body["sid"] = sid
51
+ end
40
52
  end
41
53
  end
42
54
  end
@@ -5,7 +5,7 @@ module Mock
5
5
  module Schemas
6
6
  class MessagingV1
7
7
  class << self
8
- def decorate(body)
8
+ def decorate(body, request)
9
9
  # Params for twilio pagination, needed for twilio-ruby serializers and absolute paths
10
10
  body["meta"]["key"] = "phone_numbers" if body["meta"]
11
11
  body["meta"]["page_size"] = 20 if body["meta"]
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mock
4
+ module Twilio
5
+ module Util
6
+ class Configuration
7
+ attr_accessor :host, :forwarded_host, :port, :proto
8
+
9
+ def host=(value)
10
+ @host = value
11
+ end
12
+
13
+ def forwarded_host=(value)
14
+ @forwarded_host = value
15
+ end
16
+
17
+ def port=(value)
18
+ @port = value
19
+ end
20
+
21
+ def proto=(value)
22
+ @proto = value
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Mock
4
4
  module Twilio
5
- VERSION = "0.1.0"
5
+ VERSION = "0.2.0"
6
6
  end
7
7
  end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mock
4
+ module Twilio
5
+ class WebhooksClient
6
+ attr_accessor :adapter
7
+ attr_reader :timeout, :last_request
8
+
9
+ def initialize(timeout: nil)
10
+ @timeout = timeout
11
+ @adapter = Faraday.default_adapter
12
+ end
13
+
14
+ def _request(request)
15
+ @connection = Faraday.new(url: request.host + ":" + request.port.to_s, ssl: { verify: true }) do |f|
16
+ f.options.params_encoder = Faraday::FlatParamsEncoder
17
+ f.request :url_encoded
18
+ f.adapter @adapter
19
+ f.headers = request.headers
20
+ f.request(:authorization, :basic, request.auth[0], request.auth[1])
21
+
22
+ f.options.open_timeout = request.timeout || @timeout
23
+ f.options.timeout = request.timeout || @timeout
24
+ end
25
+
26
+ response = @connection.send(request.method.downcase.to_sym,
27
+ request.url,
28
+ request.method == "GET" ? request.params : request.data)
29
+
30
+ if response.body && !response.body.empty?
31
+ object = response.body
32
+ elsif response.status == 400
33
+ object = { message: "Bad request", code: 400 }.to_json
34
+ end
35
+
36
+ response
37
+ end
38
+
39
+ def request(host, port, method, url, params = {}, data = {}, headers = {}, auth = nil, timeout = nil)
40
+ request = ::Twilio::Request.new(host, port, method, url, params, data, headers, auth, timeout)
41
+ _request(request)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mock
4
+ module Twilio
5
+ module Webhooks
6
+ class RestError < StandardError
7
+ end
8
+ class Base
9
+ DELAY = [0.5, 0.8]
10
+
11
+ def self.build_signature_for_request(request_url, params)
12
+ validator = ::Twilio::Security::RequestValidator.new(::Twilio.auth_token)
13
+ validator.build_signature_for(request_url, params)
14
+ end
15
+
16
+ def self.twilio_client
17
+ ::Twilio::REST::Client.new
18
+ end
19
+
20
+ def self.webhook_client
21
+ Mock::Twilio::WebhooksClient.new
22
+ end
23
+
24
+ def self.auth_twilio
25
+ [twilio_client.account_sid, twilio_client.auth_token]
26
+ end
27
+
28
+ def self.headers
29
+ {
30
+ 'X-Forwarded-Proto': Mock::Twilio.proto,
31
+ 'Host': Mock::Twilio.forwarded_host
32
+ }
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mock
4
+ module Twilio
5
+ module Webhooks
6
+ class Messages < Base
7
+ URL = "/api/v1/twilio_requests/webhook_message_updates"
8
+
9
+ def self.trigger(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 = { :MessageSid=>sid, :MessageStatus=>"delivered" }
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, response.body
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
data/lib/mock/twilio.rb CHANGED
@@ -1,8 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "rufus-scheduler"
4
+ require "active_support"
5
+ require "active_support/core_ext/time"
3
6
  require_relative "twilio/middleware/proxy"
4
7
  require_relative "twilio/schemas/api_2010"
5
8
  require_relative "twilio/schemas/messaging_v1"
9
+ require_relative "twilio/webhook_client"
10
+ require_relative "twilio/webhooks/base"
11
+ require_relative "twilio/webhooks/messages"
12
+ require_relative "twilio/util/configuration"
6
13
  require_relative "twilio/client"
7
14
  require_relative "twilio/decorator"
8
15
  require_relative "twilio/response"
@@ -10,6 +17,18 @@ require_relative "twilio/version"
10
17
 
11
18
  module Mock
12
19
  module Twilio
13
- class Error < StandardError; end
20
+ extend SingleForwardable
21
+
22
+ def_delegators :configuration, :host, :forwarded_host, :port, :proto
23
+
24
+ def self.configure(&block)
25
+ yield configuration
26
+ end
27
+
28
+ def self.configuration
29
+ @configuration ||= Util::Configuration.new
30
+ end
31
+
32
+ private_class_method :configuration
14
33
  end
15
34
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mock-twilio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - SchoolStatus Platform Team
@@ -24,6 +24,48 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rufus-scheduler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: twilio-ruby
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
27
69
  description: This repository contains Mock::Twilio::Client for Twilio's API.
28
70
  email:
29
71
  executables: []
@@ -42,7 +84,11 @@ files:
42
84
  - lib/mock/twilio/response.rb
43
85
  - lib/mock/twilio/schemas/api_2010.rb
44
86
  - lib/mock/twilio/schemas/messaging_v1.rb
87
+ - lib/mock/twilio/util/configuration.rb
45
88
  - lib/mock/twilio/version.rb
89
+ - lib/mock/twilio/webhook_client.rb
90
+ - lib/mock/twilio/webhooks/base.rb
91
+ - lib/mock/twilio/webhooks/messages.rb
46
92
  - sig/mock/twilio.rbs
47
93
  homepage: https://github.com/schoolstatus/mock-twilio
48
94
  licenses: