sms77 0.0.1 → 0.4.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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -2
  3. data/README.md +26 -6
  4. data/lib/sms77.rb +0 -1
  5. data/lib/sms77/client.rb +18 -87
  6. data/lib/sms77/{contacts_action.rb → contacts.rb} +2 -2
  7. data/lib/sms77/endpoint.rb +12 -12
  8. data/lib/sms77/hooks.rb +64 -0
  9. data/lib/sms77/journal.rb +38 -0
  10. data/lib/sms77/{lookup_type.rb → lookup.rb} +2 -2
  11. data/lib/sms77/resource.rb +93 -0
  12. data/lib/sms77/resources/analytics.rb +16 -0
  13. data/lib/sms77/resources/balance.rb +16 -0
  14. data/lib/sms77/resources/contacts.rb +26 -0
  15. data/lib/sms77/resources/hooks.rb +30 -0
  16. data/lib/sms77/resources/journal.rb +16 -0
  17. data/lib/sms77/resources/lookup.rb +30 -0
  18. data/lib/sms77/resources/pricing.rb +16 -0
  19. data/lib/sms77/resources/sms.rb +16 -0
  20. data/lib/sms77/resources/status.rb +16 -0
  21. data/lib/sms77/resources/validate_for_voice.rb +16 -0
  22. data/lib/sms77/resources/voice.rb +16 -0
  23. data/lib/sms77/sms.rb +8 -0
  24. data/lib/sms77/util.rb +68 -0
  25. data/lib/sms77/version.rb +1 -1
  26. data/release.sh +8 -0
  27. data/sms77.gemspec +13 -16
  28. data/spec/EnvKeyStore.rb +15 -0
  29. data/spec/matchers.rb +23 -0
  30. data/spec/sms77/balance_spec.rb +4 -7
  31. data/spec/sms77/client_spec.rb +15 -0
  32. data/spec/sms77/contacts_spec.rb +22 -24
  33. data/spec/sms77/hooks_spec.rb +106 -0
  34. data/spec/sms77/instance_spec.rb +20 -0
  35. data/spec/sms77/journal_spec.rb +86 -0
  36. data/spec/sms77/lookup_spec.rb +73 -82
  37. data/spec/sms77/pricing_spec.rb +25 -29
  38. data/spec/sms77/sms_spec.rb +20 -20
  39. data/spec/sms77/validate_for_voice_spec.rb +6 -6
  40. data/spec/sms77/voice_spec.rb +11 -8
  41. data/spec/sms77_spec.rb +0 -8
  42. data/spec/spec_helper.rb +31 -34
  43. metadata +60 -25
  44. data/lib/sms77/header.rb +0 -7
  45. data/spec/sms77/http_spec.rb +0 -40
@@ -1,8 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'spec_helper'
4
- require 'sms77/endpoint'
5
- require 'sms77/contacts_action'
4
+ require 'sms77/resources/sms'
6
5
 
7
6
  RSpec.describe Sms77, 'sms' do
8
7
  $text = 'Your glasses are ready for pickup.'
@@ -23,16 +22,17 @@ RSpec.describe Sms77, 'sms' do
23
22
 
24
23
  def request(stub, extra_params = {})
25
24
  params = {
26
- from: Helper.virtual_inbound_nr_eplus,
25
+ from: Helper::VIRTUAL_INBOUNDS[:eplus],
27
26
  text: $text,
28
- to: Helper.virtual_inbound_nr_eplus
27
+ to: Helper::VIRTUAL_INBOUNDS[:eplus]
29
28
  }.merge(extra_params)
30
29
 
31
- Helper.request(Sms77::Endpoint::SMS, params, stub)
30
+ helper = Helper.new(Sms77::Resources::Sms)
31
+ helper.request(helper.resource.method(:retrieve), stub, params)
32
32
  end
33
33
 
34
34
  it 'sends a single sms and returns success code' do
35
- expect(request(100)).to be_kind_of(Integer)
35
+ expect(request(100)).to be_a(Integer)
36
36
  end
37
37
 
38
38
  it 'sends a single sms and returns detailed text response' do
@@ -51,14 +51,14 @@ RSpec.describe Sms77, 'sms' do
51
51
 
52
52
  body = request(stub, { details: 1 })
53
53
 
54
- expect(body).to be_kind_of(String)
54
+ expect(body).to be_a(String)
55
55
 
56
56
  code, booked, cost, balance, text, type, flash, encoding, gsm0338, debug = body.split("\n")
57
57
 
