deas 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/deas.rb CHANGED
@@ -1,3 +1,36 @@
1
- require "deas/version"
1
+ require 'ns-options'
2
+ require 'pathname'
2
3
 
3
- module Deas; end
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
- $LOAD_PATH.unshift(File.expand_path("../..", __FILE__))
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,2 @@
1
+ Layout 1
2
+ <%= yield %>
@@ -0,0 +1,2 @@
1
+ Layout 2
2
+ <%= yield %>
@@ -0,0 +1,2 @@
1
+ Layout 3
2
+ <%= yield %>
@@ -0,0 +1,2 @@
1
+ show page: <%= view.message %>
2
+ <%= partial "info", :info => 'Show 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