deas 0.27.0 → 0.28.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.
Files changed (39) hide show
  1. data/lib/deas/logger.rb +10 -0
  2. data/lib/deas/redirect_proxy.rb +1 -1
  3. data/lib/deas/route.rb +10 -10
  4. data/lib/deas/route_proxy.rb +1 -1
  5. data/lib/deas/router.rb +1 -1
  6. data/lib/deas/runner.rb +12 -8
  7. data/lib/deas/server.rb +9 -2
  8. data/lib/deas/sinatra_app.rb +1 -0
  9. data/lib/deas/sinatra_runner.rb +15 -5
  10. data/lib/deas/template.rb +0 -4
  11. data/lib/deas/template_engine.rb +50 -0
  12. data/lib/deas/template_source.rb +74 -0
  13. data/lib/deas/test_runner.rb +7 -1
  14. data/lib/deas/version.rb +1 -1
  15. data/lib/deas/view_handler.rb +50 -44
  16. data/lib/deas.rb +1 -11
  17. data/test/support/fake_sinatra_call.rb +13 -10
  18. data/test/support/routes.rb +13 -21
  19. data/test/support/template.erb +1 -0
  20. data/test/support/template.json +1 -0
  21. data/test/support/test_template.test +0 -0
  22. data/test/support/view_handlers.rb +8 -0
  23. data/test/support/views/show.erb +1 -1
  24. data/test/system/rack_tests.rb +7 -5
  25. data/test/unit/error_handler_tests.rb +2 -1
  26. data/test/unit/logging_tests.rb +2 -1
  27. data/test/unit/route_tests.rb +16 -14
  28. data/test/unit/runner_tests.rb +7 -4
  29. data/test/unit/server_configuration_tests.rb +7 -4
  30. data/test/unit/server_tests.rb +6 -1
  31. data/test/unit/show_exceptions_tests.rb +2 -1
  32. data/test/unit/sinatra_app_tests.rb +16 -13
  33. data/test/unit/sinatra_runner_tests.rb +48 -0
  34. data/test/unit/template_engine_tests.rb +121 -0
  35. data/test/unit/template_source_tests.rb +221 -0
  36. data/test/unit/template_tests.rb +4 -12
  37. data/test/unit/test_runner_tests.rb +19 -7
  38. data/test/unit/view_handler_tests.rb +9 -2
  39. metadata +17 -4
@@ -0,0 +1,10 @@
1
+ module Deas
2
+
3
+ class NullLogger
4
+ require 'logger'
5
+ ::Logger::Severity.constants.each do |name|
6
+ define_method(name.downcase){|*args| } # no-op
7
+ end
8
+ end
9
+
10
+ end
@@ -1,5 +1,5 @@
1
- require 'deas/view_handler'
2
1
  require 'deas/url'
2
+ require 'deas/view_handler'
3
3
 
4
4
  module Deas
5
5
 
data/lib/deas/route.rb CHANGED
@@ -16,16 +16,16 @@ module Deas
16
16
  end
17
17
 
18
18
  def run(sinatra_call)
19
- args = {
20
- :sinatra_call => sinatra_call,
21
- :request => sinatra_call.request,
22
- :response => sinatra_call.response,
23
- :params => sinatra_call.params,
24
- :logger => sinatra_call.settings.logger,
25
- :router => sinatra_call.settings.router,
26
- :session => sinatra_call.session
27
- }
28
- runner = Deas::SinatraRunner.new(self.handler_class, args)
19
+ runner = Deas::SinatraRunner.new(self.handler_class, {
20
+ :sinatra_call => sinatra_call,
21
+ :request => sinatra_call.request,
22
+ :response => sinatra_call.response,
23
+ :session => sinatra_call.session,
24
+ :params => sinatra_call.params,
25
+ :logger => sinatra_call.settings.logger,
26
+ :router => sinatra_call.settings.router,
27
+ :template_source => sinatra_call.settings.template_source
28
+ })
29
29
 
30
30
  sinatra_call.request.env.tap do |env|
31
31
  env['deas.params'] = runner.params
@@ -1,5 +1,5 @@
1
- require 'deas/view_handler'
2
1
  require 'deas/exceptions'
2
+ require 'deas/view_handler'
3
3
 
4
4
  module Deas
5
5
  class RouteProxy
data/lib/deas/router.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'deas/redirect_proxy'
2
- require 'deas/route_proxy'
3
2
  require 'deas/route'
