apotomo 1.0.5 → 1.1.0.rc1

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 (83) hide show
  1. data/.gitignore +5 -0
  2. data/CHANGES.textile +35 -7
  3. data/Gemfile +0 -2
  4. data/README.rdoc +9 -9
  5. data/apotomo.gemspec +3 -3
  6. data/lib/apotomo.rb +4 -47
  7. data/lib/apotomo/event.rb +2 -0
  8. data/lib/apotomo/event_handler.rb +0 -3
  9. data/lib/apotomo/event_methods.rb +6 -2
  10. data/lib/apotomo/invoke_event_handler.rb +5 -3
  11. data/lib/apotomo/javascript_generator.rb +19 -16
  12. data/lib/apotomo/rails/controller_methods.rb +84 -131
  13. data/lib/apotomo/rails/view_helper.rb +15 -31
  14. data/lib/apotomo/railtie.rb +24 -0
  15. data/lib/apotomo/request_processor.rb +17 -48
  16. data/lib/apotomo/test_case.rb +5 -5
  17. data/lib/apotomo/tree_node.rb +52 -61
  18. data/lib/apotomo/version.rb +1 -1
  19. data/lib/apotomo/widget.rb +70 -146
  20. data/lib/apotomo/widget/javascript_methods.rb +39 -0
  21. data/lib/apotomo/widget_shortcuts.rb +14 -40
  22. data/lib/generators/apotomo/widget_generator.rb +8 -9
  23. data/lib/generators/erb/widget_generator.rb +17 -0
  24. data/lib/generators/haml/widget_generator.rb +20 -0
  25. data/lib/generators/{apotomo/templates → templates}/view.erb +1 -1
  26. data/lib/generators/templates/view.haml +4 -0
  27. data/lib/generators/{apotomo/templates → templates}/widget.rb +1 -1
  28. data/lib/generators/{apotomo/templates → templates}/widget_test.rb +1 -1
  29. data/lib/generators/test_unit/widget_generator.rb +14 -0
  30. data/test/rails/caching_test.rb +10 -17
  31. data/test/rails/controller_methods_test.rb +9 -81
  32. data/test/rails/rails_integration_test.rb +76 -60
  33. data/test/rails/view_helper_test.rb +17 -28
  34. data/test/rails/widget_generator_test.rb +19 -31
  35. data/test/support/test_case_methods.rb +6 -20
  36. data/test/test_helper.rb +15 -25
  37. data/test/unit/event_handler_test.rb +1 -0
  38. data/test/unit/event_methods_test.rb +20 -8
  39. data/test/unit/event_test.rb +5 -0
  40. data/test/unit/javascript_generator_test.rb +19 -19
  41. data/test/unit/render_test.rb +17 -112
  42. data/test/unit/request_processor_test.rb +73 -111
  43. data/test/unit/test_case_test.rb +13 -7
  44. data/test/unit/widget_shortcuts_test.rb +24 -53
  45. data/test/unit/widget_test.rb +76 -36
  46. data/test/widgets/mouse/eat.erb +1 -0
  47. data/test/{fixtures → widgets}/mouse/eating.html.erb +0 -0
  48. data/test/{fixtures → widgets}/mouse/educate.html.erb +0 -0
  49. data/test/{fixtures → widgets}/mouse/feed.html.erb +0 -0
  50. data/test/{fixtures → widgets}/mouse/make_me_squeak.html.erb +0 -0
  51. data/test/{fixtures → widgets}/mouse/posing.html.erb +0 -0
  52. data/test/widgets/mouse/snuggle.html.erb +1 -0
  53. metadata +32 -50
  54. data/lib/apotomo/container_widget.rb +0 -10
  55. data/lib/apotomo/persistence.rb +0 -112
  56. data/lib/apotomo/rails/view_methods.rb +0 -7
  57. data/lib/apotomo/stateful_widget.rb +0 -29
  58. data/lib/apotomo/transition.rb +0 -46
  59. data/lib/generators/apotomo/templates/view.haml +0 -4
  60. data/test/dummy/log/production.log +0 -0
  61. data/test/dummy/log/server.log +0 -0
  62. data/test/dummy/public/javascripts/application.js +0 -2
  63. data/test/dummy/public/javascripts/controls.js +0 -965
  64. data/test/dummy/public/javascripts/dragdrop.js +0 -974
  65. data/test/dummy/public/javascripts/effects.js +0 -1123
  66. data/test/dummy/public/javascripts/prototype.js +0 -6001
  67. data/test/dummy/public/javascripts/rails.js +0 -175
  68. data/test/dummy/script/rails +0 -6
  69. data/test/dummy/tmp/app/cells/mouse_widget.rb +0 -11
  70. data/test/dummy/tmp/app/cells/mouse_widget/snuggle.html.erb +0 -7
  71. data/test/dummy/tmp/app/cells/mouse_widget/squeak.html.erb +0 -7
  72. data/test/dummy/tmp/test/widgets/mouse_widget_test.rb +0 -12
  73. data/test/fixtures/application_widget_tree.rb +0 -2
  74. data/test/fixtures/mouse/snuggle.html.erb +0 -1
  75. data/test/rails/view_methods_test.rb +0 -38
  76. data/test/unit/container_test.rb +0 -21
  77. data/test/unit/invoke_test.rb +0 -126
  78. data/test/unit/persistence_test.rb +0 -201
  79. data/test/unit/stateful_widget_test.rb +0 -58
  80. data/test/unit/test_addressing.rb +0 -110
  81. data/test/unit/test_jump_to_state.rb +0 -89
  82. data/test/unit/test_tab_panel.rb +0 -71
  83. data/test/unit/transition_test.rb +0 -34
