rails-footnotes 3.6.3 → 3.6.4
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +21 -21
- data/README +140 -141
- data/Rakefile +20 -20
- data/lib/rails-footnotes.rb +19 -19
- data/lib/rails-footnotes/backtracer.rb +33 -33
- data/lib/rails-footnotes/footnotes.rb +2 -2
- data/lib/rails-footnotes/notes/assigns_note.rb +15 -15
- data/lib/rails-footnotes/notes/controller_note.rb +64 -64
- data/lib/rails-footnotes/notes/cookies_note.rb +17 -17
- data/lib/rails-footnotes/notes/env_note.rb +19 -19
- data/lib/rails-footnotes/notes/files_note.rb +43 -43
- data/lib/rails-footnotes/notes/filters_note.rb +52 -52
- data/lib/rails-footnotes/notes/general_note.rb +18 -18
- data/lib/rails-footnotes/notes/javascripts_note.rb +15 -15
- data/lib/rails-footnotes/notes/layout_note.rb +28 -28
- data/lib/rails-footnotes/notes/log_note.rb +47 -36
- data/lib/rails-footnotes/notes/params_note.rb +16 -16
- data/lib/rails-footnotes/notes/queries_note.rb +152 -152
- data/lib/rails-footnotes/notes/routes_note.rb +59 -59
- data/lib/rails-footnotes/notes/rpm_note.rb +24 -24
- data/lib/rails-footnotes/notes/session_note.rb +15 -15
- data/lib/rails-footnotes/notes/stylesheets_note.rb +15 -15
- data/lib/rails-footnotes/notes/view_note.rb +35 -35
- data/test/footnotes_test.rb +198 -198
- data/test/notes/abstract_note_test.rb +106 -106
- data/test/test_helper.rb +8 -8
- metadata +3 -3
@@ -1,59 +1,59 @@
|
|
1
|
-
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
-
|
3
|
-
module Footnotes
|
4
|
-
module Notes
|
5
|
-
class RoutesNote < AbstractNote
|
6
|
-
def initialize(controller)
|
7
|
-
@controller = controller
|
8
|
-
@parsed_routes = parse_routes
|
9
|
-
end
|
10
|
-
|
11
|
-
def legend
|
12
|
-
"Routes for #{@controller.class.to_s}"
|
13
|
-
end
|
14
|
-
|
15
|
-
def content
|
16
|
-
mount_table(@parsed_routes.unshift([:path, :name, :options, :requirements]))
|
17
|
-
end
|
18
|
-
|
19
|
-
protected
|
20
|
-
def parse_routes
|
21
|
-
routes_with_name = ActionController::Routing::Routes.named_routes.to_a.flatten
|
22
|
-
|
23
|
-
return ActionController::Routing::Routes.filtered_routes(:controller => @controller.controller_path).collect do |route|
|
24
|
-
# Catch routes name if exists
|
25
|
-
i = routes_with_name.index(route)
|
26
|
-
name = i ? routes_with_name[i-1].to_s : ''
|
27
|
-
|
28
|
-
# Catch segments requirements
|
29
|
-
req = {}
|
30
|
-
route.segments.each do |segment|
|
31
|
-
next unless segment.is_a?(ActionController::Routing::DynamicSegment) && segment.regexp
|
32
|
-
req[segment.key.to_sym] = segment.regexp
|
33
|
-
end
|
34
|
-
|
35
|
-
[escape(name), route.segments.join, route.requirements.reject{|key,value| key == :controller}.inspect, req.inspect]
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
module Extensions
|
42
|
-
module Routes
|
43
|
-
# Filter routes according to the filter sent
|
44
|
-
#
|
45
|
-
def filtered_routes(filter = {})
|
46
|
-
return [] unless filter.is_a?(Hash)
|
47
|
-
return routes.reject do |r|
|
48
|
-
filter_diff = filter.diff(r.requirements)
|
49
|
-
route_diff = r.requirements.diff(filter)
|
50
|
-
(filter_diff == filter) || (filter_diff != route_diff)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
if Footnotes::Notes::RoutesNote.included?
|
58
|
-
ActionController::Routing::RouteSet.send :include, Footnotes::Extensions::Routes
|
59
|
-
end
|
1
|
+
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
+
|
3
|
+
module Footnotes
|
4
|
+
module Notes
|
5
|
+
class RoutesNote < AbstractNote
|
6
|
+
def initialize(controller)
|
7
|
+
@controller = controller
|
8
|
+
@parsed_routes = parse_routes
|
9
|
+
end
|
10
|
+
|
11
|
+
def legend
|
12
|
+
"Routes for #{@controller.class.to_s}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def content
|
16
|
+
mount_table(@parsed_routes.unshift([:path, :name, :options, :requirements]))
|
17
|
+
end
|
18
|
+
|
19
|
+
protected
|
20
|
+
def parse_routes
|
21
|
+
routes_with_name = ActionController::Routing::Routes.named_routes.to_a.flatten
|
22
|
+
|
23
|
+
return ActionController::Routing::Routes.filtered_routes(:controller => @controller.controller_path).collect do |route|
|
24
|
+
# Catch routes name if exists
|
25
|
+
i = routes_with_name.index(route)
|
26
|
+
name = i ? routes_with_name[i-1].to_s : ''
|
27
|
+
|
28
|
+
# Catch segments requirements
|
29
|
+
req = {}
|
30
|
+
route.segments.each do |segment|
|
31
|
+
next unless segment.is_a?(ActionController::Routing::DynamicSegment) && segment.regexp
|
32
|
+
req[segment.key.to_sym] = segment.regexp
|
33
|
+
end
|
34
|
+
|
35
|
+
[escape(name), route.segments.join, route.requirements.reject{|key,value| key == :controller}.inspect, req.inspect]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
module Extensions
|
42
|
+
module Routes
|
43
|
+
# Filter routes according to the filter sent
|
44
|
+
#
|
45
|
+
def filtered_routes(filter = {})
|
46
|
+
return [] unless filter.is_a?(Hash)
|
47
|
+
return routes.reject do |r|
|
48
|
+
filter_diff = filter.diff(r.requirements)
|
49
|
+
route_diff = r.requirements.diff(filter)
|
50
|
+
(filter_diff == filter) || (filter_diff != route_diff)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
if Footnotes::Notes::RoutesNote.included?
|
58
|
+
ActionController::Routing::RouteSet.send :include, Footnotes::Extensions::Routes
|
59
|
+
end
|
@@ -1,24 +1,24 @@
|
|
1
|
-
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
-
|
3
|
-
module Footnotes
|
4
|
-
module Notes
|
5
|
-
class RpmNote < AbstractNote
|
6
|
-
def initialize(controller)
|
7
|
-
@rpm_id=NewRelic::Agent.instance.transaction_sampler.current_sample_id
|
8
|
-
end
|
9
|
-
|
10
|
-
def row
|
11
|
-
:edit
|
12
|
-
end
|
13
|
-
|
14
|
-
def link
|
15
|
-
#{:controller => 'newrelic', :action => 'show_sample_detail', :id => @rpm_id}
|
16
|
-
"/newrelic/show_sample_detail/#{@rpm_id}"
|
17
|
-
end
|
18
|
-
|
19
|
-
def valid?
|
20
|
-
!NewRelic::Config.instance['skip_developer_route']
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
1
|
+
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
+
|
3
|
+
module Footnotes
|
4
|
+
module Notes
|
5
|
+
class RpmNote < AbstractNote
|
6
|
+
def initialize(controller)
|
7
|
+
@rpm_id=NewRelic::Agent.instance.transaction_sampler.current_sample_id
|
8
|
+
end
|
9
|
+
|
10
|
+
def row
|
11
|
+
:edit
|
12
|
+
end
|
13
|
+
|
14
|
+
def link
|
15
|
+
#{:controller => 'newrelic', :action => 'show_sample_detail', :id => @rpm_id}
|
16
|
+
"/newrelic/show_sample_detail/#{@rpm_id}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def valid?
|
20
|
+
!NewRelic::Config.instance['skip_developer_route']
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -1,19 +1,19 @@
|
|
1
|
-
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
-
|
3
|
-
module Footnotes
|
4
|
-
module Notes
|
5
|
-
class SessionNote < AbstractNote
|
6
|
-
def initialize(controller)
|
7
|
-
@session = (controller.session || {}).symbolize_keys
|
8
|
-
end
|
1
|
+
require "#{File.dirname(__FILE__)}/abstract_note"
|
9
2
|
|
10
|
-
|
11
|
-
|
3
|
+
module Footnotes
|
4
|
+
module Notes
|
5
|
+
class SessionNote < AbstractNote
|
6
|
+
def initialize(controller)
|
7
|
+
@session = (controller.session.data || {}).symbolize_keys
|
12
8
|
end
|
13
|
-
|
9
|
+
|
10
|
+
def title
|
11
|
+
"Session (#{@session.length})"
|
12
|
+
end
|
13
|
+
|
14
14
|
def content
|
15
15
|
mount_table_for_hash(@session)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,16 +1,16 @@
|
|
1
|
-
require "#{File.dirname(__FILE__)}/files_note"
|
2
|
-
|
3
|
-
module Footnotes
|
4
|
-
module Notes
|
5
|
-
class StylesheetsNote < FilesNote
|
6
|
-
def title
|
7
|
-
"Stylesheets (#{@files.length})"
|
8
|
-
end
|
9
|
-
|
10
|
-
protected
|
11
|
-
def scan_text(text)
|
12
|
-
text.scan(/<link[^>]+href\s*=\s*['"]([^>?'"]+\.css)/im).flatten
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
1
|
+
require "#{File.dirname(__FILE__)}/files_note"
|
2
|
+
|
3
|
+
module Footnotes
|
4
|
+
module Notes
|
5
|
+
class StylesheetsNote < FilesNote
|
6
|
+
def title
|
7
|
+
"Stylesheets (#{@files.length})"
|
8
|
+
end
|
9
|
+
|
10
|
+
protected
|
11
|
+
def scan_text(text)
|
12
|
+
text.scan(/<link[^>]+href\s*=\s*['"]([^>?'"]+\.css)/im).flatten
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
16
|
end
|
@@ -1,35 +1,35 @@
|
|
1
|
-
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
-
|
3
|
-
module Footnotes
|
4
|
-
module Notes
|
5
|
-
class ViewNote < AbstractNote
|
6
|
-
def initialize(controller)
|
7
|
-
@controller = controller
|
8
|
-
@template = controller.instance_variable_get(:@template)
|
9
|
-
end
|
10
|
-
|
11
|
-
def row
|
12
|
-
:edit
|
13
|
-
end
|
14
|
-
|
15
|
-
def link
|
16
|
-
escape(Footnotes::Filter.prefix(filename, 1, 1))
|
17
|
-
end
|
18
|
-
|
19
|
-
def valid?
|
20
|
-
prefix? && first_render?
|
21
|
-
end
|
22
|
-
|
23
|
-
protected
|
24
|
-
|
25
|
-
def first_render?
|
26
|
-
@template.instance_variable_get(:@_first_render)
|
27
|
-
end
|
28
|
-
|
29
|
-
def filename
|
30
|
-
@filename ||= @template.instance_variable_get(:@_first_render).filename
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
1
|
+
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
+
|
3
|
+
module Footnotes
|
4
|
+
module Notes
|
5
|
+
class ViewNote < AbstractNote
|
6
|
+
def initialize(controller)
|
7
|
+
@controller = controller
|
8
|
+
@template = controller.instance_variable_get(:@template)
|
9
|
+
end
|
10
|
+
|
11
|
+
def row
|
12
|
+
:edit
|
13
|
+
end
|
14
|
+
|
15
|
+
def link
|
16
|
+
escape(Footnotes::Filter.prefix(filename, 1, 1))
|
17
|
+
end
|
18
|
+
|
19
|
+
def valid?
|
20
|
+
prefix? && first_render?
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def first_render?
|
26
|
+
@template.instance_variable_get(:@_first_render)
|
27
|
+
end
|
28
|
+
|
29
|
+
def filename
|
30
|
+
@filename ||= @template.instance_variable_get(:@_first_render).filename
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/test/footnotes_test.rb
CHANGED
@@ -1,199 +1,199 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper'
|
2
|
-
|
3
|
-
require 'action_controller'
|
4
|
-
require 'action_controller/test_case'
|
5
|
-
require 'action_controller/test_process'
|
6
|
-
|
7
|
-
class FootnotesController < ActionController::Base; attr_accessor :template, :performed_render; end
|
8
|
-
|
9
|
-
module Footnotes::Notes
|
10
|
-
class TestNote < AbstractNote
|
11
|
-
def self.to_sym; :test; end
|
12
|
-
def valid?; true; end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
class FootnotesTest < Test::Unit::TestCase
|
17
|
-
def setup
|
18
|
-
@controller = FootnotesController.new
|
19
|
-
@controller.request = ActionController::TestRequest.new
|
20
|
-
@controller.response = ActionController::TestResponse.new
|
21
|
-
@controller.response.body = $html.dup
|
22
|
-
|
23
|
-
Footnotes::Filter.notes = [ :test ]
|
24
|
-
Footnotes::Filter.multiple_notes = false
|
25
|
-
@footnotes = Footnotes::Filter.new(@controller)
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_footnotes_controller
|
29
|
-
index = @controller.response.body.index(/This is the HTML page/)
|
30
|
-
assert_equal 334, index
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_foonotes_included
|
34
|
-
footnotes_perform!
|
35
|
-
assert_not_equal $html, @controller.response.body
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_footnotes_not_included_when_request_is_xhr
|
39
|
-
@controller.request.env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
|
40
|
-
@controller.request.env['HTTP_ACCEPT'] = 'text/javascript, text/html, application/xml, text/xml, */*'
|
41
|
-
|
42
|
-
footnotes_perform!
|
43
|
-
assert_equal $html, @controller.response.body
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_footnotes_not_included_when_content_type_is_javascript
|
47
|
-
@controller.response.headers['Content-Type'] = 'text/javascript'
|
48
|
-
|
49
|
-
footnotes_perform!
|
50
|
-
assert_equal $html, @controller.response.body
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_footnotes_included_when_content_type_is_html
|
54
|
-
@controller.response.headers['Content-Type'] = 'text/html'
|
55
|
-
|
56
|
-
footnotes_perform!
|
57
|
-
assert_not_equal $html, @controller.response.body
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_footnotes_included_when_content_type_is_nil
|
61
|
-
footnotes_perform!
|
62
|
-
assert_not_equal $html, @controller.response.body
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_not_included_when_body_is_not_a_string
|
66
|
-
@controller.response.body = Proc.new{ Time.now }
|
67
|
-
assert_nothing_raised do
|
68
|
-
footnotes_perform!
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def test_footnotes_prefix
|
73
|
-
assert_equal 'txmt://open?url=file://%s&line=%d&column=%d', Footnotes::Filter.prefix
|
74
|
-
assert_equal 'txmt://open?url=file://file&line=0&column=0', Footnotes::Filter.prefix('file', 0, 0)
|
75
|
-
assert_equal 'txmt://open?url=file://file&line=10&column=10', Footnotes::Filter.prefix('file', 10, 10)
|
76
|
-
assert_equal 'txmt://open?url=file://file&line=10&column=10', Footnotes::Filter.prefix('file', 10, 10, 10)
|
77
|
-
assert_equal 'txmt://open?url=file://file&line=10&column=10', Footnotes::Filter.prefix('file', '10', '10')
|
78
|
-
end
|
79
|
-
|
80
|
-
def test_notes_are_initialized
|
81
|
-
footnotes_perform!
|
82
|
-
test_note = @footnotes.instance_variable_get('@notes').first
|
83
|
-
assert 'Footnotes::Notes::TestNote', test_note.class
|
84
|
-
assert :test, test_note.to_sym
|
85
|
-
end
|
86
|
-
|
87
|
-
def test_notes_links
|
88
|
-
note = Footnotes::Notes::TestNote.new
|
89
|
-
note.expects(:row).times(2)
|
90
|
-
@footnotes.instance_variable_set(:@notes, [note])
|
91
|
-
footnotes_perform!
|
92
|
-
end
|
93
|
-
|
94
|
-
def test_notes_fieldset
|
95
|
-
note = Footnotes::Notes::TestNote.new
|
96
|
-
note.expects(:has_fieldset?).times(3)
|
97
|
-
@footnotes.instance_variable_set(:@notes, [note])
|
98
|
-
footnotes_perform!
|
99
|
-
end
|
100
|
-
|
101
|
-
def test_multiple_notes
|
102
|
-
Footnotes::Filter.multiple_notes = true
|
103
|
-
note = Footnotes::Notes::TestNote.new
|
104
|
-
note.expects(:has_fieldset?).times(2)
|
105
|
-
@footnotes.instance_variable_set(:@notes, [note])
|
106
|
-
footnotes_perform!
|
107
|
-
end
|
108
|
-
|
109
|
-
def test_notes_are_reset
|
110
|
-
note = Footnotes::Notes::TestNote.new
|
111
|
-
note.class.expects(:close!)
|
112
|
-
@footnotes.instance_variable_set(:@notes, [note])
|
113
|
-
@footnotes.send(:close!, @controller)
|
114
|
-
end
|
115
|
-
|
116
|
-
def test_links_helper
|
117
|
-
note = Footnotes::Notes::TestNote.new
|
118
|
-
assert_equal '<a href="#" onclick="">Test</a>', @footnotes.send(:link_helper, note)
|
119
|
-
|
120
|
-
note.expects(:link).times(1).returns(:link)
|
121
|
-
assert_equal '<a href="link" onclick="">Test</a>', @footnotes.send(:link_helper, note)
|
122
|
-
end
|
123
|
-
|
124
|
-
def test_links_helper_has_fieldset?
|
125
|
-
note = Footnotes::Notes::TestNote.new
|
126
|
-
note.expects(:has_fieldset?).times(1).returns(true)
|
127
|
-
assert_equal '<a href="#" onclick="Footnotes.hideAllAndToggle(\'test_debug_info\');return false;">Test</a>', @footnotes.send(:link_helper, note)
|
128
|
-
end
|
129
|
-
|
130
|
-
def test_links_helper_onclick
|
131
|
-
note = Footnotes::Notes::TestNote.new
|
132
|
-
note.expects(:onclick).times(2).returns(:onclick)
|
133
|
-
assert_equal '<a href="#" onclick="onclick">Test</a>', @footnotes.send(:link_helper, note)
|
134
|
-
|
135
|
-
note.expects(:has_fieldset?).times(1).returns(true)
|
136
|
-
assert_equal '<a href="#" onclick="onclick">Test</a>', @footnotes.send(:link_helper, note)
|
137
|
-
end
|
138
|
-
|
139
|
-
def test_insert_style
|
140
|
-
@controller.response.body = "<head></head><split><body></body>"
|
141
|
-
@footnotes = Footnotes::Filter.new(@controller)
|
142
|
-
footnotes_perform!
|
143
|
-
assert @controller.response.body.split('<split>').first.include?('<!-- Footnotes Style -->')
|
144
|
-
end
|
145
|
-
|
146
|
-
def test_insert_footnotes_inside_body
|
147
|
-
@controller.response.body = "<head></head><split><body></body>"
|
148
|
-
@footnotes = Footnotes::Filter.new(@controller)
|
149
|
-
footnotes_perform!
|
150
|
-
assert @controller.response.body.split('<split>').last.include?('<!-- End Footnotes -->')
|
151
|
-
end
|
152
|
-
|
153
|
-
def test_insert_footnotes_inside_holder
|
154
|
-
@controller.response.body = "<head></head><split><div id='footnotes_holder'></div>"
|
155
|
-
@footnotes = Footnotes::Filter.new(@controller)
|
156
|
-
footnotes_perform!
|
157
|
-
assert @controller.response.body.split('<split>').last.include?('<!-- End Footnotes -->')
|
158
|
-
end
|
159
|
-
|
160
|
-
def test_insert_text
|
161
|
-
@footnotes.send(:insert_text, :after, /<head>/, "Graffiti")
|
162
|
-
after = " <head>Graffiti\n"
|
163
|
-
assert_equal after, @controller.response.body.to_a[2]
|
164
|
-
|
165
|
-
@footnotes.send(:insert_text, :before, /<\/body>/, "Notes")
|
166
|
-
after = " Notes</body>\n"
|
167
|
-
assert_equal after, @controller.response.body.to_a[12]
|
168
|
-
end
|
169
|
-
|
170
|
-
protected
|
171
|
-
# First we make sure that footnotes will perform (long life to mocha!)
|
172
|
-
# Then we call add_footnotes!
|
173
|
-
#
|
174
|
-
def footnotes_perform!
|
175
|
-
@controller.template.expects(:instance_variable_get).returns(true)
|
176
|
-
@controller.template.expects(:template_format).returns('html')
|
177
|
-
@controller.performed_render = true
|
178
|
-
|
179
|
-
Footnotes::Filter.start!(@controller)
|
180
|
-
@footnotes.add_footnotes!
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
$html = <<HTML
|
185
|
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
186
|
-
<html>
|
187
|
-
<head>
|
188
|
-
<title>HTML to XHTML Example: HTML page</title>
|
189
|
-
<link rel="Stylesheet" href="htmltohxhtml.css" type="text/css" media="screen">
|
190
|
-
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
|
191
|
-
</head>
|
192
|
-
<body>
|
193
|
-
<p>This is the HTML page. It works and is encoded just like any HTML page you
|
194
|
-
have previously done. View <a href="htmltoxhtml2.htm">the XHTML version</a> of
|
195
|
-
this page to view the difference between HTML and XHTML.</p>
|
196
|
-
<p>You will be glad to know that no changes need to be made to any of your CSS files.</p>
|
197
|
-
</body>
|
198
|
-
</html>
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
require 'action_controller'
|
4
|
+
require 'action_controller/test_case'
|
5
|
+
require 'action_controller/test_process'
|
6
|
+
|
7
|
+
class FootnotesController < ActionController::Base; attr_accessor :template, :performed_render; end
|
8
|
+
|
9
|
+
module Footnotes::Notes
|
10
|
+
class TestNote < AbstractNote
|
11
|
+
def self.to_sym; :test; end
|
12
|
+
def valid?; true; end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class FootnotesTest < Test::Unit::TestCase
|
17
|
+
def setup
|
18
|
+
@controller = FootnotesController.new
|
19
|
+
@controller.request = ActionController::TestRequest.new
|
20
|
+
@controller.response = ActionController::TestResponse.new
|
21
|
+
@controller.response.body = $html.dup
|
22
|
+
|
23
|
+
Footnotes::Filter.notes = [ :test ]
|
24
|
+
Footnotes::Filter.multiple_notes = false
|
25
|
+
@footnotes = Footnotes::Filter.new(@controller)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_footnotes_controller
|
29
|
+
index = @controller.response.body.index(/This is the HTML page/)
|
30
|
+
assert_equal 334, index
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_foonotes_included
|
34
|
+
footnotes_perform!
|
35
|
+
assert_not_equal $html, @controller.response.body
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_footnotes_not_included_when_request_is_xhr
|
39
|
+
@controller.request.env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
|
40
|
+
@controller.request.env['HTTP_ACCEPT'] = 'text/javascript, text/html, application/xml, text/xml, */*'
|
41
|
+
|
42
|
+
footnotes_perform!
|
43
|
+
assert_equal $html, @controller.response.body
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_footnotes_not_included_when_content_type_is_javascript
|
47
|
+
@controller.response.headers['Content-Type'] = 'text/javascript'
|
48
|
+
|
49
|
+
footnotes_perform!
|
50
|
+
assert_equal $html, @controller.response.body
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_footnotes_included_when_content_type_is_html
|
54
|
+
@controller.response.headers['Content-Type'] = 'text/html'
|
55
|
+
|
56
|
+
footnotes_perform!
|
57
|
+
assert_not_equal $html, @controller.response.body
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_footnotes_included_when_content_type_is_nil
|
61
|
+
footnotes_perform!
|
62
|
+
assert_not_equal $html, @controller.response.body
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_not_included_when_body_is_not_a_string
|
66
|
+
@controller.response.body = Proc.new{ Time.now }
|
67
|
+
assert_nothing_raised do
|
68
|
+
footnotes_perform!
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_footnotes_prefix
|
73
|
+
assert_equal 'txmt://open?url=file://%s&line=%d&column=%d', Footnotes::Filter.prefix
|
74
|
+
assert_equal 'txmt://open?url=file://file&line=0&column=0', Footnotes::Filter.prefix('file', 0, 0)
|
75
|
+
assert_equal 'txmt://open?url=file://file&line=10&column=10', Footnotes::Filter.prefix('file', 10, 10)
|
76
|
+
assert_equal 'txmt://open?url=file://file&line=10&column=10', Footnotes::Filter.prefix('file', 10, 10, 10)
|
77
|
+
assert_equal 'txmt://open?url=file://file&line=10&column=10', Footnotes::Filter.prefix('file', '10', '10')
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_notes_are_initialized
|
81
|
+
footnotes_perform!
|
82
|
+
test_note = @footnotes.instance_variable_get('@notes').first
|
83
|
+
assert 'Footnotes::Notes::TestNote', test_note.class
|
84
|
+
assert :test, test_note.to_sym
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_notes_links
|
88
|
+
note = Footnotes::Notes::TestNote.new
|
89
|
+
note.expects(:row).times(2)
|
90
|
+
@footnotes.instance_variable_set(:@notes, [note])
|
91
|
+
footnotes_perform!
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_notes_fieldset
|
95
|
+
note = Footnotes::Notes::TestNote.new
|
96
|
+
note.expects(:has_fieldset?).times(3)
|
97
|
+
@footnotes.instance_variable_set(:@notes, [note])
|
98
|
+
footnotes_perform!
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_multiple_notes
|
102
|
+
Footnotes::Filter.multiple_notes = true
|
103
|
+
note = Footnotes::Notes::TestNote.new
|
104
|
+
note.expects(:has_fieldset?).times(2)
|
105
|
+
@footnotes.instance_variable_set(:@notes, [note])
|
106
|
+
footnotes_perform!
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_notes_are_reset
|
110
|
+
note = Footnotes::Notes::TestNote.new
|
111
|
+
note.class.expects(:close!)
|
112
|
+
@footnotes.instance_variable_set(:@notes, [note])
|
113
|
+
@footnotes.send(:close!, @controller)
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_links_helper
|
117
|
+
note = Footnotes::Notes::TestNote.new
|
118
|
+
assert_equal '<a href="#" onclick="">Test</a>', @footnotes.send(:link_helper, note)
|
119
|
+
|
120
|
+
note.expects(:link).times(1).returns(:link)
|
121
|
+
assert_equal '<a href="link" onclick="">Test</a>', @footnotes.send(:link_helper, note)
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_links_helper_has_fieldset?
|
125
|
+
note = Footnotes::Notes::TestNote.new
|
126
|
+
note.expects(:has_fieldset?).times(1).returns(true)
|
127
|
+
assert_equal '<a href="#" onclick="Footnotes.hideAllAndToggle(\'test_debug_info\');return false;">Test</a>', @footnotes.send(:link_helper, note)
|
128
|
+
end
|
129
|
+
|
130
|
+
def test_links_helper_onclick
|
131
|
+
note = Footnotes::Notes::TestNote.new
|
132
|
+
note.expects(:onclick).times(2).returns(:onclick)
|
133
|
+
assert_equal '<a href="#" onclick="onclick">Test</a>', @footnotes.send(:link_helper, note)
|
134
|
+
|
135
|
+
note.expects(:has_fieldset?).times(1).returns(true)
|
136
|
+
assert_equal '<a href="#" onclick="onclick">Test</a>', @footnotes.send(:link_helper, note)
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_insert_style
|
140
|
+
@controller.response.body = "<head></head><split><body></body>"
|
141
|
+
@footnotes = Footnotes::Filter.new(@controller)
|
142
|
+
footnotes_perform!
|
143
|
+
assert @controller.response.body.split('<split>').first.include?('<!-- Footnotes Style -->')
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_insert_footnotes_inside_body
|
147
|
+
@controller.response.body = "<head></head><split><body></body>"
|
148
|
+
@footnotes = Footnotes::Filter.new(@controller)
|
149
|
+
footnotes_perform!
|
150
|
+
assert @controller.response.body.split('<split>').last.include?('<!-- End Footnotes -->')
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_insert_footnotes_inside_holder
|
154
|
+
@controller.response.body = "<head></head><split><div id='footnotes_holder'></div>"
|
155
|
+
@footnotes = Footnotes::Filter.new(@controller)
|
156
|
+
footnotes_perform!
|
157
|
+
assert @controller.response.body.split('<split>').last.include?('<!-- End Footnotes -->')
|
158
|
+
end
|
159
|
+
|
160
|
+
def test_insert_text
|
161
|
+
@footnotes.send(:insert_text, :after, /<head>/, "Graffiti")
|
162
|
+
after = " <head>Graffiti\n"
|
163
|
+
assert_equal after, @controller.response.body.to_a[2]
|
164
|
+
|
165
|
+
@footnotes.send(:insert_text, :before, /<\/body>/, "Notes")
|
166
|
+
after = " Notes</body>\n"
|
167
|
+
assert_equal after, @controller.response.body.to_a[12]
|
168
|
+
end
|
169
|
+
|
170
|
+
protected
|
171
|
+
# First we make sure that footnotes will perform (long life to mocha!)
|
172
|
+
# Then we call add_footnotes!
|
173
|
+
#
|
174
|
+
def footnotes_perform!
|
175
|
+
@controller.template.expects(:instance_variable_get).returns(true)
|
176
|
+
@controller.template.expects(:template_format).returns('html')
|
177
|
+
@controller.performed_render = true
|
178
|
+
|
179
|
+
Footnotes::Filter.start!(@controller)
|
180
|
+
@footnotes.add_footnotes!
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
$html = <<HTML
|
185
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
186
|
+
<html>
|
187
|
+
<head>
|
188
|
+
<title>HTML to XHTML Example: HTML page</title>
|
189
|
+
<link rel="Stylesheet" href="htmltohxhtml.css" type="text/css" media="screen">
|
190
|
+
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
|
191
|
+
</head>
|
192
|
+
<body>
|
193
|
+
<p>This is the HTML page. It works and is encoded just like any HTML page you
|
194
|
+
have previously done. View <a href="htmltoxhtml2.htm">the XHTML version</a> of
|
195
|
+
this page to view the difference between HTML and XHTML.</p>
|
196
|
+
<p>You will be glad to know that no changes need to be made to any of your CSS files.</p>
|
197
|
+
</body>
|
198
|
+
</html>
|
199
199
|
HTML
|