58
- expect(code).to be_kind_of(String)
59
- expect(booked.split(':').last.to_f).to be_kind_of(Float)
60
- expect(cost.split(':').last.to_f).to be_kind_of(Float)
61
- expect(balance.split(':').last.to_f).to be_kind_of(Float)
58
+ expect(code).to be_a(String)
59
+ expect(booked.split(':').last.to_f).to be_a(Float)
60
+ expect(cost.split(':').last.to_f).to be_a(Float)
61
+ expect(balance.split(':').last.to_f).to be_a(Float)
62
62
  expect(text.split(':').last.strip!).to eq($text)
63
63
  expect(type.split(':').last.strip!).to eq('direct')
64
64
  expect(flash.split(':').last.strip!).to eq('false')
@@ -88,16 +88,16 @@ RSpec.describe Sms77, 'sms' do
88
88
 
89
89
  body = request(stub, { json: 1 })
90
90
 
91
- expect(body).to be_kind_of(Hash)
91
+ expect(body).to be_a(Hash)
92
92
 
93
- expect(body['success']).to be_kind_of(String)
94
- expect(body['total_price']).to be_numeric
95
- expect(body['balance']).to be_kind_of(Float)
96
- expect(body['debug']).to be_kind_of(String)
97
- expect(body['sms_type']).to eq('direct')
98
- expect(body['messages']).to be_kind_of(Array)
99
- body['messages'].each do |message|
100
- expect(message).to be_kind_of(Hash)
93
+ expect(body[:success]).to be_a(String)
94
+ expect(body[:total_price]).to be_numeric
95
+ expect(body[:balance]).to be_a(Float)
96
+ expect(body[:debug]).to be_a(String)
97
+ expect(body[:sms_type]).to eq('direct')
98
+ expect(body[:messages]).to be_a(Array)
99
+ body[:messages].each do |message|
100
+ expect(message).to be_a(Hash)
101
101
  end
102
102
  end
103
103
  end
@@ -1,19 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'spec_helper'
4
- require 'sms77/endpoint'
5
- require 'json'
4
+ require 'sms77/resources/validate_for_voice'
6
5
 
7
6
  RSpec.describe Sms77, 'validate_for_voice' do
8
7
  it 'returns caller id information' do
9
8
  number = '491771783130'
10
- callback_host = Helper.is_http ? `curl http://ipecho.net/plain` : '127.0.0.1'
9
+ callback_host = Helper::IS_HTTP ? `curl http://ipecho.net/plain` : '127.0.0.1'
11
10
  callback = "#{callback_host}/callback.php"
12
11
  stub = { success: true }
13
12
 
14
- body = Helper.request(Sms77::Endpoint::VALIDATE_FOR_VOICE, { number: number, callback: callback }, stub)
13
+ helper = Helper.new(Sms77::Resources::ValidateForVoice)
14
+ body = helper.request(helper.resource.method(:retrieve), stub, { number: number, callback: callback })
15
15
 
16
- expect(body).to be_kind_of(Hash)
17
- expect(body['success']).to be_boolean
16
+ expect(body).to be_a(Hash)
17
+ expect(body[:success]).to be_boolean
18
18
  end
19
19
  end
@@ -1,12 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'spec_helper'
4
- require 'sms77/endpoint'
5
- require 'sms77/contacts_action'
4
+ require 'sms77/resources/voice'
6
5
 
7
6
  RSpec.describe Sms77, 'voice' do
8
7
  def assert_response(response)
9
- expect(response).to be_kind_of(String)
8
+ expect(response).to be_a(String)
10
9
 
11
10
  code, id, cost = response.split("\n")
12
11
 
@@ -22,14 +21,18 @@ RSpec.describe Sms77, 'voice' do
22
21
  0.1
23
22
  TEXT
24
23
 
25
- params = { to: Helper.virtual_inbound_nr_eplus, text: text, from: Helper.virtual_inbound_nr_eplus }
26
- .merge(extra_params)
24
+ params = {
25
+ from: Helper::VIRTUAL_INBOUNDS[:eplus],
26
+ text: text,
27
+ to: Helper::VIRTUAL_INBOUNDS[:eplus]
28
+ }.merge(extra_params)
27
29
 
28
- Helper.request(Sms77::Endpoint::VOICE, params, stub)
30
+ helper = Helper.new(Sms77::Resources::Voice)
31
+ assert_response(helper.request(helper.resource.method(:send), stub, params))
29
32
  end
30
33
 
31
34
  it 'calls a number with text input' do
32
- assert_response(request('Your glasses are ready for pickup.'))
35
+ request('Your glasses are ready for pickup.')
33
36
  end
34
37
 
35
38
  it 'calls a number with xml input' do
@@ -43,6 +46,6 @@ RSpec.describe Sms77, 'voice' do
43
46
  </Response>
44
47
  XML
45
48
 
46
- assert_response(request(text, { xml: 1 }))
49
+ request(text, { xml: true })
47
50
  end
48
51
  end
data/spec/sms77_spec.rb CHANGED
@@ -1,15 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
-
5
3
  describe Sms77 do