@@ -0,0 +1,39 @@
1
+ module Apotomo
2
+ module JavascriptMethods
3
+ # Wraps the rendered content in a replace statement targeted at your +Apotomo.js_framework+ setting.
4
+ # Use +:selector+ to change the selector.
5
+ #
6
+ # Example:
7
+ #
8
+ # Assuming you set
9
+ # Apotomo.js_framework = :jquery
10
+ #
11
+ # and call replace in a state
12
+ #
13
+ # replace :view => :squeak, :selector => "div#mouse"
14
+ # #=> "$(\"div#mouse\").replaceWith(\"<div id=\\\"mum\\\">squeak!<\\/div>\")"
15
+ def replace(*args)
16
+ wrap_in_javascript_for(:replace, *args)
17
+ end
18
+
19
+ # Same as replace except that the content is wrapped in an update statement.
20
+ #
21
+ # Example for +:jquery+:
22
+ #
23
+ # update :view => :squeak
24
+ # #=> "$(\"mum\").html(\"<div id=\\\"mum\\\">squeak!<\\/div>\")"
25
+ def update(*args)
26
+ wrap_in_javascript_for(:update, *args)
27
+ end
28
+
29
+ private
30
+ def wrap_in_javascript_for(mode, *args)
31
+ content = render(*args)
32
+ options = args.first.is_a?(::Hash) ? args.shift : {}
33
+
34
+ options[:selector] ?
35
+ Apotomo.js_generator.send(mode, options[:selector], content) : # replace(:twitter)
36
+ Apotomo.js_generator.send("#{mode}_id", name, content) # replace_id(:twitter)
37
+ end
38
+ end
39
+ end
@@ -1,59 +1,33 @@
1
1
  module Apotomo
2
2
  # Shortcut methods for creating widget trees.
3
3
  module WidgetShortcuts
4
- # Shortcut for creating an instance of +class_name+ named +id+.
5
- # If +start_state+ is omited, :display is default. Yields self.
4
+ # Shortcut for creating an instance of <tt>class_name+"_widget"</tt> named +id+. Yields self.
6
5
  #
7
6
  # Example:
8
7
  #
9
- # widget(:comments_widget, 'post-comments')
10
- # widget(:comments_widget, 'post-comments', :user => @current_user)
11
- #
12
- # Start state is <tt>:display</tt>, whereas the latter also populates @opts.
8
+ # widget(:comments)
9
+ #
10
+ # will create a +CommentsWidget+ with id :comments.
13
11
  #
