Updated README.rdoc again
[feedcatcher.git] / vendor / rails / actionpack / test / template / atom_feed_helper_test.rb
1 require 'abstract_unit'
2
3 Scroll = Struct.new(:id, :to_param, :title, :body, :updated_at, :created_at)
4
5 class ScrollsController < ActionController::Base
6 FEEDS = {}
7 FEEDS["defaults"] = <<-EOT
8 atom_feed(:schema_date => '2008') do |feed|
9 feed.title("My great blog!")
10 feed.updated((@scrolls.first.created_at))
11
12 for scroll in @scrolls
13 feed.entry(scroll) do |entry|
14 entry.title(scroll.title)
15 entry.content(scroll.body, :type => 'html')
16
17 entry.author do |author|
18 author.name("DHH")
19 end
20 end
21 end
22 end
23 EOT
24 FEEDS["entry_options"] = <<-EOT
25 atom_feed do |feed|
26 feed.title("My great blog!")
27 feed.updated((@scrolls.first.created_at))
28
29 for scroll in @scrolls
30 feed.entry(scroll, :url => "/otherstuff/" + scroll.to_param, :updated => Time.utc(2007, 1, scroll.id)) do |entry|
31 entry.title(scroll.title)
32 entry.content(scroll.body, :type => 'html')
33
34 entry.author do |author|
35 author.name("DHH")
36 end
37 end
38 end
39 end
40 EOT
41 FEEDS["xml_block"] = <<-EOT
42 atom_feed do |feed|
43 feed.title("My great blog!")
44 feed.updated((@scrolls.first.created_at))
45
46 feed.author do |author|
47 author.name("DHH")
48 end
49
50 for scroll in @scrolls
51 feed.entry(scroll, :url => "/otherstuff/" + scroll.to_param, :updated => Time.utc(2007, 1, scroll.id)) do |entry|
52 entry.title(scroll.title)
53 entry.content(scroll.body, :type => 'html')
54 end
55 end
56 end
57 EOT
58 FEEDS["feed_with_atomPub_namespace"] = <<-EOT
59 atom_feed({'xmlns:app' => 'http://www.w3.org/2007/app',
60 'xmlns:openSearch' => 'http://a9.com/-/spec/opensearch/1.1/'}) do |feed|
61 feed.title("My great blog!")
62 feed.updated((@scrolls.first.created_at))
63
64 for scroll in @scrolls
65 feed.entry(scroll) do |entry|
66 entry.title(scroll.title)
67 entry.content(scroll.body, :type => 'html')
68 entry.tag!('app:edited', Time.now)
69
70 entry.author do |author|
71 author.name("DHH")
72 end
73 end
74 end
75 end
76 EOT
77 FEEDS["feed_with_overridden_ids"] = <<-EOT
78 atom_feed({:id => 'tag:test.rubyonrails.org,2008:test/'}) do |feed|
79 feed.title("My great blog!")
80 feed.updated((@scrolls.first.created_at))
81
82 for scroll in @scrolls
83 feed.entry(scroll, :id => "tag:test.rubyonrails.org,2008:"+scroll.id.to_s) do |entry|
84 entry.title(scroll.title)
85 entry.content(scroll.body, :type => 'html')
86 entry.tag!('app:edited', Time.now)
87
88 entry.author do |author|
89 author.name("DHH")
90 end
91 end
92 end
93 end
94 EOT
95 FEEDS["feed_with_xml_processing_instructions"] = <<-EOT
96 atom_feed(:schema_date => '2008',
97 :instruct => {'xml-stylesheet' => { :href=> 't.css', :type => 'text/css' }}) do |feed|
98 feed.title("My great blog!")
99 feed.updated((@scrolls.first.created_at))
100
101 for scroll in @scrolls
102 feed.entry(scroll) do |entry|
103 entry.title(scroll.title)
104 entry.content(scroll.body, :type => 'html')
105
106 entry.author do |author|
107 author.name("DHH")
108 end
109 end
110 end
111 end
112 EOT
113 FEEDS["feed_with_xml_processing_instructions_duplicate_targets"] = <<-EOT
114 atom_feed(:schema_date => '2008',
115 :instruct => {'target1' => [{ :a => '1', :b => '2' }, { :c => '3', :d => '4' }]}) do |feed|
116 feed.title("My great blog!")
117 feed.updated((@scrolls.first.created_at))
118
119 for scroll in @scrolls
120 feed.entry(scroll) do |entry|
121 entry.title(scroll.title)
122 entry.content(scroll.body, :type => 'html')
123
124 entry.author do |author|
125 author.name("DHH")
126 end
127 end
128 end
129 end
130 EOT
131 FEEDS["feed_with_xhtml_content"] = <<-'EOT'
132 atom_feed do |feed|
133 feed.title("My great blog!")
134 feed.updated((@scrolls.first.created_at))
135
136 for scroll in @scrolls
137 feed.entry(scroll) do |entry|
138 entry.title(scroll.title)
139 entry.summary(:type => 'xhtml') do |xhtml|
140 xhtml.p "before #{scroll.id}"
141 xhtml.p {xhtml << scroll.body}
142 xhtml.p "after #{scroll.id}"
143 end
144 entry.tag!('app:edited', Time.now)
145
146 entry.author do |author|
147 author.name("DHH")
148 end
149 end
150 end
151 end
152 EOT
153 def index
154 @scrolls = [
155 Scroll.new(1, "1", "Hello One", "Something <i>COOL!</i>", Time.utc(2007, 12, 12, 15), Time.utc(2007, 12, 12, 15)),
156 Scroll.new(2, "2", "Hello Two", "Something Boring", Time.utc(2007, 12, 12, 15)),
157 ]
158
159 render :inline => FEEDS[params[:id]], :type => :builder
160 end
161
162 protected
163
164 def rescue_action(e)
165 raise(e)
166 end
167 end
168
169 class AtomFeedTest < ActionController::TestCase
170 tests ScrollsController
171
172 def setup
173 @request.host = "www.nextangle.com"
174 end
175
176 def test_feed_should_use_default_language_if_none_is_given
177 with_restful_routing(:scrolls) do
178 get :index, :id => "defaults"
179 assert_match %r{xml:lang="en-US"}, @response.body
180 end
181 end
182
183 def test_feed_should_include_two_entries
184 with_restful_routing(:scrolls) do
185 get :index, :id => "defaults"
186 assert_select "entry", 2
187 end
188 end
189
190 def test_entry_should_only_use_published_if_created_at_is_present
191 with_restful_routing(:scrolls) do
192 get :index, :id => "defaults"
193 assert_select "published", 1
194 end
195 end
196
197 def test_entry_with_prefilled_options_should_use_those_instead_of_querying_the_record
198 with_restful_routing(:scrolls) do
199 get :index, :id => "entry_options"
200
201 assert_select "updated", Time.utc(2007, 1, 1).xmlschema
202 assert_select "updated", Time.utc(2007, 1, 2).xmlschema
203 end
204 end
205
206 def test_self_url_should_default_to_current_request_url
207 with_restful_routing(:scrolls) do
208 get :index, :id => "defaults"
209 assert_select "link[rel=self][href=http://www.nextangle.com/scrolls?id=defaults]"
210 end
211 end
212
213 def test_feed_id_should_be_a_valid_tag
214 with_restful_routing(:scrolls) do
215 get :index, :id => "defaults"
216 assert_select "id", :text => "tag:www.nextangle.com,2008:/scrolls?id=defaults"
217 end
218 end
219
220 def test_entry_id_should_be_a_valid_tag
221 with_restful_routing(:scrolls) do
222 get :index, :id => "defaults"
223 assert_select "entry id", :text => "tag:www.nextangle.com,2008:Scroll/1"
224 assert_select "entry id", :text => "tag:www.nextangle.com,2008:Scroll/2"
225 end
226 end
227
228 def test_feed_should_allow_nested_xml_blocks
229 with_restful_routing(:scrolls) do
230 get :index, :id => "xml_block"
231 assert_select "author name", :text => "DHH"
232 end
233 end
234
235 def test_feed_should_include_atomPub_namespace
236 with_restful_routing(:scrolls) do
237 get :index, :id => "feed_with_atomPub_namespace"
238 assert_match %r{xml:lang="en-US"}, @response.body
239 assert_match %r{xmlns="http://www.w3.org/2005/Atom"}, @response.body
240 assert_match %r{xmlns:app="http://www.w3.org/2007/app"}, @response.body
241 end
242 end
243
244 def test_feed_should_allow_overriding_ids
245 with_restful_routing(:scrolls) do
246 get :index, :id => "feed_with_overridden_ids"
247 assert_select "id", :text => "tag:test.rubyonrails.org,2008:test/"
248 assert_select "entry id", :text => "tag:test.rubyonrails.org,2008:1"
249 assert_select "entry id", :text => "tag:test.rubyonrails.org,2008:2"
250 end
251 end
252
253 def test_feed_xml_processing_instructions
254 with_restful_routing(:scrolls) do
255 get :index, :id => 'feed_with_xml_processing_instructions'
256 assert_match %r{<\?xml-stylesheet [^\?]*type="text/css"}, @response.body
257 assert_match %r{<\?xml-stylesheet [^\?]*href="t.css"}, @response.body
258 end
259 end
260
261 def test_feed_xml_processing_instructions_duplicate_targets
262 with_restful_routing(:scrolls) do
263 get :index, :id => 'feed_with_xml_processing_instructions_duplicate_targets'
264 assert_match %r{<\?target1 (a="1" b="2"|b="2" a="1")\?>}, @response.body
265 assert_match %r{<\?target1 (c="3" d="4"|d="4" c="3")\?>}, @response.body
266 end
267 end
268
269 def test_feed_xhtml
270 with_restful_routing(:scrolls) do
271 get :index, :id => "feed_with_xhtml_content"
272 assert_match %r{xmlns="http://www.w3.org/1999/xhtml"}, @response.body
273 assert_select "summary div p", :text => "Something Boring"
274 assert_select "summary div p", :text => "after 2"
275 end
276 end
277 private
278 def with_restful_routing(resources)
279 with_routing do |set|
280 set.draw do |map|
281 map.resources(resources)
282 end
283 yield
284 end
285 end
286 end