infobipapi 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +24 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +202 -0
- data/README.md +103 -0
- data/infobipapi.gemspec +27 -0
- data/lib/infobipapi.rb +10 -0
- data/lib/infobipapi/client.rb +394 -0
- data/lib/infobipapi/models.rb +277 -0
- data/lib/infobipapi/objects.rb +198 -0
- data/lib/infobipapi/utils.rb +123 -0
- data/lib/infobipapi/version.rb +5 -0
- data/test/test.rb +447 -0
- metadata +128 -0
@@ -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
|
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
|