fortitude 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +19 -19
  3. data/CHANGES.md +31 -0
  4. data/Gemfile +1 -0
  5. data/README-erector.md +1 -1
  6. data/lib/fortitude/erector.rb +32 -0
  7. data/lib/fortitude/method_templates/tag_method_template.rb.smpl +6 -6
  8. data/lib/fortitude/method_templates/text_method_template.rb.smpl +3 -3
  9. data/lib/fortitude/rails/railtie.rb +6 -4
  10. data/lib/fortitude/rails/renderer.rb +7 -4
  11. data/lib/fortitude/rails/template_handler.rb +18 -3
  12. data/lib/fortitude/rendering_context.rb +20 -2
  13. data/lib/fortitude/tags/render_widget_placeholder.rb +19 -0
  14. data/lib/fortitude/tags/tag.rb +18 -4
  15. data/lib/fortitude/tags/tag_return_value.rb +1 -1
  16. data/lib/fortitude/tags/tag_store.rb +4 -0
  17. data/lib/fortitude/tilt/fortitude_template.rb +6 -128
  18. data/lib/fortitude/version.rb +1 -1
  19. data/lib/fortitude/widget.rb +2 -0
  20. data/lib/fortitude/widget/files.rb +162 -0
  21. data/lib/fortitude/widget/integration.rb +5 -3
  22. data/lib/fortitude/widget/modules_and_subclasses.rb +17 -0
  23. data/lib/fortitude/widget/rendering.rb +12 -5
  24. data/lib/fortitude/widget/start_and_end_comments.rb +4 -2
  25. data/lib/fortitude/widget/tags.rb +6 -1
  26. data/lib/fortitude/widget/widget_class_inheritable_attributes.rb +7 -0
  27. data/spec/helpers/rails_server.rb +4 -0
  28. data/spec/rails/basic_rails_system_spec.rb +4 -0
  29. data/spec/rails/erector_coexistence_system_spec.rb +33 -0
  30. data/spec/rails/rendering_context_system_spec.rb +19 -3
  31. data/spec/rails/rendering_system_spec.rb +6 -0
  32. data/spec/rails/templates/basic_rails_system_spec/app/controllers/basic_rails_system_spec_controller.rb +5 -0
  33. data/spec/rails/templates/basic_rails_system_spec/app/views/basic_rails_system_spec/double_render_one.rb +5 -0
  34. data/spec/rails/templates/basic_rails_system_spec/app/views/basic_rails_system_spec/double_render_three.rb +5 -0
  35. data/spec/rails/templates/basic_rails_system_spec/app/views/basic_rails_system_spec/double_render_two.rb +9 -0
  36. data/spec/rails/templates/erector_coexistence_system_spec/app/controllers/erector_coexistence_system_spec_controller.rb +19 -0
  37. data/spec/rails/templates/erector_coexistence_system_spec/app/v/views/erector_coexistence_system_spec/erector_widget_in_app_v_views.rb +7 -0
  38. data/spec/rails/templates/erector_coexistence_system_spec/app/v/views/erector_coexistence_system_spec/fortitude_widget_in_app_v_views.rb +7 -0
  39. data/spec/rails/templates/erector_coexistence_system_spec/app/views/erector_coexistence_system_spec/erector_widget_in_app_views.rb +7 -0
  40. data/spec/rails/templates/erector_coexistence_system_spec/app/views/erector_coexistence_system_spec/fortitude_widget_in_app_views.rb +7 -0
  41. data/spec/rails/templates/erector_coexistence_system_spec/config/application.rb +25 -0
  42. data/spec/rails/templates/rendering_context_system_spec/app/controllers/rendering_context_system_spec_controller.rb +2 -2
  43. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/_current_element_nesting_intermediate.html.erb +3 -0
  44. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/current_element_nesting_child.rb +13 -0
  45. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/current_element_nesting_toplevel.rb +9 -0
  46. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_through_partials.rb +2 -2
  47. data/spec/system/convenience_methods_system_spec.rb +22 -0
  48. data/spec/system/inline_system_spec.rb +2 -2
  49. data/spec/system/record_tag_emission_system_spec.rb +71 -0
  50. data/spec/system/rendering_context_system_spec.rb +21 -0
  51. data/spec/system/setting_inheritance_system_spec.rb +52 -0
  52. data/spec/system/tag_return_value_system_spec.rb +7 -0
  53. data/spec/system/tilt_system_spec.rb +13 -18
  54. data/spec/system/widget_class_from_spec.rb +240 -0
  55. data/spec/system/widget_method_system_spec.rb +52 -0
  56. metadata +37 -2
