sbsm 1.3.0 → 1.3.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.
- checksums.yaml +4 -4
- data/.gitignore +5 -0
- data/.travis.yml +2 -3
- data/Gemfile +1 -10
- data/History.txt +14 -0
- data/README.md +7 -2
- data/Rakefile +29 -2
- data/lib/cgi/drbsession.rb +4 -2
- data/lib/sbsm.rb +31 -0
- data/lib/sbsm/app.rb +112 -0
- data/lib/sbsm/cgi.rb +2 -52
- data/lib/sbsm/drb.rb +2 -1
- data/lib/sbsm/drbserver.rb +20 -16
- data/lib/sbsm/exception.rb +2 -2
- data/lib/sbsm/index.rb +2 -1
- data/lib/sbsm/logger.rb +46 -0
- data/lib/sbsm/lookandfeel.rb +2 -2
- data/lib/sbsm/lookandfeelfactory.rb +2 -2
- data/lib/sbsm/lookandfeelwrapper.rb +2 -1
- data/lib/sbsm/redirector.rb +4 -3
- data/lib/sbsm/session.rb +61 -67
- data/lib/sbsm/state.rb +16 -21
- data/lib/sbsm/time.rb +2 -0
- data/lib/sbsm/trans_handler.rb +82 -49
- data/lib/sbsm/turing.rb +2 -1
- data/lib/sbsm/user.rb +2 -0
- data/lib/sbsm/validator.rb +2 -0
- data/lib/sbsm/version.rb +1 -1
- data/lib/sbsm/viralstate.rb +2 -0
- data/sbsm.gemspec +4 -2
- data/test/simple_sbsm.rb +207 -0
- data/test/suite.rb +5 -2
- data/test/test_application.rb +122 -0
- data/test/test_logger.rb +121 -0
- data/test/test_session.rb +26 -17
- data/test/test_trans_handler.rb +167 -386
- metadata +67 -3
- data/lib/sbsm/request.rb +0 -234
data/test/suite.rb
CHANGED
@@ -3,8 +3,11 @@
|
|
3
3
|
require 'simplecov'
|
4
4
|
|
5
5
|
$: << File.dirname(File.expand_path(__FILE__))
|
6
|
-
SimpleCov.start
|
7
|
-
|
6
|
+
SimpleCov.start do
|
7
|
+
add_filter "/test/"
|
8
|
+
add_filter "/gems/"
|
9
|
+
end
|
10
|
+
require 'sbsm/logger'
|
8
11
|
Dir.foreach(File.dirname(__FILE__)) do |file|
|
9
12
|
if /^test_.*\.rb$/o.match(file)
|
10
13
|
require file
|
@@ -0,0 +1,122 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
$: << File.dirname(__FILE__)
|
4
|
+
$:.unshift File.expand_path('../lib', File.dirname(__FILE__))
|
5
|
+
|
6
|
+
ENV['RACK_ENV'] = 'test'
|
7
|
+
ENV['REQUEST_METHOD'] = 'GET'
|
8
|
+
|
9
|
+
require 'minitest/autorun'
|
10
|
+
require 'rack/test'
|
11
|
+
require 'sbsm/app'
|
12
|
+
require 'simple_sbsm'
|
13
|
+
require 'nokogiri'
|
14
|
+
begin
|
15
|
+
require 'pry'
|
16
|
+
rescue LoadError
|
17
|
+
end
|
18
|
+
|
19
|
+
class MyTest < MiniTest::Unit::TestCase
|
20
|
+
include Rack::Test::Methods
|
21
|
+
|
22
|
+
def setup
|
23
|
+
SBSM.info msg = "Starting #{SERVER_URI}"
|
24
|
+
DRb.start_service(SERVER_URI, Demo::SimpleSBSM.new)
|
25
|
+
sleep(0.1)
|
26
|
+
end
|
27
|
+
def teardown
|
28
|
+
DRb.stop_service
|
29
|
+
end
|
30
|
+
def app
|
31
|
+
Demo::SimpleSBSM.new
|
32
|
+
end
|
33
|
+
def test_post_feedback
|
34
|
+
get '/de/page' do # needed to set cookie
|
35
|
+
last_response.set_cookie SBSM::App::PERSISTENT_COOKIE_NAME, :value => "demo_cookie"
|
36
|
+
end
|
37
|
+
get '/de/page/feedback' do
|
38
|
+
last_response.set_cookie SBSM::App::PERSISTENT_COOKIE_NAME, :value => "second_cookie"
|
39
|
+
end
|
40
|
+
assert last_response.ok?
|
41
|
+
skip 'We must add here an input form or we cannot continue testing'
|
42
|
+
assert_match FEEDBACK_HTML_CONTENT, last_response.body
|
43
|
+
page = Nokogiri::HTML(last_response.body)
|
44
|
+
x = page.css('div')
|
45
|
+
assert page.css('input').find{|x| x.attributes['name'].value.eql?('state_id') }.attributes['value'].value
|
46
|
+
state_id = page.css('input').find{|x| x.attributes['name'].value.eql?('state_id') }.attributes['value'].value.to_i
|
47
|
+
assert state_id > 0
|
48
|
+
post '/de/page/feedback', { 'anrede' => 'Herr', 'msg' => 'SBSM rocks!' , 'state_id' => '1245'}
|
49
|
+
assert last_response.ok?
|
50
|
+
assert last_response.headers['Content-Length'].to_s.length > 0
|
51
|
+
assert_match CONFIRM_HTML_CONTENT, last_response.body
|
52
|
+
post '/de/page/feedback', { 'confirm' => 'true', 'anrede' => 'Herr', 'msg' => 'SBSM rocks!' }
|
53
|
+
assert last_response.ok?
|
54
|
+
assert_match CONFIRM_DONE_HTML_CONTENT, last_response.body
|
55
|
+
end
|
56
|
+
if false
|
57
|
+
def test_session_home
|
58
|
+
get '/home'
|
59
|
+
assert last_response.ok?
|
60
|
+
assert_match /^request_path is \/home$/, last_response.body
|
61
|
+
assert_match HOME_HTML_CONTENT, last_response.body
|
62
|
+
assert_match /utf-8/i, last_response.headers['Content-Type']
|
63
|
+
end
|
64
|
+
def test_css_file
|
65
|
+
css_content = "html { max-width: 960px; margin: 0 auto; }"
|
66
|
+
css_file = File.join('doc/sbsm.css')
|
67
|
+
FileUtils.makedirs(File.dirname(css_file))
|
68
|
+
unless File.exist?(css_file)
|
69
|
+
File.open(css_file, 'w+') do |file|
|
70
|
+
file.puts css_content
|
71
|
+
end
|
72
|
+
end
|
73
|
+
get '/sbsm.css'
|
74
|
+
assert last_response.ok?
|
75
|
+
assert_match css_content, last_response.body
|
76
|
+
end
|
77
|
+
def test_session_about_then_home
|
78
|
+
get '/de/page/about'
|
79
|
+
assert last_response.ok?
|
80
|
+
assert_match /^About SBSM: TDD ist great!/, last_response.body
|
81
|
+
get '/home'
|
82
|
+
assert last_response.ok?
|
83
|
+
assert_match HOME_HTML_CONTENT, last_response.body
|
84
|
+
end
|
85
|
+
def test_default_content_from_home
|
86
|
+
test_path = '/default_if_no_such_path'
|
87
|
+
get test_path
|
88
|
+
assert last_response.ok?
|
89
|
+
assert_match /^#{HOME_HTML_CONTENT}/, last_response.body
|
90
|
+
assert_match HOME_HTML_CONTENT, last_response.body
|
91
|
+
assert_match /^request_path is /, last_response.body
|
92
|
+
assert_match test_path, last_response.body
|
93
|
+
end
|
94
|
+
def test_session_id_is_maintained
|
95
|
+
get '/'
|
96
|
+
assert last_response.ok?
|
97
|
+
body = last_response.body.clone
|
98
|
+
assert_match /^request_path is \/$/, body
|
99
|
+
assert_match /member_counter is 1$/, body
|
100
|
+
assert_match HOME_HTML_CONTENT, body
|
101
|
+
m = /class_counter is (\d+)$/.match(body)
|
102
|
+
counter = m[1]
|
103
|
+
assert_match /class_counter is (\d+)$/, body
|
104
|
+
# Getting the request a second time must increment the class, but not the member counter
|
105
|
+
get '/'
|
106
|
+
assert last_response.ok?
|
107
|
+
body = last_response.body.clone
|
108
|
+
assert_match /^request_path is \/$/, body
|
109
|
+
assert_match /member_counter is 1$/, body
|
110
|
+
assert_match /class_counter is #{counter.to_i+1}$/, body
|
111
|
+
end
|
112
|
+
def test_session_home_then_fr_about
|
113
|
+
get '/home'
|
114
|
+
assert last_response.ok?
|
115
|
+
assert_match /^request_path is \/home$/, last_response.body
|
116
|
+
assert_match HOME_HTML_CONTENT, last_response.body
|
117
|
+
get '/fr/page/about'
|
118
|
+
assert last_response.ok?
|
119
|
+
assert_match ABOUT_HTML_CONTENT, last_response.body
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
data/test/test_logger.rb
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
#--
|
4
|
+
#
|
5
|
+
# State Based Session Management
|
6
|
+
# Copyright (C) 2004 Hannes Wyss
|
7
|
+
#
|
8
|
+
# This library is free software; you can redistribute it and/or
|
9
|
+
# modify it under the terms of the GNU Lesser General Public
|
10
|
+
# License as published by the Free Software Foundation; either
|
11
|
+
# version 2.1 of the License, or (at your option) any later version.
|
12
|
+
#
|
13
|
+
# This library is distributed in the hope that it will be useful,
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
16
|
+
# Lesser General Public License for more details.
|
17
|
+
#
|
18
|
+
# You should have received a copy of the GNU Lesser General Public
|
19
|
+
# License along with this library; if not, write to the Free Software
|
20
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
21
|
+
#
|
22
|
+
# ywesee - intellectual capital connected, Winterthurerstrasse 52, CH-8006 Zürich, Switzerland
|
23
|
+
# hwyss@ywesee.com
|
24
|
+
#
|
25
|
+
# TestSession -- sbsm -- 22.10.2002 -- hwyss@ywesee.com
|
26
|
+
#++
|
27
|
+
|
28
|
+
require 'minitest/autorun'
|
29
|
+
require 'fileutils'
|
30
|
+
require 'sbsm/logger'
|
31
|
+
begin
|
32
|
+
require 'pry'
|
33
|
+
rescue LoadError
|
34
|
+
end
|
35
|
+
class TestLogger < Minitest::Test
|
36
|
+
def setup
|
37
|
+
@saved_loger = SBSM.logger.clone
|
38
|
+
@default_name = Time.now.strftime("/tmp/sbsm_#{SBSM::VERSION}.log.%Y%m%d")
|
39
|
+
FileUtils.rm_f(@default_name)
|
40
|
+
# we reload the logger class as it initializes the logger to a default value
|
41
|
+
load 'sbsm/logger.rb'
|
42
|
+
assert(File.exist?(@default_name))
|
43
|
+
end
|
44
|
+
def teardown
|
45
|
+
SBSM.logger= @saved_loger
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_default_levels
|
49
|
+
saved_length = File.size(@default_name)
|
50
|
+
SBSM.debug("debug #{__LINE__}")
|
51
|
+
assert_equal(saved_length, File.size(@default_name))
|
52
|
+
SBSM.info("info #{__LINE__}")
|
53
|
+
assert_equal(saved_length, File.size(@default_name))
|
54
|
+
|
55
|
+
SBSM.logger.level = :info
|
56
|
+
SBSM.info("info #{__LINE__}")
|
57
|
+
assert(saved_length < File.size(@default_name))
|
58
|
+
saved_length = File.size(@default_name)
|
59
|
+
SBSM.debug("debug #{__LINE__}")
|
60
|
+
saved_length = File.size(@default_name)
|
61
|
+
|
62
|
+
SBSM.logger.level = :debug
|
63
|
+
SBSM.info("info #{__LINE__}")
|
64
|
+
assert(saved_length < File.size(@default_name))
|
65
|
+
saved_length = File.size(@default_name)
|
66
|
+
SBSM.debug("debug #{__LINE__}")
|
67
|
+
assert(saved_length < File.size(@default_name))
|
68
|
+
|
69
|
+
saved_length = File.size(@default_name)
|
70
|
+
SBSM.logger.level = :warn
|
71
|
+
SBSM.info("info #{__LINE__}")
|
72
|
+
SBSM.debug("debug #{__LINE__}")
|
73
|
+
assert_equal(saved_length, File.size(@default_name))
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_change_logger
|
77
|
+
new_name = '/tmp/sbsm_test_log'
|
78
|
+
FileUtils.rm_f(new_name)
|
79
|
+
assert_equal(false, File.exist?(new_name))
|
80
|
+
SBSM.logger= Logger.new(new_name)
|
81
|
+
assert_equal(true, File.exist?(new_name))
|
82
|
+
saved_length = File.size(new_name)
|
83
|
+
|
84
|
+
default_saved_length = File.size(@default_name)
|
85
|
+
SBSM.debug("debug #{__LINE__}")
|
86
|
+
SBSM.info("info #{__LINE__}")
|
87
|
+
assert_equal(default_saved_length, File.size(@default_name))
|
88
|
+
assert_equal(true, File.exist?(new_name))
|
89
|
+
|
90
|
+
SBSM.logger.level = :info
|
91
|
+
SBSM.info("info #{__LINE__}")
|
92
|
+
assert(saved_length < File.size(new_name))
|
93
|
+
saved_length = File.size(new_name)
|
94
|
+
SBSM.debug("debug #{__LINE__}")
|
95
|
+
saved_length = File.size(new_name)
|
96
|
+
|
97
|
+
SBSM.logger.level = :debug
|
98
|
+
SBSM.info("info #{__LINE__}")
|
99
|
+
assert(saved_length < File.size(new_name))
|
100
|
+
saved_length = File.size(new_name)
|
101
|
+
SBSM.debug("debug #{__LINE__}")
|
102
|
+
assert(saved_length < File.size(new_name))
|
103
|
+
|
104
|
+
saved_length = File.size(new_name)
|
105
|
+
SBSM.logger.level = :warn
|
106
|
+
SBSM.info("info #{__LINE__}")
|
107
|
+
SBSM.debug("debug #{__LINE__}")
|
108
|
+
assert_equal(saved_length, File.size(new_name))
|
109
|
+
assert_equal(default_saved_length, File.size(@default_name))
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_nil_logger
|
113
|
+
default_saved_length = File.size(@default_name)
|
114
|
+
SBSM.logger= nil
|
115
|
+
assert_equal(default_saved_length, File.size(@default_name))
|
116
|
+
SBSM.debug("debug #{__LINE__}")
|
117
|
+
SBSM.info("info #{__LINE__}")
|
118
|
+
assert_equal(default_saved_length, File.size(@default_name))
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
data/test/test_session.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# encoding: utf-8
|
3
|
+
#--
|
3
4
|
#
|
4
5
|
# State Based Session Management
|
5
6
|
# Copyright (C) 2004 Hannes Wyss
|
@@ -22,10 +23,12 @@
|
|
22
23
|
# hwyss@ywesee.com
|
23
24
|
#
|
24
25
|
# TestSession -- sbsm -- 22.10.2002 -- hwyss@ywesee.com
|
26
|
+
#++
|
25
27
|
|
26
28
|
require 'minitest/autorun'
|
27
29
|
require 'sbsm/session'
|
28
|
-
|
30
|
+
require 'rack'
|
31
|
+
require 'rack/test'
|
29
32
|
|
30
33
|
class StubSessionUnknownUser
|
31
34
|
end
|
@@ -54,16 +57,9 @@ class StubSessionValidator
|
|
54
57
|
false
|
55
58
|
end
|
56
59
|
end
|
57
|
-
class StubSessionRequest <
|
58
|
-
|
59
|
-
|
60
|
-
self
|
61
|
-
end
|
62
|
-
def cookies
|
63
|
-
{}
|
64
|
-
end
|
65
|
-
def request_method
|
66
|
-
'GET'
|
60
|
+
class StubSessionRequest < Rack::Request
|
61
|
+
def initialize(path='')
|
62
|
+
super(Rack::MockRequest.env_for("http://example.com:8080/#{path}", {}))
|
67
63
|
end
|
68
64
|
end
|
69
65
|
class StubSessionView
|
@@ -131,11 +127,24 @@ class StubSessionSession < SBSM::Session
|
|
131
127
|
end
|
132
128
|
|
133
129
|
class TestSession < Minitest::Test
|
130
|
+
include Rack::Test::Methods
|
134
131
|
def setup
|
135
132
|
@session = Session.new("test", StubSessionApp.new, StubSessionValidator.new)
|
136
133
|
@request = StubSessionRequest.new
|
137
134
|
@state = StubSessionState.new(@session, nil)
|
138
135
|
end
|
136
|
+
def test_user_input_hash
|
137
|
+
@request["hash[1]"] = "4"
|
138
|
+
@request["hash[2]"] = "5"
|
139
|
+
@request["hash[3]"] = "6"
|
140
|
+
@session.process(@request)
|
141
|
+
hash = @session.user_input(:hash)
|
142
|
+
assert_equal(Hash, hash.class)
|
143
|
+
assert_equal(3, hash.size)
|
144
|
+
assert_equal("4", hash["1"])
|
145
|
+
assert_equal("5", hash["2"])
|
146
|
+
assert_equal("6", hash["3"])
|
147
|
+
end
|
139
148
|
def test_attended_states_store
|
140
149
|
@session.process(@request)
|
141
150
|
state = @session.state
|
@@ -206,7 +215,7 @@ class TestSession < Minitest::Test
|
|
206
215
|
state.object_id => state,
|
207
216
|
}
|
208
217
|
@session.active_state = @state
|
209
|
-
@request.store('state_id', state.object_id.next)
|
218
|
+
# @request.params.store('state_id', state.object_id.next)
|
210
219
|
@session.process(@request)
|
211
220
|
assert_equal(@state, @session.active_state)
|
212
221
|
end
|
@@ -221,7 +230,7 @@ class TestSession < Minitest::Test
|
|
221
230
|
state.object_id => state,
|
222
231
|
}
|
223
232
|
@session.state = @state
|
224
|
-
@request.store('state_id', state.object_id)
|
233
|
+
@request.params.store('state_id', state.object_id)
|
225
234
|
@session.process(@request)
|
226
235
|
assert_equal(state, @session.active_state)
|
227
236
|
end
|
@@ -231,12 +240,12 @@ class TestSession < Minitest::Test
|
|
231
240
|
state.volatile = volatile
|
232
241
|
@session.active_state = state
|
233
242
|
@session.state = state
|
234
|
-
@request.store('event', :volatile)
|
243
|
+
@request.params.store('event', :volatile)
|
235
244
|
newstate = @session.process(@request)
|
236
245
|
assert_equal(:volatile, @session.event)
|
237
246
|
assert_equal(volatile, @session.state)
|
238
247
|
assert_equal(state, @session.active_state)
|
239
|
-
@request.store('event', :foo)
|
248
|
+
@request.params.store('event', :foo)
|
240
249
|
newstate = @session.process(@request)
|
241
250
|
assert_equal(state.foo, @session.state)
|
242
251
|
assert_equal(state.foo, @session.active_state)
|
@@ -321,8 +330,8 @@ class TestSession < Minitest::Test
|
|
321
330
|
}
|
322
331
|
@session.state = @state
|
323
332
|
expected = state.foo
|
324
|
-
@request.store('state_id', state.object_id)
|
325
|
-
@request.store('event', :foo)
|
333
|
+
@request.params.store('state_id', state.object_id)
|
334
|
+
@request.params.store('event', :foo)
|
326
335
|
@session.process(@request)
|
327
336
|
assert_equal(expected, @session.state)
|
328
337
|
assert_equal(expected, @session.attended_states[expected.object_id])
|
data/test/test_trans_handler.rb
CHANGED
@@ -6,434 +6,215 @@ $: << File.dirname(__FILE__)
|
|
6
6
|
$:.unshift File.expand_path('../lib', File.dirname(__FILE__))
|
7
7
|
|
8
8
|
require 'minitest/autorun'
|
9
|
+
require 'rack/request'
|
9
10
|
require 'sbsm/trans_handler'
|
11
|
+
require 'sbsm/logger'
|
10
12
|
require 'cgi'
|
11
13
|
require 'fileutils'
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
+
def fake_request_for_path(path='/')
|
16
|
+
Rack::Request.new(Rack::MockRequest.env_for("http://example.com:8080#{path}", {}))
|
15
17
|
end
|
18
|
+
|
16
19
|
module SBSM
|
17
|
-
class TestTransHandler < Minitest::Test
|
18
|
-
class RequestStub
|
19
|
-
attr_accessor :uri, :notes, :server
|
20
|
-
end
|
21
|
-
class ServerStub
|
22
|
-
attr_accessor :document_root
|
23
|
-
def log_notice(fmt, *args)
|
24
|
-
end
|
25
|
-
def log_warn(*args)
|
26
|
-
warn(args.join(' - '))
|
27
|
-
end
|
28
|
-
end
|
29
|
-
class NotesStub < Hash
|
30
|
-
alias :add :store
|
31
|
-
end
|
32
|
-
def setup
|
33
|
-
@doc_root = File.expand_path('data/htdoc', File.dirname(__FILE__))
|
34
|
-
@etc_path = File.expand_path('../etc', @doc_root)
|
35
|
-
@doc_root.taint
|
36
|
-
end
|
37
|
-
def teardown
|
38
|
-
FileUtils.rm_r(@etc_path) if(File.exist?(@etc_path))
|
39
|
-
end
|
40
|
-
def test_parser_name
|
41
|
-
assert_equal('uri', TransHandler.instance.parser_name)
|
42
|
-
end
|
43
|
-
def test_translate_uri
|
44
|
-
request = RequestStub.new
|
45
|
-
request.server = ServerStub.new
|
46
20
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
21
|
+
class TestTransHandler < Minitest::Test
|
22
|
+
def setup
|
23
|
+
@config_file = File.expand_path('../etc/trans_handler.yml', File.dirname(__FILE__))
|
24
|
+
end
|
25
|
+
def teardown
|
26
|
+
FileUtils.rm_f(@config_file) if File.exist?(@config_file)
|
27
|
+
end
|
28
|
+
def test_parser_name
|
29
|
+
assert_equal('uri', TransHandler.instance.parser_name)
|
30
|
+
end
|
31
|
+
def test_translate_uri
|
32
|
+
request = fake_request_for_path '/'
|
33
|
+
TransHandler.instance.translate_uri(request)
|
34
|
+
assert_equal({}, request.params)
|
35
|
+
assert_equal('/index.rbx', request.uri)
|
52
36
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
assert_equal('/index.rbx', request.uri)
|
37
|
+
request = fake_request_for_path '/fr'
|
38
|
+
TransHandler.instance.translate_uri(request)
|
39
|
+
assert_equal({'language' => 'fr'}, request.params)
|
40
|
+
assert_equal('/index.rbx', request.uri)
|
58
41
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
assert_equal('/index.rbx', request.uri)
|
42
|
+
request = fake_request_for_path '/en/'
|
43
|
+
TransHandler.instance.translate_uri(request)
|
44
|
+
assert_equal({'language' => 'en'}, request.params)
|
45
|
+
assert_equal('/index.rbx', request.uri)
|
64
46
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
'language' => 'de',
|
47
|
+
request = fake_request_for_path '/de/search/state_id/407422388/search_query/ponstan'
|
48
|
+
TransHandler.instance.translate_uri(request)
|
49
|
+
expected = {
|
50
|
+
'language' => 'de',
|
70
51
|
'flavor' => 'search',
|
71
52
|
'event' => 'state_id',
|
72
53
|
"407422388"=>"search_query",
|
73
54
|
'ponstan'=> '',
|
74
|
-
|
75
|
-
assert_equal(expected, request.
|
76
|
-
|
55
|
+
}
|
56
|
+
assert_equal(expected, request.params)
|
57
|
+
assert_equal('/index.rbx', request.uri)
|
77
58
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
'language' => 'de',
|
59
|
+
request = fake_request_for_path '/de/search/state_id/407422388/search_query/ponstan/page/4'
|
60
|
+
TransHandler.instance.translate_uri(request)
|
61
|
+
expected = {
|
62
|
+
'language' => 'de',
|
83
63
|
'flavor' => 'search',
|
84
64
|
'event' => 'state_id',
|
85
65
|
"407422388"=>"search_query",
|
86
66
|
'ponstan'=> 'page',
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
67
|
+
'4' => '',
|
68
|
+
}
|
69
|
+
assert_equal(expected, request.params)
|
70
|
+
assert_equal('/index.rbx', request.uri)
|
91
71
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
'language' => 'de',
|
72
|
+
request = fake_request_for_path '/de/search/pretty//state_id/407422388/search_query/ponstan/page/4'
|
73
|
+
expected = '/index.rbx?language=de&event=search&pretty=&state_id=407422388&search_query=ponstan&page=4'
|
74
|
+
TransHandler.instance.translate_uri(request)
|
75
|
+
expected = {
|
76
|
+
'language' => 'de',
|
98
77
|
'flavor' => 'search',
|
99
78
|
'event' => 'pretty',
|
100
79
|
""=>"state_id",
|
101
80
|
"407422388"=>"search_query",
|
102
81
|
'ponstan'=> 'page',
|
103
82
|
'4' => '',
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
request.uri = '/de/search/search_query/'
|
109
|
-
request.notes = NotesStub.new
|
110
|
-
TransHandler.instance.translate_uri(request)
|
111
|
-
expected = {
|
112
|
-
'language' => 'de',
|
113
|
-
'flavor' => 'search',
|
114
|
-
'event' => 'search_query',
|
115
|
-
}
|
116
|
-
assert_equal(expected, request.notes)
|
117
|
-
assert_equal('/index.rbx', request.uri)
|
118
|
-
end
|
119
|
-
def test_translate_uri__shortcut
|
120
|
-
request = RequestStub.new
|
121
|
-
request.server = ServerStub.new
|
122
|
-
request.server.document_root = @doc_root
|
83
|
+
}
|
84
|
+
assert_equal(expected, request.params)
|
85
|
+
assert_equal('/index.rbx', request.uri)
|
123
86
|
|
124
|
-
|
125
|
-
request.notes = NotesStub.new
|
87
|
+
request = fake_request_for_path '/de/search/search_query/'
|
126
88
|
TransHandler.instance.translate_uri(request)
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
shortcut = File.join(@etc_path, 'trans_handler.yml')
|
132
|
-
File.open(shortcut, 'w') { |fh|
|
133
|
-
fh.puts <<-EOS
|
134
|
-
---
|
135
|
-
shortcut:
|
136
|
-
/somewhere:
|
137
|
-
over: the rainbow
|
138
|
-
goodbye: yellow brick road
|
139
|
-
/shortcut:
|
140
|
-
shortcut: variables
|
141
|
-
EOS
|
89
|
+
expected = {
|
90
|
+
'language' => 'de',
|
91
|
+
'flavor' => 'search',
|
92
|
+
'event' => 'search_query',
|
142
93
|
}
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
TransHandler.instance.translate_uri(request)
|
150
|
-
}.join
|
151
|
-
assert_equal({'shortcut' => 'variables'}, request.notes)
|
152
|
-
assert_equal('/index.rbx', request.uri)
|
153
|
-
|
154
|
-
request.uri = '/somewhere'
|
155
|
-
request.notes = NotesStub.new
|
156
|
-
TransHandler.instance.translate_uri(request)
|
157
|
-
expected = {
|
158
|
-
'over' => 'the rainbow',
|
159
|
-
'goodbye' => 'yellow brick road',
|
160
|
-
}
|
161
|
-
assert_equal(expected, request.notes)
|
162
|
-
assert_equal('/index.rbx', request.uri)
|
163
|
-
end
|
164
|
-
end
|
165
|
-
class TestTransHandler < Minitest::Test
|
166
|
-
class RequestStub
|
167
|
-
attr_accessor :uri, :notes, :server
|
168
|
-
end
|
169
|
-
class ServerStub
|
170
|
-
attr_accessor :document_root
|
171
|
-
def log_notice(fmt, *args)
|
172
|
-
end
|
173
|
-
def log_warn(*args)
|
174
|
-
warn(args.join(' - '))
|
175
|
-
end
|
176
|
-
end
|
177
|
-
class NotesStub < Hash
|
178
|
-
alias :add :store
|
179
|
-
end
|
180
|
-
def setup
|
181
|
-
@doc_root = File.expand_path('data/htdoc', File.dirname(__FILE__))
|
182
|
-
@etc_path = File.expand_path('../etc', @doc_root)
|
183
|
-
@doc_root.taint
|
184
|
-
end
|
185
|
-
def teardown
|
186
|
-
FileUtils.rm_r(@etc_path) if(File.exist?(@etc_path))
|
187
|
-
end
|
188
|
-
def test_translate_uri
|
189
|
-
request = RequestStub.new
|
190
|
-
request.server = ServerStub.new
|
191
|
-
|
192
|
-
request.uri = '/'
|
193
|
-
request.notes = NotesStub.new
|
194
|
-
TransHandler.instance.translate_uri(request)
|
195
|
-
assert_equal({}, request.notes)
|
196
|
-
assert_equal('/index.rbx', request.uri)
|
197
|
-
|
198
|
-
request.uri = '/fr'
|
199
|
-
request.notes = NotesStub.new
|
200
|
-
TransHandler.instance.translate_uri(request)
|
201
|
-
assert_equal({'language' => 'fr'}, request.notes)
|
202
|
-
assert_equal('/index.rbx', request.uri)
|
203
|
-
|
204
|
-
request.uri = '/en/'
|
205
|
-
request.notes = NotesStub.new
|
206
|
-
TransHandler.instance.translate_uri(request)
|
207
|
-
assert_equal({'language' => 'en'}, request.notes)
|
208
|
-
assert_equal('/index.rbx', request.uri)
|
209
|
-
|
210
|
-
request.uri = '/en/flavor'
|
211
|
-
request.notes = NotesStub.new
|
212
|
-
TransHandler.instance.translate_uri(request)
|
213
|
-
expected = {
|
214
|
-
'language'=> 'en',
|
215
|
-
'flavor' => 'flavor',
|
216
|
-
}
|
217
|
-
assert_equal(expected, request.notes)
|
218
|
-
assert_equal('/index.rbx', request.uri)
|
219
|
-
|
220
|
-
request.uri = '/en/other'
|
221
|
-
request.notes = NotesStub.new
|
222
|
-
TransHandler.instance.translate_uri(request)
|
223
|
-
expected = {
|
224
|
-
'language'=> 'en',
|
225
|
-
'flavor' => 'other',
|
226
|
-
}
|
227
|
-
assert_equal(expected, request.notes)
|
228
|
-
assert_equal('/index.rbx', request.uri)
|
229
|
-
|
230
|
-
request.uri = '/de/gcc/search/state_id/407422388/search_query/ponstan'
|
231
|
-
request.notes = NotesStub.new
|
232
|
-
TransHandler.instance.translate_uri(request)
|
233
|
-
expected = {
|
234
|
-
'language' => 'de',
|
235
|
-
'flavor' => 'gcc',
|
236
|
-
'event' => 'search',
|
237
|
-
'state_id' => '407422388',
|
238
|
-
'search_query'=> 'ponstan',
|
239
|
-
}
|
240
|
-
assert_equal(expected, request.notes)
|
241
|
-
assert_equal('/index.rbx', request.uri)
|
242
|
-
|
243
|
-
request.uri = '/de/gcc/search/state_id/407422388/search_query/ponstan/page/4'
|
244
|
-
request.notes = NotesStub.new
|
245
|
-
TransHandler.instance.translate_uri(request)
|
246
|
-
expected = {
|
247
|
-
'language' => 'de',
|
248
|
-
'flavor' => 'gcc',
|
249
|
-
'event' => 'search',
|
250
|
-
'state_id' => '407422388',
|
251
|
-
'search_query'=> 'ponstan',
|
252
|
-
'page' => '4',
|
253
|
-
}
|
254
|
-
assert_equal(expected, request.notes)
|
255
|
-
assert_equal('/index.rbx', request.uri)
|
256
|
-
|
257
|
-
request.uri = '/de/gcc/search/pretty//state_id/407422388/search_query/ponstan/page/4'
|
258
|
-
request.notes = NotesStub.new
|
259
|
-
expected = '/index.rbx?language=de&flavor=gcc&event=search&pretty=&state_id=407422388&search_query=ponstan&page=4'
|
260
|
-
TransHandler.instance.translate_uri(request)
|
261
|
-
expected = {
|
262
|
-
'language' => 'de',
|
263
|
-
'flavor' => 'gcc',
|
264
|
-
'event' => 'search',
|
265
|
-
'pretty' => '',
|
266
|
-
'state_id' => '407422388',
|
267
|
-
'search_query'=> 'ponstan',
|
268
|
-
'page' => '4',
|
269
|
-
}
|
270
|
-
assert_equal(expected, request.notes)
|
271
|
-
assert_equal('/index.rbx', request.uri)
|
272
|
-
|
273
|
-
request.uri = '/de/gcc/search/search_query/'
|
274
|
-
request.notes = NotesStub.new
|
275
|
-
TransHandler.instance.translate_uri(request)
|
276
|
-
expected = {
|
277
|
-
'language' => 'de',
|
278
|
-
'flavor' => 'gcc',
|
279
|
-
'event' => 'search',
|
280
|
-
'search_query'=> '',
|
281
|
-
}
|
282
|
-
assert_equal(expected, request.notes)
|
283
|
-
assert_equal('/index.rbx', request.uri)
|
284
|
-
end
|
285
|
-
def test_translate_uri__shortcut
|
286
|
-
request = RequestStub.new
|
287
|
-
request.server = ServerStub.new
|
288
|
-
request.server.document_root = @doc_root
|
289
|
-
|
290
|
-
request.uri = '/shortcut'
|
291
|
-
request.notes = NotesStub.new
|
94
|
+
assert_equal(expected, request.params)
|
95
|
+
assert_equal('/index.rbx', request.uri)
|
96
|
+
end
|
97
|
+
def test_translate_uri__shortcut
|
98
|
+
assert_equal false, File.exist?(@config_file)
|
99
|
+
request = fake_request_for_path '/shortcut'
|
292
100
|
TransHandler.instance.translate_uri(request)
|
293
|
-
|
294
|
-
|
101
|
+
assert_equal({}, request.params)
|
102
|
+
assert_equal('/shortcut', request.uri)
|
295
103
|
|
296
|
-
|
297
|
-
|
298
|
-
File.open(shortcut, 'w') { |fh|
|
104
|
+
FileUtils.mkdir_p(File.dirname(@config_file))
|
105
|
+
File.open(@config_file, 'w') do |fh|
|
299
106
|
fh.puts <<-EOS
|
300
|
-
---
|
107
|
+
---
|
301
108
|
shortcut:
|
302
|
-
/somewhere:
|
109
|
+
/somewhere:
|
303
110
|
over: the rainbow
|
304
111
|
goodbye: yellow brick road
|
305
|
-
/shortcut:
|
112
|
+
/shortcut:
|
306
113
|
shortcut: variables
|
307
|
-
|
308
|
-
}
|
309
|
-
|
310
|
-
request.uri = '/shortcut'
|
311
|
-
request.notes = NotesStub.new
|
312
|
-
# run in safe-mode
|
313
|
-
Thread.new {
|
314
|
-
$SAFE = 1
|
315
|
-
TransHandler.instance.translate_uri(request)
|
316
|
-
}.join
|
317
|
-
assert_equal({'shortcut' => 'variables'}, request.notes)
|
318
|
-
assert_equal('/index.rbx', request.uri)
|
319
|
-
|
320
|
-
request.uri = '/somewhere'
|
321
|
-
request.notes = NotesStub.new
|
322
|
-
TransHandler.instance.translate_uri(request)
|
323
|
-
expected = {
|
324
|
-
'over' => 'the rainbow',
|
325
|
-
'goodbye' => 'yellow brick road',
|
326
|
-
}
|
327
|
-
assert_equal(expected, request.notes)
|
328
|
-
assert_equal('/index.rbx', request.uri)
|
329
|
-
end
|
330
|
-
end
|
331
|
-
class TestTransHandler < Minitest::Test
|
332
|
-
class RequestStub
|
333
|
-
attr_accessor :uri, :notes, :server
|
334
|
-
end
|
335
|
-
class ServerStub
|
336
|
-
attr_accessor :document_root
|
337
|
-
def log_notice(fmt, *args)
|
338
|
-
end
|
339
|
-
def log_warn(*args)
|
340
|
-
warn(args.join(' - '))
|
114
|
+
EOS
|
341
115
|
end
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
116
|
+
assert_equal true, File.exist?(@config_file)
|
117
|
+
request = fake_request_for_path '/shortcut'
|
118
|
+
# run in safe-mode
|
119
|
+
Thread.new {
|
120
|
+
$SAFE = 1
|
121
|
+
TransHandler.instance.translate_uri(request)
|
122
|
+
}.join
|
123
|
+
assert_equal({'shortcut' => 'variables'}, request.params)
|
124
|
+
assert_equal('/index.rbx', request.uri)
|
125
|
+
|
126
|
+
request = fake_request_for_path '/somewhere'
|
127
|
+
TransHandler.instance.translate_uri(request)
|
128
|
+
expected = {
|
129
|
+
'over' => 'the rainbow',
|
130
|
+
'goodbye' => 'yellow brick road',
|
131
|
+
}
|
132
|
+
assert_equal(expected, request.params)
|
133
|
+
assert_equal('/index.rbx', request.uri)
|
134
|
+
end
|
135
|
+
def test_translate_uri_paths
|
136
|
+
request = fake_request_for_path '/'
|
137
|
+
TransHandler.instance.translate_uri(request)
|
138
|
+
assert_equal({}, request.params)
|
139
|
+
assert_equal('/index.rbx', request.uri)
|
363
140
|
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
assert_equal('/index.rbx', request.uri)
|
141
|
+
request = fake_request_for_path '/fr'
|
142
|
+
TransHandler.instance.translate_uri(request)
|
143
|
+
assert_equal({'language' => 'fr'}, request.params)
|
144
|
+
assert_equal('/index.rbx', request.uri)
|
369
145
|
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
assert_equal('/index.rbx', request.uri)
|
146
|
+
request = fake_request_for_path '/en/'
|
147
|
+
TransHandler.instance.translate_uri(request)
|
148
|
+
assert_equal({'language' => 'en'}, request.params)
|
149
|
+
assert_equal('/index.rbx', request.uri)
|
375
150
|
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
assert_equal('/index.rbx', request.uri)
|
151
|
+
request = fake_request_for_path '/en/flavor'
|
152
|
+
TransHandler.instance.translate_uri(request)
|
153
|
+
expected = {
|
154
|
+
'language'=> 'en',
|
155
|
+
'flavor' => 'flavor',
|
156
|
+
}
|
157
|
+
assert_equal(expected, request.params)
|
158
|
+
assert_equal('/index.rbx', request.uri)
|
385
159
|
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
assert_equal('/index.rbx', request.uri)
|
160
|
+
request = fake_request_for_path '/en/other'
|
161
|
+
TransHandler.instance.translate_uri(request)
|
162
|
+
expected = {
|
163
|
+
'language'=> 'en',
|
164
|
+
'flavor' => 'other',
|
165
|
+
}
|
166
|
+
assert_equal(expected, request.params)
|
167
|
+
assert_equal('/index.rbx', request.uri)
|
395
168
|
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
169
|
+
request = fake_request_for_path '/de/gcc/search/state_id/407422388/search_query/ponstan'
|
170
|
+
TransHandler.instance.translate_uri(request)
|
171
|
+
expected = {
|
172
|
+
'language' => 'de',
|
173
|
+
'flavor' => 'gcc',
|
174
|
+
'event' => 'search',
|
175
|
+
'state_id' => '407422388',
|
176
|
+
'search_query'=> 'ponstan',
|
177
|
+
}
|
178
|
+
assert_equal(expected, request.params)
|
179
|
+
assert_equal('/index.rbx', request.uri)
|
180
|
+
request = fake_request_for_path '/de/gcc/search/state_id/407422388/search_query/ponstan/page/4'
|
181
|
+
TransHandler.instance.translate_uri(request)
|
182
|
+
expected = {
|
183
|
+
'language' => 'de',
|
184
|
+
'flavor' => 'gcc',
|
185
|
+
'event' => 'search',
|
186
|
+
'state_id' => '407422388',
|
187
|
+
'search_query'=> 'ponstan',
|
188
|
+
'page' => '4',
|
189
|
+
}
|
190
|
+
assert_equal(expected, request.params)
|
191
|
+
assert_equal('/index.rbx', request.uri)
|
409
192
|
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
assert_equal('/index.rbx', request.uri)
|
193
|
+
request = fake_request_for_path '/de/gcc/search/pretty//state_id/407422388/search_query/ponstan/page/4'
|
194
|
+
expected = '/index.rbx?language=de&flavor=gcc&event=search&pretty=&state_id=407422388&search_query=ponstan&page=4'
|
195
|
+
TransHandler.instance.translate_uri(request)
|
196
|
+
expected = {
|
197
|
+
'language' => 'de',
|
198
|
+
'flavor' => 'gcc',
|
199
|
+
'event' => 'search',
|
200
|
+
'pretty' => '',
|
201
|
+
'state_id' => '407422388',
|
202
|
+
'search_query'=> 'ponstan',
|
203
|
+
'page' => '4',
|
204
|
+
}
|
205
|
+
assert_equal(expected, request.params)
|
206
|
+
assert_equal('/index.rbx', request.uri)
|
425
207
|
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
end
|
208
|
+
request = fake_request_for_path '/de/gcc/search/search_query/'
|
209
|
+
TransHandler.instance.translate_uri(request)
|
210
|
+
expected = {
|
211
|
+
'language' => 'de',
|
212
|
+
'flavor' => 'gcc',
|
213
|
+
'event' => 'search',
|
214
|
+
'search_query'=> '',
|
215
|
+
}
|
216
|
+
assert_equal(expected, request.params)
|
217
|
+
assert_equal('/index.rbx', request.uri)
|
218
|
+
end
|
219
|
+
end
|
439
220
|
end
|