14
- # widget(:comments_widget, 'post-comments', :reload)
15
- # widget(:comments_widget, 'post-comments', :reload, :user => @current_user)
12
+ # widget(:comments, 'post-comments', :user => current_user)
16
13
  #
17
- # Explicitely sets the start state.
14
+ # sets id to 'posts_comments' and #options to the hash.
18
15
  #
19
16
  # You can also use namespaces.
20
17
  #
21
18
  # widget('jquery/tabs', 'panel')
22
- def widget(class_name, id, state=:display, *args)
23
- if state.kind_of?(Hash)
24
- args << state
25
- state = :display
26
- end
19
+ def widget(prefix, *args)
20
+ options = args.extract_options!
21
+ id = args.shift || prefix
27
22
 
28
- object = constant_for(class_name).new(parent_controller, id, state, *args)
29
- yield object if block_given?
30
- object
31
- end
32
-
33
- def container(id, *args, &block)
34
- widget('apotomo/container_widget', id, *args, &block)
35
- end
36
-
37
- def section(*args)
38
- container(*args)
39
- end
40
-
41
- # TODO: deprecate.
42
- def cell(base_name, states, id, *args)
43
- widget(base_name.to_s + '_cell', states, id, *args)
44
- end
45
-
46
- def tab_panel(id, *args)
47
- widget('apotomo/tab_panel_widget', :display, id, *args)
48
- end
49
-
50
- def tab(id, *args)
51
- widget('apotomo/tab_widget', :display, id, *args)
23
+ constant_for(prefix).new(parent_controller, id, options).tap do |object|
24
+ yield object if block_given?
25
+ end
52
26
  end
53
27
 
54
28
  private
55
- def constant_for(class_name)
56
- class_name.to_s.camelize.constantize
29
+ def constant_for(class_name) # TODO: use Cell.class_from_cell_name.
30
+ "#{class_name}_widget".classify.constantize
57
31
  end
58
32
  end
59
33
  end
@@ -1,19 +1,18 @@
1
- require 'generators/cells/cell_generator'
1
+ require 'generators/cells/base'
2
2
 
3
3
  module Apotomo
4
4
  module Generators
5
- class WidgetGenerator < Cells::Generators::CellGenerator
6
- source_root File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
5
+ class WidgetGenerator < ::Cells::Generators::Base
6
+ source_root File.expand_path(File.join(File.dirname(__FILE__), '../templates'))
7
7
 
8
8
  def create_cell_file
9
- puts "creating #{file_name}.rb"
10
- template 'widget.rb', File.join('app/cells', class_path, "#{file_name}.rb")
9
+ template 'widget.rb', File.join('app/widgets', class_path, "#{file_name}_widget.rb")
11
10
  end
12
11
 
13
- def create_test
14
- @states = actions
15
- template 'widget_test.rb', File.join('test/widgets/', "#{file_name}_test.rb")
16
- end
12
+ check_class_collision :suffix => "Widget"
13
+
14
+ hook_for(:template_engine)
15
+ hook_for(:test_framework) # TODO: implement rspec-apotomo.
17
16
  end
18
17
  end
19
18
  end
@@ -0,0 +1,17 @@
1
+ require 'generators/cells/base'
2
+
3
+ module Erb
4
+ module Generators
5
+ class WidgetGenerator < ::Cells::Generators::Base
6
+ source_root File.expand_path('../../templates', __FILE__)
7
+
8
+ def create_views
9
+ for state in actions do
10
+ @state = state
11
+ @path = File.join('app/widgets', file_name, "#{state}.html.erb")
12
+ template "view.erb", @path
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ require 'generators/cells/base'
2
+
3
+ module Haml
4
+ module Generators
5
+ class WidgetGenerator < ::Cells::Generators::Base
6
+ source_root File.expand_path('../../templates', __FILE__)
7
+
8
+ def create_views
9
+ for state in actions do
10
+ @state = state
11
+ @path = File.join('app/widgets', file_name, "#{state}.html.haml")
12
+
13
+ template "view.haml", @path
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+
@@ -1,5 +1,5 @@
1
1
  <h1>
