voicecom_sms 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NGI3MzZjYmU5YTMxZTMwYTNjNTJmM2VlMTE3ODgxYzg3YzczZTc3Nw==
5
+ data.tar.gz: !binary |-
6
+ MDQxYmY1NjEwMmYyYzE2OWViMzMyYWJiOGM1NTk4NjM2OWE5NDc0Yw==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ OGZkOGE4OTc3Yjk5MDNmMWVmYWQ3MjAyNGJkMDc0MWQzM2JhOWM3OTY1MWNh
10
+ YjFlMTMzNzAwZDIxNjYyZmNjMGRjMmVjYTFlZWYyODcyNDI2YmNiNjRiOThm
11
+ OTNhMzYxNDg3MWZiYTUxYmRiYzFjOGU1MTA1ZDlhZmExODE0NDU=
12
+ data.tar.gz: !binary |-
13
+ NWJmNTRhYmFiNTE4M2M5MDg4MmZjNmVlYWU0YzY3YWJjYzhjOWUxYWFkMjdh
14
+ NWY1ZTBlMWYyOTJiZGE0NWUxMGQxMmM2MjkxN2JkMjYxZTIzZmNmODY3ZTM0
15
+ MjY1NmQ1Y2M1ZmE4NTc3ODY0YjhmZTFiZDg1YmI4NDQ3NDkwZTA=
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,21 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
6
+ # Add dependencies to develop your gem here.
7
+ # Include everything needed to run rake, tests, features, etc.
8
+ group :development, :test do
9
+ gem "rspec", "~> 2.8.0"
10
+ gem "rdoc", "~> 3.12"
11
+ gem "bundler", "~> 1.3.0"
12
+ gem "jeweler", "~> 1.8.4"
13
+ gem "sqlite3", "~> 1.3.6"
14
+ gem 'awesome_print'
15
+ gem "database_cleaner", "~> 0.9.1"
16
+ gem 'webmock'
17
+ end
18
+
19
+ gem "activerecord", '~> 3.2.0'
20
+ gem "hashie", "~> 1.2.0"
21
+ gem "faraday"
data/Gemfile.lock ADDED
@@ -0,0 +1,68 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ activemodel (3.2.12)
5
+ activesupport (= 3.2.12)
6
+ builder (~> 3.0.0)
7
+ activerecord (3.2.12)
8
+ activemodel (= 3.2.12)
9
+ activesupport (= 3.2.12)
10
+ arel (~> 3.0.2)
11
+ tzinfo (~> 0.3.29)
12
+ activesupport (3.2.12)
13
+ i18n (~> 0.6)
14
+ multi_json (~> 1.0)
15
+ addressable (2.3.4)
16
+ arel (3.0.2)
17
+ awesome_print (1.1.0)
18
+ builder (3.0.4)
19
+ crack (0.4.0)
20
+ safe_yaml (~> 0.9.0)
21
+ database_cleaner (0.9.1)
22
+ diff-lcs (1.1.3)
23
+ faraday (0.8.4)
24
+ multipart-post (~> 1.1)
25
+ git (1.2.5)
26
+ hashie (1.2.0)
27
+ i18n (0.6.1)
28
+ jeweler (1.8.4)
29
+ bundler (~> 1.0)
30
+ git (>= 1.2.5)
31
+ rake
32
+ rdoc
33
+ json (1.7.7)
34
+ multi_json (1.6.1)
35
+ multipart-post (1.1.5)
36
+ rake (10.0.4)
37
+ rdoc (3.12.2)
38
+ json (~> 1.4)
39
+ rspec (2.8.0)
40
+ rspec-core (~> 2.8.0)
41
+ rspec-expectations (~> 2.8.0)
42
+ rspec-mocks (~> 2.8.0)
43
+ rspec-core (2.8.0)
44
+ rspec-expectations (2.8.0)
45
+ diff-lcs (~> 1.1.2)
46
+ rspec-mocks (2.8.0)
47
+ safe_yaml (0.9.3)
48
+ sqlite3 (1.3.6)
49
+ tzinfo (0.3.35)
50
+ webmock (1.11.0)
51
+ addressable (>= 2.2.7)
52
+ crack (>= 0.3.2)
53
+
54
+ PLATFORMS
55
+ ruby
56
+
57
+ DEPENDENCIES
58
+ activerecord (~> 3.2.0)
59
+ awesome_print
60
+ bundler (~> 1.3.0)
61
+ database_cleaner (~> 0.9.1)
62
+ faraday
63
+ hashie (~> 1.2.0)
64
+ jeweler (~> 1.8.4)
65
+ rdoc (~> 3.12)
66
+ rspec (~> 2.8.0)
67
+ sqlite3 (~> 1.3.6)
68
+ webmock
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 Empower United
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,71 @@
1
+ # voicecom_sms
2
+
3
+ [![Build Status](https://travis-ci.org/empowerunited/voicecom_sms.png)](https://travis-ci.org/zzeni/voicecom_sms)
4
+
5
+ This ia a simple interface to the VoiceCom SMS API, designed for rails applications.
6
+
7
+ ## Installation & Usage
8
+
9
+ To include to your rails app, simply add it to gemfile:
10
+
11
+ gem 'voicecom_sms'
12
+
13
+ Then run
14
+
15
+ rails generate voicecom_sms
16
+
17
+ that should create one migration file and an initializer for the gem.
18
+
19
+ Next run
20
+
21
+ rake db:migrate
22
+
23
+ and that will create the voicecom_messages table in your database.
24
+
25
+ Finally open and edit the initializer
26
+
27
+ voicecom_sms.rb
28
+
29
+ by filling your credentials for the VioceCom API
30
+
31
+ ### Rails example
32
+
33
+ rails c
34
+
35
+ @provider = VoicecomSms::Provider.new
36
+ @provider.send_sms('0888889204', "Vashiyat kod e: 1234")
37
+
38
+
39
+ ### irb example
40
+ irb
41
+ require 'voicecom_sms'
42
+ puts "make sure that you load the schema.rb"
43
+
44
+ configuration = VoicecomSms.configure do |config|
45
+ config.provider_ip = ENV['VOICECOM_IP']
46
+ config.provider_port = ENV['VOICECOM_PORT']
47
+ config.client_id = ENV['VOICECOM_CLIENT_ID']
48
+ config.send_req_path = ENV['VOICECOM_SEND_REQUEST_PATH']
49
+ puts "Provider settings https://#{config.provider_ip}:#{config.provider_port}#{config.send_req_path}?id=#{config.send_req_path}"
50
+ end
51
+
52
+ @provider = VoicecomSms::Provider.new
53
+ @provider.send_sms('0888889204', "Vashiyat kod e: 1234")
54
+
55
+
56
+ Enjoy :)
57
+
58
+ ## Contributing to voicecom_sms
59
+
60
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
61
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
62
+ * Fork the project.
63
+ * Start a feature/bugfix branch.
64
+ * Commit and push until you are happy with your contribution.
65
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
66
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
67
+
68
+ ## Copyright
69
+
70
+ Copyright (c) 2013 Empower United. See LICENSE.txt for further details.
71
+
data/Rakefile ADDED
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "voicecom_sms"
18
+ gem.homepage = "http://github.com/zzeni/voicecom_sms"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{Ruby interface to the VoiceCom SMS Gateway API}
21
+ gem.description = %Q{A fast SMS engine that uses VoiceCom as a service provider}
22
+ gem.email = "emanolova@gmail.com"
23
+ gem.authors = ["Evgenia Manolova"]
24
+ # dependencies defined in Gemfile
25
+ end
26
+ Jeweler::RubygemsDotOrgTasks.new
27
+
28
+ require 'rspec/core'
29
+ require 'rspec/core/rake_task'
30
+ RSpec::Core::RakeTask.new(:spec) do |spec|
31
+ spec.pattern = FileList['spec/**/*_spec.rb']
32
+ end
33
+
34
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
35
+ spec.pattern = 'spec/**/*_spec.rb'
36
+ spec.rcov = true
37
+ end
38
+
39
+ task :default => :spec
40
+
41
+ require 'rdoc/task'
42
+ Rake::RDocTask.new do |rdoc|
43
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
44
+
45
+ rdoc.rdoc_dir = 'rdoc'
46
+ rdoc.title = "voicecom_sms #{version}"
47
+ rdoc.rdoc_files.include('README*')
48
+ rdoc.rdoc_files.include('lib/**/*.rb')
49
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0
@@ -0,0 +1,21 @@
1
+ module VoicecomSms
2
+ configure do |config|
3
+ #The GET request should be in the following format:
4
+ #
5
+ #http://<<VoiceCom_IP1>>/<<PATH>>/<<script>>?sid=3&id=cd27526e4afd5c6c331ebdd23d4b3f03&msisdn=359885100407&text=test%20message&op=1&priority=2&validity=1440
6
+ #
7
+ #<VoiceCom_IP1> - IP address of VoiceCom PLC SMS gateway node
8
+ #/<<PATH>>/<<script>> - SCRIPT_URL of the script receiving the requests
9
+
10
+ # This is the VoiceCom_IP1 part from the request url
11
+ config.provider_ip = '0.0.0.0'
12
+
13
+ config.provider_port = '8443'
14
+
15
+ # This is the SCRIPT_URL part from the request url
16
+ config.send_req_path = '/smsapi/bsms/index.php'
17
+
18
+ # That's your unique identifier in the Voicecom system
19
+ config.client_id = nil
20
+ end
21
+ end
@@ -0,0 +1,30 @@
1
+ class CreateVoicecomMessages < ActiveRecord::Migration
2
+ def change
3
+ create_table :voicecom_messages do |t|
4
+ t.string :number, null: false
5
+ t.string :text, null: false
6
+ t.integer :operator
7
+ t.integer :validity
8
+ t.integer :priority
9
+ t.text :hlr
10
+ t.text :request
11
+ t.text :response
12
+ t.datetime :response_received_at
13
+ t.integer :status, default: 0 # 0 - pending, 1 - success, 2 - failed
14
+
15
+ #t.text :delivery_request
16
+ #t.text :delivery_response
17
+ #t.datetime :delivery_response_received_at
18
+ #t.integer :delivery_status, default: 0 # 0 - pending, 1 - success, 2 - failed
19
+
20
+ t.boolean :delivered, default: false
21
+
22
+ t.timestamps
23
+ end
24
+
25
+ add_index :voicecom_messages, :number
26
+ add_index :voicecom_messages, :operator
27
+ add_index :voicecom_messages, :status
28
+ add_index :voicecom_messages, :delivered
29
+ end
30
+ end
@@ -0,0 +1,19 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/active_record'
3
+
4
+ class VoicecomSmsGenerator < Rails::Generators::Base
5
+ include Rails::Generators::Migration
6
+ extend ActiveRecord::Generators::Migration
7
+
8
+ TEMPLATES_PATH = File.expand_path('../templates', __FILE__)
9
+ source_root File.expand_path('../../friendly_id', __FILE__)
10
+ #source_root File.expand_path(VoicecomSms::Engine.root, __FILE__)
11
+
12
+ def copy_files(*args)
13
+ Dir["#{TEMPLATES_PATH}/migrations/*"].each do |template_file|
14
+ migration_template template_file, "db/migrate/#{File.basename(template_file)}"
15
+ end
16
+
17
+ copy_file "#{TEMPLATES_PATH}/initializers/voicecom_sms.rb", 'config/initializers/voicecom_sms.rb'
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ module VoicecomSms
2
+ class Error < StandardError
3
+ end
4
+
5
+ class ConfigurationError < Error
6
+ end
7
+
8
+ class HttpError < Error
9
+ end
10
+
11
+ class HistoryError < Error
12
+ def initialize object
13
+ super("Can't save message because of #{object.errors.inspect}")
14
+ end
15
+ end
16
+
17
+ end
@@ -0,0 +1,7 @@
1
+ require 'active_record'
2
+
3
+ module VoicecomSms
4
+ class Message < ActiveRecord::Base
5
+ self.table_name = 'voicecom_messages'
6
+ end
7
+ end
@@ -0,0 +1,82 @@
1
+ require 'voicecom_sms/message'
2
+ require 'voicecom_sms/request'
3
+ require 'voicecom_sms/response'
4
+
5
+ module VoicecomSms
6
+ class Provider
7
+ STATUS = {
8
+ undefined: 0,
9
+ success: 1,
10
+ failure: 2
11
+ }.freeze
12
+
13
+ attr_reader :request, :response
14
+
15
+ def initialize
16
+ check_config
17
+ @request = VoicecomSms::Request.new
18
+ @response = nil
19
+ end
20
+
21
+ def send_sms(number, text)
22
+ message = VoicecomSms::Message.create({text: text, number: normalize_number(number), status: STATUS[:undefined]})
23
+
24
+ make_request(message, number, text)
25
+
26
+
27
+ if @request.error or !@request.sent?
28
+ message.update_attributes(response: @request.error, status: STATUS[:failure])
29
+ else
30
+ @response = VoicecomSms::Response.new(@request.raw_response)
31
+ status = @response.success? ? STATUS[:success] : STATUS[:failure]
32
+
33
+ message.update_attributes(response: @response.inspect, status: status, response_received_at: Time.current)
34
+ end
35
+
36
+ message.status
37
+ end
38
+
39
+ def normalize_number(number)
40
+ number.gsub!(/\s+/, '')
41
+ number.sub!(/^(\+|00)/, '')
42
+ number.sub!(/^0/, '359')
43
+ number
44
+ end
45
+
46
+ private
47
+ def make_request(message, number, text)
48
+
49
+ @request.params = {
50
+ sid: VoicecomSms.config.client_id,
51
+ id: message.id,
52
+ msisdn: number,
53
+ text: text,
54
+ #priority: 2, # 1 - high priority, 2 - normal priority (default)
55
+ #validity: 1440 # validity period in minutes from 10 to 1440 (default)
56
+ }
57
+
58
+ message[:request] = "The request before actual sending: #{@request.inspect}"
59
+
60
+ if message.save
61
+ @request.send_message
62
+ message.update_attributes(request: @request.inspect)
63
+ else
64
+ raise VoicecomSms::HistoryError(message)
65
+ end
66
+ end
67
+
68
+ def check_config
69
+ %w(send_req_path
70
+ provider_port
71
+ provider_ip
72
+ client_id).each do |setting|
73
+ raise VoicecomSms::ConfigurationError.new("Wrong configuration: #{setting} is blank") if VoicecomSms.config.send(setting).blank?
74
+ end
75
+ end
76
+
77
+ def logger
78
+ VoicecomSms.logger
79
+ end
80
+
81
+ end
82
+ end
@@ -0,0 +1,43 @@
1
+ require 'net/http'
2
+ require 'faraday'
3
+
4
+ module VoicecomSms
5
+ class Request
6
+ attr_accessor :uri, :params
7
+ attr_reader :raw_response, :error
8
+
9
+ def initialize
10
+ @uri = URI.parse('https://' + VoicecomSms.config.provider_ip + ":" + VoicecomSms.config.provider_port + VoicecomSms.config.send_req_path)
11
+
12
+ @connection = Faraday.new(:url => @uri, :ssl => {:verify => false}, timeout: 4, open_timeout: 2) do |faraday|
13
+ faraday.request :url_encoded # form-encode POST params
14
+ # faraday.response :logger # log requests to STDOUT
15
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
16
+ end
17
+
18
+ @params = {}
19
+ @raw_response = nil
20
+ @error = nil
21
+ end
22
+
23
+ def send_message
24
+ @raw_response = @connection.get do |request|
25
+ request.url @uri.path
26
+ request.params = @params
27
+ end
28
+
29
+ @raw_response
30
+ rescue Exception => e
31
+ @error = e.message
32
+ end
33
+
34
+ def sent?
35
+ @raw_response.present?
36
+ end
37
+
38
+ def logger
39
+ VoicecomSms.logger
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,17 @@
1
+ module VoicecomSms
2
+ class Response
3
+ attr_reader :status, :message, :body
4
+
5
+ def initialize(raw_response)
6
+ @raw_response = raw_response
7
+ @status = raw_response.status
8
+ @body = raw_response.body
9
+ end
10
+
11
+ def success?
12
+ return false unless @raw_response
13
+ @raw_response.success? && @body =~ /SEND_OK/ && @body !~ /ERROR/
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,39 @@
1
+ require 'voicecom_sms/provider'
2
+ require 'voicecom_sms/request'
3
+ require 'voicecom_sms/response'
4
+ require 'voicecom_sms/message'
5
+
6
+ require 'hashie/mash'
7
+ require 'logger'
8
+
9
+ module VoicecomSms
10
+
11
+ @config = Hashie::Mash.new
12
+
13
+ class << self
14
+
15
+ def configure
16
+ if block_given?
17
+ yield @config
18
+ end
19
+ end
20
+
21
+ def config(*args)
22
+ if args.empty?
23
+ @config
24
+ else
25
+ @config.send(args[0].to_sym)
26
+ end
27
+ end
28
+
29
+ def logger
30
+ return @@logger if defined? @@logger
31
+ @@logger = Rails.logger if defined? Rails
32
+ # ActiveRecord::Base.logger = Logger.new(STDERR)
33
+ @@logger = Logger.new(STDOUT)
34
+ @@logger.level = Logger::DEBUG
35
+ @@logger
36
+ end
37
+ end
38
+
39
+ end
@@ -0,0 +1,8 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx/1.0.13
3
+ Date: Wed, 12 Jun 2013 12:04:51 GMT
4
+ Content-Type: text/html
5
+ Transfer-Encoding: chunked
6
+ Connection: close
7
+
8
+ SEND_OK : value 1 duplicated
@@ -0,0 +1,57 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'rspec'
4
+ require 'voicecom_sms'
5
+ require 'database_cleaner'
6
+ require 'awesome_print'
7
+ require 'webmock/rspec'
8
+
9
+ # Requires supporting files with custom matchers and macros, etc,
10
+ # in ./support/ and its subdirectories.
11
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
12
+
13
+ DatabaseCleaner.strategy = :truncation
14
+
15
+ RSpec.configure do |config|
16
+ config.mock_with :rspec
17
+ end
18
+
19
+ VoicecomSms.configure do |config|
20
+ config.provider_ip = ENV['VOICECOM_IP']
21
+ config.provider_port = ENV['VOICECOM_PORT']
22
+ config.client_id = ENV['VOICECOM_CLIENT_ID']
23
+ config.send_req_path = ENV['VOICECOM_SEND_REQUEST_PATH']
24
+ puts "Provider settings https://#{config.provider_ip}:#{config.provider_port}#{config.send_req_path}?id=#{config.send_req_path}"
25
+ end
26
+
27
+
28
+ ActiveRecord::Base.establish_connection(
29
+ adapter: 'sqlite3',
30
+ database: ':memory:' # File.dirname(__FILE__) + '/faraday_test.sqlite3'
31
+ )
32
+
33
+ ActiveRecord::Schema.define do
34
+ self.verbose = true
35
+
36
+ create_table :voicecom_messages do |t|
37
+ t.string :number, null: false
38
+ t.string :text, null: false
39
+ t.integer :operator
40
+ t.integer :validity
41
+ t.integer :priority
42
+ t.text :hlr
43
+ t.text :request
44
+ t.text :response
45
+ t.datetime :response_received_at
46
+ t.integer :status, default: 0 # 0 - pending, 1 - success, 2 - failed
47
+
48
+ #t.text :delivery_request
49
+ #t.text :delivery_response
50
+ #t.datetime :delivery_response_received_at
51
+ #t.integer :delivery_status, default: 0 # 0 - pending, 1 - success, 2 - failed
52
+
53
+ t.boolean :delivered, default: false
54
+
55
+ t.timestamps
56
+ end
57
+ end
@@ -0,0 +1,86 @@
1
+ require "spec_helper"
2
+
3
+ require "voicecom_sms/provider"
4
+ require "voicecom_sms/request"
5
+ require "voicecom_sms/response"
6
+
7
+ describe VoicecomSms::Provider do
8
+
9
+ before(:each) do
10
+ DatabaseCleaner.clean
11
+ end
12
+
13
+ let(:destination_mobile_number){ '359899947329' }
14
+
15
+ describe "#new" do
16
+ it "should create a request instances" do
17
+ provider = VoicecomSms::Provider.new
18
+ provider.request.should be_a VoicecomSms::Request
19
+ provider.response.should be_nil
20
+ end
21
+ end
22
+
23
+ describe "#send_sms" do
24
+ before(:each) do
25
+ @provider = VoicecomSms::Provider.new
26
+ stub_request(:get, "https://localhost:8443/smsapi/bsms/index.php?sid=#{VoicecomSms.config.client_id}&id=1&msisdn=359899947329&text=some+message").
27
+ to_return(lambda { |request| File.new("request_stubs/success.curl")})
28
+ end
29
+
30
+ it "should create new message record" do
31
+ expect {
32
+ @provider.send_sms(destination_mobile_number, 'some message')
33
+ }.to change(VoicecomSms::Message, :count).by(1)
34
+ end
35
+
36
+ it "should try to convert the number to a valid one" do
37
+ @provider.send_sms("+#{destination_mobile_number}", 'some message')
38
+ message = VoicecomSms::Message.last
39
+ message.number.should == destination_mobile_number
40
+ end
41
+
42
+ it "should set the query params in the request" do
43
+ @provider.request.params.should be_blank
44
+ @provider.send_sms(destination_mobile_number, 'some message')
45
+ @provider.request.params.should_not be_blank
46
+ end
47
+
48
+ it "should save the request query in the message" do
49
+ @provider.send_sms(destination_mobile_number, 'some message')
50
+ message = VoicecomSms::Message.last
51
+ message.request.should == @provider.request.inspect
52
+ end
53
+
54
+ it "should send the message to the provider's API" do
55
+ @provider.request.should_receive('send_message')
56
+ @provider.send_sms(destination_mobile_number, 'some message')
57
+ end
58
+
59
+ it "should save the response in the message" do
60
+ @provider.send_sms(destination_mobile_number, 'some message')
61
+
62
+ message = VoicecomSms::Message.last
63
+ message.response.should == @provider.response.inspect
64
+ end
65
+
66
+ it "should return the status" do
67
+ result = @provider.send_sms(destination_mobile_number, 'some message')
68
+ result.should == VoicecomSms::Provider::STATUS[:success]
69
+ end
70
+ end
71
+
72
+ describe "#normalize_number" do
73
+ before(:all) do
74
+ @provider = VoicecomSms::Provider.new
75
+ end
76
+
77
+ it "should convert the number to an acceptable by the API value" do
78
+ acceptable_value = destination_mobile_number
79
+
80
+ @provider.normalize_number('359899947329').should == acceptable_value
81
+ @provider.normalize_number('0899947329').should == acceptable_value
82
+ @provider.normalize_number('00359899947329').should == acceptable_value
83
+ @provider.normalize_number('+359899947329').should == acceptable_value
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,19 @@
1
+ require "spec_helper"
2
+ require "voicecom_sms/request"
3
+
4
+ describe VoicecomSms::Request do
5
+ before(:each) do
6
+ @request = VoicecomSms::Request.new
7
+ end
8
+
9
+ describe "#new" do
10
+ it "should form the provider's API url" do
11
+ url = @request.uri
12
+
13
+ url.hostname.should == VoicecomSms.config.provider_ip
14
+ url.port.should == VoicecomSms.config.provider_port.to_i
15
+ url.path.should == VoicecomSms.config.send_req_path
16
+ end
17
+ end
18
+
19
+ end
@@ -0,0 +1,91 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "voicecom_sms"
8
+ s.version = "1.0.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Evgenia Manolova"]
12
+ s.date = "2013-06-13"
13
+ s.description = "A fast SMS engine that uses VoiceCom as a service provider"
14
+ s.email = "emanolova@gmail.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".rspec",
22
+ "Gemfile",
23
+ "Gemfile.lock",
24
+ "LICENSE.txt",
25
+ "README.md",
26
+ "Rakefile",
27
+ "VERSION",
28
+ "lib/generators/templates/initializers/voicecom_sms.rb",
29
+ "lib/generators/templates/migrations/create_voicecom_messages.rb",
30
+ "lib/generators/voicecom_sms_generator.rb",
31
+ "lib/voicecom_sms.rb",
32
+ "lib/voicecom_sms/error.rb",
33
+ "lib/voicecom_sms/message.rb",
34
+ "lib/voicecom_sms/provider.rb",
35
+ "lib/voicecom_sms/request.rb",
36
+ "lib/voicecom_sms/response.rb",
37
+ "request_stubs/success.curl",
38
+ "spec/spec_helper.rb",
39
+ "spec/voicecom_sms/provider_spec.rb",
40
+ "spec/voicecom_sms/request_spec.rb",
41
+ "voicecom_sms.gemspec"
42
+ ]
43
+ s.homepage = "http://github.com/zzeni/voicecom_sms"
44
+ s.licenses = ["MIT"]
45
+ s.require_paths = ["lib"]
46
+ s.rubygems_version = "2.0.3"
47
+ s.summary = "Ruby interface to the VoiceCom SMS Gateway API"
48
+
49
+ if s.respond_to? :specification_version then
50
+ s.specification_version = 4
51
+
52
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
53
+ s.add_runtime_dependency(%q<activerecord>, ["~> 3.2.0"])
54
+ s.add_runtime_dependency(%q<hashie>, ["~> 1.2.0"])
55
+ s.add_runtime_dependency(%q<faraday>, [">= 0"])
56
+ s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
57
+ s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
58
+ s.add_development_dependency(%q<bundler>, ["~> 1.3.0"])
59
+ s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
60
+ s.add_development_dependency(%q<sqlite3>, ["~> 1.3.6"])
61
+ s.add_development_dependency(%q<awesome_print>, [">= 0"])
62
+ s.add_development_dependency(%q<database_cleaner>, ["~> 0.9.1"])
63
+ s.add_development_dependency(%q<webmock>, [">= 0"])
64
+ else
65
+ s.add_dependency(%q<activerecord>, ["~> 3.2.0"])
66
+ s.add_dependency(%q<hashie>, ["~> 1.2.0"])
67
+ s.add_dependency(%q<faraday>, [">= 0"])
68
+ s.add_dependency(%q<rspec>, ["~> 2.8.0"])
69
+ s.add_dependency(%q<rdoc>, ["~> 3.12"])
70
+ s.add_dependency(%q<bundler>, ["~> 1.3.0"])
71
+ s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
72
+ s.add_dependency(%q<sqlite3>, ["~> 1.3.6"])
73
+ s.add_dependency(%q<awesome_print>, [">= 0"])
74
+ s.add_dependency(%q<database_cleaner>, ["~> 0.9.1"])
75
+ s.add_dependency(%q<webmock>, [">= 0"])
76
+ end
77
+ else
78
+ s.add_dependency(%q<activerecord>, ["~> 3.2.0"])
79
+ s.add_dependency(%q<hashie>, ["~> 1.2.0"])
80
+ s.add_dependency(%q<faraday>, [">= 0"])
81
+ s.add_dependency(%q<rspec>, ["~> 2.8.0"])
82
+ s.add_dependency(%q<rdoc>, ["~> 3.12"])
83
+ s.add_dependency(%q<bundler>, ["~> 1.3.0"])
84
+ s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
85
+ s.add_dependency(%q<sqlite3>, ["~> 1.3.6"])
86
+ s.add_dependency(%q<awesome_print>, [">= 0"])
87
+ s.add_dependency(%q<database_cleaner>, ["~> 0.9.1"])
88
+ s.add_dependency(%q<webmock>, [">= 0"])
89
+ end
90
+ end
91
+
metadata ADDED
@@ -0,0 +1,222 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: voicecom_sms
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Evgenia Manolova
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-06-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 3.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 3.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: hashie
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 1.2.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 1.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: faraday
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 2.8.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 2.8.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: rdoc
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '3.12'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '3.12'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: 1.3.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 1.3.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: jeweler
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: 1.8.4
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 1.8.4
111
+ - !ruby/object:Gem::Dependency
112
+ name: sqlite3
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 1.3.6
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ version: 1.3.6
125
+ - !ruby/object:Gem::Dependency
126
+ name: awesome_print
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ! '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: database_cleaner
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ~>
144
+ - !ruby/object:Gem::Version
145
+ version: 0.9.1
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ~>
151
+ - !ruby/object:Gem::Version
152
+ version: 0.9.1
153
+ - !ruby/object:Gem::Dependency
154
+ name: webmock
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ! '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ! '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description: A fast SMS engine that uses VoiceCom as a service provider
168
+ email: emanolova@gmail.com
169
+ executables: []
170
+ extensions: []
171
+ extra_rdoc_files:
172
+ - LICENSE.txt
173
+ - README.md
174
+ files:
175
+ - .document
176
+ - .rspec
177
+ - Gemfile
178
+ - Gemfile.lock
179
+ - LICENSE.txt
180
+ - README.md
181
+ - Rakefile
182
+ - VERSION
183
+ - lib/generators/templates/initializers/voicecom_sms.rb
184
+ - lib/generators/templates/migrations/create_voicecom_messages.rb
185
+ - lib/generators/voicecom_sms_generator.rb
186
+ - lib/voicecom_sms.rb
187
+ - lib/voicecom_sms/error.rb
188
+ - lib/voicecom_sms/message.rb
189
+ - lib/voicecom_sms/provider.rb
190
+ - lib/voicecom_sms/request.rb
191
+ - lib/voicecom_sms/response.rb
192
+ - request_stubs/success.curl
193
+ - spec/spec_helper.rb
194
+ - spec/voicecom_sms/provider_spec.rb
195
+ - spec/voicecom_sms/request_spec.rb
196
+ - voicecom_sms.gemspec
197
+ homepage: http://github.com/zzeni/voicecom_sms
198
+ licenses:
199
+ - MIT
200
+ metadata: {}
201
+ post_install_message:
202
+ rdoc_options: []
203
+ require_paths:
204
+ - lib
205
+ required_ruby_version: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - ! '>='
208
+ - !ruby/object:Gem::Version
209
+ version: '0'
210
+ required_rubygems_version: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - ! '>='
213
+ - !ruby/object:Gem::Version
214
+ version: '0'
215
+ requirements: []
216
+ rubyforge_project:
217
+ rubygems_version: 2.0.3
218
+ signing_key:
219
+ specification_version: 4
220
+ summary: Ruby interface to the VoiceCom SMS Gateway API
221
+ test_files: []
222
+ has_rdoc: