twilio_mock 0.1.0 → 0.1.1
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 +4 -4
- data/lib/rest.rb +13 -7
- data/lib/twilio_mock/lookup_mocker.rb +28 -0
- data/lib/twilio_mock/mocker.rb +71 -0
- data/lib/twilio_mock/number_generator.rb +23 -0
- data/lib/twilio_mock/testing.rb +39 -0
- metadata +14 -47
- data/lib/twilio_lookup_mocker.rb +0 -26
- data/lib/twilio_mocker.rb +0 -64
- data/lib/twilio_number_generator.rb +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1e85e4460cea137d2213054ef9a0f267004f3b15
|
4
|
+
data.tar.gz: 7624468ce852603c647cfd56cd0ca22ae0eaf416
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e66ea8ff9506f6a30a99a2e3fffb9732c62152d03ba689cc2c5a4a2abe546e7ee785c135aa83ac9a30e22776919b8d58a7f8881019607879d3c0f55e74841a6c
|
7
|
+
data.tar.gz: 8fed1a57fd636c40377135d401ed0ae12293b334f24fc9dc3ce479f2d4229ddfe6133fca3229f2365870ef8b0eeebe510a1fe0038039cb32cd969de2addc5f7b
|
data/lib/rest.rb
CHANGED
@@ -1,34 +1,40 @@
|
|
1
1
|
require 'twilio-ruby'
|
2
|
-
require 'twilio_mocker'
|
3
2
|
|
4
3
|
module Twilio
|
5
4
|
module REST
|
6
5
|
class Messages < ListResource
|
7
6
|
def create(attrs)
|
8
|
-
|
7
|
+
TwilioMock::Mocker.new.create_message(attrs) if TwilioMock::Testing.enabled?
|
9
8
|
super(attrs)
|
10
9
|
end
|
11
10
|
end
|
12
11
|
|
13
12
|
class IncomingPhoneNumbers < ListResource
|
14
13
|
def create(attrs)
|
15
|
-
|
14
|
+
TwilioMock::Mocker.new.buy_number(attrs) if TwilioMock::Testing.enabled?
|
16
15
|
super(attrs)
|
17
16
|
end
|
18
17
|
end
|
19
18
|
|
20
19
|
class AvailablePhoneNumbers < ListResource
|
21
20
|
def get(sid)
|
22
|
-
|
21
|
+
TwilioMock::Mocker.new.available_number if TwilioMock::Testing.enabled?
|
23
22
|
super(sid)
|
24
23
|
end
|
25
24
|
end
|
26
25
|
|
26
|
+
class Local < ListResource
|
27
|
+
def list(params = {}, full_path = false)
|
28
|
+
TwilioMock::Mocker.new.available_number(nil, params) if TwilioMock::Testing.enabled?
|
29
|
+
super(params, full_path)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
27
33
|
module Lookups
|
28
34
|
class PhoneNumbers < NextGenListResource
|
29
|
-
def get(number
|
30
|
-
|
31
|
-
super(number
|
35
|
+
def get(number)
|
36
|
+
TwilioMock::LookupMocker.new.lookup(number) if TwilioMock::Testing.enabled?
|
37
|
+
super(number)
|
32
38
|
end
|
33
39
|
end
|
34
40
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative './mocker'
|
2
|
+
|
3
|
+
module TwilioMock
|
4
|
+
class LookupMocker < Mocker
|
5
|
+
API_VERSION = 'v1'.freeze
|
6
|
+
HOST = 'lookups.twilio.com'.freeze
|
7
|
+
|
8
|
+
def lookup(number, country_code = nil)
|
9
|
+
stub_request(:get, "#{base_twilio_url}/PhoneNumbers/#{number}")
|
10
|
+
.with(headers: headers)
|
11
|
+
.to_return(status: 200, body: response(number, country_code), headers: {})
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def response(number, country_code)
|
17
|
+
{
|
18
|
+
country_code: country_code || 'US',
|
19
|
+
phone_number: number,
|
20
|
+
url: "#{base_twilio_url}/PhoneNumber/number"
|
21
|
+
}.to_json
|
22
|
+
end
|
23
|
+
|
24
|
+
def base_twilio_url
|
25
|
+
"https://#{HOST}/#{API_VERSION}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'twilio-ruby'
|
2
|
+
require 'webmock'
|
3
|
+
require_relative 'number_generator'
|
4
|
+
|
5
|
+
module TwilioMock
|
6
|
+
class Mocker
|
7
|
+
include Twilio::REST::Utils
|
8
|
+
|
9
|
+
API_VERSION = '2010-04-01'.freeze
|
10
|
+
HOST = 'api.twilio.com'.freeze
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@username = Twilio.account_sid
|
14
|
+
@token = Twilio.auth_token
|
15
|
+
end
|
16
|
+
|
17
|
+
def create_message(attrs)
|
18
|
+
prepare_stub(attrs, 'Messages.json')
|
19
|
+
end
|
20
|
+
|
21
|
+
def available_number(number = nil, params = nil)
|
22
|
+
query_string = params && params.any? ? twilify(params).to_h.to_query : ''
|
23
|
+
stub_request(:get, "#{base_twilio_url}/AvailablePhoneNumbers/US/Local.json?#{query_string}")
|
24
|
+
.with(headers: headers, basic_auth: basic_auth)
|
25
|
+
.to_return(status: 200, body: available_number_response(number), headers: {})
|
26
|
+
end
|
27
|
+
|
28
|
+
def buy_number(attrs)
|
29
|
+
prepare_stub(attrs, 'IncomingPhoneNumbers.json')
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def response
|
35
|
+
{
|
36
|
+
sid: @username
|
37
|
+
}.to_json
|
38
|
+
end
|
39
|
+
|
40
|
+
def headers
|
41
|
+
Twilio::REST::Client::HTTP_HEADERS
|
42
|
+
end
|
43
|
+
|
44
|
+
def basic_auth
|
45
|
+
[@username, @token]
|
46
|
+
end
|
47
|
+
|
48
|
+
def stub_request(method, url)
|
49
|
+
WebMock.stub_request(method, url)
|
50
|
+
end
|
51
|
+
|
52
|
+
def base_twilio_url
|
53
|
+
"https://#{HOST}/#{API_VERSION}/Accounts/#{@username}"
|
54
|
+
end
|
55
|
+
|
56
|
+
def prepare_stub(attrs, path)
|
57
|
+
body = twilify(attrs).map { |k, val| [k, val.to_s] }.to_h
|
58
|
+
stub_request(:post, "#{base_twilio_url}/#{path}")
|
59
|
+
.with(body: body, headers: headers, basic_auth: basic_auth)
|
60
|
+
.to_return(status: 200, body: response, headers: {})
|
61
|
+
end
|
62
|
+
|
63
|
+
def available_number_response(number)
|
64
|
+
number ||= NumberGenerator.instance.generate
|
65
|
+
{
|
66
|
+
sid: @username,
|
67
|
+
available_phone_numbers: [{ 'PhoneNumber' => number }]
|
68
|
+
}.to_json
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module TwilioMock
|
2
|
+
class NumberGenerator
|
3
|
+
include Singleton
|
4
|
+
|
5
|
+
BASE_TEST_NUMBER = '+1500555'.freeze
|
6
|
+
|
7
|
+
attr_reader :available_numbers
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@available_numbers = []
|
11
|
+
end
|
12
|
+
|
13
|
+
def generate
|
14
|
+
number = loop do
|
15
|
+
number = "#{BASE_TEST_NUMBER}#{rand(9999).to_s.rjust(4, '0')}"
|
16
|
+
unless @available_numbers.include?(number)
|
17
|
+
@available_numbers << number
|
18
|
+
break number
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module TwilioMock
|
2
|
+
class Testing
|
3
|
+
class << self
|
4
|
+
attr_accessor :__test_mode
|
5
|
+
|
6
|
+
def __set_test_mode(mode)
|
7
|
+
if block_given?
|
8
|
+
current_mode = self.__test_mode
|
9
|
+
begin
|
10
|
+
self.__test_mode = mode
|
11
|
+
yield
|
12
|
+
ensure
|
13
|
+
self.__test_mode = current_mode
|
14
|
+
end
|
15
|
+
else
|
16
|
+
self.__test_mode = mode
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def enable!(&block)
|
21
|
+
__set_test_mode(:enable, &block)
|
22
|
+
end
|
23
|
+
|
24
|
+
def disable!(&block)
|
25
|
+
__set_test_mode(:disable, &block)
|
26
|
+
end
|
27
|
+
|
28
|
+
def enabled?
|
29
|
+
self.__test_mode == :enable
|
30
|
+
end
|
31
|
+
|
32
|
+
def disabled?
|
33
|
+
self.__test_mode == :disable
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
TwilioMock::Testing.enable! # default behavior
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twilio_mock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maicol Bentancor
|
@@ -10,90 +10,57 @@ bindir: bin
|
|
10
10
|
cert_chain: []
|
11
11
|
date: 2017-05-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: bundler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.14'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.14'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: twilio-ruby
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
17
|
- - "~>"
|
32
18
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
19
|
+
version: '3.16'
|
34
20
|
- - ">="
|
35
21
|
- !ruby/object:Gem::Version
|
36
|
-
version:
|
22
|
+
version: '3'
|
37
23
|
type: :runtime
|
38
24
|
prerelease: false
|
39
25
|
version_requirements: !ruby/object:Gem::Requirement
|
40
26
|
requirements:
|
41
27
|
- - "~>"
|
42
28
|
- !ruby/object:Gem::Version
|
43
|
-
version: '
|
29
|
+
version: '3.16'
|
44
30
|
- - ">="
|
45
31
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
32
|
+
version: '3'
|
47
33
|
- !ruby/object:Gem::Dependency
|
48
34
|
name: webmock
|
49
35
|
requirement: !ruby/object:Gem::Requirement
|
50
36
|
requirements:
|
51
37
|
- - "~>"
|
52
38
|
- !ruby/object:Gem::Version
|
53
|
-
version: '3
|
39
|
+
version: '2.3'
|
54
40
|
- - ">="
|
55
41
|
- !ruby/object:Gem::Version
|
56
|
-
version:
|
42
|
+
version: '2'
|
57
43
|
type: :runtime
|
58
44
|
prerelease: false
|
59
45
|
version_requirements: !ruby/object:Gem::Requirement
|
60
46
|
requirements:
|
61
47
|
- - "~>"
|
62
48
|
- !ruby/object:Gem::Version
|
63
|
-
version: '3
|
64
|
-
- - ">="
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: 3.0.1
|
67
|
-
- !ruby/object:Gem::Dependency
|
68
|
-
name: rspec
|
69
|
-
requirement: !ruby/object:Gem::Requirement
|
70
|
-
requirements:
|
71
|
-
- - "~>"
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
version: '3.6'
|
74
|
-
- - ">="
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
version: 3.6.0
|
77
|
-
type: :development
|
78
|
-
prerelease: false
|
79
|
-
version_requirements: !ruby/object:Gem::Requirement
|
80
|
-
requirements:
|
81
|
-
- - "~>"
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
version: '3.6'
|
49
|
+
version: '2.3'
|
84
50
|
- - ">="
|
85
51
|
- !ruby/object:Gem::Version
|
86
|
-
version:
|
87
|
-
description:
|
52
|
+
version: '2'
|
53
|
+
description: Mock for the twilio gem using webmock
|
88
54
|
email:
|
89
55
|
executables: []
|
90
56
|
extensions: []
|
91
57
|
extra_rdoc_files: []
|
92
58
|
files:
|
93
59
|
- lib/rest.rb
|
94
|
-
- lib/
|
95
|
-
- lib/
|
96
|
-
- lib/
|
60
|
+
- lib/twilio_mock/lookup_mocker.rb
|
61
|
+
- lib/twilio_mock/mocker.rb
|
62
|
+
- lib/twilio_mock/number_generator.rb
|
63
|
+
- lib/twilio_mock/testing.rb
|
97
64
|
homepage:
|
98
65
|
licenses:
|
99
66
|
- MIT
|
data/lib/twilio_lookup_mocker.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
require_relative './twilio_mocker'
|
2
|
-
|
3
|
-
class TwilioLookupMocker < TwilioMocker
|
4
|
-
API_VERSION = 'v1'.freeze
|
5
|
-
HOST = 'lookups.twilio.com'.freeze
|
6
|
-
|
7
|
-
def stub_lookup(number, country_code = nil)
|
8
|
-
stub_request(:get, "#{base_twilio_url}/PhoneNumbers/#{number}")
|
9
|
-
.with(headers: headers)
|
10
|
-
.to_return(status: 200, body: response(number, country_code), headers: {})
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def response(number, country_code)
|
16
|
-
{
|
17
|
-
country_code: country_code.presence || 'US',
|
18
|
-
phone_number: number,
|
19
|
-
url: "#{base_twilio_url}/PhoneNumber/number"
|
20
|
-
}.to_json
|
21
|
-
end
|
22
|
-
|
23
|
-
def base_twilio_url
|
24
|
-
"https://#{HOST}/#{API_VERSION}"
|
25
|
-
end
|
26
|
-
end
|
data/lib/twilio_mocker.rb
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
require 'twilio-ruby'
|
2
|
-
require 'webmock'
|
3
|
-
require 'twilio_number_generator'
|
4
|
-
|
5
|
-
class TwilioMocker
|
6
|
-
include Twilio::REST::Utils
|
7
|
-
|
8
|
-
API_VERSION = '2010-04-01'.freeze
|
9
|
-
HOST = 'api.twilio.com'.freeze
|
10
|
-
|
11
|
-
def initialize
|
12
|
-
@username = Twilio.account_sid
|
13
|
-
@token = Twilio.auth_token
|
14
|
-
end
|
15
|
-
|
16
|
-
def stub_create_message(attrs)
|
17
|
-
prepare_stub(attrs, 'Messages.json')
|
18
|
-
end
|
19
|
-
|
20
|
-
def stub_available_numbers
|
21
|
-
response_numbers = {
|
22
|
-
sid: @username,
|
23
|
-
available_phone_numbers: [{ 'PhoneNumber' => TwilioNumberGenerator.instance.generate }]
|
24
|
-
}.to_json
|
25
|
-
stub_request(:get, "#{base_twilio_url}/AvailablePhoneNumbers/US/Local.json")
|
26
|
-
.with(headers: headers, basic_auth: basic_auth)
|
27
|
-
.to_return(status: 200, body: response_numbers, headers: {})
|
28
|
-
end
|
29
|
-
|
30
|
-
def stub_buy_number(attrs)
|
31
|
-
prepare_stub(attrs, 'IncomingPhoneNumbers.json')
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def response
|
37
|
-
{
|
38
|
-
sid: @username
|
39
|
-
}.to_json
|
40
|
-
end
|
41
|
-
|
42
|
-
def headers
|
43
|
-
Twilio::REST::Client::HTTP_HEADERS
|
44
|
-
end
|
45
|
-
|
46
|
-
def basic_auth
|
47
|
-
[@username, @token]
|
48
|
-
end
|
49
|
-
|
50
|
-
def stub_request(method, url)
|
51
|
-
WebMock.stub_request(method, url)
|
52
|
-
end
|
53
|
-
|
54
|
-
def base_twilio_url
|
55
|
-
"https://#{HOST}/#{API_VERSION}/Accounts/#{@username}"
|
56
|
-
end
|
57
|
-
|
58
|
-
def prepare_stub(attrs, path)
|
59
|
-
body = twilify(attrs).map { |k, val| [k, val.to_s] }.to_h
|
60
|
-
stub_request(:post, "#{base_twilio_url}/#{path}")
|
61
|
-
.with(body: body, headers: headers, basic_auth: basic_auth)
|
62
|
-
.to_return(status: 200, body: response, headers: {})
|
63
|
-
end
|
64
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
class TwilioNumberGenerator
|
2
|
-
include Singleton
|
3
|
-
|
4
|
-
BASE_TEST_NUMBER = '+1500555'.freeze
|
5
|
-
|
6
|
-
attr_reader :available_numbers
|
7
|
-
|
8
|
-
def initialize
|
9
|
-
@available_numbers = []
|
10
|
-
end
|
11
|
-
|
12
|
-
def generate
|
13
|
-
number = loop do
|
14
|
-
number = "#{BASE_TEST_NUMBER}#{rand(9999).to_s.rjust(4, '0')}"
|
15
|
-
unless @available_numbers.include?(number)
|
16
|
-
@available_numbers << number
|
17
|
-
break number
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|