2
- <%= class_name %>#<%= @state %>
2
+ <%= class_name %>Widget#<%= @state %>
3
3
  </h1>
4
4
 
5
5
  <p>
@@ -0,0 +1,4 @@
1
+ %h1
2
+ <%= class_name %>Widget#<%= @state %>
3
+ %p
4
+ Find me in <%= @path %>
@@ -1,4 +1,4 @@
1
- class <%= class_name %> < Apotomo::Widget
1
+ class <%= class_name %>Widget < Apotomo::Widget
2
2
 
3
3
  <% for action in actions -%>
4
4
  def <%= action %>
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
- class <%= class_name %>Test < Apotomo::TestCase
3
+ class <%= class_name %>WidgetTest < Apotomo::TestCase
4
4
  has_widgets do |root|
5
5
  root << widget(:<%= file_name %>, 'me')
6
6
  end
@@ -0,0 +1,14 @@
1
+ require 'generators/cells/base'
2
+
3
+ module TestUnit
4
+ module Generators
5
+ class WidgetGenerator < ::Cells::Generators::Base
6
+ source_root File.expand_path('../../templates', __FILE__)
7
+
8
+ def create_test
9
+ @states = actions
10
+ template 'widget_test.rb', File.join('test/widgets/', "#{file_name}_widget_test.rb")
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
-
3
+ # TODO: assert that same-named cells and widgets don't overwrite their caches.
4
4
 
5
5
  class CachingTest < ActiveSupport::TestCase
6
6
  include Apotomo::TestCaseMethods::TestController
@@ -8,31 +8,24 @@ class CachingTest < ActiveSupport::TestCase
8
8
  class CheeseWidget < Apotomo::Widget
9
9
  cache :holes
10
10
 
11
- @@holes = 0
12
- cattr_accessor :holes
13
-
14
-
15
- #def self.reset!
16
- # @@counter = 0
17
- #end
18
-
19
- def increment!
20
- self.class.holes += 1
21
- end
22
-
23
- def holes
24
- render :text => increment!
11
+ def holes(count)
12
+ render :text => count
25
13
  end
26
14
  end
27
15
 
28
16
  context "A caching widget" do
29
17
  setup do
18
+ ActionController::Base.perform_caching = true
30
19
  @cheese = CheeseWidget.new(parent_controller, 'cheese', :holes)
31
20
  end
32
21
 
22
+ teardown do
23
+ ActionController::Base.perform_caching = false
24
+ end
25
+
33
26
  should "invoke the cached state only once" do
34
- assert_equal "1", @cheese.invoke
35
- assert_equal "1", @cheese.invoke
27
+ assert_equal "1", @cheese.invoke(:holes, 1)
28
+ assert_equal "1", @cheese.invoke(:holes, 2)
36
29
  end
37
30
  end
38
31
  end
@@ -16,7 +16,7 @@ class ControllerMethodsTest < ActionController::TestCase
16
16
  end
17
17
 
18
18
  context "responding to #apotomo_request_processor" do
19
- should "initially return the processor which has a flushed root" do
19
+ should "initially return the processor which has an empty root" do
20
20
  assert_kind_of Apotomo::RequestProcessor, @controller.apotomo_request_processor
21
21
  assert_equal 1, @controller.apotomo_request_processor.root.size
22
22
  end
@@ -29,7 +29,7 @@ class ControllerMethodsTest < ActionController::TestCase
29
29
  context "invoking #has_widgets" do
30
30
  setup do
31
31
  @controller.class.has_widgets do |root|
32
- root << widget(:mouse_cell, 'mum')
32
+ root << widget(:mouse, 'mum')
33
33
  end
34
34
  end
35
35
 
@@ -44,7 +44,7 @@ class ControllerMethodsTest < ActionController::TestCase
44
44
 
45
45
  should "allow multiple calls to has_widgets" do
46
46
  @controller.class.has_widgets do |root|