@@ -15,6 +15,7 @@ module Fortitude
15
15
  _fortitude_class_inheritable_attribute :extra_assigns, :ignore, [ :error, :ignore, :use ]
16
16
  _fortitude_class_inheritable_attribute :automatic_helper_access, true, [ true, false ]
17
17
  _fortitude_class_inheritable_attribute :implicit_shared_variable_access, false, [ true, false ]
18
+ _fortitude_class_inheritable_attribute :record_tag_emission, false, [ true, false ]
18
19
  _fortitude_class_inheritable_attribute :enforce_element_nesting_rules, false, [ true, false ]
19
20
  _fortitude_class_inheritable_attribute :enforce_attribute_rules, false, [ true, false ]
20
21
  _fortitude_class_inheritable_attribute :enforce_id_uniqueness, false, [ true, false ]
@@ -30,6 +31,12 @@ module Fortitude
30
31
  end)
31
32
  _fortitude_class_inheritable_attribute :debug, false, [ true, false ]
32
33
  end
34
+
35
+ module ClassMethods
36
+ def _fortitude_record_emitting_tag?
37
+ self.enforce_element_nesting_rules || self.record_tag_emission
38
+ end
39
+ end
33
40
  end
34
41
  end
35
42
  end
@@ -248,6 +248,10 @@ EOS
248
248
  # new-style hash syntax. As a result, we pin the version backwards in this one specific case.
249
249
  gemfile_contents << "\ngem 'execjs', '~> 2.0.0'\n" if RUBY_VERSION =~ /^1\.8\./
250
250
 
251
+ Array(@options[:additional_gemfile_lines] || [ ]).each do |gemfile_line|
252
+ gemfile_contents << "\n#{gemfile_line}\n"
253
+ end
254
+
251
255
  File.open(gemfile, 'w') { |f| f << gemfile_contents }
252
256
  end
253
257
 
@@ -4,4 +4,8 @@ describe "basic Rails support", :type => :rails do
4
4
  it "should be able to render a trivial widget" do
5
5
  expect_match("trivial_widget", /layout_default/, /hello, world/)
6
6
  end
7
+
8
+ it "should be able to use 'render' more than once in an action, and it should work fine" do
9
+ expect_match("double_render", /layout_default/, /hello, world.*goodbye, world.*and this is the last partial\!/mi)
10
+ end
7
11
  end
@@ -0,0 +1,33 @@
1
+ describe "Erector coexistence support", :type => :rails do
2
+ uses_rails_with_template :erector_coexistence_system_spec, :additional_gemfile_lines => "gem 'erector'"
3
+
4
+ begin
5
+ gem 'erector'
6
+ rescue Gem::LoadError => le
7
+ # ok
8
+ end
9
+
10
+ begin
11
+ require 'erector'
12
+ rescue LoadError => le
13
+ # ok
14
+ end
15
+
16
+ if defined?(::Erector::Widget)
17
+ it "should be able to render a Fortitude widget in app/views" do
18
+ expect_match("fortitude_widget_in_app_views", /this is Fortitude: foo = bar/)
19
+ end
20
+
21
+ it "should be able to render a Fortitude widget in app/v/views" do
22
+ expect_match("fortitude_widget_in_app_v_views", /this is Fortitude: foo = marph/)
23
+ end
24
+
25
+ it "should be able to render an Erector widget in app/views" do
26
+ expect_match("erector_widget_in_app_views", /<p\s+class\s*=\s*"some_class"\s*>this is Erector: foo = baz<\/p>/)
27
+ end
28
+
29
+ it "should be able to render an Erector widget in app/v/views" do
30
+ expect_match("erector_widget_in_app_v_views", /<p\s+class\s*=\s*"some_class"\s*>this is Erector: foo = quux<\/p>/)
31
+ end
32
+ end
33
+ end
@@ -32,7 +32,7 @@ describe "Rails RenderingContext support", :type => :rails do
32
32
  end