6
4
  it 'has a version number' do
7
5
  expect(Sms77::VERSION).not_to be nil
8
6
  end
9
-
10
- context 'failing authentication' do
11
- it 'balance' do
12
- expect { Sms77::Client.new('NotExistingApiKey', nil) }.to raise_error(RuntimeError)
13
- end
14
- end
15
7
  end
data/spec/spec_helper.rb CHANGED
@@ -3,54 +3,51 @@
3
3
  $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
4
4
 
5
5
  require 'sms77'
6
+ require 'sms77/resource'
7
+ require 'sms77/util'
8
+ require 'matchers'
9
+ require 'EnvKeyStore'
6
10
 
7
- RSpec::Matchers.define :be_boolean do
8
- match do |value|
9
- [true, false].include? value
10
- end
11
- end
11
+ SMS77_TEST_HTTP = (ENV['SMS77_TEST_HTTP'].nil? ? false : true).freeze
12
12
 
13
- RSpec::Matchers.define :be_numeric do
14
- match do |value|
15
- return true if value.is_a?(Integer)
16
-
17
- value.scan(/\D/).empty?
13
+ RSpec.configure do |config|
14
+ SMS77_TEST_HTTP && config.after do
15
+ sleep(1.125)
18
16
  end
19
17
  end
20
18
 
21
19
  class Helper
22
- @is_http = ENV.key?('TEST_HTTP')
23
- @stubs = Faraday::Adapter::Test::Stubs.new
24
- @conn = Faraday.new(Sms77::Client::BASE_URI) do |b|
25
- b.adapter(:test, @stubs) unless @is_http
26
- end
27
- @client = Sms77::Client.new(ENV['SMS77_DUMMY_API_KEY'], @conn, 'ruby-test')
28
- @virtual_inbound_nr_eplus = '+491771783130'
20
+ attr_reader :resource
29
21
 
30
- def self.request(endpoint, params, stub, extra_params = {})
31
- path = "#{Sms77::Client::API_SUFFIX}#{endpoint}"
22
+ IS_HTTP = SMS77_TEST_HTTP
23
+ VIRTUAL_INBOUNDS = {
24
+ eplus: '+491771783130',
25
+ }.freeze
32
26
 
33
- # TODO-START: determine request method to avoid multiple useless stubs
34
- @stubs.get(path) { |_env| [200, {}, JSON.generate(stub)] } unless @is_http
35
- @stubs.post(path) { |_env| [200, {}, JSON.generate(stub)] } unless @is_http
36
- # TODO-END
27
+ # @param resource [Class<Sms77::Resource>]
28
+ def initialize(resource)
29
+ @resource = resource.new(ENV['SMS77_DUMMY_API_KEY'], 'ruby-test')
37
30
 
38
- response = @client.method(endpoint).call(params.merge(extra_params))
31
+ unless Helper::IS_HTTP
32
+ @stubs = Faraday::Adapter::Test::Stubs.new
33
+ @resource.conn.builder.adapter(:test, @stubs)
34
+ end
35
+ end
39
36
 
40
- raise 'unexpected response' unless Faraday::Response == response.class
37
+ def create_stub(fn_name, stub)
38
+ http_fn = @resource.http_methods[fn_name]
39
+ puts "creating stub for #{http_fn} @ #{@resource.class.name}.#{fn_name}"
41
40
 
42
- body = response.body
41
+ @stubs.method(http_fn).call(Sms77::Resource::BASE_PATH + @resource.endpoint) do
42
+ puts "stub: " + stub.inspect
43
43
 
44
- begin
45
- body = JSON.parse(body)
46
- rescue StandardError
47
- # Ignored
44
+ [200, {}, stub]
48
45
  end
49
-
50
- body
51
46
  end
52
47
 
53
- class << self
54
- attr_reader :is_http, :stubs, :conn, :client, :virtual_inbound_nr_eplus
48
+ def request(fn, stub, params = nil)
49
+ create_stub(fn.name, stub) unless Helper::IS_HTTP
50
+
51
+ fn.call(*[params].compact)
55
52
  end
56
53
  end
metadata CHANGED
@@ -1,74 +1,73 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sms77
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - sms77 e.K.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-05 00:00:00.000000000 Z
11
+ date: 2021-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: faraday
14
+ name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1'
20
- type: :runtime
19
+ version: '2.1'
20
+ type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1'
26
+ version: '2.1'
27
27
  - !ruby/object:Gem::Dependency
28
- name: bundler
28
+ name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '2.1'
33
+ version: '13.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '2.1'
40
+ version: '13.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rake
42
+ name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '13'
47
+ version: '3.9'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '13'
54
+ version: '3.9'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rspec
56
+ name: faraday
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '3.0'
62
- type: :development
61
+ version: '1.1'
62
+ type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '3.0'
68
+ version: '1.1'
69
69
  description: Send SMS & Text2Voice messages via the Sms77.io SMS Gateway.