47
- root << widget(:mouse_cell, 'kid')
47
+ root << widget(:mouse, 'kid')
48
48
  end
49
49
 
50
50
  assert @controller.apotomo_root['mum']
@@ -52,7 +52,7 @@ class ControllerMethodsTest < ActionController::TestCase
52
52
  end
53
53
 
54
54
  should "inherit has_widgets blocks to sub-controllers" do
55
- berry = widget(:mouse_cell, 'berry')
55
+ berry = widget(:mouse, 'berry')
56
56
  @sub_controller = Class.new(@controller.class) do
57
57
  has_widgets { |root| root << berry }
58
58
  end.new
@@ -68,88 +68,34 @@ class ControllerMethodsTest < ActionController::TestCase
68
68
  end
69
69
 
70
70
  @controller.class.has_widgets do |root|
71
- root << widget(:mouse_cell, 'kid', :display, :roomies => roomies)
71
+ root << widget(:mouse, 'kid', :display, :roomies => roomies)
72
72
  end
73
73
 
74
- assert_equal ['mice', 'cows'], @controller.apotomo_root['kid'].opts[:roomies]
74
+ assert_equal ['mice', 'cows'], @controller.apotomo_root['kid'].options[:roomies]
75
75
  end
76
76
  end
77
77
 
78
- context "invoking #use_widgets" do
79
- should "have an empty apotomo_root if no call happened, yet" do
80
- assert_equal [], @controller.bound_use_widgets_blocks
81
- assert_equal 1, @controller.apotomo_root.size
82
- end
83
-
84
- should "extend the widget family and remember the block with one #use_widgets call" do
85
- @controller.use_widgets do |root|
86
- root << widget(:mouse_cell, 'mum')
87
- end
88
-
89
- assert_equal 1, @controller.bound_use_widgets_blocks.size
90
- assert_equal 2, @controller.apotomo_root.size
91
- end
92
-
93
- should "add blocks only once" do
94
- block = Proc.new {|root| root << widget(:mouse_cell, 'mum')}
95
-
96
- @controller.use_widgets &block
97
- @controller.use_widgets &block
98
-
99
- assert_equal 1, @controller.bound_use_widgets_blocks.size
100
- assert_equal 2, @controller.apotomo_root.size
101
- end
102
-
103
- should "allow multiple calls with different blocks" do
104
- mum_and_kid!
105
- @controller.use_widgets do |root|
106
- root << @mum
107
- end
108
- @controller.use_widgets do |root|
109
- root << widget(:mouse_cell, 'pet')
110
- end
111
-
112
- assert_equal 2, @controller.bound_use_widgets_blocks.size
113
- assert_equal 4, @controller.apotomo_root.size
114
- end
115
- end
78
+
116
79
 
117
80
  context "invoking #url_for_event" do
118
81
  should "compute an url for any widget" do
119
82
  assert_equal "/barn/render_event_response?source=mouse&type=footsteps&volume=9", @controller.url_for_event(:footsteps, :source => :mouse, :volume => 9)
120
83
  end
121
84
  end
122
-
123
- should "flush its bound_use_widgets_blocks with, guess, #flush_bound_use_widgets_blocks" do
124
- @controller.bound_use_widgets_blocks << Proc.new {}
125
- assert_equal 1, @controller.bound_use_widgets_blocks.size
126
- @controller.flush_bound_use_widgets_blocks
127
- assert_equal 0, @controller.bound_use_widgets_blocks.size
128
- end
129
85
  end
130
86
 
131
87
  context "invoking #render_widget" do
132
88
  setup do
133
- @mum = mouse_mock('mum', 'snuggle') {def snuggle; render; end}
89
+ @mum = mouse_mock('mum', 'eating')
134
90
  end
135
91
 
136
92
  should "render the widget" do
137
93
  @controller.apotomo_root << @mum
138
- assert_equal "<div id=\"mum\"><snuggle></snuggle></div>\n", @controller.render_widget('mum')
94
+ assert_equal "<div id=\"mum\">burp!</div>\n", @controller.render_widget('mum', :eat)
139
95
  end
