socky 0.2.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +3 -25
- data/lib/socky.rb +1 -75
- metadata +20 -91
- data/CHANGELOG.textile +0 -88
- data/Rakefile +0 -30
- data/VERSION +0 -1
- data/bin/socky +0 -5
- data/lib/em-websocket_hacks.rb +0 -15
- data/lib/socky/connection.rb +0 -137
- data/lib/socky/connection/authentication.rb +0 -99
- data/lib/socky/connection/finders.rb +0 -67
- data/lib/socky/message.rb +0 -85
- data/lib/socky/misc.rb +0 -74
- data/lib/socky/net_request.rb +0 -27
- data/lib/socky/options.rb +0 -39
- data/lib/socky/options/config.rb +0 -79
- data/lib/socky/options/parser.rb +0 -93
- data/lib/socky/runner.rb +0 -95
- data/spec/em-websocket_spec.rb +0 -36
- data/spec/files/default.yml +0 -18
- data/spec/files/invalid.yml +0 -1
- data/spec/socky/connection/authentication_spec.rb +0 -183
- data/spec/socky/connection/finders_spec.rb +0 -188
- data/spec/socky/connection_spec.rb +0 -151
- data/spec/socky/message_spec.rb +0 -102
- data/spec/socky/misc_spec.rb +0 -74
- data/spec/socky/net_request_spec.rb +0 -42
- data/spec/socky/options/config_spec.rb +0 -72
- data/spec/socky/options/parser_spec.rb +0 -76
- data/spec/socky/options_spec.rb +0 -60
- data/spec/socky/runner_spec.rb +0 -88
- data/spec/socky_spec.rb +0 -89
- data/spec/spec_helper.rb +0 -6
- data/spec/support/stallion.rb +0 -96
@@ -1,151 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Socky::Connection do
|
4
|
-
|
5
|
-
context "class" do
|
6
|
-
it "should have connections array" do
|
7
|
-
described_class.connections.should_not be_nil
|
8
|
-
described_class.connections.class.should eql(Array)
|
9
|
-
end
|
10
|
-
it "should have empty connections array at start" do
|
11
|
-
described_class.connections.should be_empty
|
12
|
-
end
|
13
|
-
it "should create instance and assign socket to self" do
|
14
|
-
socket = mock(:socket)
|
15
|
-
connection = described_class.new(socket)
|
16
|
-
connection.socket.should equal(socket)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
context "instance" do
|
21
|
-
before(:each) do
|
22
|
-
described_class.connections.clear
|
23
|
-
socket = mock(:socket, :request => { "Query" => {}})
|
24
|
-
@connection = described_class.new(socket)
|
25
|
-
end
|
26
|
-
|
27
|
-
context "#admin" do
|
28
|
-
it "should return true for socket request data admin equal to '1' and 'true'" do
|
29
|
-
["1","true"].each do |value|
|
30
|
-
@connection.socket.request["Query"]["admin"] = value
|
31
|
-
@connection.admin.should be_true
|
32
|
-
end
|
33
|
-
end
|
34
|
-
it "should return false for socket request data admin equal to anything except '1' and 'true'" do
|
35
|
-
[nil,"0","false","abstract"].each do |value|
|
36
|
-
@connection.socket.request["Query"]["admin"] = value
|
37
|
-
@connection.admin.should be_false
|
38
|
-
end
|
39
|
-
end
|
40
|
-
it "should return false if socket request data is nil" do
|
41
|
-
@connection.socket.request["Query"] = nil
|
42
|
-
@connection.admin.should be_false
|
43
|
-
end
|
44
|
-
end
|
45
|
-
it "#client should return client_id from socket request data" do
|
46
|
-
@connection.socket.request["Query"]["client_id"] = "abstract"
|
47
|
-
@connection.client.should eql("abstract")
|
48
|
-
end
|
49
|
-
it "#secret should return client_secret from socket request data" do
|
50
|
-
@connection.socket.request["Query"]["client_secret"] = "abstract"
|
51
|
-
@connection.secret.should eql("abstract")
|
52
|
-
end
|
53
|
-
context "#channels" do
|
54
|
-
it "should ba array" do
|
55
|
-
@connection.channels.should_not be_nil
|
56
|
-
@connection.channels.class.should eql(Array)
|
57
|
-
end
|
58
|
-
it "should return table with nil if socket request data 'channels' is nil" do
|
59
|
-
@connection.socket.request["Query"]["channels"] = nil
|
60
|
-
@connection.channels.should eql([nil])
|
61
|
-
end
|
62
|
-
it "should return table of channels if provided and separated by comma" do
|
63
|
-
@connection.socket.request["Query"]["channels"] = "aaa,bbb,ccc"
|
64
|
-
@connection.channels.should eql(["aaa","bbb","ccc"])
|
65
|
-
end
|
66
|
-
it "should not allow empty names of channels" do
|
67
|
-
@connection.socket.request["Query"]["channels"] = "aaa,,ccc"
|
68
|
-
@connection.channels.should eql(["aaa","ccc"])
|
69
|
-
end
|
70
|
-
it "should strip trailing spaces in channel names" do
|
71
|
-
@connection.socket.request["Query"]["channels"] = " aaa\n , \n , ccc "
|
72
|
-
@connection.channels.should eql(["aaa","ccc"])
|
73
|
-
end
|
74
|
-
end
|
75
|
-
it "#subscribe should send subscribe request" do
|
76
|
-
@connection.stub!(:subscribe_request)
|
77
|
-
@connection.should_receive(:subscribe_request)
|
78
|
-
@connection.subscribe
|
79
|
-
end
|
80
|
-
it "#unsubscribe should send unsubscribe request" do
|
81
|
-
@connection.stub!(:unsubscribe_request)
|
82
|
-
@connection.should_receive(:unsubscribe_request)
|
83
|
-
@connection.unsubscribe
|
84
|
-
end
|
85
|
-
context "#process_message" do
|
86
|
-
it "should send process request to socky message class if connection is by admin" do
|
87
|
-
@connection.stub!(:admin).and_return(true)
|
88
|
-
Socky::Message.stub!(:process)
|
89
|
-
Socky::Message.should_receive(:process).with(@connection, "abstract")
|
90
|
-
@connection.process_message("abstract")
|
91
|
-
end
|
92
|
-
it "should send user message that he can not send messages if connection is not admin" do
|
93
|
-
@connection.stub!(:admin).and_return(false)
|
94
|
-
@connection.stub!(:send_message)
|
95
|
-
@connection.should_receive(:send_message).with("You are not authorized to post messages")
|
96
|
-
@connection.process_message("abstract")
|
97
|
-
end
|
98
|
-
end
|
99
|
-
it "#send_message should call #send_data with hashed form of message" do
|
100
|
-
@connection.should_receive(:send_data).with({:type => :message, :body => "abstract"})
|
101
|
-
@connection.send_message("abstract")
|
102
|
-
end
|
103
|
-
it "#send_data should send message by socket in json format" do
|
104
|
-
@connection.socket.stub!(:send)
|
105
|
-
@connection.socket.should_receive(:send).with({:test => "abstract"}.to_json)
|
106
|
-
@connection.send(:send_data, {:test => "abstract"})
|
107
|
-
end
|
108
|
-
it "#disconnect should close connection after writing" do
|
109
|
-
@connection.socket.stub!(:close_connection_after_writing)
|
110
|
-
@connection.socket.should_receive(:close_connection_after_writing)
|
111
|
-
@connection.disconnect
|
112
|
-
end
|
113
|
-
context "#add_to_pool" do
|
114
|
-
it "should add self to class connection list if self isn't already on list or self isn't admin" do
|
115
|
-
@connection.stub!(:admin).and_return(false)
|
116
|
-
@connection.send(:add_to_pool)
|
117
|
-
described_class.connections.should include(@connection)
|
118
|
-
described_class.connections.should have(1).item
|
119
|
-
end
|
120
|
-
it "should not add self to class connection list if self is already on it" do
|
121
|
-
described_class.connections << @connection
|
122
|
-
described_class.connections.should have(1).item
|
123
|
-
@connection.stub!(:admin).and_return(false)
|
124
|
-
@connection.send(:add_to_pool)
|
125
|
-
described_class.connections.should include(@connection)
|
126
|
-
described_class.connections.should have(1).item
|
127
|
-
end
|
128
|
-
it "should not add self to class connection list if self is admin" do
|
129
|
-
@connection.stub!(:admin).and_return(true)
|
130
|
-
@connection.send(:add_to_pool)
|
131
|
-
described_class.connections.should_not include(@connection)
|
132
|
-
end
|
133
|
-
end
|
134
|
-
it "#remove_from_pool should delete self from class connection list" do
|
135
|
-
described_class.connections << @connection
|
136
|
-
described_class.connections.should have(1).item
|
137
|
-
@connection.send(:remove_from_pool)
|
138
|
-
described_class.connections.should_not include(@connection)
|
139
|
-
described_class.connections.should have(0).items
|
140
|
-
end
|
141
|
-
it "#to_json should return self as hash of object_id, client_id and channels" do
|
142
|
-
@connection.socket.request["Query"]["client_id"] = "abstract"
|
143
|
-
@connection.socket.request["Query"]["channels"] = "first,second,third"
|
144
|
-
json = @connection.to_json
|
145
|
-
JSON.parse(json).should eql({ "id" => @connection.object_id,
|
146
|
-
"client_id" => @connection.client,
|
147
|
-
"channels" => @connection.channels})
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
end
|
data/spec/socky/message_spec.rb
DELETED
@@ -1,102 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Socky::Message do
|
4
|
-
before(:each) do
|
5
|
-
@connection = mock(:connection, :name => "connection", :send_message => nil)
|
6
|
-
end
|
7
|
-
|
8
|
-
context "class" do
|
9
|
-
context "#process" do
|
10
|
-
before(:each) { @message = mock(:message, :process => nil) }
|
11
|
-
it "should create new instance of self with provided params" do
|
12
|
-
described_class.stub!(:new).and_return(@message)
|
13
|
-
described_class.should_receive(:new).with(@connection, "test")
|
14
|
-
described_class.process(@connection, "test")
|
15
|
-
end
|
16
|
-
it "should send #process to instance if valid message" do
|
17
|
-
described_class.stub!(:new).and_return(@message)
|
18
|
-
@message.should_receive(:process)
|
19
|
-
described_class.process(@connection, "test")
|
20
|
-
end
|
21
|
-
it "should rescue from error if creating instance raise error" do
|
22
|
-
described_class.stub!(:new).and_raise(Socky::SockyError)
|
23
|
-
lambda{ described_class.process(@connection, "test") }.should_not raise_error
|
24
|
-
end
|
25
|
-
it "should rescue from error if parsing instance raise error" do
|
26
|
-
@message.stub!(:process).and_raise(Socky::SockyError)
|
27
|
-
described_class.stub!(:new).and_return(@message)
|
28
|
-
lambda{ described_class.process(@connection, "test") }.should_not raise_error
|
29
|
-
end
|
30
|
-
end
|
31
|
-
context "#new" do
|
32
|
-
it "should create message with provided creator and message is message is JSON hash" do
|
33
|
-
message = described_class.new(@connection, {:test => true}.to_json)
|
34
|
-
message.params.should eql(:test => true)
|
35
|
-
message.creator.should eql(@connection)
|
36
|
-
end
|
37
|
-
it "should raise error if message is not JSON" do
|
38
|
-
lambda{described_class.new(@connection, {:test => true})}.should raise_error Socky::SockyError
|
39
|
-
lambda{described_class.new(@connection, "test")}.should raise_error Socky::SockyError
|
40
|
-
end
|
41
|
-
it "should raise error if message is JSON but not JSON hash" do
|
42
|
-
lambda{described_class.new(@connection, "test".to_json)}.should raise_error Socky::SockyError
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
context "instance" do
|
48
|
-
before(:each) { @message = described_class.new(@connection, {}.to_json) }
|
49
|
-
context "#process" do
|
50
|
-
before(:each) do
|
51
|
-
@message.stub!(:send_message)
|
52
|
-
end
|
53
|
-
it "should raise error if message command is nil" do
|
54
|
-
@message.stub!(:params).and_return({:command => nil})
|
55
|
-
lambda {@message.process}.should raise_error(Socky::SockyError, "unknown command")
|
56
|
-
end
|
57
|
-
it "should raise error if message command is neither :broadcast nor :query" do
|
58
|
-
@message.stub!(:params).and_return({:command => :invalid})
|
59
|
-
lambda {@message.process}.should raise_error(Socky::SockyError, "unknown command")
|
60
|
-
end
|
61
|
-
it "should not distinguish between string and symbol in command" do
|
62
|
-
@message.stub!(:params).and_return({:command => 'broadcast'})
|
63
|
-
lambda {@message.process}.should_not raise_error(Socky::SockyError, "unknown command")
|
64
|
-
end
|
65
|
-
context ":broadcast" do
|
66
|
-
it "should select target connections basing on params" do
|
67
|
-
@message.stub!(:params).and_return({:command => :broadcast, :some => :abstract})
|
68
|
-
Socky::Connection.should_receive(:find).with(:some => :abstract)
|
69
|
-
@message.process
|
70
|
-
end
|
71
|
-
it "should send_message with message body and connection list" do
|
72
|
-
@message.stub!(:params).and_return({:command => :broadcast, :body => "some message"})
|
73
|
-
Socky::Connection.stub!(:find).and_return(["first","second"])
|
74
|
-
@message.should_receive(:send_message).with("some message", ["first", "second"])
|
75
|
-
@message.process
|
76
|
-
end
|
77
|
-
end
|
78
|
-
context ":query" do
|
79
|
-
it "should raise error if query type is nil" do
|
80
|
-
@message.stub!(:params).and_return(:command => :query, :type => nil)
|
81
|
-
lambda{ @message.process }.should raise_error(Socky::SockyError, "unknown query type")
|
82
|
-
end
|
83
|
-
it "should raise error if query type is invalid" do
|
84
|
-
@message.stub!(:params).and_return(:command => :query, :type => :invalid)
|
85
|
-
lambda{ @message.process }.should raise_error(Socky::SockyError, "unknown query type")
|
86
|
-
end
|
87
|
-
it "should not distinguish between string and symbol in command" do
|
88
|
-
@message.stub!(:params).and_return({:command => :query, :type => "show_connections"})
|
89
|
-
lambda {@message.process}.should_not raise_error(Socky::SockyError, "unknown query type")
|
90
|
-
end
|
91
|
-
context "=> :show_connections" do
|
92
|
-
it "should return current connection list to creator" do
|
93
|
-
@message.stub!(:params).and_return(:command => :query, :type => :show_connections)
|
94
|
-
Socky::Connection.stub!(:find_all).and_return(["find results"])
|
95
|
-
@connection.should_receive(:send_message).with(["find results"])
|
96
|
-
@message.process
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
data/spec/socky/misc_spec.rb
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Socky::Misc do
|
4
|
-
include Socky::Misc
|
5
|
-
|
6
|
-
shared_examples_for "socky_misc" do
|
7
|
-
it "#option should return Socky.options" do
|
8
|
-
Socky.stub!(:options).and_return({:test => true})
|
9
|
-
@object.options.should eql({:test => true})
|
10
|
-
end
|
11
|
-
it "#options= should set Socky.options" do
|
12
|
-
default_options = Socky.options
|
13
|
-
begin
|
14
|
-
Socky.options = {}
|
15
|
-
@object.options = {:test => true}
|
16
|
-
Socky.options.should eql({:test => true})
|
17
|
-
ensure
|
18
|
-
Socky.options = default_options
|
19
|
-
end
|
20
|
-
end
|
21
|
-
it "#name should return self formatted name" do
|
22
|
-
@object.name.should eql("#{@object.class.to_s.split("::").last}(#{@object.object_id})")
|
23
|
-
end
|
24
|
-
it "#log_path should return Socky.log_path" do
|
25
|
-
Socky.stub!(:log_path).and_return("abstract")
|
26
|
-
@object.log_path.should eql("abstract")
|
27
|
-
end
|
28
|
-
it "#config_path should return Socky.config_path" do
|
29
|
-
Socky.stub!(:config_path).and_return("abstract")
|
30
|
-
@object.config_path.should eql("abstract")
|
31
|
-
end
|
32
|
-
it "#info should send joined args to Socky.logger.info" do
|
33
|
-
Socky.logger.stub!(:info)
|
34
|
-
Socky.logger.should_receive(:info).with("first second third")
|
35
|
-
@object.info(["first","second","third"])
|
36
|
-
end
|
37
|
-
it "#debug should send joined args to Socky.logger.debug" do
|
38
|
-
Socky.logger.stub!(:debug)
|
39
|
-
Socky.logger.should_receive(:debug).with("first second third")
|
40
|
-
@object.debug(["first","second","third"])
|
41
|
-
end
|
42
|
-
it "#error should send self name and error message to self.debug" do
|
43
|
-
@object.stub!(:debug)
|
44
|
-
error = mock(:abstract_error, :class => "AbstractError", :message => "abstract")
|
45
|
-
@object.should_receive(:debug).with([@object.name,"raised:","AbstractError","abstract"])
|
46
|
-
@object.error(@object.name, error)
|
47
|
-
end
|
48
|
-
context "#symbolize_keys" do
|
49
|
-
it "return args if args are not hash" do
|
50
|
-
@object.symbolize_keys("abstract").should eql("abstract")
|
51
|
-
end
|
52
|
-
it "return hash with symbolized keys if args is hash" do
|
53
|
-
hash = {"aaa" => "a", 123 => "b"}
|
54
|
-
@object.symbolize_keys(hash).should eql({:aaa => "a", 123 => "b"})
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
context "class" do
|
60
|
-
before(:each) do
|
61
|
-
@object = self.class
|
62
|
-
end
|
63
|
-
it_should_behave_like "socky_misc"
|
64
|
-
end
|
65
|
-
|
66
|
-
context "instance" do
|
67
|
-
before(:each) do
|
68
|
-
@object = self
|
69
|
-
end
|
70
|
-
it_should_behave_like "socky_misc"
|
71
|
-
end
|
72
|
-
|
73
|
-
end
|
74
|
-
|
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Socky::NetRequest do
|
4
|
-
|
5
|
-
context "class" do
|
6
|
-
context "#post" do
|
7
|
-
it "should send EventMachine::HttpRequest to url" do
|
8
|
-
EventMachine::HttpRequest.should_receive(:new).with("some url")
|
9
|
-
described_class.post("some url")
|
10
|
-
end
|
11
|
-
it "should send EventMachine::HttpRequest post request with specified params" do
|
12
|
-
request = mock(:request)
|
13
|
-
EventMachine::HttpRequest.stub!(:new).and_return(request)
|
14
|
-
request.should_receive(:post).with({:body => {:test => true}, :timeout => 3})
|
15
|
-
described_class.post("some url", :test => true)
|
16
|
-
end
|
17
|
-
it "should rescue from EM::HttpRequest and return false" do
|
18
|
-
EM.run do
|
19
|
-
described_class.post("inexistent").should be_false
|
20
|
-
EM.stop
|
21
|
-
end
|
22
|
-
end
|
23
|
-
it "should call block with false if request return status other than 200" do
|
24
|
-
EM.run do
|
25
|
-
described_class.post("http://127.0.0.1:8765/fail") do |response|
|
26
|
-
response.should be_false
|
27
|
-
EM.stop
|
28
|
-
end.should be_true
|
29
|
-
end
|
30
|
-
end
|
31
|
-
it "should call block with true if request return status 200" do
|
32
|
-
EM.run do
|
33
|
-
described_class.post("http://127.0.0.1:8765/") do |response|
|
34
|
-
response.should be_true
|
35
|
-
EM.stop
|
36
|
-
end.should be_true
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
FILES_DIR = File.join(File.dirname(__FILE__), '..', '..', 'files')
|
4
|
-
|
5
|
-
describe Socky::Options::Config do
|
6
|
-
|
7
|
-
context "class" do
|
8
|
-
before(:each) do
|
9
|
-
described_class.stub!(:puts)
|
10
|
-
end
|
11
|
-
|
12
|
-
context "#read" do
|
13
|
-
it "should raise error if file doesn't exists" do
|
14
|
-
described_class.should_receive(:puts).with("You must generate a config file (socky -g filename.yml)")
|
15
|
-
lambda { described_class.read("abstract") }.should raise_error SystemExit
|
16
|
-
end
|
17
|
-
it "should raise error if file is corrupted" do
|
18
|
-
described_class.should_receive(:puts).with("Provided config file is invalid.")
|
19
|
-
lambda { described_class.read(FILES_DIR + "/invalid.yml") }.should raise_error SystemExit
|
20
|
-
end
|
21
|
-
it "should not raise error if :kill option is provided" do
|
22
|
-
described_class.should_not_receive(:puts).with("Provided config file is invalid.")
|
23
|
-
lambda { described_class.read(FILES_DIR + "/invalid.yml", :kill => true) }.should_not raise_error SystemExit
|
24
|
-
end
|
25
|
-
it "should return valid options if file is valid" do
|
26
|
-
lambda { described_class.read(FILES_DIR + "/default.yml") }.should_not raise_error SystemExit
|
27
|
-
described_class.read(FILES_DIR + "/default.yml").should eql(default_options)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
context "#generate" do
|
32
|
-
it "should raise error if file exists" do
|
33
|
-
described_class.should_receive(:puts).with("Config file already exists. You must remove it before generating a new one.")
|
34
|
-
lambda { described_class.generate(FILES_DIR + "/invalid.yml") }.should raise_error SystemExit
|
35
|
-
end
|
36
|
-
it "should raise error if path is not valid" do
|
37
|
-
described_class.should_receive(:puts).with("Config file is unavailable - please choose another.")
|
38
|
-
lambda { described_class.generate("/proc/inexistent") }.should raise_error SystemExit
|
39
|
-
end
|
40
|
-
it "should create file and exit if path is valid" do
|
41
|
-
path = FILES_DIR + "/inexistent.yml"
|
42
|
-
begin
|
43
|
-
described_class.should_receive(:puts).with("Config file generated at #{path}")
|
44
|
-
lambda { described_class.generate(path) }.should raise_error SystemExit
|
45
|
-
ensure
|
46
|
-
FileUtils.rm(path, :force => true)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
it "should generate file that after parsing will equal default config" do
|
50
|
-
path = FILES_DIR + "/inexistent.yml"
|
51
|
-
begin
|
52
|
-
described_class.should_receive(:puts).with("Config file generated at #{path}")
|
53
|
-
lambda { described_class.generate(path) }.should raise_error SystemExit
|
54
|
-
lambda { described_class.read(path) }.should_not raise_error SystemExit
|
55
|
-
described_class.read(path).should eql(default_options)
|
56
|
-
ensure
|
57
|
-
FileUtils.rm(path, :force => true)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def default_options
|
64
|
-
{
|
65
|
-
:port => 8080,
|
66
|
-
:debug => false,
|
67
|
-
:secret => "my_secret_key",
|
68
|
-
:secure => false
|
69
|
-
}
|
70
|
-
end
|
71
|
-
|
72
|
-
end
|
@@ -1,76 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Socky::Options::Parser do
|
4
|
-
|
5
|
-
context "class" do
|
6
|
-
context "#parse" do
|
7
|
-
before(:each) do
|
8
|
-
described_class.stub!(:puts)
|
9
|
-
end
|
10
|
-
|
11
|
-
it "should return empty hash on empty array" do
|
12
|
-
described_class.parse([]).should eql({})
|
13
|
-
end
|
14
|
-
it "should inform about inexistent option and exit" do
|
15
|
-
described_class.should_receive(:puts).with("invalid option: -z")
|
16
|
-
lambda { described_class.parse(["-z"]) }.should raise_error SystemExit
|
17
|
-
end
|
18
|
-
it "on -g or --generate should set config_path and generate default config file in specified destination" do
|
19
|
-
Socky::Options::Config.stub!(:generate)
|
20
|
-
["-g","--generate"].each do |function|
|
21
|
-
Socky::Options::Config.should_receive(:generate).with("/tmp/socky.yml")
|
22
|
-
described_class.parse([function,"/tmp/socky.yml"]).should eql({:config_path => "/tmp/socky.yml"})
|
23
|
-
end
|
24
|
-
end
|
25
|
-
it "on -c or --config should set config_path to provided path" do
|
26
|
-
["-c","--config"].each do |function|
|
27
|
-
described_class.parse([function,"/tmp/socky.yml"]).should eql({:config_path => "/tmp/socky.yml"})
|
28
|
-
end
|
29
|
-
end
|
30
|
-
it "on -p or --port should set port" do
|
31
|
-
["-p","--port"].each do |function|
|
32
|
-
described_class.parse([function,"222"]).should eql({:port => 222})
|
33
|
-
end
|
34
|
-
end
|
35
|
-
it "on -s or --secure should set secure mode on" do
|
36
|
-
["-s","--secure"].each do |function|
|
37
|
-
described_class.parse([function]).should eql({:secure => true})
|
38
|
-
end
|
39
|
-
end
|
40
|
-
it "on -P or --pid should set pid_path to provided path" do
|
41
|
-
["-P","--pid"].each do |function|
|
42
|
-
described_class.parse([function,"/tmp/socky.pid"]).should eql({:pid_path => "/tmp/socky.pid"})
|
43
|
-
end
|
44
|
-
end
|
45
|
-
it "on -d or --daemon should set daemon mode on" do
|
46
|
-
["-d","--daemon"].each do |function|
|
47
|
-
described_class.parse([function]).should eql({:daemonize => true})
|
48
|
-
end
|
49
|
-
end
|
50
|
-
it "on -l or --log should set log_path to provided path" do
|
51
|
-
["-l","--log"].each do |function|
|
52
|
-
described_class.parse([function,"/tmp/socky.log"]).should eql({:log_path => "/tmp/socky.log"})
|
53
|
-
end
|
54
|
-
end
|
55
|
-
it "on --debug should set debug to true" do
|
56
|
-
described_class.parse(["--debug"]).should eql({:debug => true})
|
57
|
-
end
|
58
|
-
it "on --deep-debug should set debug and deep_debug to true" do
|
59
|
-
described_class.parse(["--deep-debug"]).should eql({:debug => true, :deep_debug => true})
|
60
|
-
end
|
61
|
-
it "on -? or --help should display usage" do
|
62
|
-
["-?","--help"].each do |function|
|
63
|
-
described_class.should_receive(:puts).with(/Usage: socky \[options\]/)
|
64
|
-
lambda { described_class.parse([function]) }.should raise_error SystemExit
|
65
|
-
end
|
66
|
-
end
|
67
|
-
it "on -v or --version should dosplay current version" do
|
68
|
-
["-v","--version"].each do |function|
|
69
|
-
described_class.should_receive(:puts).with("Socky #{Socky::VERSION}")
|
70
|
-
lambda { described_class.parse([function]) }.should raise_error SystemExit
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|