33
33
 
34
34
  it "should still call that method for all widgets" do
35
- expect_match("uses_direct_context_for_all_widgets", /context is: SimpleRc, value 67890.*context is: SimpleRc, value 67891.*context is: SimpleRc, value 67890/mi)
35
+ expect_match("uses_direct_context_for_all_widgets", /context is: SimpleRc, value 67890.*context is: SimpleRc, value 67890.*context is: SimpleRc, value 67890/mi)
36
36
  end
37
37
 
38
38
  it "should call start_widget! and end_widget! properly on widgets in Rails" do
@@ -55,10 +55,26 @@ describe "Rails RenderingContext support", :type => :rails do
55
55
  lines = lines.select { |l| l =~ /^\d:/ }.map { |l| l.strip }
56
56
 
57
57
  expect(lines[0]).to eq("0: start Views::RenderingContextSystemSpec::StartEndWidgetThroughPartials")
58
- expect(lines[1]).to eq("1: start [{:partial=>\"start_end_widget_through_partials_partial\"}]")
58
+ expect(lines[1]).to eq("1: start Fortitude::Tags::RenderWidgetPlaceholder [{:partial=>\"start_end_widget_through_partials_partial\"}]")
59
59
  expect(lines[2]).to eq("2: start Views::RenderingContextSystemSpec::StartEndWidgetThroughPartialsPartialWidget 12345")
60
60
  expect(lines[3]).to eq("3: end Views::RenderingContextSystemSpec::StartEndWidgetThroughPartialsPartialWidget 12345")
61
- expect(lines[4]).to eq("4: end [{:partial=>\"start_end_widget_through_partials_partial\"}]")
61
+ expect(lines[4]).to eq("4: end Fortitude::Tags::RenderWidgetPlaceholder [{:partial=>\"start_end_widget_through_partials_partial\"}]")
62
62
  expect(lines.length).to eq(5)
63
+ end
64
+
65
+ # +<div><span>yohoho
66
+ # +<p>[Views::RenderingContextSystemSpec::CurrentElementNestingToplevel][Fortitude::Tags::Tag][Fortitude::Tags::PartialTagPlaceholder][Array][Views::RenderingContextSystemSpec::CurrentElementNestingChild][Fortitude::Tags::Tag]</p>
67
+ # +</span>
68
+ # +</div>
69
+
70
+ it "should return the correct #current_element_nesting, even through multiple widgets and partials" do
71
+ text = get_success("current_element_nesting_toplevel")
72
+ expect(text).to match(%r{<div><span>yohoho\s*<p>0:.*</p>\s*</span>\s*</div>$}mi)
73
+ expect(text).to match(%r{0: \[Views::RenderingContextSystemSpec::CurrentElementNestingToplevel\]}mi)
74
+ expect(text).to match(%r{1: \[Fortitude::Tags::Tag/:div\]}mi)
75
+ expect(text).to match(%r{2: \[Fortitude::Tags::PartialTagPlaceholder/:_fortitude_partial_placeholder\]}mi)
76
+ expect(text).to match(%r{3: \[Fortitude::Tags::RenderWidgetPlaceholder/:_fortitude_render_widget_placeholder\]}mi)
77
+ expect(text).to match(%r{4: \[Views::RenderingContextSystemSpec::CurrentElementNestingChild\]}mi)
78
+ expect(text).to match(%r{5: \[Fortitude::Tags::Tag/:p\]}mi)
63
79
  end
64
80
  end
@@ -20,6 +20,12 @@ describe "Rails rendering support", :type => :rails do
20
20
  expect(data).not_to match(/rails_spec_application/)
21
21
  end
22
22
 
