snarl-snp 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,22 @@
1
+ # -*- coding:utf-8 -*-
2
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
3
+ require 'snarl/snp'
4
+ require 'rubygems'
5
+ require 'webmock'
6
+
7
+ html = File.open(File.join(File.dirname(__FILE__), 'data', 'weather_yahoo_co_jp.html')){|f| f.read}
8
+ WebMock.stub_request(:get, 'http://weather.yahoo.co.jp/weather/jp/1b/1400.html').to_return(:body => html)
9
+
10
+ require 'open-uri'
11
+ #p open('http://weather.yahoo.co.jp/weather/jp/1b/1400.html').read
12
+ describe "Show weathercast of Sapporo, Japan" do
13
+ it "do" do
14
+ lambda{
15
+ argv = ARGV.dup
16
+ ARGV.clear # spec -fs -v yahoo_weather_spec.rb #=> ARGV[0] == '-fs'
17
+ ARGV[0] = Snarl::SNP::Config.host
18
+ load File.expand_path(File.dirname(__FILE__) + '../../../exsample/yahoo_weather.rb')
19
+ ARGV.concat(argv)
20
+ }.should_not raise_error
21
+ end
22
+ end
@@ -0,0 +1,198 @@
1
+ # -*- coding:utf-8 -*-
2
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
3
+
4
+ describe "SNP" do
5
+
6
+ before :all do
7
+ @host = '192.168.0.2'
8
+ @port = 9887
9
+ @app = Snarl::SNP::DEFAULT_TITLE
10
+ @class = '1'
11
+ Snarl::SNP::Config.reset
12
+ end
13
+
14
+ describe "#register" do
15
+ it "everything goes well" do
16
+ lambda{
17
+ Snarl::SNP.open(@host, @port) do |snp|
18
+ snp.register(@app)
19
+ snp.unregister(@app)
20
+ end
21
+ }.should_not raise_error
22
+ end
23
+ it "twice raises error on verbose" do
24
+ Snarl::SNP.open(@host, @port) do |snp|
25
+ snp.verbose = true
26
+ snp.register(@app)
27
+ lambda{snp.register(@app)}.should raise_error(Snarl::SNP::Error::SNP_ERROR_ALREADY_REGISTERED)
28
+ snp.unregister(@app)
29
+ end
30
+ Snarl::SNP.open(@host, @port) do |snp|
31
+ snp.register(@app)
32
+ lambda{snp.register(@app)}.should_not raise_error(Snarl::SNP::Error::SNP_ERROR_ALREADY_REGISTERED)
33
+ snp.unregister(@app)
34
+ end
35
+ end
36
+ end
37
+
38
+ describe "#unregister" do
39
+ # it "everything goes well" is done in #register
40
+ it "unregister before register raises error on verbose" do
41
+ Snarl::SNP.open(@host, @port) do |snp|
42
+ snp.verbose = true
43
+ lambda{snp.unregister(@app)}.should raise_error(Snarl::SNP::Error::SNP_ERROR_NOT_REGISTERED)
44
+ end
45
+ Snarl::SNP.open(@host, @port) do |snp|
46
+ lambda{snp.unregister(@app)}.should_not raise_error(Snarl::SNP::Error::SNP_ERROR_NOT_REGISTERED)
47
+ end
48
+ end
49
+ end
50
+
51
+ describe "#add_class" do
52
+ it "everything goes well" do
53
+ lambda{
54
+ Snarl::SNP.open(@host, @port) do |snp|
55
+ snp.register(@app)
56
+ snp.add_class(@class)
57
+ snp.unregister(@app)
58
+ end
59
+ }.should_not raise_error
60
+ end
61
+ it "add same class raises error on verbose" do
62
+ Snarl::SNP.open(@host, @port) do |snp|
63
+ snp.verbose = true
64
+ snp.register(@app)
65
+ snp.add_class(@class)
66
+ lambda{snp.add_class(@class)}.should raise_error(Snarl::SNP::Error::SNP_ERROR_CLASS_ALREADY_EXISTS)
67
+ snp.unregister(@app)
68
+ end
69
+ Snarl::SNP.open(@host, @port) do |snp|
70
+ snp.register(@app)
71
+ snp.add_class(@class)
72
+ lambda{snp.add_class(@app)}.should_not raise_error(Snarl::SNP::Error::SNP_ERROR_CLASS_ALREADY_EXISTS)
73
+ snp.unregister(@app)
74
+ end
75
+ end
76
+ end
77
+
78
+ describe "#notification" do
79
+ it "sends title, text, icon, timeout, class" do
80
+ Snarl::SNP.open(@host) do |snp|
81
+ snp.register(@app)
82
+ snp.add_class(@class)
83
+ res = snp.notification('tit', 'tex(4 no icon popups)', 'ico', 9, 'cls')
84
+ expected = "type=SNP#?version=1.0#?action=notification#?app=Ruby-Snarl#?class=cls#?title=tit#?text=tex(4 no icon popups)#?timeout=9#?icon=ico\r\n"
85
+ res.request.to_s.should eql(expected)
86
+ end
87
+ end
88
+ it "sends keyword-hash, keys=[:title, :text, :icon, :timeout, :class]" do
89
+ Snarl::SNP.open(@host) do |snp|
90
+ snp.register(@app)
91
+ snp.add_class(@class)
92
+ res = snp.notification(:title => 'tit', :text => 'tex', :icon => 'ico', :timeout => 9, :class => 'cls')
93
+ expected = "type=SNP#?version=1.0#?action=notification#?app=Ruby-Snarl#?class=cls#?title=tit#?text=tex#?timeout=9#?icon=ico\r\n"
94
+ res.request.to_s.should eql(expected)
95
+ end
96
+ end
97
+ it "sends 'anonymous' message if not registered yet" do
98
+ Snarl::SNP.open(@host) do |snp|
99
+ res = snp.notification('tit', 'tex', 'ico', 9)
100
+ expected = "type=SNP#?version=1.0#?action=notification#?title=tit#?text=tex#?timeout=9#?icon=ico\r\n"
101
+ res.request.to_s.should eql(expected)
102
+ end
103
+ end
104
+ it "sends 'anonymous' message if keyhash has {:app => nil} pair" do
105
+ Snarl::SNP.open(@host) do |snp|
106
+ res = snp.notification(:app => nil, :title => 'tit', :text => 'tex', :icon => 'ico', :timeout => 9)
107
+ expected = "type=SNP#?version=1.0#?action=notification#?title=tit#?text=tex#?timeout=9#?icon=ico\r\n"
108
+ res.request.to_s.should eql(expected)
109
+ end
110
+ end
111
+ end
112
+
113
+ describe "#hello" do
114
+ it "returns Snarl release identifier" do
115
+ Snarl::SNP.open(@host) do |snp|
116
+ snp.hello.infomation.should match(/\ASnarl /)
117
+ end
118
+ end
119
+ end
120
+
121
+ describe "#version" do
122
+ it "returns Snarl (inner) version" do
123
+ Snarl::SNP.open(@host) do |snp|
124
+ snp.version.infomation.should match(/[\d\.]+/)
125
+ end
126
+ end
127
+ end
128
+
129
+ describe "#normalize_notification_params" do
130
+ before do
131
+ @snp = Snarl::SNP.new
132
+ @default_title = Snarl::SNP::DEFAULT_TITLE
133
+ @default_timeout = Snarl::SNP::DEFAULT_TIMEOUT
134
+ end
135
+ def normalize_notification_params(param)
136
+ @snp.__send__(:normalize_notification_params, param)
137
+ end
138
+
139
+ it "['text'] returns {:title => DEFAULT_TITLE, :text => 'text', :timeout => DEFAULT_TIMEOUT}" do
140
+ params = ['text']
141
+ expected = {:action => 'notification', :title => @default_title, :text => "text", :timeout => @default_timeout}
142
+ normalize_notification_params(params).should eql(expected)
143
+ end
144
+ it "['text'] returns {:title => snp.title, :text => 'text', :timeout => DEFAULT_TIMEOUT}, when snp.title is set" do
145
+ params = ['text']
146
+ snp = Snarl::SNP.new
147
+ snp.title = 'snp.title'
148
+ expected = {:action => 'notification', :title => 'snp.title', :text => "text", :timeout => @default_timeout}
149
+ snp.__send__(:normalize_notification_params, params).should eql(expected)
150
+ end
151
+ it "['text', 9] returns {:title => DEFAULT_TITLE, :text => 'text', :timeout => 9}" do
152
+ params = ['text', 9]
153
+ expected = {:action => 'notification', :title => @default_title, :text => "text", :timeout => 9}
154
+ normalize_notification_params(params).should eql(expected)
155
+ end
156
+ it "['text', 9] returns {:title => snp.title, :text => 'text', :timeout => 9}, when snp.title is set" do
157
+ params = ['text', 9]
158
+ snp = Snarl::SNP.new
159
+ snp.title = 'snp.title'
160
+ expected = {:action => 'notification', :title => 'snp.title', :text => "text", :timeout => 9}
161
+ snp.__send__(:normalize_notification_params, params).should eql(expected)
162
+ end
163
+ it "['title', 'text', 9] returns {:title => 'title', :text => 'text', :timeout => 9}" do
164
+ params = ['title', 'text', 9]
165
+ expected = {:action => 'notification', :title => 'title', :text => 'text', :timeout => 9}
166
+ normalize_notification_params(params).should eql(expected)
167
+ end
168
+ it "[1,2,3,4,5,6,7] returns {:title, :text, :icon, :timeout, :class, :action, :app} Hash" do
169
+ timeout = 9
170
+ params = ['title', 'text', 'icon', timeout, 'class', 'action', 'app']
171
+ expected = {:action => 'notification', :title => 'title', :text => 'text', :icon => 'icon', :timeout => timeout,
172
+ :class => 'class', :app => 'app'}
173
+ normalize_notification_params(params).should eql(expected)
174
+ end
175
+ it "[1,2,3,4,nil,nil,nil] returns {:title, :text, :icon, :timeout} Hash. nil-value key is omitted" do
176
+ timeout = 9
177
+ params = ['title', 'text', 'icon', timeout, nil, nil, nil]
178
+ expected = {:action => 'notification', :title => 'title', :text => 'text', :icon => 'icon', :timeout => timeout}
179
+ normalize_notification_params(params).should eql(expected)
180
+ end
181
+ it "when already registered, app is @app" do
182
+ params = [{:text => 'text'}]
183
+ snp = Snarl::SNP.new
184
+ snp.instance_variable_set(:@app, 'app')
185
+ expected = {:action => 'notification', :app => 'app', :title => @default_title, :text => "text", :timeout => @default_timeout}
186
+ snp.__send__(:normalize_notification_params, params).should eql(expected)
187
+ end
188
+ it "if @app is :anonymous, app is nil" do
189
+ params = [{:text => 'text'}]
190
+ snp = Snarl::SNP.new
191
+ snp.instance_variable_set(:@app, :anonymous)
192
+ expected = {:action => 'notification', :app => nil, :title => @default_title, :text => "text", :timeout => @default_timeout}
193
+ snp.__send__(:normalize_notification_params, params).should eql(expected)
194
+ end
195
+
196
+ end
197
+ end
198
+
@@ -0,0 +1,53 @@
1
+ # -*- coding:utf-8 -*-
2
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
3
+
4
+ describe "Config" do
5
+
6
+ before do
7
+ Snarl::SNP::Config.reset
8
+ end
9
+
10
+ describe ".host=" do
11
+ it "set host into String" do
12
+ Snarl::SNP::Config.host = 1234
13
+ Snarl::SNP::Config.host.should eql('1234')
14
+ end
15
+ it "set nil, returns default" do
16
+ config = Snarl::SNP::Config.new
17
+ Snarl::SNP::Config.host = nil
18
+ Snarl::SNP::Config.host.should eql(Snarl::SNP::Config::DEFAULT_HOST)
19
+ end
20
+ end
21
+
22
+ describe ".port=" do
23
+ it "set port into Integer" do
24
+ Snarl::SNP::Config.port = '9887'
25
+ Snarl::SNP::Config.port.should eql(9887)
26
+ end
27
+ it "set nil, returns default" do
28
+ Snarl::SNP::Config.port = nil
29
+ Snarl::SNP::Config.port.should eql(Snarl::SNP::Config::DEFAULT_PORT)
30
+ end
31
+ end
32
+
33
+ # describe ".load_snp_config" do
34
+
35
+ # before do
36
+ # @yaml = Tempfile.new('rubysnarlsnpconfigspec')
37
+ # end
38
+ # after do
39
+ # @yaml.close
40
+ # end
41
+
42
+ # it "read yaml from argument path" do
43
+ # host = '192.168.0.2'
44
+ # port = 9887
45
+ # @yaml.write("host : #{host}\nport : #{port}")
46
+ # @yaml.close
47
+ # config = Snarl::SNP::Config.load_snp_config(@yaml.path)
48
+ # config.host.should eql(host)
49
+ # config.port.should eql(port) # YAML.load('9887') #=> Integer
50
+ # end
51
+ # end
52
+
53
+ end
@@ -0,0 +1,72 @@
1
+ # -*- coding:utf-8 -*-
2
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
3
+
4
+ describe "Request" do
5
+
6
+ describe "normalize_action" do
7
+ def normalize_action(action)
8
+ Snarl::SNP::Request.new.__send__(:normalize_action, action)
9
+ end
10
+ it "returns action String, add-class is add_class" do
11
+ normalize_action('register').should eql('register')
12
+ normalize_action('add-class').should eql('add_class')
13
+ end
14
+ end
15
+
16
+ describe "#[]=" do
17
+ it "set commands with []=" do
18
+ req = Snarl::SNP::Request.new
19
+ req[:action] = 'register'
20
+ req['app'] = 'Just Testing...'
21
+ expected = {"app"=>"Just Testing...", :action =>"register"}
22
+ req.commands.should eql(expected)
23
+ end
24
+ end
25
+
26
+ describe "#normalize" do
27
+ it "normalize" do
28
+ cmd_hash = {
29
+ :action => 'add-class',
30
+ :app => "Just \r\nTesting\r\n...",
31
+ 'tiTLe' => nil,
32
+ :cLASS => '1'
33
+ }
34
+ req = Snarl::SNP::Request.new(cmd_hash)
35
+ req.__send__(:normalize)
36
+ expected = {"app"=>"Just \nTesting\n...", "class"=>"1", "action"=>"add_class", "type"=>"SNP", "version"=>"1.0"}
37
+ req.commands.should eql(expected)
38
+ end
39
+ end
40
+
41
+ describe "#to_s" do
42
+ it "is sendable string" do
43
+ action = :notification
44
+ cmds = {
45
+ :action => action,
46
+ :app => 'Just Testing...',
47
+ :class => '1',
48
+ :title => 'Hello',
49
+ :text => 'World!',
50
+ :timeout => 10
51
+ }
52
+ req = Snarl::SNP::Request.new(cmds)
53
+ extepted = "type=SNP#?version=1.0#?action=notification#?app=Just Testing...#?class=1#?title=Hello#?text=World!#?timeout=10\r\n"
54
+ req.to_s.should eql(extepted)
55
+ end
56
+ end
57
+
58
+ describe ".build" do
59
+ it "makes Request Object" do
60
+ action = :add_class
61
+ cmds = {
62
+ :action => action,
63
+ :app => 'Just Testing...',
64
+ :class => '1',
65
+ :title => '1 is one'
66
+ }
67
+ req = Snarl::SNP::Request.new(cmds)
68
+ extepted = "type=SNP#?version=1.0#?action=add_class#?app=Just Testing...#?class=1#?title=1 is one\r\n"
69
+ req.to_s.should eql(extepted)
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,96 @@
1
+ # -*- coding:utf-8 -*-
2
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
3
+
4
+ describe "Response" do
5
+
6
+ before do
7
+ @res = 'SNP/1.0/0/OK/1234'
8
+ end
9
+
10
+ describe "initialize" do
11
+ it "parse string" do
12
+ Snarl::SNP::Response.new(@res).instance_variable_get(:@response).should eql(@res)
13
+ end
14
+ it "parse getable obj" do
15
+ socket = Object.new
16
+ socket.stub!(:get).and_return(@res)
17
+ Snarl::SNP::Response.new(socket).instance_variable_get(:@response).should eql(@res)
18
+ end
19
+ end
20
+
21
+ describe "#parse_response" do
22
+ it "raise error when unparsable response" do
23
+ lambda{
24
+ Snarl::SNP::Response.new("SNP/1.0/zerozero/Oops!\r\n")
25
+ }.should raise_error(Snarl::SNP::Error::RUBYSNARL_UNKNOWN_RESPONSE)
26
+ end
27
+ end
28
+
29
+ describe "#code" do
30
+ it "SNP1.1 response code(3rd block) on non-error-response is String '0'" do
31
+ Snarl::SNP::Response.new(@res).code.should eql('0')
32
+ end
33
+ it "other response code" do
34
+ begin
35
+ Snarl::SNP::Response.new("SNP/1.1/203/Application is already registered\r\n")
36
+ rescue Snarl::SNP::Error::SNP_ERROR_ALREADY_REGISTERED => ex
37
+ ex.response.code.should eql('203')
38
+ end
39
+ end
40
+ end
41
+
42
+ describe "#message" do
43
+ it "SNP1.1 respnse message(4th block) on non-error-response is 'OK'" do
44
+ Snarl::SNP::Response.new(@res).message.should eql('OK')
45
+ end
46
+ it "no 5th block response" do
47
+ begin
48
+ Snarl::SNP::Response.new("SNP/1.1/203/Application is already registered\r\n")
49
+ rescue Snarl::SNP::Error::SNP_ERROR_ALREADY_REGISTERED => ex
50
+ ex.response.message.should eql('Application is already registered')
51
+ end
52
+ end
53
+ end
54
+
55
+ describe "#infomation" do
56
+ it "SNP1.1 response infomation(5th opptional block) on non-error-notification-response is integer str" do
57
+ Snarl::SNP::Response.new(@res).infomation.should eql('1234')
58
+ end
59
+ it "no 5th block response, returns nil" do
60
+ begin
61
+ Snarl::SNP::Response.new("SNP/1.1/203/Application is already registered\r\n")
62
+ rescue Snarl::SNP::Error::SNP_ERROR_ALREADY_REGISTERED => ex
63
+ ex.response.infomation.should be_nil
64
+ end
65
+ end
66
+ end
67
+
68
+ describe "#error" do
69
+ it "returns Snarl::SNP::Error class" do
70
+ Snarl::SNP::Response.new(@res).error.should eql(Snarl::SNP::Error::SNP_OK)
71
+ begin
72
+ Snarl::SNP::Response.new("SNP/1.0/204/Class is already registered\r\n")
73
+ rescue Snarl::SNP::Error::SNP_ERROR_CLASS_ALREADY_EXISTS => ex
74
+ ex.response.error.should eql(Snarl::SNP::Error::SNP_ERROR_CLASS_ALREADY_EXISTS)
75
+ end
76
+ end
77
+ end
78
+
79
+ describe "#ok?" do
80
+ it "returns true when OK response" do
81
+ Snarl::SNP::Response.new(@res).should be_ok
82
+ end
83
+ end
84
+
85
+ describe "#to_s" do
86
+ it "to_s is response code" do
87
+ Snarl::SNP::Response.new(@res).to_s.should eql('0')
88
+ end
89
+ end
90
+
91
+ describe "#inspect" do
92
+ it "inspect is response string itself" do
93
+ Snarl::SNP::Response.new(@res).inspect.should eql(@res)
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,265 @@
1
+ # -*- coding:utf-8 -*-
2
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
3
+
4
+ describe "SNP" do
5
+
6
+ before :all do
7
+ @host = '192.168.0.2'
8
+ @port = 9887
9
+ @app = Snarl::SNP::DEFAULT_TITLE
10
+ @class = '1'
11
+ Snarl::SNP::Config.reset
12
+ end
13
+
14
+ describe "initialize" do
15
+ it "new('192.168.0.2', 9887). (snarl_working_machine_host, snarl_port_9887)" do
16
+ host, port, verbose = '192.168.0.2', 9887, true
17
+ snp = Snarl::SNP.new(host, port, verbose)
18
+ snp.instance_variable_get(:@host).should eql(host)
19
+ snp.instance_variable_get(:@port).should eql(port)
20
+ snp.verbose.should eql(verbose)
21
+ end
22
+ it "default host is 127.0.0.1, default port is 9887. when SNP.new()" do
23
+ snp = Snarl::SNP.new
24
+ snp.instance_variable_get(:@host).should eql(nil)
25
+ snp.instance_variable_get(:@port).should eql(nil)
26
+ snp.verbose.should eql(false)
27
+ end
28
+ end
29
+
30
+ describe "#request" do
31
+ describe "send raw string" do
32
+ before :all do
33
+ @register ="type=SNP#?version=1.0#?action=register#?app=#{@app}\r\n"
34
+ @add_class = "type=SNP#?version=1.0#?action=add_class#?app=#{@app}#?class=#{@class}\r\n"
35
+ @notification = "type=SNP#?version=1.0#?action=notification#?app=#{@app}#?title=Raw!#?text=raw message!#?timeout=10\r\n"
36
+ @unregister = "type=SNP#?version=1.0#?action=unregister#?app=#{@app}\r\n"
37
+ end
38
+
39
+ it "raises error according to SNP#verbose" do
40
+ Snarl::SNP.open(@host, @port) do |snp|
41
+ lambda{
42
+ snp.request(@register)
43
+ snp.request(@register)
44
+ }.should_not raise_error(Snarl::SNP::Error::SNP_ERROR_ALREADY_REGISTERED)
45
+ end
46
+ Snarl::SNP.open(@host, @port) do |snp|
47
+ snp.verbose = true
48
+ lambda{
49
+ snp.request(@register)
50
+ snp.request(@register)
51
+ }.should raise_error(Snarl::SNP::Error::SNP_ERROR_ALREADY_REGISTERED)
52
+ end
53
+ end
54
+
55
+ it "sends command text" do
56
+ lambda{
57
+ Snarl::SNP.open(@host, @port) do |snp|
58
+ begin
59
+ snp.request(@register)
60
+ rescue Snarl::SNP::Error::SNP_ERROR_ALREADY_REGISTERED
61
+ end
62
+ begin
63
+ snp.request(@add_class)
64
+ rescue Snarl::SNP::Error::SNP_ERROR_CLASS_ALREADY_EXISTS
65
+ end
66
+ snp.request(@notification)
67
+ snp.request(@unregister)
68
+ end
69
+ }.should_not raise_error
70
+ end
71
+ end
72
+ describe "send hash" do
73
+ before :each do
74
+ @register = {
75
+ :action => 'register',
76
+ :app => @app
77
+ }
78
+ @add_class = {
79
+ :app => @app,
80
+ :action => 'add_class',
81
+ :class => @class
82
+ }
83
+ @notification = {
84
+ :app => @app,
85
+ :action => 'notification',
86
+ :class => @class,
87
+ :title => 'command!',
88
+ :text => 'Hashed message!',
89
+ :timeout => 10
90
+ }
91
+ @unregister = {
92
+ :action => 'unregister',
93
+ :app => @app
94
+ }
95
+ end
96
+
97
+ it "raises error according to SNP#verbose" do
98
+ Snarl::SNP.open(@host, @port) do |snp|
99
+ lambda{
100
+ snp.request(@register)
101
+ snp.request(@register)
102
+ }.should_not raise_error(Snarl::SNP::Error::SNP_ERROR_ALREADY_REGISTERED)
103
+ end
104
+ Snarl::SNP.open(@host, @port) do |snp|
105
+ snp.verbose = true
106
+ lambda{
107
+ snp.request(@register)
108
+ snp.request(@register)
109
+ }.should raise_error(Snarl::SNP::Error::SNP_ERROR_ALREADY_REGISTERED)
110
+ end
111
+ end
112
+
113
+ it "sends command Hash" do
114
+ lambda{
115
+ Snarl::SNP.open(@host, @port) do |snp|
116
+ begin
117
+ snp.request(@register)
118
+ rescue Snarl::SNP::Error::SNP_ERROR_ALREADY_REGISTERED
119
+ end
120
+ begin
121
+ snp.request(@add_class)
122
+ rescue Snarl::SNP::Error::SNP_ERROR_CLASS_ALREADY_EXISTS
123
+ end
124
+ snp.request(@notification)
125
+ snp.request(@unregister)
126
+ end
127
+ }.should_not raise_error
128
+ end
129
+ end
130
+ end
131
+
132
+ describe "#add_classes" do
133
+ it "adds two class pair like [['class1', 'one'], ['class2', 'two']]" do
134
+ classes = [['1', 'one'], ['2', 'two']]
135
+ lambda{
136
+ Snarl::SNP.open(@host, @port) do |snp|
137
+ snp.register(@app)
138
+ snp.add_classes(classes)
139
+ snp.notification('First class', '1!', nil, 4, '1')
140
+ snp.notification('Second class', '2!', nil, 4, '2')
141
+ snp.unregister(@app)
142
+ end
143
+ }.should_not raise_error
144
+ end
145
+ end
146
+
147
+ describe "#snarl_hello" do
148
+ it "returns Snarl release identifier string without popup" do
149
+ Snarl::SNP.open(@host) do |snp|
150
+ snp.snarl_hello.should match(/\ASnarl /)
151
+ end
152
+ end
153
+ end
154
+
155
+ describe "#snarl_version" do
156
+ it "returns Snarl (inner) version string without popup" do
157
+ Snarl::SNP.open(@host) do |snp|
158
+ snp.snarl_version.should match(/[\d\.]+/)
159
+ end
160
+ end
161
+ end
162
+
163
+ describe "#iconset" do
164
+ it "set icon using" do
165
+ iconset = {:red => 'red.jpg', :blue => 'blue.jpg'}
166
+ Snarl::SNP.open(@host, @port) do |snp|
167
+ snp.register(@app)
168
+ snp.iconset(iconset)
169
+ snp.notification('icon!', 'icon1!', :red, 1).request.to_s.should match(/icon=red\.jpg/)
170
+ snp.notification('icon!', 'icon2!', :blue, 1).request.to_s.should match(/icon=blue\.jpg/)
171
+ end
172
+ end
173
+ end
174
+
175
+ describe ".ping" do
176
+ it "ping!" do
177
+ lambda{Snarl::SNP.ping(@host)}.should_not raise_error
178
+ end
179
+ it "no host ping!" do
180
+ Snarl::SNP::Config.host = @host
181
+ lambda{Snarl::SNP.ping(nil)}.should_not raise_error
182
+ end
183
+ end
184
+
185
+ describe ".open{|snp| ...}" do
186
+ it "supplies Snarl::SNP object block" do
187
+ Snarl::SNP.open(@host, @port) do |snp|
188
+ snp.notification('hello!', 10) # TODO: default timeout
189
+ end
190
+ end
191
+ end
192
+
193
+ describe ".show_message" do
194
+ it "show_message(host, port, title, text, timeout, icon) shows popup message" do
195
+ lambda{Snarl::SNP.show_message(@host, @port, 'snp_spec', 'test mesage', 2, nil)}.should_not raise_error
196
+ end
197
+ it "show_message(host, text) shows popup message with ease" do
198
+ lambda{Snarl::SNP.show_message(@host, 'short mesage')}.should_not raise_error
199
+ end
200
+ end
201
+
202
+ end
203
+
204
+ describe "SNP1.1 feature" do
205
+ # NOTE: With "type=SNP#?version=1.0" also works on Snarl R2.21. wow.
206
+
207
+ before :all do
208
+ @host = '192.168.0.2'
209
+ @port = 9887
210
+ @app = Snarl::SNP::DEFAULT_TITLE
211
+ @class = '1'
212
+ end
213
+
214
+ # Supports notification feedback forwarding in the form of 3xx codes sent to the remote application's port.
215
+ ## How test?
216
+
217
+ describe "new action" do
218
+
219
+ describe "action=hello receives Snarl release identifier (i.e. Snarl R2.21)." do
220
+ it "type=SNP#?version=1.1#?action=hello\\r\\n" do
221
+ Snarl::SNP.open(@host) do |snp|
222
+ res = snp.request("type=SNP#?version=1.1#?action=hello\r\n")
223
+ res.inspect.should match(/\ASNP\/1.1\/0\/OK\/Snarl /)
224
+ end
225
+ end
226
+ end
227
+
228
+ describe "action=version receives Snarl (inner) version (i.e. 40.15)" do
229
+ it "type=SNP#?version=1.1#?action=version\\r\\n" do
230
+ Snarl::SNP.open(@host) do |snp|
231
+ res = snp.request("type=SNP#?version=1.1#?action=version\r\n")
232
+ res.inspect.should match(/\ASNP\/1.1\/0\/OK\/[\d\.]+\Z/)
233
+ end
234
+ end
235
+ end
236
+
237
+ end
238
+
239
+ describe "notification returns notification token value." do
240
+ it "counter?" do
241
+ Snarl::SNP.open(@host) do |snp|
242
+ snp.register(@app)
243
+ snp.add_class(@class)
244
+ res = snp.request("type=SNP#?version=1.1#?action=notification#?app=#{@app}#?title=1.1!#?text=val!#?timeout=2\r\n")
245
+ res.inspect.should match(/\ASNP\/1.1\/0\/OK\/\d+\Z/)
246
+ snp.unregister(@class)
247
+ end
248
+ end
249
+ end
250
+
251
+ # describe "notification icon path can be URL" do
252
+ # it "use Google News Icon" do
253
+ # lambda{
254
+ # Snarl::SNP.open(@host) do |snp|
255
+ # snp.register(@app)
256
+ # snp.add_class(@class)
257
+ # icon = 'http://www.google.com/images/newspaper.gif'
258
+ # res = snp.request("type=SNP#?version=1.1#?action=notification#?app=#{@app}#?title=1.1!#?text=Google News!!#?timeout=4#?icon=#{icon}\r\n")
259
+ # snp.unregister(@class)
260
+ # end
261
+ # }.should_not raise_error
262
+ # end
263
+ # end
264
+ end
265
+