deas 0.0.2 → 0.1.0
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/deas.gemspec +7 -1
- data/lib/deas/logger.rb +23 -0
- data/lib/deas/route.rb +45 -0
- data/lib/deas/runner.rb +30 -0
- data/lib/deas/server.rb +152 -0
- data/lib/deas/sinatra_app.rb +54 -0
- data/lib/deas/sinatra_runner.rb +119 -0
- data/lib/deas/template.rb +80 -0
- data/lib/deas/test_helpers.rb +15 -0
- data/lib/deas/test_runner.rb +40 -0
- data/lib/deas/version.rb +1 -1
- data/lib/deas/view_handler.rb +97 -0
- data/lib/deas.rb +35 -2
- data/test/helper.rb +9 -1
- data/test/support/fake_app.rb +46 -0
- data/test/support/routes.rb +117 -0
- data/test/support/view_handlers.rb +52 -0
- data/test/support/views/_info.erb +1 -0
- data/test/support/views/layout1.erb +2 -0
- data/test/support/views/layout2.erb +2 -0
- data/test/support/views/layout3.erb +2 -0
- data/test/support/views/show.erb +2 -0
- data/test/support/views/with_layout.erb +1 -0
- data/test/system/making_requests_tests.rb +78 -0
- data/test/unit/deas_tests.rb +21 -0
- data/test/unit/logger_tests.rb +33 -0
- data/test/unit/route_tests.rb +43 -0
- data/test/unit/runner_tests.rb +34 -0
- data/test/unit/server_tests.rb +203 -0
- data/test/unit/sinatra_app_tests.rb +70 -0
- data/test/unit/sinatra_runner_tests.rb +103 -0
- data/test/unit/template_tests.rb +150 -0
- data/test/unit/view_handler_tests.rb +96 -0
- metadata +130 -7
data/lib/deas.rb
CHANGED
@@ -1,3 +1,36 @@
|
|
1
|
-
require
|
1
|
+
require 'ns-options'
|
2
|
+
require 'pathname'
|
2
3
|
|
3
|
-
|
4
|
+
require 'deas/version'
|
5
|
+
require 'deas/server'
|
6
|
+
require 'deas/sinatra_app'
|
7
|
+
require 'deas/view_handler'
|
8
|
+
|
9
|
+
ENV['DEAS_ROUTES_FILE'] ||= 'config/routes'
|
10
|
+
|
11
|
+
module Deas
|
12
|
+
|
13
|
+
def self.app
|
14
|
+
@app
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.config
|
18
|
+
Deas::Config
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.configure(&block)
|
22
|
+
self.config.define(&block)
|
23
|
+
self.config
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.init
|
27
|
+
require self.config.routes_file
|
28
|
+
@app = Deas::SinatraApp.new(Deas::Server.configuration)
|
29
|
+
end
|
30
|
+
|
31
|
+
module Config
|
32
|
+
include NsOptions::Proxy
|
33
|
+
option :routes_file, Pathname, :default => ENV['DEAS_ROUTES_FILE']
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
data/test/helper.rb
CHANGED
@@ -2,7 +2,15 @@
|
|
2
2
|
# put any test helpers here
|
3
3
|
|
4
4
|
# add the root dir to the load path
|
5
|
-
|
5
|
+
ROOT = File.expand_path('../..', __FILE__)
|
6
|
+
$LOAD_PATH.unshift(ROOT)
|
6
7
|
|
7
8
|
# require pry for debugging (`binding.pry`)
|
8
9
|
require 'pry'
|
10
|
+
require 'assert-mocha' if defined?(Assert)
|
11
|
+
|
12
|
+
require 'deas'
|
13
|
+
Deas.configure do |config|
|
14
|
+
config.routes_file = File.join(ROOT, 'test/support/routes')
|
15
|
+
end
|
16
|
+
Deas.init
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'deas/logger'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
class FakeApp
|
5
|
+
|
6
|
+
# Mimic's the context that is accessible in a Sinatra' route. Should provide
|
7
|
+
# any methods needed to replace using an actual Sinatra app.
|
8
|
+
|
9
|
+
attr_accessor :request, :response, :params, :settings, :session
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@request = FakeRequest.new('GET','/something', {}, OpenStruct.new)
|
13
|
+
@params = @request.params
|
14
|
+
@session = @request.session
|
15
|
+
@response = FakeResponse.new
|
16
|
+
@settings = OpenStruct.new({
|
17
|
+
:runner_logger => Deas::RunnerLogger.new(Deas::NullLogger.new, false)
|
18
|
+
})
|
19
|
+
end
|
20
|
+
|
21
|
+
def halt(*args)
|
22
|
+
throw :halt, args
|
23
|
+
end
|
24
|
+
|
25
|
+
def erb(*args, &block)
|
26
|
+
if block
|
27
|
+
[ args, block.call ].flatten
|
28
|
+
else
|
29
|
+
args
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def to(relative_path)
|
34
|
+
File.join("http://test.local", relative_path)
|
35
|
+
end
|
36
|
+
|
37
|
+
def redirect(*args)
|
38
|
+
halt 302, { 'Location' => args[0] }
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
class FakeRequest < Struct.new(:http_method, :path, :params, :session)
|
44
|
+
alias :request_method :http_method
|
45
|
+
end
|
46
|
+
FakeResponse = Struct.new(:status, :headers, :body)
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'deas'
|
2
|
+
|
3
|
+
class Deas::Server
|
4
|
+
|
5
|
+
root File.expand_path("..", __FILE__)
|
6
|
+
|
7
|
+
log_file_path = File.expand_path("../../../log/test.log", __FILE__)
|
8
|
+
|
9
|
+
logger Logger.new(File.open(log_file_path, 'w'))
|
10
|
+
verbose_logging true
|
11
|
+
|
12
|
+
get '/show', 'ShowHandler'
|
13
|
+
get '/halt', 'HaltHandler'
|
14
|
+
get '/error', 'ErrorHandler'
|
15
|
+
get '/with_layout', 'WithLayoutHandler'
|
16
|
+
get '/alt_with_layout', 'AlternateWithLayoutHandler'
|
17
|
+
get '/redirect', 'RedirectHandler'
|
18
|
+
get '/redirect_to', 'RedirectToHandler'
|
19
|
+
get '/set_session', 'SetSessionHandler'
|
20
|
+
get '/use_session', 'UseSessionHandler'
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
class ShowHandler
|
25
|
+
include Deas::ViewHandler
|
26
|
+
|
27
|
+
attr_reader :message
|
28
|
+
|
29
|
+
def init!
|
30
|
+
@message = params['message']
|
31
|
+
end
|
32
|
+
|
33
|
+
def run!
|
34
|
+
render 'show'
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
class HaltHandler
|
40
|
+
include Deas::ViewHandler
|
41
|
+
|
42
|
+
def init!
|
43
|
+
halt params['with'].to_i
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
class ErrorHandler
|
49
|
+
include Deas::ViewHandler
|
50
|
+
|
51
|
+
def run!
|
52
|
+
raise 'test'
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
class WithLayoutHandler
|
58
|
+
include Deas::ViewHandler
|
59
|
+
layouts 'layout1', 'layout2', 'layout3'
|
60
|
+
|
61
|
+
def run!
|
62
|
+
render 'with_layout'
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
class AlternateWithLayoutHandler
|
68
|
+
include Deas::ViewHandler
|
69
|
+
|
70
|
+
def run!
|
71
|
+
render 'layout1' do
|
72
|
+
render 'layout2' do
|
73
|
+
render 'layout3' do
|
74
|
+
render 'with_layout'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
class RedirectHandler
|
83
|
+
include Deas::ViewHandler
|
84
|
+
|
85
|
+
def run!
|
86
|
+
redirect 'http://google.com', 'wrong place, buddy'
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
class RedirectToHandler
|
92
|
+
include Deas::ViewHandler
|
93
|
+
|
94
|
+
def run!
|
95
|
+
redirect_to '/somewhere'
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
class SetSessionHandler
|
101
|
+
include Deas::ViewHandler
|
102
|
+
|
103
|
+
def run!
|
104
|
+
session[:secret] = 'session_secret'
|
105
|
+
redirect_to '/use_session'
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
class UseSessionHandler
|
111
|
+
include Deas::ViewHandler
|
112
|
+
|
113
|
+
def run!
|
114
|
+
session[:secret]
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'deas/view_handler'
|
2
|
+
|
3
|
+
class TestViewHandler
|
4
|
+
include Deas::ViewHandler
|
5
|
+
|
6
|
+
end
|
7
|
+
|
8
|
+
class FlagViewHandler
|
9
|
+
include Deas::ViewHandler
|
10
|
+
before{ @before_hook_called = true }
|
11
|
+
after{ @after_hook_called = true }
|
12
|
+
layout 'web'
|
13
|
+
|
14
|
+
attr_reader :before_init_called, :init_bang_called, :after_init_called,
|
15
|
+
:before_run_called, :run_bang_called, :after_run_called,
|
16
|
+
:before_hook_called, :after_hook_called
|
17
|
+
|
18
|
+
def before_init
|
19
|
+
@before_init_called = true
|
20
|
+
end
|
21
|
+
|
22
|
+
def init!
|
23
|
+
@init_bang_called = true
|
24
|
+
end
|
25
|
+
|
26
|
+
def after_init
|
27
|
+
@after_init_called = true
|
28
|
+
end
|
29
|
+
|
30
|
+
def before_run
|
31
|
+
@before_run_called = true
|
32
|
+
end
|
33
|
+
|
34
|
+
def run!
|
35
|
+
@run_bang_called = true
|
36
|
+
end
|
37
|
+
|
38
|
+
def after_run
|
39
|
+
@after_run_called = true
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
class HaltViewHandler
|
45
|
+
include Deas::ViewHandler
|
46
|
+
|
47
|
+
def run!
|
48
|
+
halt_args = [ params['code'], params['headers'], params['body'] ].compact
|
49
|
+
halt(*halt_args)
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Stuff: <%= info %>
|
@@ -0,0 +1 @@
|
|
1
|
+
With Layout
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'rack/test'
|
3
|
+
|
4
|
+
class MakingRequestsTests < Assert::Context
|
5
|
+
include Rack::Test::Methods
|
6
|
+
|
7
|
+
desc "Making requests using rack test"
|
8
|
+
setup do
|
9
|
+
@app = Deas.app.new
|
10
|
+
end
|
11
|
+
|
12
|
+
should "return a 200 response with a GET to '/show'" do
|
13
|
+
get '/show', 'message' => 'this is a test'
|
14
|
+
|
15
|
+
expected_body = "show page: this is a test\n" \
|
16
|
+
"Stuff: Show Info\n"
|
17
|
+
assert_equal 200, last_response.status
|
18
|
+
assert_equal expected_body, last_response.body
|
19
|
+
end
|
20
|
+
|
21
|
+
should "allow halting with a custom response" do
|
22
|
+
get '/halt', 'with' => 234
|
23
|
+
|
24
|
+
assert_equal 234, last_response.status
|
25
|
+
end
|
26
|
+
|
27
|
+
should "return a 404 response with an undefined route" do
|
28
|
+
get '/not_defined'
|
29
|
+
|
30
|
+
assert_equal 404, last_response.status
|
31
|
+
end
|
32
|
+
|
33
|
+
should "return a 500 response with an error route" do
|
34
|
+
get '/error'
|
35
|
+
|
36
|
+
assert_equal 500, last_response.status
|
37
|
+
end
|
38
|
+
|
39
|
+
should "return a 200 response and use all the layouts" do
|
40
|
+
get '/with_layout'
|
41
|
+
|
42
|
+
expected_body = "Layout 1\nLayout 2\nLayout 3\nWith Layout\n"
|
43
|
+
assert_equal 200, last_response.status
|
44
|
+
assert_equal expected_body, last_response.body
|
45
|
+
|
46
|
+
get '/alt_with_layout'
|
47
|
+
|
48
|
+
assert_equal 200, last_response.status
|
49
|
+
assert_equal expected_body, last_response.body
|
50
|
+
end
|
51
|
+
|
52
|
+
should "return a 302 redirecting to the expected locations" do
|
53
|
+
get '/redirect'
|
54
|
+
expected_location = 'http://google.com'
|
55
|
+
|
56
|
+
assert_equal 302, last_response.status
|
57
|
+
assert_equal expected_location, last_response.headers['Location']
|
58
|
+
|
59
|
+
get '/redirect_to'
|
60
|
+
expected_location = 'http://example.org/somewhere'
|
61
|
+
|
62
|
+
assert_equal 302, last_response.status
|
63
|
+
assert_equal expected_location, last_response.headers['Location']
|
64
|
+
end
|
65
|
+
|
66
|
+
should "return a 200 response and the session value" do
|
67
|
+
get '/set_session'
|
68
|
+
follow_redirect!
|
69
|
+
|
70
|
+
assert_equal 200, last_response.status
|
71
|
+
assert_equal 'session_secret', last_response.body
|
72
|
+
end
|
73
|
+
|
74
|
+
def app
|
75
|
+
@app
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'deas'
|
3
|
+
|
4
|
+
module Deas
|
5
|
+
|
6
|
+
class BaseTests < Assert::Context
|
7
|
+
desc "Deas"
|
8
|
+
subject{ Deas }
|
9
|
+
|
10
|
+
should have_instance_methods :config, :configure, :init, :app
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
class ConfigTests < BaseTests
|
15
|
+
desc "Deas::Config"
|
16
|
+
subject{ Deas::Config }
|
17
|
+
|
18
|
+
should have_instance_methods :routes_file
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'assert'
|
2
|
+
|
3
|
+
class Deas::RunnerLogger
|
4
|
+
|
5
|
+
class BaseTests < Assert::Context
|
6
|
+
desc "Deas::RunnerLogger"
|
7
|
+
setup do
|
8
|
+
@logger = Logger.new(File.open("/dev/null", 'w'))
|
9
|
+
@runner_logger = Deas::RunnerLogger.new(@logger)
|
10
|
+
end
|
11
|
+
subject{ @runner_logger }
|
12
|
+
|
13
|
+
should have_instance_methods :verbose, :summary
|
14
|
+
|
15
|
+
should "use the passed logger as #verbose and a null logger as #summary " \
|
16
|
+
"when passed true as the second arg" do
|
17
|
+
runner_logger = Deas::RunnerLogger.new(@logger, true)
|
18
|
+
|
19
|
+
assert_equal @logger, runner_logger.verbose
|
20
|
+
assert_instance_of Deas::NullLogger, runner_logger.summary
|
21
|
+
end
|
22
|
+
|
23
|
+
should "use the passed logger as #summary and a null logger as #verbose " \
|
24
|
+
"when passed false as the second arg" do
|
25
|
+
runner_logger = Deas::RunnerLogger.new(@logger, false)
|
26
|
+
|
27
|
+
assert_instance_of Deas::NullLogger, runner_logger.verbose
|
28
|
+
assert_equal @logger, runner_logger.summary
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'deas/route'
|
3
|
+
require 'deas/sinatra_runner'
|
4
|
+
require 'test/support/fake_app'
|
5
|
+
require 'test/support/view_handlers'
|
6
|
+
|
7
|
+
class Deas::Route
|
8
|
+
|
9
|
+
class BaseTests < Assert::Context
|
10
|
+
desc "Deas::Route"
|
11
|
+
setup do
|
12
|
+
@route = Deas::Route.new(:get, '/test', 'TestViewHandler')
|
13
|
+
end
|
14
|
+
subject{ @route }
|
15
|
+
|
16
|
+
should have_instance_methods :method, :path, :handler_class_name,
|
17
|
+
:handler_class, :runner
|
18
|
+
|
19
|
+
should "constantize the handler class with #constantize!" do
|
20
|
+
assert_nil subject.handler_class
|
21
|
+
|
22
|
+
assert_nothing_raised{ subject.constantize! }
|
23
|
+
|
24
|
+
assert_equal TestViewHandler, subject.handler_class
|
25
|
+
end
|
26
|
+
|
27
|
+
should "raise a custom exception if the handler class name " \
|
28
|
+
"can't be constantized" do
|
29
|
+
route = Deas::Route.new(:get, '/', 'SomethingNotDefined')
|
30
|
+
|
31
|
+
assert_raises(Deas::NoHandlerClassError) do
|
32
|
+
route.constantize!
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
should "return an instance of the Runner class with supplied variables" do
|
37
|
+
subject.constantize!
|
38
|
+
returned = subject.runner(FakeApp.new)
|
39
|
+
assert_instance_of Deas::SinatraRunner, returned
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'deas/runner'
|
3
|
+
require 'test/support/view_handlers'
|
4
|
+
|
5
|
+
class Deas::Runner
|
6
|
+
|
7
|
+
class BaseTests < Assert::Context
|
8
|
+
desc "Deas::Runner"
|
9
|
+
setup do
|
10
|
+
@runner = Deas::Runner.new(TestViewHandler)
|
11
|
+
end
|
12
|
+
subject{ @runner }
|
13
|
+
|
14
|
+
should have_instance_methods :request, :response, :params, :logger, :session
|
15
|
+
|
16
|
+
should "raise NotImplementedError with #halt" do
|
17
|
+
assert_raises(NotImplementedError){ subject.halt }
|
18
|
+
end
|
19
|
+
|
20
|
+
should "raise NotImplementedError with #render" do
|
21
|
+
assert_raises(NotImplementedError){ subject.render }
|
22
|
+
end
|
23
|
+
|
24
|
+
should "raise NotImplementedError with #redirect" do
|
25
|
+
assert_raises(NotImplementedError){ subject.redirect }
|
26
|
+
end
|
27
|
+
|
28
|
+
should "raise NotImplementedError with #redirect_to" do
|
29
|
+
assert_raises(NotImplementedError){ subject.redirect_to }
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|