23
+ it "should set the Content-Type to text/html when using render :widget" do
24
+ response = get_response("render_widget")
25
+ expect(response.body).to match(/hello from a widget named Fred/)
26
+ expect(response.header['Content-Type']).to match(%r{text/html}i)
27
+ end
28
+
23
29
  it "should let you render a widget with 'render \"foo\"'" do
24
30
  expect_match("render_widget_via_file_path", /hello from a widget named Fred/)
25
31
  end
@@ -2,6 +2,11 @@ class BasicRailsSystemSpecController < ApplicationController
2
2
  def trivial_widget
3
3
  end
4
4
 
5
+ def double_render
6
+ @rendered_string = render_to_string(:action => 'double_render_one', :layout => nil)
7
+ render :action => 'double_render_two'
8
+ end
9
+
5
10
  def the_class_should_not_load
6
11
  render :text => BasicRailsSystemSpec::ClassShouldNotLoad.new.to_s
7
12
  end
@@ -0,0 +1,5 @@
1
+ class Views::BasicRailsSystemSpec::DoubleRenderOne < Fortitude::Widgets::Html5
2
+ def content
3
+ p "hello, world"
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class Views::BasicRailsSystemSpec::DoubleRenderThree < Fortitude::Widgets::Html5
2
+ def content
3
+ p "and this is the last partial!"
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ class Views::BasicRailsSystemSpec::DoubleRenderTwo < Fortitude::Widgets::Html5
2
+ needs :rendered_string
3
+
4
+ def content
5
+ rawtext rendered_string
6
+ p "goodbye, world"
7
+ render :partial => 'double_render_three'
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ class ErectorCoexistenceSystemSpecController < ApplicationController
2
+ prepend_view_path "app/v/views"
3
+
4
+ def fortitude_widget_in_app_views
5
+ @foo = "bar"
6
+ end
7
+
8
+ def fortitude_widget_in_app_v_views
9
+ @foo = "marph"
10
+ end
11
+
12
+ def erector_widget_in_app_views
13
+ @foo = "baz"
14
+ end
15
+
16
+ def erector_widget_in_app_v_views
17
+ @foo = "quux"
18
+ end
19
+ end
@@ -0,0 +1,7 @@
1
+ class Views::ErectorCoexistenceSystemSpec::ErectorWidgetInAppVViews < Erector::Widget
2
+ needs :foo
3
+
4
+ def content
5
+ p.some_class "this is Erector: foo = #{@foo}"
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ class Views::ErectorCoexistenceSystemSpec::FortitudeWidgetInAppVViews < Fortitude::Widgets::Html5
2
+ needs :foo
3
+
4
+ def content
5
+ p "this is Fortitude: foo = #{foo}"
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ class Views::ErectorCoexistenceSystemSpec::ErectorWidgetInAppViews < Erector::Widget
2
+ needs :foo
3
+
4
+ def content
5
+ p.some_class "this is Erector: foo = #{@foo}"
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ class Views::ErectorCoexistenceSystemSpec::FortitudeWidgetInAppViews < Fortitude::Widgets::Html5
2
+ needs :foo
3
+
4
+ def content
5
+ p "this is Fortitude: foo = #{foo}"
6
+ end
7
+ end
@@ -0,0 +1,25 @@
1
+ require File.expand_path('../boot', __FILE__)
2
+
3
+ require 'rails/all'
4
+
5
+ # Require the gems listed in Gemfile, including any gems
6
+ # you've limited to :test, :development, or :production.
7
+ Bundler.require(:default, Rails.env)
8
+
9
+ module ErectorCoexistenceSystemSpec
10
+ class Application < Rails::Application
11
+ # Settings in config/environments/* take precedence over those specified here.
12
+ # Application configuration should go into files in config/initializers
13
+ # -- all .rb files in that directory are automatically loaded.
14
+
15
+ # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
16
+ # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
17
+ # config.time_zone = 'Central Time (US & Canada)'
18
+
19
+ # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
20
+ # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
21
+ # config.i18n.default_locale = :de
22
+
23
+ config.autoload_paths += [ File.join(Rails.root, "app", "v") ]
24
+ end
25
+ end
@@ -35,7 +35,7 @@ class RenderingContextSystemSpecController < ApplicationController
35
35
  def uses_direct_context_in_view
