mock-twilio 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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: