Renamed helpers to correspond to renamed Controller classes.
[merb_radiant.git] / radiant_specs / test / unit / .svn / text-base / page_test.rb.svn-base
blobeb0fb14a495f6f8b1204994d5384fdd62c8db59c
1 require File.dirname(__FILE__) + '/../test_helper'
3 class PageTest < Test::Unit::TestCase
4   fixtures :users, :pages, :page_parts, :snippets, :layouts
5   test_helper :pages, :page_parts, :validations, :render
7   def setup
8     @page_title = 'Page Title'
9     destroy_test_page
10     
11     @part_name = 'test-part'
12     destroy_test_part
13     
14     @page = @model = Page.new(VALID_PAGE_PARAMS)
15     
16     @request = ActionController::TestRequest.new :url => '/page/'
17     @response = ActionController::TestResponse.new
18   end
19   
20   def test_mixins
21     assert Page.included_modules.include?(StandardTags)
22   end
23   
24   def test_validates_length_of
25     {
26       :title => 255,
27       :slug => 100,
28       :breadcrumb => 160
29     }.each do |field, max|
30       assert_invalid field, ('%d-character limit' % max), 'x' * (max + 1)
31       assert_valid field, 'x' * max
32     end
33   end
34   
35   def test_validates_presence_of
36     [:title, :slug, :breadcrumb].each do |field|
37       assert_invalid field, 'required', '', ' ', nil
38     end 
39   end
40   
41   def test_validates_format_of
42     @page.parent = pages(:homepage)
43     assert_valid :slug, 'abc', 'abcd-efg', 'abcd_efg', 'abc.html', '/', '123'
44     assert_invalid :slug, 'invalid format', 'abcd efg', ' abcd', 'abcd/efg'
45   end
46   
47   def test_validates_numericality_of
48     assert_invalid :status_id, 'required', '', nil
49     [:id, :status_id, :parent_id].each do |field|
50       assert_valid field, '1', '2'
51       assert_invalid field, 'must be a number', 'abcd', '1,2', '1.3'
52     end
53   end
55   def test_validates_uniqueness_of
56     @page.parent = pages(:radius)
57     assert_invalid :slug, 'slug already in use for child of parent', 'child-1', 'child-2', 'child-3'
58     assert_valid :slug, 'child-4'
59   end
61   def test_included_modules
62     assert Page.included_modules.include?(Annotatable), 'Annotatable is not included'
63   end
65   def test_layout
66     @page = pages(:page_with_layout)
67     assert_equal 1, @page.layout_id
68     assert_kind_of Layout, @page.layout
69   end
71   def test_parts
72     @homepage = pages(:homepage)
73     assert_equal(4, @homepage.parts.count)
74     
75     @documentation = pages(:documentation)
76     assert_equal(1, @documentation.parts.count)
77   end
78   
79   def test_destroy__parts_dependant
80     @page = create_test_page
81     @page.parts.create(part_params(:name => @part_name, :page_id => nil))
82     assert_kind_of PagePart, @page.parts.find_by_name(@part_name)
83     
84     id = @page.id
85     @page.destroy
86     assert_nil PagePart.find_by_page_id_and_name(id, @part_name)
87   end
89   def test_part
90     part = pages(:radius).part('body')
91     assert_equal 'body', part.name
92   end
93   def test_part__lookup_by_symbol
94     part = pages(:radius).part(:body)
95     assert_equal 'body', part.name
96   end
97   def test_part__when_page_is_unsaved
98     part = PagePart.new(:content => "test", :name => "test")
99     @page.parts << part
100     assert_equal part, @page.part('test')
101     assert_equal part, @page.part(:test)
102   end
103   def test_part__when_parts_are_unsaved
104     @page = pages(:radius)
105     @page.parts.build(:content => "test", :name => "test")
106     assert_equal "test", @page.part('test').content
107     assert_equal "test", @page.part(:test).content
108   end
109   
110   def test_published_at
111     @page = create_test_page(:status_id => '1')
112     assert_nil @page.published_at
113     
114     @page.status_id = Status[:published].id
115     @page.save
116     assert_not_nil @page.published_at
117     assert_equal Time.now.day, @page.published_at.day
118   end  
119   def test_published_at__not_updated_on_save_because_already_published
120     @page = create_test_page(:status_id => Status[:published].id)
121     assert_kind_of Time, @page.published_at
122     
123     expected = @page.published_at
124     @page.save
125     assert_equal expected, @page.published_at
126   end
127   
128   def test_published
129     @page.status = Status[:published]
130     assert_equal true, @page.published?
131   end
132   def test_published__not_published
133     @page.status = Status[:draft]
134     assert_equal false, @page.published?
135   end
137   def test_url
138     @page = pages(:parent)
139     assert_equal '/parent/', @page.url
140     assert_equal '/parent/child/', @page.children.first.url
141     
142     grandchild = pages(:grandchild)
143     assert_equal '/parent/child/grandchild/', grandchild.url
144   end
145   
146   def test_child_url
147     @page = pages(:parent)
148     child = pages(:child)
149     assert_equal '/parent/child/', @page.child_url(child)
150   end
151   
152   def test_find_by_url_1
153     @page = pages(:homepage)
154     assert_equal @page, @page.find_by_url('/') 
155   end
156   def test_find_by_url_2
157     @page = pages(:homepage)
158     expected = pages(:great_grandchild)
159     found = @page.find_by_url('/parent/child/grandchild/great-grandchild/')
160     assert_equal expected, found 
161   end
162   def test_find_by_url__when_virtual
163     @page = pages(:homepage)
164     found = @page.find_by_url('/assorted/virtual/')
165     assert_equal nil, found
166   end
167   def test_find_by_url__when_not_found_and_missing_page_defined
168     @page = pages(:homepage)
169     found = @page.find_by_url('/gallery/asdf/')
170     assert_instance_of FileNotFoundPage, found
171   end
172   def test_find_by_url__when_not_found_and_custom_missing_page_defined
173     @page = pages(:homepage)
174     found = @page.find_by_url('/custom_404/asdf/')
175     assert_instance_of CustomFileNotFoundPage, found
176   end
177   def test_find_by_url__when_not_found_on_live
178     @page = pages(:homepage)
179     found = @page.find_by_url('/gallery/gallery_draft/')
180     assert_instance_of FileNotFoundPage, found
181   end
182   def test_find_by_url__when_not_found_on_dev
183     @page = pages(:homepage)
184     expected = pages(:gallery_draft)
185     found = @page.find_by_url('/gallery/gallery_draft/', false)
186     assert_equal expected, found
187   end  
189   def test_find_by_url_class_method
190     @root = pages(:homepage)
191     assert_equal @root, Page.find_by_url('/')
192     
193     @page = pages(:books)
194     assert_equal @page, Page.find_by_url('/documentation/books/')
195     
196     @root = pages(:homepage)
197     assert_equal 'File Not Found', Page.find_by_url('/gallery/gallery_draft/').title
198     assert_equal 'Gallery Draft', Page.find_by_url('/gallery/gallery_draft/', false).title
199   end
200   def test_find_by_url_class_method__raises_exception_when_root_missing
201     pages(:homepage).destroy
202     assert_nil Page.find_by_parent_id(nil)
203     e = assert_raises(Page::MissingRootPageError) { Page.find_by_url "/" }
204     assert_equal 'Database missing root page', e.message
205   end
206   
207   def test_headers
208     expected = { 'Status' => ActionController::Base::DEFAULT_RENDER_STATUS_CODE }
209     assert_equal expected, @page.headers
210   end
211   
212   def test_render
213     expected = 'This is the body portion of the Ruby home page.'
214     assert_page_renders :homepage, expected
215   end
216   def test_render__with_filter
217     expected = '<p>Some <strong>Textile</strong> content.</p>'
218     assert_page_renders :textile, expected
219   end
220   def test_render__with_tags
221     expected = "<h1>Radius Test Page</h1>\n\n\n\t<ul>\n\t<li>Radius Test Child 1</li>\n\t\t<li>Radius Test Child 2</li>\n\t\t<li>Radius Test Child 3</li>\n\t</ul>"
222     assert_page_renders :radius, expected
223   end
224   def test_render__with_layout
225     expected = "<html>\n  <head>\n    <title>Page With Layout</title>\n  </head>\n  <body>\n    Page With Layout\n  </body>\n</html>\n"
226     assert_page_renders :page_with_layout, expected
227   end
228   
229   def test_render_snippet
230     assert_snippet_renders :first, 'test'
231   end
232   def test_render_snippet_with_filter
233     assert_snippet_renders :markdown, '<p><strong>markdown</strong></p>'
234   end
235   def test_render_snippet_with_tag
236     assert_snippet_renders :snippet_with_tag, 'New Page'
237   end
238   
239   def test_process
240     @page = pages(:textile)
241     @page.process(@request, @response)
242     assert_match %r{Some <strong>Textile</strong> content.}, @response.body
243   end
244   def test_process_with_headers
245     @page = pages(:test_page)
246     @page.process(@request, @response)
247     assert_equal 'beans', @response.headers['cool']
248     assert_equal 'TestRequest', @response.headers['request']
249     assert_equal 'TestResponse', @response.headers['response']
250   end
251   def test_process__page_with_content_type_set_on_layot
252     @page = pages(:page_with_content_type_set_on_layout)
253     @page.process(@request, @response)
254     assert_response :success
255     assert_equal 'text/html;charset=utf8', @response.headers['Content-Type']
256   end
258   def test_status
259     @page = pages(:homepage)
260     assert_equal Status[:published], @page.status
261   end
262   
263   def test_set_status
264     @page = pages(:homepage)
265     draft = Status[:draft]
266     @page.status = draft
267     assert_equal draft, @page.status
268     assert_equal draft.id, @page.status_id
269   end
270   
271   def test_cache
272     assert_equal true, @page.cache?
273   end
274   
275   def test_layout__inherited
276     @page = pages(:child_of_page_with_layout)
277     assert_equal nil, @page.layout_id
278     assert_equal @page.parent.layout, @page.layout
279   end
280   
281   def test_virtual?
282     assert_equal false, @page.virtual?
283   end
284    
285   def test_before_save
286     @page = create_test_page(:class_name => "ArchiveMonthIndexPage")
287     assert_kind_of ArchiveMonthIndexPage, @page
288     assert_equal true, @page.virtual?
289     assert_equal true, @page.virtual
290   end
291   
292   def test_annotations
293     assert_equal 'this is just a test page', TestPage.description
294   end
295   
296   def test_defined_tags
297     assert_page_renders :test_page, 'Hello world! Another test.'
298   end
299   def test_defined_tags_are_unique_for_each_behavior
300     assert_render_error %r{undefined tag `test1'}, '<r:test1 />'
301   end
302   
303   def test_render_part
304     @page = pages(:test_page)
305     assert_equal "Hello world! Another test.", @page.render_part(:body)
306   end
308   def test_display_name_class_method
309     assert_equal "Page", Page.display_name
310     
311     assert_equal "Test", TestPage.display_name
312     
313     TestPage.display_name = "New Name"
314     assert_equal "New Name", TestPage.display_name
315     
316     assert_equal "File Not Found", FileNotFoundPage.display_name
317   end
318   
319   def test_decendants_class_method
320     descendants = Page.descendants
321     assert_kind_of Array, descendants
322     assert_match /TestPage/, descendants.inspect
323   end
325   def test_mass_assignment_for_class_name
326     @page = Page.new
327     @page.attributes = { :class_name => 'ArchivePage' }
328     assert_valid @page
329     assert_equal 'ArchivePage', @page.class_name
330   end
331   
332   def test_mass_assignment_class_name_must_be_set_to_a_valid_descendant
333     @page = Page.new
334     @page.attributes = {:class_name => 'Object' }
335     assert !@page.valid?
336     assert_not_nil @page.errors.on(:class_name)
337     assert_equal @page.errors.on(:class_name), 'must be set to a valid descendant of Page'
338   end
339   
340   def test_class_name_must_be_a_valid_descendant
341     @page = Page.new
342     @page.class_name = 'Object'
343     assert !@page.valid?
344     assert_not_nil @page.errors.on(:class_name)
345     assert_equal @page.errors.on(:class_name), 'must be set to a valid descendant of Page'
346   end
347   
348   def test_class_name_can_be_set_to_page_or_empty_or_nil
349     [nil, '', 'Page'].each do |value|
350       @page = ArchivePage.new
351       @page.class_name = value
352       assert_valid @page
353       assert_equal value, @page.class_name
354     end
355   end
357   def test_new_with_defaults_class_method__nil_config
358     @page = Page.new_with_defaults({})
359     assert_equal 0, @page.parts.size
360   end
361   
362   def test_new_with_defaults_class_method__default_parts
363     @page = Page.new_with_defaults({ 'defaults.page.parts' => 'a, b, c'})
364     assert_equal 3, @page.parts.size
365     assert_equal 'a', @page.parts.first.name
366     assert_equal 'c', @page.parts.last.name
367   end
368   
369   def test_new_with_defaults_class_method__default_status
370     @page = Page.new_with_defaults({ 'defaults.page.status' => 'published' })
371     assert_equal Status[:published], @page.status
372   end
373   
374   def test_descendant_class_class_method
375     ["", nil, "Page"].each do |value|
376       assert_equal Page.descendant_class(value), Page
377     end
378     assert_equal Page.descendant_class("TestPage"), TestPage
379     assert_equal Page.descendant_class("NoCachePage"), NoCachePage
380     assert_equal Page.descendant_class("ArchivePage"), ArchivePage
381   end
382   
383   def test_is_descendant_class_name_class_method
384     ["", nil, "Page", "TestPage", "NoCachePage", "ArchivePage"].each do |value|
385       assert Page.is_descendant_class_name?(value)
386     end
387     assert !Page.is_descendant_class_name?("InvalidPage")  
388   end  
389   
390   def test_optimistic_locking
391     p1 = Page.find(1)
392     p2 = Page.find(1)
393     p1.save!
394     assert_raises(ActiveRecord::StaleObjectError) {
395       p2.save!
396     }
397   end
398   
399   def test_should_update_virtual_based_on_new_class_name
400     # turn a regular page into a virtual page
401     @page.class_name = "VirtualPage"
402     @page.slug = "virtual1"
403     assert @page.save
404     assert @page.virtual?
405     assert @page.send(:read_attribute, :virtual)
406     
407     @page = VirtualPage.create(page_params)
408     # turn a virtual page into a non-virtual one
409     ["", nil, "Page", "EnvDumpPage"].each do |value|
410       @page.class_name = value
411       assert_nothing_raised { @page.save! }
412       @page = Page.find(@page.id)
413       assert_instance_of Page.descendant_class(value), @page
414       assert !@page.virtual?
415       assert !@page.send(:read_attribute, :virtual)
416     end
417   end
418   
419   def test_has_part
420     @page = pages(:homepage)
421     assert(@page.has_part?(:body))
422     assert(@page.has_part?('extended'))
423     assert(!@page.has_part?(:obviously_false_part_name))
424   end
425   def test_has_or_inherits_part
426     @page = pages(:child)
427     assert(!@page.has_part?(:sidebar))
428     assert(@page.has_or_inherits_part?(:sidebar))
429     assert(!@page.has_or_inherits_part?(:obviously_false_part_name))
430     
431     @page = pages(:homepage)
432     assert(@page.has_part?(:sidebar))
433     assert(@page.has_or_inherits_part?(:sidebar))
434     assert(!@page.has_or_inherits_part?(:obviously_false_part_name))
435   end
436   def test_inherits_part
437     @page = pages(:child)
438     assert(!@page.has_part?(:sidebar))
439     assert(@page.inherits_part?(:sidebar))
440     
441     @page = pages(:homepage)
442     assert(@page.has_part?(:sidebar))
443     assert(!@page.inherits_part?(:sidebar))
444     
445     @page = pages(:radius)
446     assert(@page.has_part?(:extended))
447     assert(!@page.inherits_part?(:extended))
448   end
449