36
36
  $invoke_count = 0
37
37
  class << self
38
- def fortitude_rendering_context(options)
38
+ def create_fortitude_rendering_context(options)
39
39
  out = SimpleRc.new(options.merge(:the_value => 67890 + $invoke_count))
40
40
  $invoke_count += 1
41
41
  out
@@ -46,7 +46,7 @@ class RenderingContextSystemSpecController < ApplicationController
46
46
  def uses_direct_context_for_all_widgets
47
47
  $invoke_count = 0
48
48
  class << self
49
- def fortitude_rendering_context(options)
49
+ def create_fortitude_rendering_context(options)
50
50
  out = SimpleRc.new(options.merge(:the_value => 67890 + $invoke_count))
51
51
  $invoke_count += 1
52
52
  out
@@ -0,0 +1,3 @@
1
+ <span>yohoho
2
+ <%= render :partial => 'current_element_nesting_child' %>
3
+ </span>
@@ -0,0 +1,13 @@
1
+ class Views::RenderingContextSystemSpec::CurrentElementNestingChild < Fortitude::Widgets::Html5
2
+ record_tag_emission true
3
+
4
+ def content
5
+ p {
6
+ rendering_context.current_element_nesting.each_with_index do |item, index|
7
+ name_text = ""
8
+ name_text = "/#{item.name.inspect}" if item.respond_to?(:name)
9
+ text "#{index}: [#{item.class.name}#{name_text}]\n"
10
+ end
11
+ }
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ class Views::RenderingContextSystemSpec::CurrentElementNestingToplevel < Fortitude::Widgets::Html5
2
+ record_tag_emission true
3
+
4
+ def content
5
+ div {
6
+ render :partial => 'current_element_nesting_intermediate'
7
+ }
8
+ end
9
+ end
@@ -5,8 +5,8 @@ class Views::RenderingContextSystemSpec::StartEndWidgetThroughPartials < Fortitu
5
5
  rendering_context.start_end_calls.each_with_index do |data, index|
6
6
  start_or_end = data[0]
7
7
  widget = data[1]
8
- widget_data = if widget.kind_of?(Array)
9
- widget.inspect
8
+ widget_data = if widget.respond_to?(:render_args)
9
+ "#{widget.class.name} #{widget.render_args.inspect}"
10
10
  else
11
11
  widget.class.name
12
12
  end
@@ -1,4 +1,26 @@
1
1
  describe "Fortitude convenience methods", :type => :system do
2
+ describe "#all_fortitude_superclasses" do
3
+ it "should return an empty array for ::Fortitude::Widget" do
4
+ expect(::Fortitude::Widget.all_fortitude_superclasses).to eq([ ])
5
+ end
6
+
7
+ it "should return just ::Fortitude::Widget for a direct subclass" do
8
+ class ConvenienceSpecAllSuperclassesDirectSubclass < ::Fortitude::Widget; end
9
+ expect(ConvenienceSpecAllSuperclassesDirectSubclass.all_fortitude_superclasses).to eq([ ::Fortitude::Widget ])
10
+ end
11
+
12
+ it "should return a whole class hierarchy if appropriate" do
13
+ class ConvenienceSpecAllSuperclassesGrandparent < ::Fortitude::Widget; end
14
+ class ConvenienceSpecAllSuperclassesParent < ConvenienceSpecAllSuperclassesGrandparent; end
15
+ class ConvenienceSpecAllSuperclassesChild < ConvenienceSpecAllSuperclassesParent; end
16
+ expect(ConvenienceSpecAllSuperclassesChild.all_fortitude_superclasses).to eq([
17
+ ConvenienceSpecAllSuperclassesParent,
18
+ ConvenienceSpecAllSuperclassesGrandparent,
19
+ ::Fortitude::Widget
20
+ ])
21
+ end
22
+ end
23
+
2
24
  describe "#javascript" do
3
25
  it "should output JavaScript inside the proper tag, by default" do
