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