3
+ require 'deas/route_proxy'
4
4
  require 'deas/url'
5
5
 
6
6
  module Deas
data/lib/deas/runner.rb CHANGED
@@ -1,25 +1,28 @@
1
1
  require 'rack/utils'
2
+ require 'deas/logger'
2
3
  require 'deas/router'
4
+ require 'deas/template_source'
3
5
 
4
6
  module Deas
5
7
 
6
8
  class Runner
7
9
 
8
10
  attr_reader :handler_class, :handler
9
- attr_reader :request, :response, :params
10
- attr_reader :logger, :router, :session
11
+ attr_reader :request, :response, :session
12
+ attr_reader :params, :logger, :router, :template_source
11
13
 
12
14
  def initialize(handler_class, args = nil)
13
15
  @handler_class = handler_class
14
16
  @handler = @handler_class.new(self)
15
17
 
16
18
  a = args || {}
17
- @request = a[:request]
18
- @response = a[:response]
19
- @params = a[:params] || {}
20
- @logger = a[:logger] || Deas::NullLogger.new
21
- @router = a[:router] || Deas::Router.new
22
- @session = a[:session]
19
+ @request = a[:request]
20
+ @response = a[:response]
21
+ @session = a[:session]
22
+ @params = a[:params] || {}
23
+ @logger = a[:logger] || Deas::NullLogger.new
24
+ @router = a[:router] || Deas::Router.new
25
+ @template_source = a[:template_source] || Deas::NullTemplateSource.new
23
26
  end
24
27
 
25
28
  def halt(*args); raise NotImplementedError; end
@@ -28,6 +31,7 @@ module Deas
28
31
  def status(*args); raise NotImplementedError; end
29
32
  def headers(*args); raise NotImplementedError; end
30
33
  def render(*args); raise NotImplementedError; end
34
+ def partial(*args); raise NotImplementedError; end
31
35
  def send_file(*args); raise NotImplementedError; end
32
36
 
33
37
  class NormalizedParams
data/lib/deas/server.rb CHANGED
@@ -2,11 +2,13 @@ require 'pathname'
2
2
  require 'ns-options'
3
3
  require 'ns-options/boolean'
4
4
  require 'deas/exceptions'
5
- require 'deas/template'
5
+ require 'deas/logger'
6
6
  require 'deas/logging'
7
- require 'deas/show_exceptions'
8
7
  require 'deas/router'
8
+ require 'deas/show_exceptions'
9
9
  require 'deas/sinatra_app'
10
+ require 'deas/template'
11
+ require 'deas/template_source'
10
12
 
11
13
  module Deas; end
12
14
  module Deas::Server
@@ -34,6 +36,7 @@ module Deas::Server
34
36
 
35
37
  option :verbose_logging, NsOptions::Boolean, :default => true
36
38
  option :logger, :default => proc{ Deas::NullLogger.new }
39
+ option :template_source, :default => proc{ Deas::NullTemplateSource.new }
37
40
 
38
41
  attr_accessor :settings, :error_procs, :init_procs, :template_helpers
39
42
  attr_accessor :middlewares, :router
@@ -198,6 +201,10 @@ module Deas::Server
198
201
  self.configuration.default_charset *args
199
202
  end
200
203
 
204
+ def template_source(*args)
205
+ self.configuration.template_source *args
206
+ end
207
+
201
208
  # router handling
202
209
 
203
210
  def router(value = nil)
@@ -35,6 +35,7 @@ module Deas
35
35
  set :deas_default_charset, server_config.default_charset
36
36
  set :logger, server_config.logger
37
37
  set :router, server_config.router
38
+ set :template_source, server_config.template_source
38
39
 
39
40
  server_config.settings.each{ |set_args| set *set_args }
40
41
  server_config.middlewares.each{ |use_args| use *use_args }
@@ -40,19 +40,29 @@ module Deas
40
40
  @sinatra_call.headers(*args)
41
41
  end
42
42
 
43
- def render(template_name, opts = nil, &block)
43
+ def render(template_name, opts = nil)
44
44
  self.content_type(get_content_type(template_name)) if self.content_type.nil?
45
45
 
46
- # TODO: move to DeasRunner, don't pass sinatra call to create template
47
- # def render(template_name, *args, &block)
48
- # super(template_name, *args, &block)
49
46
  options = opts || {}