4
26
  expect(render(widget_class_with_content { javascript "hi, there" })).to eq(
@@ -25,7 +25,7 @@ describe "Fortitude inline-code support", :type => :system do
25
25
  <div>
26
26
  <p>hello, julia</p>
27
27
  </div>
28
- <!-- END depth 0 -->})
28
+ <!-- END (anonymous widget class) depth 0 -->})
29
29
  end
30
30
 
31
31
  it "should let you get rendered content back with .inline_html" do
@@ -53,6 +53,6 @@ describe "Fortitude inline-code support", :type => :system do
53
53
  <div>
54
54
  <p>hello, julia</p>
55
55
  </div>
56
- <!-- END depth 0 -->})
56
+ <!-- END (anonymous widget class) depth 0 -->})
57
57
  end
58
58
  end
@@ -0,0 +1,71 @@
1
+ describe "Fortitude record_tag_emission behavior", :type => :system do
2
+ before :each do
3
+ @recording_class = widget_class do
4
+ attr_reader :recorded_tags
5
+
6
+ def content
7
+ div {
8
+ p {
9
+ @recorded_tags = rendering_context.current_element_nesting.dup
10
+ }
11
+ }
12
+ end
13
+ end
14
+ end
15
+
16
+ it "should not record tag emission by default" do
17
+ expect(recorded_tags_from(@recording_class.new)).to eq([ ])
18
+ end
19
+
20
+ it "should record tag emission if asked to" do
21
+ @recording_class.class_eval { record_tag_emission true }
22
+ expect(recorded_tags_from(@recording_class.new).map(&:name)).to eq([ :div, :p ])
23
+ end
24
+
25
+ it "should record tag emission across two widgets" do
26
+ parent_class = widget_class do
27
+ record_tag_emission true
28
+ attr_accessor :child_instance
29
+
30
+ def content
31
+ div {
32
+ widget child_instance
33
+ }
34
+ end
35
+ end
36
+
37
+ child_class = widget_class do
38
+ record_tag_emission true
39
+ attr_reader :recorded_tags
40
+
41
+ def content
42
+ p {
43
+ @recorded_tags = rendering_context.current_element_nesting.dup
44
+ }
45
+ end
46
+ end
47
+
48
+ parent_instance = parent_class.new
49
+ child_instance = child_class.new
50
+
51
+ parent_instance.child_instance = child_instance
52
+
53
+ results = render(parent_instance)
54
+ expect(results).to eq("<div><p></p></div>")
55
+
56
+ rt = child_instance.recorded_tags
57
+
58
+ expect(rt.shift).to be(parent_instance)
59
+ expect(rt.shift.name).to eq(:div)
60
+ expect(rt.shift).to be(child_instance)
61
+ expect(rt.shift.name).to eq(:p)
62
+ expect(rt).to eq([ ])
63
+ end
64
+
65
+ def recorded_tags_from(instance)
66
+ expect(render(instance)).to eq("<div><p></p></div>")
67
+ rt = instance.recorded_tags
68
+ expect(rt.shift).to be(instance)
69
+ rt
70
+ end
71
+ end
@@ -21,6 +21,27 @@ describe "Fortitude rendering context interactions", :type => :system do
21
21
  super(widget_or_class, options.merge(:rendering_context => @rc))
22
22
  end
23
23
 
24
+ it "should return the parent widget properly" do
25
+ child_widget_class = widget_class_with_content { p "child: #{rendering_context.parent_widget.some_method}" }
26
+ parent_widget_class = widget_class do
27
+ attr_accessor :child_widget_class
28
+
29
+ def some_method
30
+ "ahoy!"
31
+ end
32
+
33
+ def content
34
+ p "foo"
35
+ widget child_widget_class.new
36
+ p "baz"
37
+ end
38
+ end
39
+
40
+ pw = parent_widget_class.new
41
+ pw.child_widget_class = child_widget_class
42
+ expect(render(pw)).to eq("<p>foo</p><p>child: ahoy!</p><p>baz</p>")
43
+ end
44
+
24
45
  it "should call start_widget! and end_widget! on the context when starting and ending a simple widget" do
25
46
  wc = widget_class_with_content { p "foo" }
26
47
  instance = wc.new