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.
- data/.gitignore +5 -0
- data/CHANGES.textile +35 -7
- data/Gemfile +0 -2
- data/README.rdoc +9 -9
- data/apotomo.gemspec +3 -3
- data/lib/apotomo.rb +4 -47
- data/lib/apotomo/event.rb +2 -0
- data/lib/apotomo/event_handler.rb +0 -3
- data/lib/apotomo/event_methods.rb +6 -2
- data/lib/apotomo/invoke_event_handler.rb +5 -3
- data/lib/apotomo/javascript_generator.rb +19 -16
- data/lib/apotomo/rails/controller_methods.rb +84 -131
- data/lib/apotomo/rails/view_helper.rb +15 -31
- data/lib/apotomo/railtie.rb +24 -0
- data/lib/apotomo/request_processor.rb +17 -48
- data/lib/apotomo/test_case.rb +5 -5
- data/lib/apotomo/tree_node.rb +52 -61
- data/lib/apotomo/version.rb +1 -1
- data/lib/apotomo/widget.rb +70 -146
- data/lib/apotomo/widget/javascript_methods.rb +39 -0
- data/lib/apotomo/widget_shortcuts.rb +14 -40
- data/lib/generators/apotomo/widget_generator.rb +8 -9
- data/lib/generators/erb/widget_generator.rb +17 -0
- data/lib/generators/haml/widget_generator.rb +20 -0
- data/lib/generators/{apotomo/templates → templates}/view.erb +1 -1
- data/lib/generators/templates/view.haml +4 -0
- data/lib/generators/{apotomo/templates → templates}/widget.rb +1 -1
- data/lib/generators/{apotomo/templates → templates}/widget_test.rb +1 -1
- data/lib/generators/test_unit/widget_generator.rb +14 -0
- data/test/rails/caching_test.rb +10 -17
- data/test/rails/controller_methods_test.rb +9 -81
- data/test/rails/rails_integration_test.rb +76 -60
- data/test/rails/view_helper_test.rb +17 -28
- data/test/rails/widget_generator_test.rb +19 -31
- data/test/support/test_case_methods.rb +6 -20
- data/test/test_helper.rb +15 -25
- data/test/unit/event_handler_test.rb +1 -0
- data/test/unit/event_methods_test.rb +20 -8
- data/test/unit/event_test.rb +5 -0
- data/test/unit/javascript_generator_test.rb +19 -19
- data/test/unit/render_test.rb +17 -112
- data/test/unit/request_processor_test.rb +73 -111
- data/test/unit/test_case_test.rb +13 -7
- data/test/unit/widget_shortcuts_test.rb +24 -53
- data/test/unit/widget_test.rb +76 -36
- data/test/widgets/mouse/eat.erb +1 -0
- data/test/{fixtures → widgets}/mouse/eating.html.erb +0 -0
- data/test/{fixtures → widgets}/mouse/educate.html.erb +0 -0
- data/test/{fixtures → widgets}/mouse/feed.html.erb +0 -0
- data/test/{fixtures → widgets}/mouse/make_me_squeak.html.erb +0 -0
- data/test/{fixtures → widgets}/mouse/posing.html.erb +0 -0
- data/test/widgets/mouse/snuggle.html.erb +1 -0
- metadata +32 -50
- data/lib/apotomo/container_widget.rb +0 -10
- data/lib/apotomo/persistence.rb +0 -112
- data/lib/apotomo/rails/view_methods.rb +0 -7
- data/lib/apotomo/stateful_widget.rb +0 -29
- data/lib/apotomo/transition.rb +0 -46
- data/lib/generators/apotomo/templates/view.haml +0 -4
- data/test/dummy/log/production.log +0 -0
- data/test/dummy/log/server.log +0 -0
- data/test/dummy/public/javascripts/application.js +0 -2
- data/test/dummy/public/javascripts/controls.js +0 -965
- data/test/dummy/public/javascripts/dragdrop.js +0 -974
- data/test/dummy/public/javascripts/effects.js +0 -1123
- data/test/dummy/public/javascripts/prototype.js +0 -6001
- data/test/dummy/public/javascripts/rails.js +0 -175
- data/test/dummy/script/rails +0 -6
- data/test/dummy/tmp/app/cells/mouse_widget.rb +0 -11
- data/test/dummy/tmp/app/cells/mouse_widget/snuggle.html.erb +0 -7
- data/test/dummy/tmp/app/cells/mouse_widget/squeak.html.erb +0 -7
- data/test/dummy/tmp/test/widgets/mouse_widget_test.rb +0 -12
- data/test/fixtures/application_widget_tree.rb +0 -2
- data/test/fixtures/mouse/snuggle.html.erb +0 -1
- data/test/rails/view_methods_test.rb +0 -38
- data/test/unit/container_test.rb +0 -21
- data/test/unit/invoke_test.rb +0 -126
- data/test/unit/persistence_test.rb +0 -201
- data/test/unit/stateful_widget_test.rb +0 -58
- data/test/unit/test_addressing.rb +0 -110
- data/test/unit/test_jump_to_state.rb +0 -89
- data/test/unit/test_tab_panel.rb +0 -71
- 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
|
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(:
|
10
|
-
#
|
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(:
|
15
|
-
# widget(:comments_widget, 'post-comments', :reload, :user => @current_user)
|
12
|
+
# widget(:comments, 'post-comments', :user => current_user)
|
16
13
|
#
|
17
|
-
#
|
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(
|
23
|
-
|
24
|
-
|
25
|
-
state = :display
|
26
|
-
end
|
19
|
+
def widget(prefix, *args)
|
20
|
+
options = args.extract_options!
|
21
|
+
id = args.shift || prefix
|
27
22
|
|
28
|
-
|
29
|
-
|
30
|
-
|
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.
|
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/
|
1
|
+
require 'generators/cells/base'
|
2
2
|
|
3
3
|
module Apotomo
|
4
4
|
module Generators
|
5
|
-
class WidgetGenerator < Cells::Generators::
|
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
|
-
|
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
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|
+
|
@@ -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
|
data/test/rails/caching_test.rb
CHANGED
@@ -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
|
-
|
12
|
-
|
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
|
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(:
|
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(:
|
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(:
|
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(:
|
71
|
+
root << widget(:mouse, 'kid', :display, :roomies => roomies)
|
72
72
|
end
|
73
73
|
|
74
|
-
assert_equal ['mice', 'cows'], @controller.apotomo_root['kid'].
|
74
|
+
assert_equal ['mice', 'cows'], @controller.apotomo_root['kid'].options[:roomies]
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
|
-
|
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', '
|
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\"
|
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
|
-
|
11
|
-
|
12
|
-
context "A Rails controller" do
|
10
|
+
context "ActionController" do
|
13
11
|
setup do
|
14
|
-
@mum =
|
15
|
-
@mum.
|
16
|
-
|
17
|
-
|
18
|
-
|
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
|
-
|
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
|
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 "
|
70
|
-
|
71
|
-
|
72
|
-
|
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 '
|
83
|
-
|
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('<
|
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&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
|