70
- email:
71
- - support@sms77.io
70
+ email: support@sms77.io
72
71
  executables: []
73
72
  extensions: []
74
73
  extra_rdoc_files: []
@@ -80,15 +79,36 @@ files:
80
79
  - Rakefile
81
80
  - lib/sms77.rb
82
81
  - lib/sms77/client.rb
83
- - lib/sms77/contacts_action.rb
82
+ - lib/sms77/contacts.rb
84
83
  - lib/sms77/endpoint.rb
85
- - lib/sms77/header.rb
86
- - lib/sms77/lookup_type.rb
84
+ - lib/sms77/hooks.rb
85
+ - lib/sms77/journal.rb
86
+ - lib/sms77/lookup.rb
87
+ - lib/sms77/resource.rb
88
+ - lib/sms77/resources/analytics.rb
89
+ - lib/sms77/resources/balance.rb
90
+ - lib/sms77/resources/contacts.rb
91
+ - lib/sms77/resources/hooks.rb
92
+ - lib/sms77/resources/journal.rb
93
+ - lib/sms77/resources/lookup.rb
94
+ - lib/sms77/resources/pricing.rb
95
+ - lib/sms77/resources/sms.rb
96
+ - lib/sms77/resources/status.rb
97
+ - lib/sms77/resources/validate_for_voice.rb
98
+ - lib/sms77/resources/voice.rb
99
+ - lib/sms77/sms.rb
100
+ - lib/sms77/util.rb
87
101
  - lib/sms77/version.rb
102
+ - release.sh
88
103
  - sms77.gemspec
104
+ - spec/EnvKeyStore.rb
105
+ - spec/matchers.rb
89
106
  - spec/sms77/balance_spec.rb
107
+ - spec/sms77/client_spec.rb
90
108
  - spec/sms77/contacts_spec.rb
91
- - spec/sms77/http_spec.rb
109
+ - spec/sms77/hooks_spec.rb
110
+ - spec/sms77/instance_spec.rb
111
+ - spec/sms77/journal_spec.rb
92
112
  - spec/sms77/lookup_spec.rb
93
113
  - spec/sms77/pricing_spec.rb
94
114
  - spec/sms77/sms_spec.rb
@@ -108,7 +128,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
108
128
  requirements:
109
129
  - - ">="
110
130
  - !ruby/object:Gem::Version
111
- version: 2.6.5
131
+ version: 2.6.0
112
132
  required_rubygems_version: !ruby/object:Gem::Requirement
113
133
  requirements:
114
134
  - - ">="
@@ -118,5 +138,20 @@ requirements: []
118
138
  rubygems_version: 3.1.2
119
139
  signing_key:
120
140
  specification_version: 4
121
- summary: Official Sms77.io API Client for Ruby
122
- test_files: []
141
+ summary: Official API Client for the Sms77.io SMS Gateway
142
+ test_files:
143
+ - spec/matchers.rb
144
+ - spec/sms77_spec.rb
145
+ - spec/sms77/balance_spec.rb
146
+ - spec/sms77/lookup_spec.rb
147
+ - spec/sms77/instance_spec.rb
148
+ - spec/sms77/voice_spec.rb
149
+ - spec/sms77/journal_spec.rb
150
+ - spec/sms77/validate_for_voice_spec.rb
151
+ - spec/sms77/contacts_spec.rb
152
+ - spec/sms77/hooks_spec.rb
153
+ - spec/sms77/sms_spec.rb
154
+ - spec/sms77/client_spec.rb
155
+ - spec/sms77/pricing_spec.rb
156
+ - spec/spec_helper.rb
157
+ - spec/EnvKeyStore.rb
data/lib/sms77/header.rb DELETED
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sms77
4
- module Header
5
- CONTENT_TYPE = 'Content-Type'
6
- end
7
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'logger'
5
-
6
- describe Sms77::Http do
7
- before(:all) do
8
- end
9
-
10
- after(:all) do
11
- end
12
-
13
- after(:each) do
14
- end
15
-
16
- let(:config) do
17
- Helper.config
18
- end
19
-
20
- let(:logger) do
21
- Logger.new($stderr).tap do |logger|
22
- logger.level = Logger::ERROR
23
- end
24
- end
25
-
26
- let(:instance) do
27
- described_class.new(config, logger)
28
- end
29
-
30
- context 'GET' do
31
- it 'performs GET requests' do
32
- Helper.maybe_stub_balance(:get)
33
-
34
- response = instance.get(url: 'balance')
35
- puts response.body
36
-
37
- expect(response.body.to_f).to be_kind_of(Float)
38
- end
39
- end
40
- end