50
47
  options[:locals] = {
51
48
  :view => self.handler,
52
49
  :logger => self.logger
53
50
  }.merge(options[:locals] || {})
54
51
  options[:layout] = self.handler_class.layouts if !options.key?(:layout)
55
- Deas::Template.new(@sinatra_call, template_name, options).render(&block)
52
+
53
+ if self.template_source.engine_for?(template_name)
54
+ self.template_source.render(template_name, self.handler, options[:locals])
55
+ else
56
+ Deas::Template.new(@sinatra_call, template_name, options).render
57
+ end
58
+ end
59
+
60
+ def partial(template_name, locals = nil)
61
+ if self.template_source.engine_for?(template_name)
62
+ self.template_source.partial(template_name, locals || {})
63
+ else
64
+ Deas::Template::Partial.new(@sinatra_call, template_name, locals).render
65
+ end
56
66
  end
57
67
 
58
68
  def send_file(*args, &block)
data/lib/deas/template.rb CHANGED
@@ -76,10 +76,6 @@ module Deas
76
76
 
77
77
  def initialize(sinatra_call, name, locals = nil)
78
78
  options = { :locals => (locals || {}) }
79
- name = name.to_s.tap do |n|
80
- basename = File.basename(n)
81
- n.sub!(/#{basename}\Z/, "_#{basename}") unless basename[0] == '_'[0]
82
- end
83
79
  super sinatra_call, name, options
84
80
  end
85
81
 
@@ -0,0 +1,50 @@
1
+ require 'pathname'
2
+ require 'deas/logger'
3
+
4
+ module Deas
5
+
6
+ class TemplateEngine
7
+
8
+ attr_reader :source_path, :logger, :opts
9
+
10
+ def initialize(opts = nil)
11
+ @opts = opts || {}
12
+ @source_path = Pathname.new(@opts['source_path'].to_s)
13
+ @logger = @opts['logger'] || Deas::NullLogger.new
14
+ end
15
+
16
+ def render(template_name, view_handler, locals)
17
+ raise NotImplementedError
18
+ end
19
+
20
+ def partial(template_name, locals)
21
+ raise NotImplementedError
22
+ end
23
+
24
+ def capture_partial(template_name, locals, &content)
25
+ raise NotImplementedError
26
+ end
27
+
28
+ end
29
+
30
+ class NullTemplateEngine < TemplateEngine
31
+
32
+ def render(template_name, view_handler, locals)
33
+ template_file = self.source_path.join(template_name).to_s
34
+ unless File.exists?(template_file)
35
+ raise ArgumentError, "template file `#{template_file}` does not exist"
36
+ end
37
+ File.read(template_file)
38
+ end
39
+
40
+ def partial(template_name, locals)
41
+ render(template_name, nil, locals)
42
+ end
43
+
44
+ def capture_partial(template_name, locals, &content)
45
+ render(template_name, nil, locals)
46
+ end
47
+
48
+ end
49
+
50
+ end
@@ -0,0 +1,74 @@
1
+ require 'deas/logger'
2
+ require 'deas/template_engine'
3
+
4
+ module Deas
5
+
6
+ class TemplateSource
7
+
8
+ DISALLOWED_ENGINE_EXTS = [ 'rb' ]
9
+
10
+ DisallowedEngineExtError = Class.new(ArgumentError)
11
+
12
+ attr_reader :path, :engines
13
+
14
+ def initialize(path, logger = nil)
15
+ @path = path.to_s
16
+ @default_opts = {
17
+ 'source_path' => @path,
18
+ 'logger' => logger || Deas::NullLogger.new
19
+ }
20
+ @engines = Hash.new{ |h,k| Deas::NullTemplateEngine.new(@default_opts) }
21
+ end
22
+
23
+ def engine(input_ext, engine_class, registered_opts = nil)
24
+ if DISALLOWED_ENGINE_EXTS.include?(input_ext)
25
+ raise DisallowedEngineExtError, "`#{input_ext}` is disallowed as an"\
26
+ " engine extension."
27
+ end
28
+ engine_opts = @default_opts.merge(registered_opts || {})
29
+ @engines[input_ext.to_s] = engine_class.new(engine_opts)
30
+ end
31
+
32
+ def engine_for?(template_name)
33
+ @engines.keys.include?(get_template_ext(template_name))
34
+ end
35
+
36
+ def render(template_name, view_handler, locals)
37
+ get_engine(template_name).render(template_name, view_handler, locals)
38
+ end
39
+
40
+ def partial(template_name, locals)
41
+ get_engine(template_name).partial(template_name, locals)
42
+ end
43
+
44
+ def capture_partial(template_name, locals, &content)
45
+ get_engine(template_name).capture_partial(template_name, locals, &content)
46
+ end
47
+
48
+ private
49
+
50
+ def get_engine(template_name)
51
+ @engines[get_template_ext(template_name)]
52
+ end
53
+
54
+ def get_template_ext(template_name)
55
+ files = Dir.glob("#{File.join(@path, template_name.to_s)}.*")
56
+ files = files.reject{ |p| !@engines.keys.include?(parse_ext(p)) }
57
+ parse_ext(files.first.to_s || '')
58
+ end
59
+
60
+ def parse_ext(template_name)
61
+ File.extname(template_name)[1..-1]
62
+ end
63
+
64
+ end
65
+
66
+ class NullTemplateSource < TemplateSource
67
+
68
+ def initialize
69
+ super('')
70
+ end
71
+
72
+ end
73
+
74
+ end
@@ -14,10 +14,11 @@ module Deas
14
14
  super(handler_class, {
15
15
  :request => args.delete(:request),
16
16
  :response => args.delete(:response),
17
+ :session => args.delete(:session),
17
18
  :params => NormalizedParams.new(args.delete(:params) || {}).value,
18
19
  :logger => args.delete(:logger),
19
20
  :router => args.delete(:router),
20
- :session => args.delete(:session)
21
+ :template_source => args.delete(:template_source)
21
22
  })
22
23
  args.each{|key, value| self.handler.send("#{key}=", value) }
23
24
 
@@ -72,6 +73,11 @@ module Deas
72
73
  end
73
74
  RenderArgs = Struct.new(:template_name, :options, :block)
74
75
 
76
+ def partial(template_name, locals = nil)
77
+ PartialArgs.new(template_name, locals)
78
+ end
79
+ PartialArgs = Struct.new(:template_name, :locals)
80
+
75
81
  def send_file(file_path, options = nil, &block)
76
82
  SendFileArgs.new(file_path, options, block)
77
83
  end
data/lib/deas/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Deas
2
- VERSION = "0.27.0"
2
+ VERSION = "0.28.0"
3
3
  end
@@ -7,66 +7,72 @@ module Deas
7
7
  def self.included(klass)
8
8
  klass.class_eval do
9
9
  extend ClassMethods
10
+ include InstanceMethods
10
11
  end
11
12
  end
12
13
 
13
- def initialize(runner)
14
- @deas_runner = runner
15
- end
14
+ module InstanceMethods
16
15
 
17
- def init
18
- self.run_callback 'before_init'
19
- self.init!
20
- self.run_callback 'after_init'
21
- end
16
+ def initialize(runner)
17
+ @deas_runner = runner
18
+ end
22
19
 
23
- def init!
24
- end
20
+ def init
21
+ run_callback 'before_init'
22
+ self.init!
23
+ run_callback 'after_init'
24
+ end
25
25
 
26
- def run
27
- self.run_callback 'before_run'
28
- data = self.run!
29
- self.run_callback 'after_run'
30
- data
31
- end
26
+ def init!
27
+ end
32
28
 
33
- def run!
34
- raise NotImplementedError
35
- end
29
+ def run
30
+ run_callback 'before_run'
31
+ data = self.run!
32
+ run_callback 'after_run'
33
+ data
34
+ end
36
35
 
37
- def inspect
38
- reference = '0x0%x' % (self.object_id << 1)
39
- "#<#{self.class}:#{reference} @request=#{self.request.inspect}>"
40
- end
36
+ def run!
37
+ raise NotImplementedError
38
+ end
41
39
 
42
- def ==(other_handler)
43
- self.class == other_handler.class
44
- end
40
+ def inspect
41
+ reference = '0x0%x' % (self.object_id << 1)
42
+ "#<#{self.class}:#{reference} @request=#{request.inspect}>"
43
+ end
44
+
45
+ def ==(other_handler)
46
+ self.class == other_handler.class
47
+ end
45
48
 
46
- protected
49
+ private
47
50
 
48
- # Helpers
51
+ # Helpers
49
52
 
50
- def halt(*args); @deas_runner.halt(*args); end
51
- def redirect(*args); @deas_runner.redirect(*args); end
52
- def content_type(*args); @deas_runner.content_type(*args); end
53
- def status(*args); @deas_runner.status(*args); end
54
- def headers(*args); @deas_runner.headers(*args); end
53
+ def halt(*args); @deas_runner.halt(*args); end
54
+ def redirect(*args); @deas_runner.redirect(*args); end
55
+ def content_type(*args); @deas_runner.content_type(*args); end
56
+ def status(*args); @deas_runner.status(*args); end
57
+ def headers(*args); @deas_runner.headers(*args); end
55
58
 
56
- def render(*args, &block); @deas_runner.render(*args, &block); end
57
- def send_file(*args, &block); @deas_runner.send_file(*args, &block); end
59
+ def render(*args, &block); @deas_runner.render(*args, &block); end
60
+ def partial(*args, &block); @deas_runner.partial(*args, &block); end
61
+ def send_file(*args, &block); @deas_runner.send_file(*args, &block); end
58
62
 
59
- def logger; @deas_runner.logger; end
60
- def router; @deas_runner.router; end
61
- def request; @deas_runner.request; end
62
- def response; @deas_runner.response; end
63
- def params; @deas_runner.params; end
64
- def session; @deas_runner.session; end
63
+ def logger; @deas_runner.logger; end
64
+ def router; @deas_runner.router; end
65
+ def request; @deas_runner.request; end
66
+ def response; @deas_runner.response; end
67
+ def params; @deas_runner.params; end
68
+ def session; @deas_runner.session; end
65
69
 
66
- def run_callback(callback)
67
- (self.class.send("#{callback}_callbacks") || []).each do |callback|
68
- self.instance_eval(&callback)
70
+ def run_callback(callback)
71
+ (self.class.send("#{callback}_callbacks") || []).each do |callback|
72
+ self.instance_eval(&callback)
73
+ end
69
74
  end
75
+
70
76
  end
71
77
 
72
78
  module ClassMethods
data/lib/deas.rb CHANGED
@@ -9,14 +9,4 @@ require 'deas/view_handler'
9
9
  # TODO - remove with future version of Rack (> v1.5.2)
10
10
  require 'deas/rack_request_fix'
11
11
 
12
- module Deas
13
-
14
- class NullLogger
15
- require 'logger'
16
-
17
- ::Logger::Severity.constants.each do |name|
18
- define_method(name.downcase){|*args| } # no-op
19
- end
20
- end
21
-
22
- end
12
+ module Deas; end
@@ -1,6 +1,7 @@
1
1
  require 'ostruct'
2
- require 'deas'
2
+ require 'deas/logger'
3
3
  require 'deas/router'
4
+ require 'deas/template_source'
4
5
 
5
6
  class FakeSinatraCall
6
7
 
@@ -10,19 +11,21 @@ class FakeSinatraCall
10
11
  attr_accessor :request, :response, :params, :logger, :router, :session
11
12
  attr_accessor :settings
12
13
 
13
- def initialize(settings={})
14
- @request = FakeRequest.new('GET','/something', {}, OpenStruct.new)
15
- @response = FakeResponse.new
16
- @params = @request.params
17
- @logger = Deas::NullLogger.new
18
- @router = Deas::Router.new
19
- @session = @request.session
14
+ def initialize(settings = {})
15
+ @request = FakeRequest.new('GET','/something', {}, OpenStruct.new)
16
+ @response = FakeResponse.new
17
+ @session = @request.session
18
+ @params = @request.params
19
+ @logger = Deas::NullLogger.new
20
+ @router = Deas::Router.new
21
+ @template_source = Deas::NullTemplateSource.new
20
22
 
21
23
  @settings = OpenStruct.new({
22
24
  :deas_template_scope => Deas::Template::Scope,
23
25
  :deas_default_charset => 'utf-8',
24
- :router => Deas::Router.new,
25
- :logger => @logger
26
+ :logger => @logger,
27
+ :router => @router,
28
+ :template_source => @template_source
26
29
  }.merge(settings))
27
30
  end
28
31
 
@@ -33,10 +33,10 @@ class DeasTestServer
33
33
  get '/session', 'UseSessionHandler'
34
34
 
35
35
  get '/with_layout', 'WithLayoutHandler'
36
- get '/alt_with_layout', 'AlternateWithLayoutHandler'
37
36
  get '/haml_with_layout', 'HamlWithLayoutHandler'
38
37
  get '/with_haml_layout', 'WithHamlLayoutHandler'
39
38
  get '/haml_with_haml_layout', 'HamlWithHamlLayoutHandler'
39
+ get '/partial.html', 'PartialHandler'
40
40
 
41
41
  get '/handler/tests.json', 'HandlerTestsHandler'
42
42
 
@@ -149,21 +149,6 @@ class WithLayoutHandler
149
149
 
150
150
  end
151
151
 
152
- class AlternateWithLayoutHandler
153
- include Deas::ViewHandler
154
-
155
- def run!
156
- render 'layout1' do
157
- render 'layout2' do
158
- render 'layout3' do
159
- render 'with_layout'
160
- end
161
- end
162
- end
163
- end
164
-
165
- end
166
-
167
152
  class HamlWithLayoutHandler
168
153
  include Deas::ViewHandler
169
154
  layouts 'layout1'
@@ -194,6 +179,13 @@ class HamlWithHamlLayoutHandler
194
179
 
195
180
  end
196
181
 
182
+ class PartialHandler
183
+ include Deas::ViewHandler
184
+
185
+ def run!; partial '_info', :info => 'some-info'; end
186
+
187
+ end
188
+
197
189
  class RedirectHandler
198
190
  include Deas::ViewHandler
199
191
 
@@ -227,11 +219,11 @@ class HandlerTestsHandler
227
219
 
228
220
  def init!
229
221
  @data = {}
230
- set_data('logger_class_name'){ self.logger.class.name }
231
- set_data('request_method'){ self.request.request_method.to_s }
232
- set_data('response_firstheaderval'){ self.response.headers.sort.first.to_s }
233
- set_data('params_a_param'){ self.params['a-param'] }
234
- set_data('session_inspect'){ self.session.inspect }
222
+ set_data('logger_class_name'){ logger.class.name }
223
+ set_data('request_method'){ request.request_method.to_s }
224
+ set_data('response_firstheaderval'){ response.headers.sort.first.to_s }
225
+ set_data('params_a_param'){ params['a-param'] }
226
+ set_data('session_inspect'){ session.inspect }
235
227
  end
236
228
 
237
229
  def set_data(a, &block)
@@ -0,0 +1 @@
1
+ ERB Template Message: <%= view.message %>
@@ -0,0 +1 @@
1
+ This is a json template for use in template engine tests.
File without changes
@@ -40,6 +40,14 @@ class RenderViewHandler
40
40
  end
41
41
  end
42
42
 
43
+ class PartialViewHandler
44
+ include Deas::ViewHandler
45
+
46
+ def run!
47
+ partial "my_partial", :some => 'locals'
48
+ end
49
+ end
50
+
43
51
  class SendFileViewHandler
44
52
  include Deas::ViewHandler
45
53
 
@@ -1,2 +1,2 @@
1
1
  show page: <%= view.message %>
2
- <%= partial "info", :info => 'Show Info' %>
2
+ <%= partial "_info", :info => 'Show Info' %>
@@ -72,11 +72,6 @@ module Deas
72
72
  expected_body = "Layout 1\nLayout 2\nLayout 3\nWith Layouts View: WithLayoutHandler\n"
73
73
  assert_equal 200, last_response.status
74
74
  assert_equal expected_body, last_response.body
75
-
76
- get '/alt_with_layout'
77
- expected_body = "Layout 1\nLayout 2\nLayout 3\nWith Layouts View: AlternateWithLayoutHandler\n"
78
- assert_equal 200, last_response.status
79
- assert_equal expected_body, last_response.body
80
75
  end
81
76
 
82
77
  should "render mixed (erb and other) templates using layouts" do
@@ -96,6 +91,13 @@ module Deas
96
91
  assert_equal expected_body, last_response.body
97
92
  end
98
93
 
94
+ should "render partial templates" do
95
+ get '/partial.html'
96
+ expected_body = "Stuff: some-info\n"
97
+ assert_equal 200, last_response.status
98
+ assert_equal expected_body, last_response.body
99
+ end
100
+
99
101
  should "return a 302 redirecting to the expected locations" do
100
102
  get '/redirect'
101
103
  expected_location = 'http://google.com'
@@ -1,7 +1,8 @@
1
1
  require 'assert'
2
- require 'test/support/fake_sinatra_call'
3
2
  require 'deas/error_handler'
4
3
 
4
+ require 'test/support/fake_sinatra_call'
5
+
5
6
  class Deas::ErrorHandler
6
7
 
7
8
  class UnitTests < Assert::Context