140
96
  end
141
97
 
142
98
 
143
-
144
- context "invoking #apotomo_freeze" do
145
- should "freeze the widget tree to session" do
146
- assert_equal 0, @controller.session.size
147
- @controller.send :apotomo_freeze
148
- assert @controller.session[:apotomo_widget_ivars]
149
- assert @controller.session[:apotomo_stateful_branches]
150
- end
151
- end
152
-
153
99
  context "processing an event request" do
154
100
  setup do
155
101
  @mum = mouse_mock('mum', :eating)
@@ -180,24 +126,6 @@ class ControllerMethodsTest < ActionController::TestCase
180
126
  end
181
127
  end
182
128
 
183
- context "The ProcHash" do
184
- setup do
185
- @procs = Apotomo::Rails::ControllerMethods::ProcHash.new
186
- @b = Proc.new{}; @d = Proc.new{}
187
- @c = Proc.new{}
188
- @procs << @b
189
- end
190
-
191
- should "return true for procs it includes" do
192
- assert @procs.include?(@b)
193
- assert @procs.include?(@d) ### DISCUSS: line nr is id, or do YOU got a better idea?!
194
- end
195
-
196
- should "reject unknown procs" do
197
- assert ! @procs.include?(@c)
198
- end
199
- end
200
-
201
129
  ### FIXME: could somebody get that working?
202
130
  context "Routing" do
203
131
  should_eventually "generate routes to the render_event_response action" do
@@ -1,90 +1,55 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class RailsIntegrationTest < ActionController::TestCase
4
+ include Apotomo::TestCaseMethods::TestController
5
+
4
6
  def simulate_request!
5
7
  @controller.instance_eval { @apotomo_request_processor = nil }
6
-
7
- ### FIXME: @controller.session = Marshal.load(Marshal.dump(@controller.session))
8
8
  end
9
9
 
10
- include Apotomo::TestCaseMethods::TestController
11
-
12
- context "A Rails controller" do
10
+ context "ActionController" do
13
11
  setup do
14
- @mum = MouseCell.new(parent_controller, 'mum', :snuggle)
15
- @mum.class.class_eval do
16
- responds_to_event :squeak, :with => :snuggle
17
-
18
- def snuggle; render; end
12
+ @mum = mum = MouseWidget.new(parent_controller, 'mum', :eating)
13
+ @mum.instance_eval do
14
+ def eating; render; end
15
+ end
16
+
17
+ @mum.respond_to_event :squeak
18
+
19
+ @controller.class.has_widgets do |root|
20
+ root << mum
19
21
  end
20
22
 
21
- @controller.instance_variable_set(:@mum, @mum)
22
23
  @controller.instance_eval do
23
24
  def widget
24
- use_widgets do |root|
25
- root << @mum
26
- end
27
-
28
- render :text => render_widget('mum')
25
+ render :text => render_widget('mum', :eat)
29
26
  end
30
27
  end
31
28
  end
32
29
 
33
- should "freeze the widget tree once after each request" do
34
- assert_equal 0, @controller.session.size
35
-
36
- get 'widget'
37
- assert_equal 1, @controller.session[:apotomo_stateful_branches].size
38
- end
39
-
40
- should "invoke a #use_widgets block only once per session" do
41
- #assert_equal 1, @controller.apotomo_root.size
42
-
43
- get 'widget'
44
- assert_response :success
45
- assert_equal 1, @controller.session[:apotomo_stateful_branches].size
46
-
47
- simulate_request!
48
-
49
- get 'widget'
50
- assert_equal 1, @controller.session[:apotomo_stateful_branches].size
51
- assert_response :success
52
-
53
- simulate_request!
54
-
55
- get 'widget'
56
- assert_response :success
57
- assert_equal 2, @controller.apotomo_root.size, "mum added multiple times"
58
- end
59
-
60
30
  should "provide the rails view helpers in state views" do
61
31
  @mum.instance_eval do
62
- def snuggle; render :view => :make_me_squeak; end
32
+ def eat; render :view => :make_me_squeak; end
63
33
  end
