infobipapi 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,123 @@
1
+ # vim: set sw=4 ts=4 et :
2
+
3
+ #require 'pry'
4
+ require 'json'
5
+ require 'socket'
6
+
7
+ module InfobipApi
8
+
9
+ class JSONUtils
10
+
11
+ def self.get_json(json)
12
+ if json.instance_of? String
13
+ return JSON.parse(json)
14
+ end
15
+
16
+ return json
17
+ end
18
+
19
+ def self.get(json, field)
20
+ json = JSONUtils.get_json(json)
21
+
22
+ if not field
23
+ return nil
24
+ end
25
+
26
+ if field.instance_of? Symbol
27
+ field = field.to_s
28
+ end
29
+
30
+ if field.include?('|') then
31
+ field_parts = field.split('|')
32
+ for field_part in field_parts
33
+ value = JSONUtils.get(json, field_part.strip)
34
+ if value
35
+ return value
36
+ end
37
+ end
38
+ return nil
39
+ end
40
+
41
+ result = nil
42
+ parts = field.split('.')
43
+ result = json
44
+ for part in parts
45
+ if result == nil
46
+ return nil
47
+ end
48
+
49
+ if part.to_i.to_s == part
50
+ # Int index => array:
51
+ result = result[part.to_i]
52
+ else
53
+ # Hash:
54
+ result = result[part]
55
+ end
56
+ end
57
+
58
+ result
59
+ end
60
+
61
+ end
62
+
63
+ class Utils
64
+
65
+ @@gsm7_set = {
66
+ '@' => 0x00, 'Δ' => 0x10, ' ' => 0x20, '0' => 0x30, '¡' => 0x40, 'P' => 0x50, '¿' => 0x60, 'p' => 0x70,
67
+ '£' => 0x01, '_' => 0x11, '!' => 0x21, '1' => 0x31, 'A' => 0x41, 'Q' => 0x51, 'a' => 0x61, 'q' => 0x71,
68
+ '$' => 0x02, 'Φ' => 0x12, '"' => 0x22, '2' => 0x32, 'B' => 0x42, 'R' => 0x52, 'b' => 0x62, 'r' => 0x72,
69
+ '¥' => 0x03, 'Γ' => 0x13, '#' => 0x23, '3' => 0x33, 'C' => 0x43, 'S' => 0x53, 'c' => 0x63, 's' => 0x73,
70
+ 'è' => 0x04, 'Λ' => 0x14, '¤' => 0x24, '4' => 0x34, 'D' => 0x44, 'T' => 0x54, 'd' => 0x64, 't' => 0x74,
71
+ 'é' => 0x05, 'Ω' => 0x15, '%' => 0x25, '5' => 0x35, 'E' => 0x45, 'U' => 0x55, 'e' => 0x65, 'u' => 0x75,
72
+ 'ù' => 0x06, 'Π' => 0x16, '&' => 0x26, '6' => 0x36, 'F' => 0x46, 'V' => 0x56, 'f' => 0x66, 'v' => 0x76,
73
+ 'ì' => 0x07, 'Ψ' => 0x17, '\'' => 0x27, '7' => 0x37, 'G' => 0x47, 'W' => 0x57, 'g' => 0x67, 'w' => 0x77,
74
+ 'ò' => 0x08, 'Σ' => 0x18, '(' => 0x28, '8' => 0x38, 'H' => 0x48, 'X' => 0x58, 'h' => 0x68, 'x' => 0x78,
75
+ 'Ç' => 0x09, 'Θ' => 0x19, ')' => 0x29, '9' => 0x39, 'I' => 0x49, 'Y' => 0x59, 'i' => 0x69, 'y' => 0x79,
76
+ '\n' => 0x0a, 'Ξ' => 0x1a, '*' => 0x2a, ':' => 0x3a, 'J' => 0x4a, 'Z' => 0x5a, 'j' => 0x6a, 'z' => 0x7a,
77
+ 'Ø' => 0x0b, '\a' => 0x1b, '+' => 0x2b, ';' => 0x3b, 'K' => 0x4b, 'Ä' => 0x5b, 'k' => 0x6b, 'ä' => 0x7b,
78
+ 'ø' => 0x0c, 'Æ' => 0x1c, ',' => 0x2c, '<' => 0x3c, 'L' => 0x4c, 'Ö' => 0x5c, 'l' => 0x6c, 'ö' => 0x7c,
79
+ '\r' => 0x0d, 'æ' => 0x1d, '-' => 0x2d, '=' => 0x3d, 'M' => 0x4d, 'Ñ' => 0x5d, 'm' => 0x6d, 'ñ' => 0x7d,
80
+ 'Å' => 0x0e, 'ß' => 0x1e, '.' => 0x2e, '>' => 0x3e, 'N' => 0x4e, 'Ü' => 0x5e, 'n' => 0x6e, 'ü' => 0x7e,
81
+ 'å' => 0x0f, 'É' => 0x1f, '/' => 0x2f, '?' => 0x3f, 'O' => 0x4f, '§' => 0x5f, 'o' => 0x6f, 'à' => 0x7f
82
+ }
83
+ def self.empty(obj)
84
+ if obj == nil
85
+ return true
86
+ end
87
+
88
+ if obj.instance_of? Hash or obj.instance_of? Array or obj.instance_of? String
89
+ return obj.size == 0
90
+ end
91
+
92
+ return obj == 0
93
+ end
94
+
95
+ def self.get_random_string(length, chars)
96
+ if not length
97
+ raise "Invalid random string length: #{length}"
98
+ end
99
+ if not chars
100
+ raise "Invalid random chars: #{chars}"
101
+ end
102
+
103
+ result = ''
104
+
105
+ length.times do
106
+ result += chars[rand(chars.length - 1), 1]
107
+ end
108
+
109
+ result
110
+ end
111
+
112
+ def self.get_random_alphanumeric_string(length=10)
113
+ get_random_string(length, 'qwertzuiopasdfghjklyxcvbnm123456789')
114
+ end
115
+
116
+ def self.in_gsm7_set?(c)
117
+ @@gsm7_set.has_key?(c)
118
+ end
119
+
120
+ end
121
+
122
+
123
+ end
@@ -0,0 +1,5 @@
1
+ # vim: set sw=4 ts=4 et :
2
+
3
+ module InfobipApi
4
+ VERSION = "0.5.0"
5
+ end
data/test/test.rb ADDED
@@ -0,0 +1,447 @@
1
+ # vim: set sw=4 ts=4 et :
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'minitest/autorun'
6
+ require 'infobipapi/client'
7
+
8
+ API_USERNAME = ENV["API_USERNAME"]
9
+ API_PASSWORD = ENV["API_PASSWORD"]
10
+
11
+ if (API_USERNAME.nil? || API_USERNAME == '') || (API_PASSWORD.nil? || API_PASSWORD == '') then
12
+ raise "set environement variable API_USERNAME and API_PASSWORD with an Infobip valid account (see https://dev.infobip.com/docs/getting-started)"
13
+ end
14
+
15
+
16
+ NUMBERS = File::readlines(File.expand_path('../../test-numbers.txt', __FILE__)).map { |a| a.strip }
17
+
18
+ puts ""
19
+ puts "Testing API with #{API_USERNAME} / #{API_PASSWORD} credentials"
20
+ puts ""
21
+ puts "List of numbers used:"
22
+ NUMBERS.each { |num|
23
+ puts " - #{num}"
24
+ }
25
+ puts ""
26
+ puts "-------"
27
+ puts ""
28
+
29
+ class InfobipApiTest < MiniTest::Unit::TestCase
30
+
31
+ def self.test_order
32
+ return :alpha
33
+ end
34
+
35
+ def test_a_empty
36
+ assert_equal InfobipApi::Utils.empty(0), true
37
+ assert_equal InfobipApi::Utils.empty(1), false
38
+ assert_equal InfobipApi::Utils.empty('aaa'), false
39
+ assert_equal InfobipApi::Utils.empty(0.0), true
40
+ assert_equal InfobipApi::Utils.empty([]), true
41
+ assert_equal InfobipApi::Utils.empty([1]), false
42
+ assert_equal InfobipApi::Utils.empty({}), true
43
+ assert_equal InfobipApi::Utils.empty({'a' => 1}), false
44
+ assert_equal InfobipApi::Utils.empty(''), true
45
+ end
46
+
47
+ def test_a_json_get
48
+ json = '{"requestError":{"serviceException":{"text":"Request URI missing required component(s): ","messageId":"SVC0002","variables":[""]},"policyException":null}}'
49
+ request_error = InfobipApi::JSONUtils.get(json, 'requestError.serviceException.text')
50
+ assert_equal('Request URI missing required component(s): ', request_error)
51
+ end
52
+
53
+ def test_a_json_get_hash_result
54
+ json = '{"requestError":{"serviceException":{"text":"Request URI missing required component(s): ","messageId":"SVC0002","variables":[""]},"policyException":null}}'
55
+ value = InfobipApi::JSONUtils.get(json, 'requestError.serviceException')
56
+ puts value.inspect
57
+ assert_equal(value, {"messageId"=>"SVC0002", "variables"=>[""], "text"=>"Request URI missing required component(s): "})
58
+ end
59
+
60
+ def test_a_json_get_array_in_path
61
+ json = '{"requestError":{"serviceException":{"text":"Request URI missing required component(s): ","messageId":"SVC0002","variables":["abc", "cde"]},"policyException":null}}'
62
+ value = InfobipApi::JSONUtils.get(json, 'requestError.serviceException.variables.1')
63
+ assert_equal(value, "cde")
64
+ end
65
+
66
+ def test_a_json_get_with_or_paths
67
+ json = '{"requestError":{"serviceException":{"text":"Request URI missing required component(s): ","messageId":"SVC0002","variables":["abc", "cde"]},"policyException":null}}'
68
+ value = InfobipApi::JSONUtils.get(json, 'requestError.serviceException.messageId | requestError.policyException.messageId')
69
+ assert_equal(value, "SVC0002")
70
+
71
+ json = '{"requestError":{"policyException":{"text":"Request URI missing required component(s): ","messageId":"SVC0002","variables":["abc", "cde"]},"serviceException":null}}'
72
+ value = InfobipApi::JSONUtils.get(json, 'requestError.serviceException.messageId | requestError.policyException.messageId')
73
+ assert_equal(value, "SVC0002")
74
+ end
75
+
76
+ def test_a_exception_serialization
77
+ json = '{"requestError":{"serviceException":{"text":"Request URI missing required component(s): ","messageId":"SVC0002","variables":[""]},"policyException":null}}'
78
+
79
+ sms_exception = InfobipApi::Conversions.from_json(InfobipApi::InfobipApiError, json, nil)
80
+
81
+ assert(sms_exception)
82
+ assert_equal(sms_exception.message_id, 'SVC0002')
83
+ assert_equal(sms_exception.text, 'Request URI missing required component(s): ')
84
+ end
85
+
86
+ def test_a_exception_object_array
87
+ json = '{"deliveryInfoList":{"deliveryInfo":[{"address":null,"deliveryStatus":"DeliveryUncertain1"},{"address":null,"deliveryStatus":"DeliveryUncertain2"}],"resourceURL":"http://api.infobip.com/sms/1/smsmessaging/outbound/TODO/requests/28drx7ypaqr/deliveryInfos"}}'
88
+
89
+ object = InfobipApi::Conversions.from_json(InfobipApi::DeliveryInfoList, json, nil)
90
+
91
+ assert(object)
92
+ assert(object.delivery_info)
93
+ assert_equal(2, object.delivery_info.length)
94
+ assert_equal("DeliveryUncertain1", object.delivery_info[0].delivery_status)
95
+ assert_equal("DeliveryUncertain2", object.delivery_info[1].delivery_status)
96
+ end
97
+
98
+ def test_a_login
99
+ @@sms_connector = InfobipApi::SmsClient.new(API_USERNAME, API_PASSWORD)
100
+ refute_instance_of(InfobipApi::InfobipApiError, @@sms_connector)
101
+ end
102
+
103
+ def test_a_sms_usage_single_gsm7
104
+ test_sms = [
105
+ "Hello",
106
+ "Hello, are you ok ?",
107
+ "Bonjour, es-tu assoiffé ?"
108
+ ].each { |message|
109
+ usage = @@sms_connector.compute_sms_usage(message)
110
+ assert_equal(:gsm7, usage[:format], "Failed to compute the right format on message '#{message}'")
111
+ assert_equal(message.length, usage[:length], "Failed length on message '#{message}'")
112
+ assert_equal(160, usage[:length_by_sms], "Failed length by SMS on message '#{message}'")
113
+ assert_equal(1, usage[:number_of_sms], "Failed number of SMS on message '#{message}'")
114
+ }
115
+ end
116
+
117
+ def test_a_sms_usage_multi_gsm7
118
+ test_sms = [
119
+ "Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello ",
120
+ "Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? ",
121
+ "Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ?"
122
+ ].each { |message|
123
+ usage = @@sms_connector.compute_sms_usage(message)
124
+ assert_equal(:gsm7, usage[:format], "Failed to compute the right format on message '#{message}'")
125
+ assert_equal(message.length, usage[:length], "Failed length on message '#{message}'")
126
+ assert_equal(153, usage[:length_by_sms], "Failed length by SMS on message '#{message}'")
127
+ assert_equal(
128
+ (message.length.to_f / 153.0).ceil,
129
+ usage[:number_of_sms],
130
+ "Failed number of SMS on message #{message}")
131
+ }
132
+ end
133
+
134
+ def test_a_sms_usage_single_utf8
135
+ test_sms = [
136
+ "Hello č",
137
+ "Hello, are you ok ? č",
138
+ "Bonjour, es-tu assoiffé ? œŒ"
139
+ ].each { |message|
140
+ usage = @@sms_connector.compute_sms_usage(message)
141
+ assert_equal(:unicode, usage[:format], "Failed to compute the right format on message '#{message}'")
142
+ assert_equal(message.length, usage[:length], "Failed length on message '#{message}'")
143
+ assert_equal(70, usage[:length_by_sms], "Failed length by SMS on message '#{message}'")
144
+ assert_equal(1, usage[:number_of_sms], "Failed number of SMS on message '#{message}'")
145
+ }
146
+ end
147
+
148
+ def test_a_sms_usage_multi_utf8
149
+ test_sms = [
150
+ "Hellœ Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello ",
151
+ "Hellœ, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? ",
152
+ "Bœnjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ?"
153
+ ].each { |message|
154
+ usage = @@sms_connector.compute_sms_usage(message)
155
+ assert_equal(:unicode, usage[:format], "Failed to compute the right format on message '#{message}'")
156
+ assert_equal(message.length, usage[:length], "Failed length on message '#{message}'")
157
+ assert_equal(67, usage[:length_by_sms], "Failed length by SMS on message '#{message}'")
158
+ assert_equal(
159
+ (message.length.to_f / 67.0).ceil,
160
+ usage[:number_of_sms],
161
+ "Failed number of SMS on message #{message}")
162
+ }
163
+ end
164
+
165
+ # use prefix test_b for any function that needs to be run after test_a_login
166
+ def test_b_single_text_sms_00001
167
+ sms = InfobipApi::SimpleTextSMSRequest.new
168
+ sms.from = 'InfobipApiRuby'
169
+ sms.to = NUMBERS[0]
170
+ sms.text = "Unit Testing: #{__method__}"
171
+ response = @@sms_connector.single_text_sms(sms)
172
+ refute_instance_of(InfobipApi::InfobipApiError, response)
173
+ assert_equal(response.messages.length, 1)
174
+ end
175
+
176
+ def test_b_single_text_sms_0000n
177
+ sms = InfobipApi::SimpleTextSMSRequest.new
178
+ sms.from = 'InfobipApiRuby'
179
+ sms.to = NUMBERS
180
+ sms.text = "Unit Testing: #{__method__}"
181
+ response = @@sms_connector.single_text_sms(sms)
182
+ refute_instance_of(InfobipApi::InfobipApiError, response)
183
+ assert_equal(response.messages.length, NUMBERS.length)
184
+ end
185
+
186
+ # def test_b_single_text_sms_03000
187
+ # sms = InfobipApi::SimpleTextSMSRequest.new
188
+ # sms.from = 'InfobipApiRuby'
189
+ # sms.to = (NUMBERS[0].to_i..(NUMBERS[0].to_i + 2999)).to_a
190
+ # sms.text = "Unit Testing: #{__method__}"
191
+ # response = @@sms_connector.single_text_sms(sms)
192
+ # refute_instance_of(InfobipApi::InfobipApiError, response)
193
+ # assert_equal(response.messages.length, 3000)
194
+ # end
195
+
196
+
197
+ # def test_b_single_text_sms_10000
198
+ # sms = InfobipApi::SimpleTextSMSRequest.new
199
+ # sms.from = 'InfobipApiRuby'
200
+ # sms.to = (NUMBERS[0].to_i..(NUMBERS[0].to_i + 9999)).to_a
201
+ # sms.text = "Unit Testing: #{__method__}"
202
+ # response = @@sms_connector.single_text_sms(sms)
203
+ # refute_instance_of(InfobipApi::InfobipApiError, response)
204
+ # assert_equal(response.messages.length, 10000)
205
+ # end
206
+
207
+ def test_b_multiple_text_sms_00001
208
+ smss = []
209
+ NUMBERS.each { |num|
210
+ sms = InfobipApi::SimpleTextSMSRequest.new
211
+ sms.from = 'InfobipApiRuby'
212
+ sms.to = num
213
+ sms.text = "Unit Testing: #{__method__} for '#{num}'"
214
+ smss.push sms
215
+ }
216
+ response = @@sms_connector.multiple_text_sms(smss)
217
+ refute_instance_of(InfobipApi::InfobipApiError, response)
218
+ assert_equal(smss.length, response.messages.length)
219
+ end
220
+
221
+ def test_b_single_utf8_sms_00001
222
+ sms = InfobipApi::SimpleTextSMSRequest.new
223
+ sms.from = 'InfobipApiRuby'
224
+ sms.to = NUMBERS[0]
225
+ sms.text = "Unit Testing: #{__method__}"
226
+ response = @@sms_connector.single_utf8_sms(sms)
227
+ refute_instance_of(InfobipApi::InfobipApiError, response)
228
+ assert_equal(response.messages.length, 1)
229
+ end
230
+
231
+ def test_b_single_utf8_sms_0000n
232
+ sms = InfobipApi::SimpleTextSMSRequest.new
233
+ sms.from = 'InfobipApiRuby'
234
+ sms.to = NUMBERS
235
+ sms.text = "Unit Testing: #{__method__}"
236
+ response = @@sms_connector.single_utf8_sms(sms)
237
+ refute_instance_of(InfobipApi::InfobipApiError, response)
238
+ assert_equal(response.messages.length, NUMBERS.length)
239
+ end
240
+
241
+ def test_b_multiple_utf8_as_text_sms_00001
242
+ smss = []
243
+ NUMBERS.each { |num|
244
+ sms = InfobipApi::SimpleTextSMSRequest.new
245
+ sms.from = 'InfobipApiRuby'
246
+ sms.to = num
247
+ sms.text = "Unit Testing: #{__method__} for '#{num}'"
248
+ smss.push sms
249
+ }
250
+ answers = @@sms_connector.multiple_utf8_sms(smss)
251
+ assert_equal(2, answers.length)
252
+ answer_text = answers[0]
253
+ answer_bin = answers[1]
254
+ assert_nil(answer_bin)
255
+ refute_nil(answer_text)
256
+ refute_instance_of(InfobipApi::InfobipApiError, answer_text)
257
+ assert_equal(smss.length, answer_text.messages.length)
258
+ end
259
+
260
+ def test_b_multiple_utf8_as_binary_sms_00001
261
+ smss = []
262
+ NUMBERS.each { |num|
263
+ sms = InfobipApi::SimpleTextSMSRequest.new
264
+ sms.from = 'InfobipApiRuby'
265
+ sms.to = num
266
+ sms.text = "Unit Testing: #{__method__} fœr '#{num}'"
267
+ smss.push sms
268
+ }
269
+ answers = @@sms_connector.multiple_utf8_sms(smss)
270
+ assert_equal(2, answers.length)
271
+ answer_text = answers[0]
272
+ answer_bin = answers[1]
273
+ refute_nil(answer_bin)
274
+ assert_nil(answer_text)
275
+ refute_instance_of(InfobipApi::InfobipApiError, answer_bin)
276
+ binding.pry
277
+ assert_equal(smss.length, answer_bin.messages.length)
278
+ end
279
+
280
+ def test_b_multiple_utf8_as_mixte_sms_00001
281
+ smss = []
282
+ NUMBERS.each_with_index { |num, i| # we need at least 2 numbers for this test to pass
283
+ sms = InfobipApi::SimpleTextSMSRequest.new
284
+ sms.from = 'InfobipApiRuby'
285
+ sms.to = num
286
+ if i.modulo(2) == 0 then
287
+ sms.text = "Unit Testing: #{__method__} fœr '#{num}'"
288
+ else
289
+ sms.text = "Unit Testing: #{__method__} for '#{num}'"
290
+ end
291
+ smss.push sms
292
+ }
293
+ answers = @@sms_connector.multiple_utf8_sms(smss)
294
+ assert_equal(2, answers.length)
295
+ answer_text = answers[0]
296
+ answer_bin = answers[1]
297
+ refute_nil(answer_bin)
298
+ refute_nil(answer_text)
299
+ refute_instance_of(InfobipApi::InfobipApiError, answer_bin)
300
+ refute_instance_of(InfobipApi::InfobipApiError, answer_text)
301
+ assert_equal(smss.length, answer_bin.messages.length + answers_text.messages.length)
302
+ end
303
+
304
+ def test_b_gsm7_cmp_sms_usage_to_realone
305
+ sms = InfobipApi::SimpleTextSMSRequest.new
306
+ sms.from = 'InfobipApiRuby'
307
+ sms.to = NUMBERS[0]
308
+ sms.text = "Unit Testing: #{__method__}"
309
+ test_sms = [
310
+ "Hello",
311
+ "Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? ",
312
+ "Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ?"
313
+ ].each { |message|
314
+ usage = @@sms_connector.compute_sms_usage(message)
315
+ assert_equal(:gsm7, usage[:format], "Failed to compute the right format on message '#{message}'")
316
+ assert_equal(message.length, usage[:length], "Failed length on message '#{message}'")
317
+ if message.length > 160 then
318
+ assert_equal(153, usage[:length_by_sms], "Failed length by SMS on message '#{message}'")
319
+ assert_equal(
320
+ (message.length.to_f / 153.0).ceil,
321
+ usage[:number_of_sms],
322
+ "Failed number of SMS on message '#{message}'")
323
+ else
324
+ assert_equal(160, usage[:length_by_sms], "Failed length by SMS on message '#{message}'")
325
+ assert_equal(1, usage[:number_of_sms], "Failed number of SMS on message '#{message}'")
326
+ end
327
+ sms.text = message
328
+ response = @@sms_connector.single_text_sms(sms)
329
+ refute_instance_of(InfobipApi::InfobipApiError, response)
330
+ assert_equal(1, response.messages.length)
331
+ assert_equal(response.messages[0].sms_count, usage[:number_of_sms], "Failed to match computed usage and API measurement on message '#{message}'")
332
+ }
333
+ end
334
+
335
+ def test_b_utf8_cmp_sms_usage_to_realone
336
+ sms = InfobipApi::SimpleTextSMSRequest.new
337
+ sms.from = 'InfobipApiRuby'
338
+ sms.to = NUMBERS[0]
339
+ sms.text = "Unit Testing: #{__method__}"
340
+ test_sms = [
341
+ "Hellœ",
342
+ "Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? ",
343
+ "Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ? Bœnjour, es-tu assoiffé ?"
344
+ ].each { |message|
345
+ usage = @@sms_connector.compute_sms_usage(message)
346
+ assert_equal(:unicode, usage[:format], "Failed to compute the right format on message '#{message}'")
347
+ assert_equal(message.length, usage[:length], "Failed length on message '#{message}'")
348
+ if message.length > 70 then
349
+ assert_equal(67, usage[:length_by_sms], "Failed length by SMS on message '#{message}'")
350
+ assert_equal(
351
+ (message.length.to_f / 67.0).ceil,
352
+ usage[:number_of_sms],
353
+ "Failed number of SMS on message '#{message}'")
354
+ else
355
+ assert_equal(70, usage[:length_by_sms], "Failed length by SMS on message '#{message}'")
356
+ assert_equal(1, usage[:number_of_sms], "Failed number of SMS on message '#{message}'")
357
+ end
358
+ sms.text = message
359
+ response = @@sms_connector.single_utf8_sms(sms)
360
+ refute_instance_of(InfobipApi::InfobipApiError, response)
361
+ assert_equal(1, response.messages.length)
362
+ assert_equal(response.messages[0].sms_count, usage[:number_of_sms], "Failed to match computed usage and API measurement on message '#{message}'")
363
+ }
364
+ end
365
+
366
+ def test_b_utf8_as_gsm7_cmp_sms_usage_to_realone
367
+ sms = InfobipApi::SimpleTextSMSRequest.new
368
+ sms.from = 'InfobipApiRuby'
369
+ sms.to = NUMBERS[0]
370
+ sms.text = "Unit Testing: #{__method__}"
371
+ test_sms = [
372
+ "Hello",
373
+ "Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? Hello, are you ok ? ",
374
+ "Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ?"
375
+ ].each { |message|
376
+ usage = @@sms_connector.compute_sms_usage(message)
377
+ assert_equal(:gsm7, usage[:format], "Failed to compute the right format on message '#{message}'")
378
+ assert_equal(message.length, usage[:length], "Failed length on message '#{message}'")
379
+ if message.length > 160 then
380
+ assert_equal(153, usage[:length_by_sms], "Failed length by SMS on message '#{message}'")
381
+ assert_equal(
382
+ (message.length.to_f / 153.0).ceil,
383
+ usage[:number_of_sms],
384
+ "Failed number of SMS on message '#{message}'")
385
+ else
386
+ assert_equal(160, usage[:length_by_sms], "Failed length by SMS on message '#{message}'")
387
+ assert_equal(1, usage[:number_of_sms], "Failed number of SMS on message '#{message}'")
388
+ end
389
+ sms.text = message
390
+ answer = @@sms_connector.single_utf8_sms(sms)
391
+ refute_nil(answer)
392
+ refute_instance_of(InfobipApi::InfobipApiError, answer)
393
+ assert_equal(1, answer.messages.length)
394
+ assert_equal(answer.messages[0].sms_count,
395
+ usage[:number_of_sms],
396
+ "Failed to match computed usage and API measurement on message '#{message}'")
397
+ }
398
+ end
399
+
400
+ def test_b_utf8_as_binary_cmp_sms_usage_to_realone
401
+ sms = InfobipApi::SimpleTextSMSRequest.new
402
+ sms.from = 'InfobipApiRuby'
403
+ sms.to = NUMBERS[0]
404
+ sms.text = "Unit Testing: #{__method__}"
405
+ test_sms = [
406
+ "Hellœ",
407
+ "Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? Hellœ, are you ok ? ",
408
+ "Bœnjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ? Bonjour, es-tu assoiffé ?"
409
+ ].each { |message|
410
+ usage = @@sms_connector.compute_sms_usage(message)
411
+ assert_equal(:unicode, usage[:format], "Failed to compute the right format on message '#{message}'")
412
+ assert_equal(message.length, usage[:length], "Failed length on message '#{message}'")
413
+ if message.length > 70 then
414
+ assert_equal(67, usage[:length_by_sms], "Failed length by SMS on message '#{message}'")
415
+ assert_equal(
416
+ (message.length.to_f / 67.0).ceil,
417
+ usage[:number_of_sms],
418
+ "Failed number of SMS on message '#{message}'")
419
+ else
420
+ assert_equal(70, usage[:length_by_sms], "Failed length by SMS on message '#{message}'")
421
+ assert_equal(1, usage[:number_of_sms], "Failed number of SMS on message '#{message}'")
422
+ end
423
+ sms.text = message
424
+ answer = @@sms_connector.single_utf8_sms(sms)
425
+ refute_nil(answer)
426
+ refute_instance_of(InfobipApi::InfobipApiError, answer)
427
+ assert_equal(1, answer.messages.length)
428
+ assert_equal(answer.messages[0].sms_count,
429
+ usage[:number_of_sms],
430
+ "Failed to match computed usage and API measurement on message '#{message}'")
431
+ }
432
+ end
433
+
434
+ def test_b_get_delivery_reports
435
+ sms = InfobipApi::SimpleTextSMSRequest.new
436
+ sms.from = 'InfobipApiRuby'
437
+ sms.to = NUMBERS
438
+ sms.text = "Unit Testing: #{__method__}"
439
+ response = @@sms_connector.single_utf8_sms(sms)
440
+ refute_instance_of(InfobipApi::InfobipApiError, response)
441
+ assert_instance_of(InfobipApi::SimpleSMSAnswer, response)
442
+ dr = @@sms_connector.delivery_reports({:bulkId => response.bulk_id})
443
+ refute_instance_of(InfobipApi::InfobipApiError, dr)
444
+ assert_instance_of(InfobipApi::DeliveryReportList, dr)
445
+ end
446
+
447
+ end