exetel_sms 1.03 → 1.04

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.
data/CHANGELOG CHANGED
@@ -1,3 +1,5 @@
1
+ v1.04. Test API without making HTTP calls. Unit tests.
2
+
1
3
  v1.03. Support message retrieval (check sent status). Update hostname.
2
4
 
3
5
  v1.02. Fixed requirements for gem
data/Manifest CHANGED
@@ -6,9 +6,11 @@ Rakefile
6
6
  lib/class_methods.rb
7
7
  lib/client.rb
8
8
  lib/config.rb
9
+ lib/credit_check.rb
9
10
  lib/deleter.rb
10
11
  lib/exetel_sms.rb
11
12
  lib/receiver.rb
12
13
  lib/retriever.rb
13
14
  lib/sender.rb
15
+ test/test_all.rb
14
16
  Manifest
data/README CHANGED
@@ -38,6 +38,31 @@ Receiving messages from a Virtual Mobile Number
38
38
  if result = receiver.receive('my virtual mobile number')
39
39
  puts "Received from #{result[:from_mobile_number]}: #{result[:message]}"
40
40
  end
41
+
42
+ Then you can delete the messages with ExetelSms::Deleter
43
+
44
+
45
+
46
+ Credit Check - also useful as a ping before sending
47
+ ---------------------------------------------------
48
+
49
+ checker = ExetelSms::CreditCheck.new(config)
50
+ if result = checker.get_credit_limit
51
+ puts "Credit limit is #{result[:limit}}"
52
+ end
53
+
54
+
55
+
56
+ Test API - test responses without making actual HTTP calls
57
+ ----------------------------------------------------------
58
+
59
+ good = ExetelSms::Client.with_test_api { retriever.check_sent('1') }
60
+ good[:message_status] # => 'Delivered'
61
+
62
+ bad = ExetelSms::Client.with_test_api(:fail) { retriever.check_sent('1') }
63
+ bad[:message_status] # => 'Failed'
64
+
65
+ See test/ for more examples
41
66
 
42
67
 
43
68
  Contact the author
@@ -45,4 +70,5 @@ Contact the author
45
70
 
46
71
  Andrew Snow <andrew@modulus.org>
47
72
  Andys^ on irc.freenode.net
73
+ @andy_snow on Twitter
48
74
 
data/README.textile CHANGED
@@ -37,12 +37,34 @@ bc. receiver = ExetelSms::Receiver.new(config)
37
37
  if result = receiver.receive('my virtual mobile number')
38
38
  puts "Received from #{result[:from_mobile_number]}: #{result[:message]}"
39
39
  end
40
-
41
40
 
41
+ Then you can delete the messages with ExetelSms::Deleter
42
+
43
+ h3. Credit Check: also useful as a ping before sending
44
+
45
+ bc. checker = ExetelSms::CreditCheck.new(config)
46
+ if result = checker.get_credit_limit
47
+ puts "Credit limit is #{result[:limit}}"
48
+ end
49
+
50
+
51
+ h3. Test API: test responses without making actual HTTP calls
52
+
53
+ bc. good = ExetelSms::Client.with_test_api { retriever.check_sent('1') }
54
+ good[:message_status] # => 'Delivered'
55
+
56
+ bc. bad = ExetelSms::Client.with_test_api(:fail) { retriever.check_sent('1') }
57
+ bad[:message_status] # => 'Failed'
58
+
59
+
60
+ See test/ for more examples
42
61
 
43
62
 
44
63
  h3. Contact the author
45
64
 
46
65
  Andrew Snow <andrew@modulus.org>
47
66
  Andys^ on irc.freenode.net
67
+ @andy_snow on Twitter
68
+
69
+
48
70
 