64
34
 
65
35
  get 'widget'
66
36
  assert_select "a", "mum"
67
37
  end
68
38
 
69
- should "contain a freshly flushed tree when ?flush_widgets=1 is set" do
70
- get 'widget'
71
- assert_response :success
72
- assert @controller.apotomo_request_processor.widgets_flushed?
73
-
74
- simulate_request!
75
-
76
- get 'widget'
77
- assert_response :success
78
- assert_not @controller.apotomo_request_processor.widgets_flushed?
79
-
80
- simulate_request!
39
+ should "pass the event with all params data as state-args" do
40
+ @mum.instance_eval do
41
+ def squeak(evt); render :text => evt.data; end
42
+ end
81
43
 
82
- get 'widget', :flush_widgets => 1
83
- assert_response :success # will fail if no #use_widgets block invoked
84
- assert @controller.apotomo_request_processor.widgets_flushed?
44
+ get 'render_event_response', :source => 'mum', :type => :squeak, :pitch => :high
45
+ assert_equal "{\"source\"=>\"mum\", \"type\"=>:squeak, \"pitch\"=>:high, \"controller\"=>\"barn\", \"action\"=>\"render_event_response\"}", @response.body
85
46
  end
86
47
 
87
48
  should "render updates to the parent window for an iframe request" do
49
+ @mum.instance_eval do
50
+ def squeak(evt); render :text => "<b>SQUEAK!</b>"; end
51
+ end
52
+
88
53
  get 'widget'
89
54
  assert_response :success
90
55
 
@@ -94,7 +59,58 @@ class RailsIntegrationTest < ActionController::TestCase
94
59
 
95
60
  assert_response :success
96
61
  assert_equal 'text/html', @response.content_type
97
- assert_equal "<html><body><script type='text/javascript' charset='utf-8'>\nvar loc = document.location;\nwith(window.parent) { setTimeout(function() { window.eval('<div id=\\\"mum\\\"><snuggle><\\/snuggle><\\/div>\\n'); window.loc && loc.replace('about:blank'); }, 1) }\n</script></body></html>", @response.body
62
+ assert_equal "<html><body><script type='text/javascript' charset='utf-8'>\nvar loc = document.location;\nwith(window.parent) { setTimeout(function() { window.eval('<b>SQUEAK!<\\/b>'); window.loc && loc.replace('about:blank'); }, 1) }\n</script></body></html>", @response.body
63
+ end
64
+
65
+
66
+ context "ActionView" do
67
+ setup do
68
+ @controller.instance_eval do
69
+ def widget
70
+ render :inline => "<%= render_widget 'mum', :eat %>"
71
+ end
72
+ end
73
+ end
74
+
75
+ should "respond to #render_widget" do
76
+ get :widget
77
+ assert_select "#mum", "burp!"
78
+ end
79
+
80
+ should "respond to #url_for_event" do
81
+ @controller.instance_eval do
82
+ def widget
83
+ render :inline => "<%= url_for_event :footsteps, :source => 'mum' %>"
84
+ end
85
+ end
86
+
87
+ get :widget
88
+ assert_equal "/barn/render_event_response?source=mum&amp;type=footsteps", @response.body
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+
95
+ class IncludingApotomoSupportTest < ActiveSupport::TestCase
96
+ context "A controller not including ControllerMethods explicitely" do
97
+ setup do
98
+ @class = Class.new(ActionController::Base)
99
+ @controller = @class.new
100
+ @controller.request = ActionController::TestRequest.new
101
+ end
102
+
103
+ should "respond to .has_widgets only" do
104
+ assert_respond_to @class, :has_widgets
105
+ assert_not_respond_to @class, :apotomo_request_processor
106
+ end
107
+
108
+ should "mixin all methods after first use of .has_widgets" do
109
+ @class.has_widgets do |root|
110
+ end
111
+
112
+ assert_respond_to @class, :has_widgets
113
+ assert_respond_to @controller, :apotomo_request_processor
98
114
  end
99
115
  end
100
116
  end