seven_api 0.5.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 (103) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.idea/.gitignore +8 -0
  4. data/.idea/inspectionProfiles/Project_Default.xml +6 -0
  5. data/.idea/modules.xml +8 -0
  6. data/.idea/ruby-client.iml +18 -0
  7. data/.idea/vcs.xml +6 -0
  8. data/Gemfile +3 -0
  9. data/LICENSE +22 -0
  10. data/README.md +41 -0
  11. data/Rakefile +6 -0
  12. data/doc/Sms77/Client.html +230 -0
  13. data/doc/Sms77/Contacts/Action.html +131 -0
  14. data/doc/Sms77/Contacts.html +126 -0
  15. data/doc/Sms77/Endpoint.html +187 -0
  16. data/doc/Sms77/Hooks/Action.html +131 -0
  17. data/doc/Sms77/Hooks/EventType.html +146 -0
  18. data/doc/Sms77/Hooks/RequestMethod.html +131 -0
  19. data/doc/Sms77/Hooks/Validator.html +598 -0
  20. data/doc/Sms77/Hooks.html +126 -0
  21. data/doc/Sms77/Journal/Type.html +136 -0
  22. data/doc/Sms77/Journal/Validator.html +394 -0
  23. data/doc/Sms77/Journal.html +126 -0
  24. data/doc/Sms77/Lookup/Type.html +136 -0
  25. data/doc/Sms77/Lookup.html +126 -0
  26. data/doc/Sms77/Resource.html +870 -0
  27. data/doc/Sms77/Resources/Analytics.html +263 -0
  28. data/doc/Sms77/Resources/Balance.html +246 -0
  29. data/doc/Sms77/Resources/Contacts.html +449 -0
  30. data/doc/Sms77/Resources/Hooks.html +457 -0
  31. data/doc/Sms77/Resources/Journal.html +261 -0
  32. data/doc/Sms77/Resources/Lookup.html +540 -0
  33. data/doc/Sms77/Resources/Pricing.html +263 -0
  34. data/doc/Sms77/Resources/Sms.html +261 -0
  35. data/doc/Sms77/Resources/Status.html +261 -0
  36. data/doc/Sms77/Resources/Subaccounts.html +651 -0
  37. data/doc/Sms77/Resources/ValidateForVoice.html +261 -0
  38. data/doc/Sms77/Resources/Voice.html +261 -0
  39. data/doc/Sms77/Resources.html +128 -0
  40. data/doc/Sms77/Sms/Type.html +126 -0
  41. data/doc/Sms77/Sms.html +126 -0
  42. data/doc/Sms77/Subaccounts/Action.html +141 -0
  43. data/doc/Sms77/Subaccounts/Validator.html +490 -0
  44. data/doc/Sms77/Subaccounts.html +126 -0
  45. data/doc/Sms77/Util.html +1033 -0
  46. data/doc/Sms77.html +146 -0
  47. data/doc/_index.html +444 -0
  48. data/doc/class_list.html +51 -0
  49. data/doc/css/common.css +1 -0
  50. data/doc/css/full_list.css +58 -0
  51. data/doc/css/style.css +497 -0
  52. data/doc/file.README.html +112 -0
  53. data/doc/file_list.html +56 -0
  54. data/doc/frames.html +17 -0
  55. data/doc/index.html +112 -0
  56. data/doc/js/app.js +314 -0
  57. data/doc/js/full_list.js +216 -0
  58. data/doc/js/jquery.js +4 -0
  59. data/doc/method_list.html +563 -0
  60. data/doc/top-level-namespace.html +110 -0
  61. data/lib/seven_api/client.rb +30 -0
  62. data/lib/seven_api/contacts.rb +10 -0
  63. data/lib/seven_api/endpoint.rb +17 -0
  64. data/lib/seven_api/hooks.rb +67 -0
  65. data/lib/seven_api/journal.rb +39 -0
  66. data/lib/seven_api/lookup.rb +11 -0
  67. data/lib/seven_api/resource.rb +94 -0
  68. data/lib/seven_api/resources/analytics.rb +21 -0
  69. data/lib/seven_api/resources/balance.rb +20 -0
  70. data/lib/seven_api/resources/contacts.rb +39 -0
  71. data/lib/seven_api/resources/hooks.rb +41 -0
  72. data/lib/seven_api/resources/journal.rb +21 -0
  73. data/lib/seven_api/resources/lookup.rb +48 -0
  74. data/lib/seven_api/resources/pricing.rb +21 -0
  75. data/lib/seven_api/resources/sms.rb +21 -0
  76. data/lib/seven_api/resources/status.rb +21 -0
  77. data/lib/seven_api/resources/subaccounts.rb +66 -0
  78. data/lib/seven_api/resources/validate_for_voice.rb +21 -0
  79. data/lib/seven_api/resources/voice.rb +21 -0
  80. data/lib/seven_api/sms.rb +9 -0
  81. data/lib/seven_api/subaccounts.rb +55 -0
  82. data/lib/seven_api/util.rb +69 -0
  83. data/lib/seven_api/version.rb +5 -0
  84. data/lib/seven_api.rb +6 -0
  85. data/release.sh +5 -0
  86. data/seven_api.gemspec +22 -0
  87. data/spec/EnvKeyStore.rb +15 -0
  88. data/spec/matchers.rb +23 -0
  89. data/spec/seven_api/balance_spec.rb +12 -0
  90. data/spec/seven_api/client_spec.rb +15 -0
  91. data/spec/seven_api/contacts_spec.rb +129 -0
  92. data/spec/seven_api/hooks_spec.rb +109 -0
  93. data/spec/seven_api/instance_spec.rb +22 -0
  94. data/spec/seven_api/journal_spec.rb +86 -0
  95. data/spec/seven_api/lookup_spec.rb +179 -0
  96. data/spec/seven_api/pricing_spec.rb +76 -0
  97. data/spec/seven_api/sms_spec.rb +103 -0
  98. data/spec/seven_api/subaccounts_spec.rb +121 -0
  99. data/spec/seven_api/validate_for_voice_spec.rb +19 -0
  100. data/spec/seven_api/voice_spec.rb +51 -0
  101. data/spec/seven_api_spec.rb +9 -0
  102. data/spec/spec_helper.rb +53 -0
  103. metadata +215 -0
