suls-smsr 0.0.1
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/.autotest +3 -0
- data/.gitignore +4 -0
- data/History.txt +5 -0
- data/Manifest.txt +38 -0
- data/README.txt +70 -0
- data/Rakefile +70 -0
- data/bin/smsr +4 -0
- data/bin/smsr-config +4 -0
- data/bin/smsr-send +4 -0
- data/lib/providers/hispeed.rb +35 -0
- data/lib/providers/o2.rb +28 -0
- data/lib/providers/orange.rb +34 -0
- data/lib/providers/swisscom.rb +41 -0
- data/lib/smsr.rb +12 -0
- data/lib/smsr/actions.rb +110 -0
- data/lib/smsr/actions/config.rb +21 -0
- data/lib/smsr/actions/list.rb +21 -0
- data/lib/smsr/actions/send.rb +24 -0
- data/lib/smsr/config.rb +33 -0
- data/lib/smsr/extensions.rb +31 -0
- data/lib/smsr/providers.rb +54 -0
- data/lib/smsr/providers/provider.rb +14 -0
- data/lib/smsr/smsr.rb +97 -0
- data/lib/smsr/version.rb +10 -0
- data/smsr.gemspec +41 -0
- data/spec/providers/hispeed_spec.rb +11 -0
- data/spec/providers/orange_spec.rb +11 -0
- data/spec/providers/provider_helper.rb +16 -0
- data/spec/providers/swisscom_spec.rb +12 -0
- data/spec/smsr/actions/config_spec.rb +8 -0
- data/spec/smsr/actions/send_spec.rb +7 -0
- data/spec/smsr/actions_requirements_spec.rb +143 -0
- data/spec/smsr/actions_spec.rb +125 -0
- data/spec/smsr/config_spec.rb +81 -0
- data/spec/smsr/providers_spec.rb +84 -0
- data/spec/smsr/version_spec.rb +11 -0
- data/spec/smsr_spec.rb +40 -0
- data/spec/spec_helper.rb +18 -0
- metadata +122 -0
@@ -0,0 +1,21 @@
|
|
1
|
+
module SmsR
|
2
|
+
module Actions
|
3
|
+
|
4
|
+
class Config < RunnableAction
|
5
|
+
runnable do |provider, user, password|
|
6
|
+
SmsR.debug "Store entry for #{provider}"
|
7
|
+
SmsR.config[:"#{provider}"] = user, password
|
8
|
+
SmsR.config.save!
|
9
|
+
SmsR.info "Config for #{provider} added."
|
10
|
+
end
|
11
|
+
|
12
|
+
runnable :config do |provider|
|
13
|
+
p_c = SmsR.config[:"#{provider}"]
|
14
|
+
SmsR.info "Saved config for Provider '#{provider}':"
|
15
|
+
%w{user password}.each { |e| SmsR.info " #{e}: #{p_c.send e}"}
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module SmsR
|
2
|
+
module Actions
|
3
|
+
|
4
|
+
class List < RunnableAction
|
5
|
+
runnable :load_providers do
|
6
|
+
|
7
|
+
SmsR.info "","Available providers:", ""
|
8
|
+
SmsR::Providers.providers.each do |name, prov|
|
9
|
+
if SmsR.config[name.to_sym]
|
10
|
+
has_config = ""
|
11
|
+
else
|
12
|
+
has_config = "*"
|
13
|
+
end
|
14
|
+
SmsR.info "\t#{name} #{has_config}"
|
15
|
+
end
|
16
|
+
SmsR.info "","* indicates no config saved for the provider."
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "rake"
|
3
|
+
|
4
|
+
module SmsR
|
5
|
+
module Actions
|
6
|
+
|
7
|
+
class Send < RunnableAction
|
8
|
+
runnable :load_providers do
|
9
|
+
SmsR.info "Available providers:"
|
10
|
+
SmsR::Providers.providers.each { |k,v| SmsR.info " #{k}"}
|
11
|
+
end
|
12
|
+
|
13
|
+
runnable :load_providers, :config, :provider do |provider_name, number, message|
|
14
|
+
|
15
|
+
SmsR.debug "using #{@provider} " +
|
16
|
+
"with config #{@config}"
|
17
|
+
|
18
|
+
@provider.call @config.user, @config.password, number, message
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
data/lib/smsr/config.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module SmsR
|
4
|
+
OperatorConfig = Struct.new(:user, :password)
|
5
|
+
|
6
|
+
class Config
|
7
|
+
attr_reader :last_saved
|
8
|
+
|
9
|
+
def self.load(file=ENV['HOME']+'/.smsr_config')
|
10
|
+
return File.open(file) { |f| YAML.load(f) } if File.exists? file
|
11
|
+
Config.new(file)
|
12
|
+
end
|
13
|
+
|
14
|
+
def save!(f_to_save=@config_file)
|
15
|
+
@last_saved = Time.now
|
16
|
+
File.open(f_to_save, "w") { |f| YAML.dump(self, f) }
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(f=nil)
|
20
|
+
@config_file = f
|
21
|
+
@config = {}
|
22
|
+
end
|
23
|
+
|
24
|
+
def []=(key, params)
|
25
|
+
@config[key] = OperatorConfig.new(*params)
|
26
|
+
end
|
27
|
+
|
28
|
+
def [](key)
|
29
|
+
@config[key]
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# from http://eigenclass.org/hiki/bounded+space+instance_exec
|
2
|
+
class Object
|
3
|
+
module InstanceExecHelper; end
|
4
|
+
include InstanceExecHelper
|
5
|
+
def instance_exec(*args, &block)
|
6
|
+
begin
|
7
|
+
old_critical, Thread.critical = Thread.critical, true
|
8
|
+
n = 0
|
9
|
+
n += 1 while respond_to?(mname="__instance_exec#{n}")
|
10
|
+
InstanceExecHelper.module_eval{ define_method(mname, &block) }
|
11
|
+
ensure
|
12
|
+
Thread.critical = old_critical
|
13
|
+
end
|
14
|
+
begin
|
15
|
+
ret = send(mname, *args)
|
16
|
+
ensure
|
17
|
+
InstanceExecHelper.module_eval{ remove_method(mname) } rescue nil
|
18
|
+
end
|
19
|
+
ret
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# http://whytheluckystiff.net/articles/seeingMetaclassesClearly.html
|
24
|
+
class Object
|
25
|
+
# The hidden singleton lurks behind everyone
|
26
|
+
def eigenclass; class << self; self; end; end
|
27
|
+
|
28
|
+
def add_instance_method(name, blk)
|
29
|
+
eigenclass.send :define_method, name, blk
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module SmsR
|
2
|
+
module Providers
|
3
|
+
|
4
|
+
DEFAULT_PROVIDERS = File.dirname(__FILE__) +
|
5
|
+
'/../providers'
|
6
|
+
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def provider(provider_name, &block)
|
10
|
+
SmsR.debug "registering #{provider_name}"
|
11
|
+
providers[provider_name] = Provider.new(block)
|
12
|
+
end
|
13
|
+
|
14
|
+
def providers
|
15
|
+
@providers ||= {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def reset
|
19
|
+
@providers = {}
|
20
|
+
end
|
21
|
+
|
22
|
+
def load(*files)
|
23
|
+
files.each do |file|
|
24
|
+
if File.exists? file
|
25
|
+
SmsR.debug "Loading providers from: #{file}"
|
26
|
+
data = File.read(file)
|
27
|
+
# @providers = {} if drop_existing
|
28
|
+
module_eval data, file
|
29
|
+
else
|
30
|
+
SmsR.debug "Provider file #{file} doesn't exist."
|
31
|
+
end
|
32
|
+
end
|
33
|
+
providers
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
module ProviderHelper
|
39
|
+
|
40
|
+
def find_form_with_field(page, fieldname)
|
41
|
+
page.forms.each do |form|
|
42
|
+
if form.fields.find{|f| f.name == fieldname}
|
43
|
+
yield form
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_ISO_8859_1(msg)
|
49
|
+
require "iconv"
|
50
|
+
Iconv.conv("ISO-8859-1", "UTF-8", message)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
data/lib/smsr/smsr.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
require "ostruct"
|
2
|
+
require "optparse"
|
3
|
+
|
4
|
+
module SmsR
|
5
|
+
|
6
|
+
extend self
|
7
|
+
|
8
|
+
def start(args, io=STDOUT)
|
9
|
+
@io = io
|
10
|
+
args_copy = args.dup
|
11
|
+
@options = parse_options(args)
|
12
|
+
|
13
|
+
info ""
|
14
|
+
debug "args: ", args_copy << " "
|
15
|
+
debug "options: ", options
|
16
|
+
|
17
|
+
debug "SmsR #{VERSION::STRING} started .."
|
18
|
+
|
19
|
+
invoke_action(args.shift, args) if args.size > 0 if args
|
20
|
+
|
21
|
+
debug ".. exiting SmsR"
|
22
|
+
info ""
|
23
|
+
end
|
24
|
+
|
25
|
+
def debug?
|
26
|
+
!!@debug
|
27
|
+
end
|
28
|
+
|
29
|
+
# FIXME: duplication!
|
30
|
+
def debug(*messages)
|
31
|
+
@io.puts messages.map { |m| "** #{m}" } if debug?
|
32
|
+
end
|
33
|
+
|
34
|
+
# FIXME: duplication!
|
35
|
+
def info(*messages)
|
36
|
+
@io.puts messages.map { |m| " #{m}" }
|
37
|
+
end
|
38
|
+
|
39
|
+
def parse_options(args)
|
40
|
+
options = OpenStruct.new
|
41
|
+
options.debug = false
|
42
|
+
|
43
|
+
begin
|
44
|
+
OptionParser.new do |opts|
|
45
|
+
opts.banner = <<BANNER
|
46
|
+
Usage: smsr [action] [parameters] [options]
|
47
|
+
|
48
|
+
To send a sms:
|
49
|
+
|
50
|
+
$ smsr-send provider_name 079xx "this is my message"
|
51
|
+
|
52
|
+
Provider 'provider_name' must exist. To see what providers exist:
|
53
|
+
|
54
|
+
$ smsr list
|
55
|
+
|
56
|
+
BANNER
|
57
|
+
|
58
|
+
opts.on("-d", "--debug", "Show debug log statements") do |d|
|
59
|
+
options.debug = d
|
60
|
+
end
|
61
|
+
|
62
|
+
opts.on_tail("--version", "Show version") do
|
63
|
+
@io.puts VERSION::STRING
|
64
|
+
exit
|
65
|
+
end
|
66
|
+
end.parse!(args)
|
67
|
+
rescue OptionParser::InvalidOption => e
|
68
|
+
@io.puts e
|
69
|
+
exit
|
70
|
+
end
|
71
|
+
|
72
|
+
@debug = options.debug
|
73
|
+
|
74
|
+
options
|
75
|
+
end
|
76
|
+
|
77
|
+
def options
|
78
|
+
@options
|
79
|
+
end
|
80
|
+
|
81
|
+
def config
|
82
|
+
@config ||= Config.load
|
83
|
+
end
|
84
|
+
|
85
|
+
def invoke_action(action, args)
|
86
|
+
action = action.capitalize
|
87
|
+
available_actions = (Actions.constants - ['RunnableAction'])
|
88
|
+
debug "available actions: ", *(available_actions.map{|e| "\t"+e}) << " "
|
89
|
+
|
90
|
+
if available_actions.include?(action)
|
91
|
+
Actions.const_get(action).run(args)
|
92
|
+
else
|
93
|
+
debug "selected action not available: #{action}"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
data/lib/smsr/version.rb
ADDED
data/smsr.gemspec
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{smsr}
|
5
|
+
s.version = "0.0.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Mathias Sulser"]
|
9
|
+
s.date = %q{2008-11-04}
|
10
|
+
s.description = %q{Simple commandline utility for sending sms.}
|
11
|
+
s.email = ["suls@suls.org"]
|
12
|
+
s.executables = ["smsr", "smsr-config", "smsr-send"]
|
13
|
+
s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.txt"]
|
14
|
+
s.files = [".autotest", ".gitignore", "History.txt", "Manifest.txt", "README.txt", "Rakefile", "bin/smsr", "bin/smsr-config", "bin/smsr-send", "lib/providers/hispeed.rb", "lib/providers/o2.rb", "lib/providers/orange.rb", "lib/providers/swisscom.rb", "lib/smsr.rb", "lib/smsr/actions.rb", "lib/smsr/actions/config.rb", "lib/smsr/actions/list.rb", "lib/smsr/actions/send.rb", "lib/smsr/config.rb", "lib/smsr/extensions.rb", "lib/smsr/providers.rb", "lib/smsr/providers/provider.rb", "lib/smsr/smsr.rb", "lib/smsr/version.rb", "smsr.gemspec", "spec/providers/hispeed_spec.rb", "spec/providers/orange_spec.rb", "spec/providers/provider_helper.rb", "spec/providers/swisscom_spec.rb", "spec/smsr/actions/config_spec.rb", "spec/smsr/actions/send_spec.rb", "spec/smsr/actions_requirements_spec.rb", "spec/smsr/actions_spec.rb", "spec/smsr/config_spec.rb", "spec/smsr/providers_spec.rb", "spec/smsr/version_spec.rb", "spec/smsr_spec.rb", "spec/spec_helper.rb"]
|
15
|
+
s.has_rdoc = true
|
16
|
+
s.homepage = %q{http://sulsarts.ch/p/smsr}
|
17
|
+
s.rdoc_options = ["--main", "README.txt"]
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
s.rubyforge_project = %q{smsr}
|
20
|
+
s.rubygems_version = %q{1.3.1}
|
21
|
+
s.summary = %q{SmsR version 0.0.1}
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 2
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
s.add_runtime_dependency(%q<mechanize>, [">= 0.7.8"])
|
29
|
+
s.add_runtime_dependency(%q<rspec>, [">= 1.1.4"])
|
30
|
+
s.add_development_dependency(%q<hoe>, [">= 1.8.2"])
|
31
|
+
else
|
32
|
+
s.add_dependency(%q<mechanize>, [">= 0.7.8"])
|
33
|
+
s.add_dependency(%q<rspec>, [">= 1.1.4"])
|
34
|
+
s.add_dependency(%q<hoe>, [">= 1.8.2"])
|
35
|
+
end
|
36
|
+
else
|
37
|
+
s.add_dependency(%q<mechanize>, [">= 0.7.8"])
|
38
|
+
s.add_dependency(%q<rspec>, [">= 1.1.4"])
|
39
|
+
s.add_dependency(%q<hoe>, [">= 1.8.2"])
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
def running(cmd, *args, &block)
|
4
|
+
SmsR::Providers.load File.dirname(__FILE__) +
|
5
|
+
"/../../lib/providers/#{cmd}.rb"
|
6
|
+
|
7
|
+
# rcov hack
|
8
|
+
begin
|
9
|
+
require File.dirname(__FILE__) +
|
10
|
+
"/../../lib/providers/#{cmd}.rb"
|
11
|
+
rescue NoMethodError => e
|
12
|
+
end
|
13
|
+
|
14
|
+
block.call
|
15
|
+
SmsR::Providers.providers[cmd].call args
|
16
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/provider_helper'
|
2
|
+
|
3
|
+
describe SmsR::Providers::Provider, "Swisscom" do
|
4
|
+
it "should test the swisscom provider" do
|
5
|
+
running :swisscom, "usr", "pwd", "num", "msg" do
|
6
|
+
WWW::Mechanize.stub!(:new)
|
7
|
+
end
|
8
|
+
|
9
|
+
pending
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
describe SmsR::Actions::Config do
|
4
|
+
it "should respond to the config action"
|
5
|
+
it "should list the configs entries when run with 0 argument"
|
6
|
+
it "should list the provider's config entry when run with 1 argument"
|
7
|
+
it "should save the provider's config entry when run with 3 argument"
|
8
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
describe SmsR::Actions::Send do
|
4
|
+
it "should respond to the send action"
|
5
|
+
it "should list the available providers when run with 0 argument"
|
6
|
+
it "should send the sms using the give provider when run with 3 arguments"
|
7
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe SmsR::Actions::Requirements do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
Object.send(:remove_const, :SubTest) if defined? SubTest
|
7
|
+
end
|
8
|
+
|
9
|
+
after(:each) do
|
10
|
+
Object.send(:remove_const, :SubTest) if defined? SubTest
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
it "should run the defined requirements in sequence" do
|
15
|
+
helper = mock("RequirementsFoo")
|
16
|
+
helper.should_receive(:first).and_return(true)
|
17
|
+
helper.should_receive(:second).and_return(false)
|
18
|
+
helper.should_not_receive(:third)
|
19
|
+
|
20
|
+
helper_mod = MixinMock.new(helper)
|
21
|
+
|
22
|
+
SmsR::Actions.stub!(:requirements).and_return(helper_mod)
|
23
|
+
|
24
|
+
class SubTest < SmsR::Actions::RunnableAction
|
25
|
+
runnable :first, :second, :third do |needed|
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
st = SubTest.new :p
|
30
|
+
st.requirements = [:first, :second, :third]
|
31
|
+
st.check.should be(false)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe SmsR::Actions::Requirements, "requirement #config" do
|
36
|
+
|
37
|
+
before(:all) do
|
38
|
+
Test = Class.new do
|
39
|
+
attr_accessor :provider_name, :error
|
40
|
+
include SmsR::Actions::Requirements
|
41
|
+
|
42
|
+
def initialize
|
43
|
+
@error = []
|
44
|
+
end
|
45
|
+
end
|
46
|
+
@tester = Test.new
|
47
|
+
@config = mock("Config")
|
48
|
+
end
|
49
|
+
|
50
|
+
after(:each) do
|
51
|
+
@tester = nil
|
52
|
+
@config = nil
|
53
|
+
SmsR::Config.stub!(:load).and_return(nil)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should return false if no config for provider :nonexisting_provider exists" do
|
57
|
+
@tester.provider_name = :nonexisting_provider
|
58
|
+
|
59
|
+
@config.should_receive(:[]).
|
60
|
+
with(:nonexisting_provider).
|
61
|
+
and_return(nil)
|
62
|
+
|
63
|
+
SmsR.stub!(:config).and_return(@config)
|
64
|
+
|
65
|
+
@tester.config.should be(false)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should return 'true' if config for :existing_provider_1 exists" do
|
69
|
+
@tester.provider_name = :existing_provider
|
70
|
+
|
71
|
+
@config.should_receive(:[]).
|
72
|
+
with(:existing_provider).
|
73
|
+
and_return(true)
|
74
|
+
|
75
|
+
SmsR.stub!(:config).and_return(@config)
|
76
|
+
|
77
|
+
@tester.config.should be(true)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should add an error to @error when failing" do
|
81
|
+
@tester.provider_name = :nonexisting_provider
|
82
|
+
|
83
|
+
@config.should_receive(:[]).
|
84
|
+
with(:nonexisting_provider).
|
85
|
+
and_return(nil)
|
86
|
+
|
87
|
+
SmsR.stub!(:config).and_return(@config)
|
88
|
+
|
89
|
+
@tester.config
|
90
|
+
|
91
|
+
@tester.error.size.should_not be(0)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe SmsR::Actions::Requirements, "requirement #provider" do
|
96
|
+
|
97
|
+
include SmsR::Actions::Requirements
|
98
|
+
|
99
|
+
before(:each) do
|
100
|
+
@providers = mock("Providers")
|
101
|
+
@provider_name = :blubb
|
102
|
+
@error = []
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should return false if no provider :nonexisting_provider exists" do
|
106
|
+
|
107
|
+
@providers.should_receive(:[]).
|
108
|
+
with(:nonexisting_provider).
|
109
|
+
and_return(nil)
|
110
|
+
|
111
|
+
SmsR::Providers.stub!(:providers).and_return(@providers)
|
112
|
+
|
113
|
+
@provider_name = :nonexisting_provider
|
114
|
+
|
115
|
+
provider.should be(false)
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should return 'true' if provider :existing_provider exists" do
|
120
|
+
@providers.should_receive(:[]).
|
121
|
+
with(:existing_provider).
|
122
|
+
and_return(true)
|
123
|
+
|
124
|
+
SmsR::Providers.stub!(:providers).and_return(@providers)
|
125
|
+
|
126
|
+
@provider_name = :existing_provider
|
127
|
+
|
128
|
+
provider.should be(true)
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should add an error to @error when failing" do
|
132
|
+
@providers.should_receive(:[]).
|
133
|
+
with(:existing_provider).
|
134
|
+
and_return(true)
|
135
|
+
|
136
|
+
SmsR::Providers.stub!(:providers).and_return(@providers)
|
137
|
+
|
138
|
+
@provider_name = :existing_provider
|
139
|
+
provider
|
140
|
+
|
141
|
+
@error.size.should >= 1
|
142
|
+
end
|
143
|
+
end
|