apotomo 1.0.5 → 1.1.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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