@@ -0,0 +1,179 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'seven_api/endpoint'
5
+ require 'seven_api/lookup'
6
+ require 'seven_api/resources/lookup'
7
+ require 'json'
8
+
9
+ RSpec.describe SevenApi, 'lookup' do
10
+ def request(type, stub, extra_args = {})
11
+ helper = Helper.new(SevenApi::Resources::Lookup)
12
+ helper.request(
13
+ helper.resource.method(type),
14
+ stub,
15
+ { number: '+491771783130' }.merge(extra_args))
16
+ end
17
+
18
+ it 'misses number to lookup' do
19
+ stub = {
20
+ carrier: nil,
21
+ country_code: false,
22
+ country_iso: nil,
23
+ country_name: nil,
24
+ international: '+',
25
+ international_formatted: '',
26
+ national: '',
27
+ network_type: nil,
28
+ success: false
29
+ }
30
+
31
+ res = request(SevenApi::Lookup::Type::FORMAT, stub, { number: '' })
32
+
33
+ expect(res).to be_a(Hash)
34
+ expect(res[:success]).to match(false)
35
+ end
36
+
37
+ it 'returns number formatting details as json' do
38
+ stub = {
39
+ carrier: 'Eplus',
40
+ country_code: '49',
41
+ country_iso: 'DE',
42
+ country_name: 'Germany',
43
+ international: '+491771783130',
44
+ international_formatted: '+49 177 1783130',
45
+ national: '0177 1783130',
46
+ network_type: 'mobile',
47
+ success: true
48
+ }
49
+
50
+ body = request(SevenApi::Lookup::Type::FORMAT, stub)
51
+
52
+ expect(body).to be_a(Hash)
53
+ expect(body[:carrier]).to be_a(String)
54
+ expect(body[:country_code]).to be_a(String)
55
+ expect(body[:country_iso]).to be_a(String)
56
+ expect(body[:country_name]).to be_a(String)
57
+ expect(body[:international]).to be_a(String)
58
+ expect(body[:international_formatted]).to be_a(String)
59
+ expect(body[:national]).to be_a(String)
60
+ expect(body[:network_type]).to be_a(String)
61
+ expect(body[:success]).to be_boolean
62
+ end
63
+
64
+ it 'returns CNAM details as json' do
65
+ stub = {
66
+ code: '100',
67
+ name: 'GERMANY',
68
+ number: '+491771783130',
69
+ success: 'true'
70
+ }
71
+ body = request(SevenApi::Lookup::Type::CNAM, stub)
72
+
73
+ expect(body).to be_a(Hash)
74
+ expect(body[:code]).to be_a(String)
75
+ expect(body[:name]).to be_a(String)
76
+ expect(body[:number]).to be_a(String)
77
+ expect(body[:success]).to be_a(String)
78
+ end
79
+
80
+ it 'returns MNP details as text' do
81
+ body = request(SevenApi::Lookup::Type::MNP, 'eplus')
82
+
83
+ expect(body).to be_a(String)
84
+ end
85
+
86
+ it 'returns MNP details as json' do
87
+ stub = {
88
+ code: 100,
89
+ mnp: {
90
+ country: 'DE',
91
+ international_formatted: '+49 177 1783130',
92
+ isPorted: false,
93
+ mccmnc: '26203',
94
+ national_format: '0177 1783130',
95
+ network: "Telef\u00f3nica Germany GmbH & Co. oHG (O2)",
96
+ number: '+491771783130'
97
+ },
98
+ price: 0.005,
99
+ success: true
100
+ }
101
+ body = request(SevenApi::Lookup::Type::MNP, stub, { json: 1 })
102
+
103
+ expect(body).to be_a(Hash)
104
+ expect(body[:code]).to be_a(Integer)
105
+ expect(body[:price]).to be_a(Float)
106
+ expect(body[:mnp]).to be_a(Hash)
107
+ expect(body[:mnp][:country]).to be_a(String)
108
+ expect(body[:mnp][:international_formatted]).to be_a(String)
109
+ expect(body[:mnp][:isPorted]).to be_boolean
110
+ expect(body[:mnp][:mccmnc]).to be_a(String)
111
+ expect(body[:mnp][:national_format]).to be_a(String)
112
+ expect(body[:mnp][:network]).to be_a(String)
113
+ expect(body[:mnp][:number]).to be_a(String)
114
+ expect(body[:success]).to be_boolean
115
+ end
116
+
117
+ it 'returns HLR details as json' do
118
+ stub = {
119
+ country_code: 'DE',
120
+ country_name: 'Germany',
121
+ country_prefix: '49',
122
+ current_carrier: {
123
+ country: 'DE',
124
+ name: "Telef\u00f3nica Germany GmbH & Co. oHG (O2)",
125
+ network_code: '26203',
126
+ network_type: 'mobile'
127
+ },
128
+ international_format_number: '491771783130',
129
+ international_formatted: '+49 177 1783130',
130
+ lookup_outcome: true,
131
+ lookup_outcome_message: 'success',
132
+ national_format_number: '0177 1783130',
133
+ original_carrier: {
134
+ country: 'DE',
135
+ name: "Telef\u00f3nica Germany GmbH & Co. oHG (O2)",
136
+ network_code: '26203',
137
+ network_type: 'mobile'
138
+ },
139
+ status: true,
140
+ status_message: 'success',
141
+ gsm_code: '0',
142
+ gsm_message: 'No error',
143
+ ported: 'assumed_not_ported',
144
+ reachable: 'reachable',
145
+ roaming: 'not_roaming',
146
+ valid_number: 'valid'
147
+ }
148
+
149
+ body = request(SevenApi::Lookup::Type::HLR, stub)
150
+
151
+ expect(body).to be_a(Hash)
152
+ expect(body[:country_code]).to be_a(String)
153
+ expect(body[:country_name]).to be_a(String)
154
+ expect(body[:country_prefix]).to be_a(String)
155
+ assert_carrier(body[:current_carrier])
156
+ expect(body[:international_format_number]).to be_a(String)
157
+ expect(body[:international_formatted]).to be_a(String)
158
+ expect(body[:lookup_outcome]).to be_boolean
159
+ expect(body[:lookup_outcome_message]).to be_a(String)
160
+ expect(body[:national_format_number]).to be_a(String)
161
+ assert_carrier(body[:original_carrier])
162
+ expect(body[:status]).to be_boolean
163
+ expect(body[:status_message]).to be_a(String)
164
+ expect(body[:gsm_code]).to be_a(String)
165
+ expect(body[:gsm_message]).to be_a(String)
166
+ expect(body[:ported]).to be_a(String)
167
+ expect(body[:reachable]).to be_a(String)
168
+ expect(body[:roaming]).to be_a(String)
169
+ expect(body[:valid_number]).to be_a(String)
170
+ end
171
+
172
+ def assert_carrier(hash)
173
+ expect(hash).to be_a(Hash)
174
+ expect(hash[:country]).to be_a(String)
175
+ expect(hash[:name]).to be_a(String)
176
+ expect(hash[:network_code]).to be_a(String)
177
+ expect(hash[:network_type]).to be_a(String)
178
+ end
179
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'seven_api/resources/pricing'
5
+
6
+ RSpec.describe SevenApi, 'pricing' do
7
+ it 'returns all countries pricing as json' do
8
+ stub = {
9
+ countCountries: 1,
10
+ countNetworks: 4,
11
+ countries: [
12
+ {
13
+ countryCode: 'AT',
14
+ countryName: 'Austria',
15
+ countryPrefix: '43',
16
+ networks: [
17
+ {
18
+ comment: '',
19
+ features: [],
20
+ mcc: '232',
21
+ mncs: ['02'],
22
+ networkName: 'A1 Telekom Austria',
23
+ price: 0.075
24
+ },
25
+ {
26
+ comment: '',
27
+ features: %w[alpha Numeric dlr sc],
28
+ mcc: '232',
29
+ mncs: ['01'],
30
+ networkName: 'A1 Telekom Austria (A1.net)',
31
+ price: 0.075
32
+ }
33
+ ]
34
+ }
35
+ ]
36
+ }
37
+
38
+ helper = Helper.new(SevenApi::Resources::Pricing)
39
+ res = helper.request(helper.resource.method(:retrieve), stub)
40
+ countries = res[:countries]
41
+
42
+ expect(res).to be_a(Hash)
43
+ expect(res[:countCountries]).to be_a(Integer)
44
+ expect(res[:countNetworks]).to be_a(Integer)
45
+ expect(countries).to be_a(Array)
46
+
47
+ countries.each do |country|
48
+ networks = country[:networks]
49
+
50
+ expect(country).to be_a(Hash)
51
+ expect(country[:countryCode]).to be_a(String)
52
+ expect(country[:countryName]).to be_a(String)
53
+ expect(country[:countryPrefix]).to be_a(String)
54
+ expect(networks).to be_a(Array)
55
+
56
+ networks.each do |network|
57
+ mncs = network[:mncs]
58
+ features = network[:features]
59
+
60
+ expect(network).to be_a(Hash)
61
+ expect(network[:mcc]).to be_a(String)
62
+ expect(mncs).to be_a(Array)
63
+ mncs.each do |mnc|
64
+ expect(mnc).to be_a(String)
65
+ end
66
+ expect(network[:networkName]).to be_a(String)
67
+ expect(network[:price]).to be_a(Float)
68
+ expect(features).to be_a(Array)
69
+ features.each do |feature|
70
+ expect(feature).to be_a(String)
71
+ end
72
+ expect(network[:comment]).to be_a(String)
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'seven_api/resources/sms'
5
+
6
+ RSpec.describe SevenApi, 'sms' do
7
+ $text = 'Your glasses are ready for pickup.'
8
+
9
+ def assert_response(response)
10
+ if response.is_a?(String)
11
+ id, name, number = response.split("\n")
12
+ else
13
+ id = response['ID']
14
+ name = response['Name']
15
+ number = response['Number']
16
+ end
17
+
18
+ expect(Integer(id)).to be_an_instance_of(Integer)
19
+ expect(name.to_f).to be_an_instance_of(Float) if id != ''
20
+ expect(number.to_f).to be_an_instance_of(Float)
21
+ end
22
+
23
+ def request(stub, extra_params = {})
24
+ params = {
25
+ from: Helper::VIRTUAL_INBOUNDS[:eplus],
26
+ text: $text,
27
+ to: Helper::VIRTUAL_INBOUNDS[:eplus]
28
+ }.merge(extra_params)
29
+
30
+ helper = Helper.new(SevenApi::Resources::Sms)
31
+ helper.request(helper.resource.method(:retrieve), stub, params)
32
+ end
33
+
34
+ it 'sends a single sms and returns success code' do
35
+ expect(request(100)).to be_a(Integer)
36
+ end
37
+
38
+ it 'sends a single sms and returns detailed text response' do
39
+ stub = <<~TEXT
40
+ 100
41
+ Verbucht: 0
42
+ Preis: 0.075
43
+ Guthaben: 4.575
44
+ Text: Your glasses are ready for pickup.
45
+ SMS-Typ: direct
46
+ Flash SMS: false
47
+ Encoding: gsm
48
+ GSM0338: true
49
+ Debug: true
50
+ TEXT
51
+
52
+ body = request(stub, { details: 1 })
53
+
54
+ expect(body).to be_a(String)
55
+
56
+ code, booked, cost, balance, text, type, flash, encoding, gsm0338, debug = body.split("\n")
57
+
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
+ expect(text.split(':').last.strip!).to eq($text)
63
+ expect(type.split(':').last.strip!).to eq('direct')
64
+ expect(flash.split(':').last.strip!).to eq('false')
65
+ expect(encoding.split(':').last.strip!).to eq('gsm')
66
+ expect(gsm0338.split(':').last.strip!).to eq('true')
67
+ expect(debug.split(':').last.strip!).to eq('true')
68
+ end
69
+
70
+ it 'sends a single sms and returns json response' do
71
+ stub = {
72
+ success: '100',
73
+ total_price: 0,
74
+ balance: 4.5,
75
+ debug: 'true',
76
+ sms_type: 'direct',
77
+ messages: [{ id: nil,
78
+ sender: '491771783130',
79
+ recipient: '491771783130',
80
+ text: 'Your glasses are ready for pickup.',
81
+ encoding: 'gsm',
82
+ parts: 1,
83
+ price: 0,
84
+ success: true,
85
+ error: nil,
86
+ error_text: nil }]
87
+ }
88
+
89
+ body = request(stub, { json: 1 })
90
+
91
+ expect(body).to be_a(Hash)
92
+
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
+ end
102
+ end
103
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'seven_api/resources/subaccounts'
5
+
6
+ dummy_subaccount = {
7
+ :auto_topup => {
8
+ :amount => 5,
9
+ :threshold => 1,
10
+ },
11
+ :balance => 36.8100,
12
+ :company => 'Company1',
13
+ :contact => {
14
+ :email => 'sms@acme-company1.com',
15
+ :name => 'John Doe',
16
+ },
17
+ :id => '1234567891',
18
+ :total_usage => 0.3000,
19
+ :username => nil,
20
+ }
21
+
22
+ RSpec.describe SevenApi, 'subaccounts' do
23
+ HELPER = Helper.new(SevenApi::Resources::Subaccounts)
24
+
25
+ def request(key, stub, extra_params = {})
26
+ HELPER.request(HELPER.resource.method(key), stub, extra_params)
27
+ end
28
+
29
+ it 'returns all subaccounts' do
30
+ res = request(:read, [
31
+ dummy_subaccount
32
+ ])
33
+
34
+ expect(res).to be_a(Array)
35
+
36
+ res.each do |subaccount|
37
+ assert_subaccount(subaccount)
38
+ end
39
+ end
40
+
41
+ it 'creates a subaccount' do
42
+ res = request(:create, {
43
+ :error => nil,
44
+ :subaccount => dummy_subaccount,
45
+ :success => true,
46
+ })
47
+
48
+ expect(res).to be_a(Hash)
49
+ expect(res[:error]).to be_nil_or_lengthy_string
50
+ assert_subaccount(res[:subaccount])
51
+ expect(res[:success]).to be_boolean
52
+ end
53
+
54
+ it 'deletes a subaccount' do
55
+ res = request(
56
+ :delete,
57
+ {
58
+ :error => nil,
59
+ :success => true,
60
+ },
61
+ {
62
+ :id => -1,
63
+ }
64
+ )
65
+
66
+ expect(res).to be_a(Hash)
67
+ expect(res[:error]).to be_nil_or_lengthy_string
68
+ expect(res[:success]).to be_boolean
69
+ end
70
+
71
+ it 'transfers credits' do
72
+ res = request(
73
+ :transfer_credits,
74
+ {
75
+ :error => nil,
76
+ :success => true,
77
+ },
78
+ {
79
+ :amount => 0,
80
+ :id => -1,
81
+ }
82
+ )
83
+
84
+ expect(res).to be_a(Hash)
85
+ expect(res[:error]).to be_nil_or_lengthy_string
86
+ expect(res[:success]).to be_boolean
87
+ end
88
+
89
+ it 'updats automatic charging of credits' do
90
+ res = request(
91
+ :update,
92
+ {
93
+ :error => nil,
94
+ :success => true,
95
+ },
96
+ {
97
+ :amount => 0,
98
+ :id => -1,
99
+ :threshold => -1,
100
+ }
101
+ )
102
+
103
+ expect(res).to be_a(Hash)
104
+ expect(res[:error]).to be_nil_or_lengthy_string
105
+ expect(res[:success]).to be_boolean
106
+ end
107
+
108
+ private
109
+
110
+ def assert_subaccount(subaccount)
111
+ expect(subaccount).to be_a(Hash)
112
+ expect(subaccount).to include(:auto_topup, :balance, :company, :contact, :id, :total_usage, :username,)
113
+ expect(subaccount[:auto_topup]).to be_a(Object)
114
+ expect(subaccount[:auto_topup]).to include(:amount, :threshold,)
115
+ expect(subaccount[:balance]).to be_a(Float)
116
+ expect(subaccount[:contact]).to be_a(Object)
117
+ expect(subaccount[:contact]).to include(:email, :name,)
118
+ expect(subaccount[:id]).to be_a(String)
119
+ expect(subaccount[:total_usage]).to be_a(Float)
120
+ end
121
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'seven_api/resources/validate_for_voice'
5
+
6
+ RSpec.describe SevenApi, 'validate_for_voice' do
7
+ it 'returns caller id information' do
8
+ number = '491771783130'
9
+ callback_host = Helper::IS_HTTP ? `curl http://ipecho.net/plain` : '127.0.0.1'
10
+ callback = "#{callback_host}/callback.php"
11
+ stub = { success: true }
12
+
13
+ helper = Helper.new(SevenApi::Resources::ValidateForVoice)
14
+ body = helper.request(helper.resource.method(:retrieve), stub, { number: number, callback: callback })
15
+
16
+ expect(body).to be_a(Hash)
17
+ expect(body[:success]).to be_boolean
18
+ end
19
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'seven_api/resources/voice'
5
+
6
+ RSpec.describe SevenApi, 'voice' do
7
+ def assert_response(response)
8
+ expect(response).to be_a(String)
9
+
10
+ code, id, cost = response.split("\n")
11
+
12
+ expect(Integer(code)).to be_an_instance_of(Integer)
13
+ expect(id.to_f).to be_an_instance_of(Float) if id != ''
14
+ expect(cost.to_f).to be_an_instance_of(Float)
15
+ end
16
+
17
+ def request(text, extra_params = {})
18
+ stub = <<~TEXT
19
+ 301
20
+
21
+ 0.1
22
+ TEXT
23
+
24
+ params = {
25
+ from: Helper::VIRTUAL_INBOUNDS[:eplus],
26
+ text: text,
27
+ to: Helper::VIRTUAL_INBOUNDS[:eplus]
28
+ }.merge(extra_params)
29
+
30
+ helper = Helper.new(SevenApi::Resources::Voice)
31
+ assert_response(helper.request(helper.resource.method(:send), stub, params))
32
+ end
33
+
34
+ it 'calls a number with text input' do
35
+ request('Your glasses are ready for pickup.')
36
+ end
37
+
38
+ it 'calls a number with xml input' do
39
+ text = <<~XML
40
+ <?xml version="1.0" encoding="UTF-8"?>
41
+ <Response>
42
+ <Say voice="woman" language="en-EN">
43
+ Your glasses are ready for pickup.
44
+ </Say>
45
+ <Record maxlength="20" />
46
+ </Response>
47
+ XML
48
+
49
+ request(text, { xml: true })
50
+ end
51
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe SevenApi do
6
+ it 'has a version number' do
7
+ expect(SevenApi::VERSION).not_to be nil
8
+ end
9
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
4
+
5
+ require 'seven_api'
6
+ require 'seven_api/resource'
7
+ require 'seven_api/util'
8
+ require 'matchers'
9
+ require 'EnvKeyStore'
10
+
11
+ SEVEN_TEST_HTTP = (ENV['SEVEN_TEST_HTTP'].nil? ? false : true).freeze
12
+
13
+ RSpec.configure do |config|
14
+ SEVEN_TEST_HTTP && config.after do
15
+ sleep(1.125)
16
+ end
17
+ end
18
+
19
+ class Helper
20
+ attr_reader :resource
21
+
22
+ IS_HTTP = SEVEN_TEST_HTTP
23
+ VIRTUAL_INBOUNDS = {
24
+ eplus: '+491771783130',
25
+ }.freeze
26
+
27
+ # @param resource [Class<SevenApi::Resource>]
28
+ def initialize(resource)
29
+ @resource = resource.new(ENV['SEVEN_API_KEY_SANDBOX'], 'ruby-test')
30
+
31
+ unless Helper::IS_HTTP
32
+ @stubs = Faraday::Adapter::Test::Stubs.new
33
+ @resource.conn.builder.adapter(:test, @stubs)
34
+ end
35
+ end
36
+
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}"
40
+
41
+ @stubs.method(http_fn).call(SevenApi::Resource::BASE_PATH + @resource.endpoint) do
42
+ puts "stub: " + stub.inspect
43
+
44
+ [200, {}, stub]
45
+ end
46
+ end
47
+
48
+ def request(fn, stub, params = nil)
49
+ create_stub(fn.name, stub) unless Helper::IS_HTTP
50
+
51
+ fn.call(*[params].compact)
52
+ end
53
+ end