data/exetel_sms.gemspec CHANGED
@@ -2,24 +2,24 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{exetel_sms}
5
- s.version = "1.03"
5
+ s.version = "1.04"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Andrew Snow"]
9
- s.date = %q{2011-01-28}
9
+ s.date = %q{2011-03-30}
10
10
  s.description = %q{Ruby gem to send and receive SMS via Exetel's API}
11
11
  s.email = %q{andrew@modulus.org}
12
- s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README", "README.textile", "lib/class_methods.rb", "lib/client.rb", "lib/config.rb", "lib/deleter.rb", "lib/exetel_sms.rb", "lib/receiver.rb", "lib/retriever.rb", "lib/sender.rb"]
13
- s.files = ["CHANGELOG", "LICENSE", "README", "README.textile", "Rakefile", "lib/class_methods.rb", "lib/client.rb", "lib/config.rb", "lib/deleter.rb", "lib/exetel_sms.rb", "lib/receiver.rb", "lib/retriever.rb", "lib/sender.rb", "Manifest", "exetel_sms.gemspec"]
12
+ s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README", "README.textile", "lib/class_methods.rb", "lib/client.rb", "lib/config.rb", "lib/credit_check.rb", "lib/deleter.rb", "lib/exetel_sms.rb", "lib/receiver.rb", "lib/retriever.rb", "lib/sender.rb"]
13
+ s.files = ["CHANGELOG", "LICENSE", "README", "README.textile", "Rakefile", "lib/class_methods.rb", "lib/client.rb", "lib/config.rb", "lib/credit_check.rb", "lib/deleter.rb", "lib/exetel_sms.rb", "lib/receiver.rb", "lib/retriever.rb", "lib/sender.rb", "test/test_all.rb", "Manifest", "exetel_sms.gemspec"]
14
14
  s.homepage = %q{}
15
15
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Exetel_sms", "--main", "README"]
16
16
  s.require_paths = ["lib"]
17
17
  s.rubyforge_project = %q{exetel_sms}
18
- s.rubygems_version = %q{1.3.7}
18
+ s.rubygems_version = %q{1.6.2}
19
19
  s.summary = %q{Ruby gem to send and receive SMS via Exetel's API}
20
+ s.test_files = ["test/test_all.rb"]
20
21
 
21
22
  if s.respond_to? :specification_version then
22
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
23
23
  s.specification_version = 3
24
24
 
25
25
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
data/lib/class_methods.rb CHANGED
@@ -2,7 +2,17 @@
2
2
  require 'uri'
3
3
 
4
4
  module ExetelSms
5
+ module ResultHashMethods
6
+ def success?
7
+ self[:status] == '1'
8
+ end
9
+ end
10
+
5
11
  module ClassMethods
12
+ def exetel_url
13
+ "https://smsgw.exetel.com.au/sendsms/#{api_path}?"
14
+ end
15
+
6
16
  def new_reference_number(ident='')
7
17
  @@counter ||= 0
8
18
  @@counter += 1
@@ -20,17 +30,13 @@ module ExetelSms
20
30
  URI.encode(URI.encode(str), /=|&|\?/)
21
31
  end
22
32
 
33
+
23
34
  def response_to_hash(fields)
24
35
  raise "Missing fields in response body? Expected #{response_fields.map(&:to_s).join(',')}, got #{fields.inspect}" unless fields.length >= response_fields.length
25
36
  ret = {}
26
37
  response_fields.each {|field| ret[field] = fields.shift }
27
38
  ret[:other] = fields
28
- class << ret
29
- def success?
30
- self[:status] == '1'
31
- end
32
- end
33
- ret
39
+ ret.extend ResultHashMethods
34
40
  end
35
41
 
36
42
  end
data/lib/client.rb CHANGED
@@ -7,8 +7,40 @@ require 'uri'
7
7
  module ExetelSms
8
8
  class Client
9
9
  class << self
10
+ attr_accessor :test_api
11
+
12
+ def with_test_api(failmode=false)
13
+ old_test_api = @test_api
14
+ @test_api = failmode
15
+ retval = yield
16
+ @test_api = old_test_api
17
+ retval
18
+ end
19
+
20
+ def test_api?
21
+ !@test_api.nil?
22
+ end
23
+
24
+ def fake_response(url)
25
+ @counter = (@counter || 0) + 1
26
+ if url.match(/\/#{Sender.api_path}\?/)
27
+ test_api != false ? raise(Timeout::Error.new) : "1|0412345678|#{@counter}|#{@counter}|OK"
28
+ elsif url.match(/\/#{Receiver.api_path}\?/)
29
+ test_api != false ? '2||||No results returned|' : "1|#{@counter}|0412345678|2011-03-29 23:15:03|OK|Test message"
30
+ elsif url.match(/\/#{Retriever.api_path}\?/) && (referencenumber = url.match(/referencenumber=(.*)/))
31
+ test_api != false ? "1|#{@counter}|#{referencenumber}|0412987654|0412345678||Failed|0.05|OK" : "1|#{@counter}|#{referencenumber}|0412987654|0412345678|2011-03-29 23:15:03|Delivered|0.05|OK"
32
+ elsif url.match(/\/#{Deleter.api_path}\?/)
33
+ test_api != false ? '2|No results returned' : "1|OK"
34
+ elsif url.match(/\/#{CreditCheck.api_path}\?/)
35
+ test_api != false ? '1|0|OK' : '1|100|OK'
36
+ else
37
+ raise "ExetelSMS test API: Unknown URL"
38
+ end.split('|',-1).map {|str| str.strip }
39
+ end
10
40
 
11
41
  def request(url)
42
+ return fake_response(url) if test_api?
43
+
12
44
  uri = URI.parse(url)
13
45
  h = Net::HTTP.new(uri.host, uri.port)
14
46
  h.use_ssl = true
@@ -19,7 +51,7 @@ module ExetelSms
19
51
  response = http.request_get(uri.request_uri)
20
52
  body = response.body
21
53
  end
22
- raise "No body" unless body && body =~ /|/
54
+ raise "ExetelSms::Client: No valid body found: #{body.inspect}" unless body && body =~ /|/
23
55
  body.chomp.gsub(/<br>$/i, '').split('|',-1).map {|str| str.strip }
24
56
  end
25
57
  end
data/lib/config.rb CHANGED
@@ -9,5 +9,6 @@ module ExetelSms
9
9
  @password = password
10
10
  @mvn = mvn
11
11
  end
12
+
12
13
  end
13
14
  end
@@ -0,0 +1,35 @@
1
+
2
+ module ExetelSms
3
+
4
+ class CreditCheck
5
+ extend ExetelSms::ClassMethods
6
+
7
+ attr_reader :config
8
+ def initialize(config)
9
+ @config = config
10
+ end
11
+
12
+ def get_credit_limit
13
+ url = self.class.build_url(
14
+ :username => @config.username,
15
+ :password => @config.password
16
+ )
17
+
18
+ self.class.response_to_hash(ExetelSms::Client.request(url))
19
+ end
20
+
21
+ class << self
22
+ def response_fields
23
+ [:status, :limit, :notes]
24
+ end
25
+
26
+ def request_fields
27
+ [:username, :password]
28
+ end
29
+
30
+ def api_path
31
+ 'api_sms_credit.php'
32
+ end
33
+ end
34
+ end
35
+ end
data/lib/deleter.rb CHANGED
@@ -17,11 +17,10 @@ module ExetelSms
17
17
  :messageid => message_id
18
18
  )
19
19
 
20
- response_to_hash(ExetelSms::Client.request(url))
20
+ self.class.response_to_hash(ExetelSms::Client.request(url))
21
21
  end
22
22
 
23
23
  class << self
24
-
25
24
  def response_fields
26
25
  [:status, :notes]
27
26
  end
@@ -30,10 +29,9 @@ module ExetelSms
30
29
  [:username, :password, :mobilenumber, :messageid]
31
30
  end
32
31
 
33
- def exetel_url
34
- 'https://smsgw.exetel.com.au/sendsms/api_sms_mvn_delete.php?'
32
+ def api_path
33
+ 'api_sms_mvn_delete.php'
35
34
  end
36
-
37
35
  end
38
36
  end
39
37
  end
data/lib/exetel_sms.rb CHANGED
@@ -1,5 +1,5 @@
1
1
 
2
- ['client', 'class_methods', 'sender', 'config', 'receiver', 'deleter', 'retriever'].each do |x|
2
+ ['class_methods', 'client', 'sender', 'config', 'receiver', 'deleter', 'retriever', 'credit_check'].each do |x|
3
3
  require("#{File.dirname(__FILE__)}/" + x)
4
4
  end
5
5
 
data/lib/receiver.rb CHANGED
@@ -29,8 +29,8 @@ module ExetelSms
29
29
  [:username, :password, :mobilenumber]
30
30
  end
31
31
 
32
- def exetel_url
33
- 'https://smsgw.exetel.com.au/sendsms/api_sms_mvn_inbox.php?'
32
+ def api_path
33
+ 'api_sms_mvn_inbox.php'
34
34
  end
35
35
 
36
36
  end
data/lib/retriever.rb CHANGED
@@ -8,7 +8,7 @@ module ExetelSms
8
8
  def initialize(config)
9
9
  @config = config
10
10
  end
11
-
11
+
12
12
  def check_sent(reference_number)
13
13
  url = self.class.build_url(
14
14
  :username => @config.username,
@@ -29,8 +29,8 @@ module ExetelSms
29
29
  [:username, :password, :referencenumber]
30
30
  end
31
31
 
32
- def exetel_url
33
- 'https://smsgw.exetel.com.au/sendsms/api_sms_detail.php?'
32
+ def api_path
33
+ 'api_sms_detail.php'
34
34
  end
35
35
 
36
36
  end
data/lib/sender.rb CHANGED
@@ -8,7 +8,7 @@ module ExetelSms
8
8
  def initialize(config)
9
9
  @config = config
10
10
  end
11
-
11
+
12
12
  def send(to_mobile_number, msg, from_mobile_number, reference_number)
13
13
  url = self.class.build_url(
14
14
  :username => @config.username,
@@ -33,9 +33,8 @@ module ExetelSms
33
33
  [:username, :password, :mobilenumber, :message, :sender, :messagetype, :referencenumber]
34
34
  end
35
35
 
36
- def exetel_url
37
- 'https://smsgw.exetel.com.au/sendsms/api_sms.php?'
38
- #username=xxxxxxxx&password=xxxxxxxx&mobilenumber=xxxxxxxx&message=xxxxxxxx&sender=xxxxxxxxx&messagetype=Text&referencenumber=xxxxxx'
36
+ def api_path
37
+ 'api_sms.php'
39
38
  end
40
39
 
41
40
  end
data/test/test_all.rb ADDED
@@ -0,0 +1,79 @@
1
+
2
+ require 'test/unit'
3
+ require "./#{File.dirname(__FILE__)}/../lib/exetel_sms.rb"
4
+
5
+ class TestExetelSms < Test::Unit::TestCase
6
+
7
+ def setup
8
+ config = ExetelSms::Config.new('username', 'password')
9
+ @sender = ExetelSms::Sender.new(config)
10
+ @retriever = ExetelSms::Retriever.new(config)
11
+ @receiver = ExetelSms::Receiver.new(config)
12
+ @deleter = ExetelSms::Deleter.new(config)
13
+ @credit_check = ExetelSms::CreditCheck.new(config)
14
+ end
15
+
16
+ def teardown
17
+ end
18
+
19
+ def test_credit_check_ok
20
+ result = ExetelSms::Client.with_test_api { @credit_check.get_credit_limit }
21
+ assert result.success?
22
+ assert result[:limit].to_f > 0
23
+ end
24
+
25
+ def test_credit_check_fail
26
+ result = ExetelSms::Client.with_test_api(:fail) { @credit_check.get_credit_limit }
27
+ assert result.success?
28
+ assert_equal 0, result[:limit].to_f
29
+ end
30
+
31
+ def test_sender_ok
32
+ result = ExetelSms::Client.with_test_api { @sender.send('0412345678', 'Hello?', '0412987654', '1') }
33
+ assert result.success?
34
+ end
35
+
36
+ def test_sender_exception
37
+ assert_raises(Timeout::Error) do
38
+ ExetelSms::Client.with_test_api(:fail) { @sender.send('0412345678', 'Hello?', '0412987654', '1') }
39
+ end
40
+ end
41
+
42
+ def test_receiver_ok
43
+ result = ExetelSms::Client.with_test_api { @receiver.receive('0412345678') }
44
+ assert result.success?
45
+ assert_not_equal '', result[:message]
46
+ end
47
+
48
+ def test_receiver_fail
49
+ result = ExetelSms::Client.with_test_api(:fail) { @receiver.receive('0412345678') }
50
+ assert !result.success?
51
+ assert_equal '', result[:message]
52
+ end
53
+
54
+ def test_retriever_ok
55
+ result = ExetelSms::Client.with_test_api { @retriever.check_sent('1') }
56
+ assert result.success?
57
+ assert_equal 'Delivered', result[:message_status]
58
+ end
59
+
60
+ def test_retriever_fail
61
+ result = ExetelSms::Client.with_test_api(:fail) { @retriever.check_sent('1') }
62
+ assert result.success?
63
+ assert_equal 'Failed', result[:message_status]
64
+ end
65
+
66
+ def test_deleter_ok
67
+ result = ExetelSms::Client.with_test_api { @deleter.delete('0412345678', '1') }
68
+ assert result.success?
69
+ end
70
+
71
+ def test_deleter_fail
72
+ result = ExetelSms::Client.with_test_api(:fail) { @deleter.delete('0412345678', '1') }
73
+ assert !result.success?
74
+ end
75
+
76
+
77
+ end
78
+
79
+
metadata CHANGED
@@ -1,11 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exetel_sms
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 1
7
- - 3
8
- version: "1.03"
4
+ prerelease:
5
+ version: "1.04"
9
6
  platform: ruby
10
7
  authors:
11
8
  - Andrew Snow
@@ -13,7 +10,7 @@ autorequire:
13
10
  bindir: bin
14
11
  cert_chain: []
15
12
 
16
- date: 2011-01-28 00:00:00 +11:00
13
+ date: 2011-03-30 00:00:00 +11:00
17
14
  default_executable:
18
15
  dependencies: []
19
16
 
@@ -31,6 +28,7 @@ extra_rdoc_files:
31
28
  - lib/class_methods.rb
32
29
  - lib/client.rb
33
30
  - lib/config.rb
31
+ - lib/credit_check.rb
34
32
  - lib/deleter.rb
35
33
  - lib/exetel_sms.rb
36
34
  - lib/receiver.rb
@@ -45,11 +43,13 @@ files:
45
43
  - lib/class_methods.rb
46
44
  - lib/client.rb
47
45
  - lib/config.rb
46
+ - lib/credit_check.rb
48
47
  - lib/deleter.rb
49
48
  - lib/exetel_sms.rb
50
49
  - lib/receiver.rb
51
50
  - lib/retriever.rb
52
51
  - lib/sender.rb
52
+ - test/test_all.rb
53
53
  - Manifest
54
54
  - exetel_sms.gemspec
55
55
  has_rdoc: true
@@ -71,24 +71,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
- segments:
75
- - 0
76
74
  version: "0"
77
75
  required_rubygems_version: !ruby/object:Gem::Requirement
78
76
  none: false
79
77
  requirements:
80
78
  - - ">="
81
79
  - !ruby/object:Gem::Version
82
- segments:
83
- - 1
84
- - 2
85
80
  version: "1.2"
86
81
  requirements: []
87
82
 
88
83
  rubyforge_project: exetel_sms
89
- rubygems_version: 1.3.7
84
+ rubygems_version: 1.6.2
90
85
  signing_key:
91
86
  specification_version: 3
92
87
  summary: Ruby gem to send and receive SMS via Exetel's API
93
- test_files: []
94
-
88
+ test_files:
89
+ - test/test_all.rb