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/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