require File.dirname(__FILE__) + '/../spec_helper' class PageSpecTestPage < Page description 'this is just a test page' def headers { 'cool' => 'beans', 'request' => @request.inspect[20..30], 'response' => @response.inspect[20..31] } end tag 'test1' do 'Hello world!' end tag 'test2' do 'Another test.' end end describe Page, 'validations' do dataset :pages test_helper :validations before :each do @page = @model = Page.new(page_params) end it 'should validate length of' do { :title => 255, :slug => 100, :breadcrumb => 160 }.each do |field, max| assert_invalid field, ('%d-character limit' % max), 'x' * (max + 1) assert_valid field, 'x' * max end end it 'should validate presence of' do [:title, :slug, :breadcrumb].each do |field| assert_invalid field, 'required', '', ' ', nil end end it 'should validate format of' do @page.parent = pages(:home) assert_valid :slug, 'abc', 'abcd-efg', 'abcd_efg', 'abc.html', '/', '123' assert_invalid :slug, 'invalid format', 'abcd efg', ' abcd', 'abcd/efg' end it 'should validate numericality of' do assert_invalid :status_id, 'required', '', nil [:id, :status_id, :parent_id].each do |field| assert_valid field, '1', '2' assert_invalid field, 'must be a number', 'abcd', '1,2', '1.3' end end it 'should validate uniqueness of' do @page.parent = pages(:parent) assert_invalid :slug, 'slug already in use for child of parent', 'child', 'child-2', 'child-3' assert_valid :slug, 'child-4' end it 'should allow mass assignment for class name' do @page.attributes = { :class_name => 'ArchivePage' } assert_valid @page @page.class_name.should == 'ArchivePage' end it 'should not be valid when class name is not a descendant of page' do @page.class_name = 'Object' @page.valid?.should == false assert_not_nil @page.errors.on(:class_name) @page.errors.on(:class_name).should == 'must be set to a valid descendant of Page' end it 'should not be valid when class name is not a descendant of page and it is set through mass assignment' do @page.attributes = {:class_name => 'Object' } @page.valid?.should == false assert_not_nil @page.errors.on(:class_name) @page.errors.on(:class_name).should == 'must be set to a valid descendant of Page' end it 'should be valid when class name is page or empty or nil' do [nil, '', 'Page'].each do |value| @page = ArchivePage.new(page_params) @page.class_name = value assert_valid @page @page.class_name.should == value end end end describe Page, "behaviors" do it 'should include' do Page.included_modules.should include(StandardTags) Page.included_modules.should include(Annotatable) end end describe Page, "layout" do dataset :pages_with_layouts it 'should be accessible' do @page = pages(:first) @page.layout_id.should == layout_id(:main) @page.layout.name.should == "Main" end it 'should be inherited' do @page = pages(:inherited_layout) @page.layout_id.should == nil @page.layout.should == @page.parent.layout end end describe Page do dataset :pages before :each do @page = pages(:first) end it 'should have parts' do @page.parts.count.should == 1 pages(:home).parts.count.should == 4 end it 'should destroy dependant parts' do @page.parts.create(page_part_params(:name => 'test', :page_id => nil)) @page.parts.find_by_name('test').should be_kind_of(PagePart) id = @page.id @page.destroy PagePart.find_by_page_id_and_name(id, 'test').should be_nil end it 'should allow access to parts by name with a string' do part = @page.part('body') part.name.should == 'body' end it 'should allow access to parts by name with a symbol' do part = @page.part(:body) part.name.should == 'body' end it 'should allow access to parts by name when page is unsaved' do part = PagePart.new(:content => "test", :name => "test") @page.parts << part @page.part('test').should == part @page.part(:test).should == part end it 'should allow access to parts by name created with the build method when page is unsaved' do @page.parts.build(:content => "test", :name => "test") @page.part('test').content.should == "test" @page.part(:test).content.should == "test" end it "should accept new page parts as an array of PageParts" do @page.parts = [PagePart.new(:name => 'body', :content => 'Hello, world!')] @page.parts.size.should == 1 @page.parts.first.should be_kind_of(PagePart) @page.parts.first.name.should == 'body' @page.parts.first.content.should == 'Hello, world!' end it "should dirty the page object when only changing parts" do lambda do @page.parts = [PagePart.new(:name => 'body', :content => 'Hello, world!')] @page.changed.should_not be_empty end end # invalid, as published_at is set when form is submitted it 'should set published_at when published' do @page = Page.new(page_params(:status_id => '1', :published_at => nil)) @page.published_at.should be_nil @page.status_id = Status[:published].id @page.save @page.published_at.should_not be_nil @page.published_at.utc.day.should == Time.now.utc.day end it 'should not update published_at when already published' do @page = Page.new(page_params(:status_id => Status[:published].id)) @page.published_at.should be_kind_of(Time) expected = @page.published_at @page.save @page.published_at.should == expected end it 'should answer true when published' do @page.status = Status[:published] @page.published?.should == true end it 'should answer false when not published' do @page.status = Status[:draft] @page.published?.should be_false end it 'should answer false when not published but scheduled' do @page.status = Status[:scheduled] @page.published?.should be_false end it 'should change its status to scheduled when publishing in the future' do @page = Page.new(page_params(:status_id => '100', :published_at => '2020-1-1')) @page.save @page.status_id.should == 90 end it 'should change its status to draft when set to draft' do @page = pages(:scheduled) @page.status_id = Status[:draft].id @page.save @page.status_id.should == 1 end it 'should be published status when published_at is in the past' do #current time 01-29-2010 scheduled_time = '2010-1-1' @page = Page.new(page_params(:status_id => '90', :published_at => scheduled_time)) @page.save @page.status_id.should == 100 end it "should answer the page's url" do @page = pages(:parent) @page.url.should == '/parent/' @page.children.first.url.should == '/parent/child/' grandchild = pages(:grandchild) grandchild.url.should == '/parent/child/grandchild/' end it 'should allow you to calculate a child url from the parent' do @page = pages(:parent) child = pages(:child) @page.child_url(child).should == '/parent/child/' end it 'should have status' do @page = pages(:home) @page.status.should == Status[:published] end it 'should allow you to set the status' do @page = pages(:home) draft = Status[:draft] @page.status = draft @page.status.should == draft @page.status_id.should == draft.id end it 'should respond to cache? with true (by default)' do @page.cache?.should == true end it 'should respond to virtual? with false (by default)' do @page.virtual?.should == false end it 'should allow you to tell if a part exists based on a string or symbol' do @page = pages(:home) @page.has_part?(:body).should == true @page.has_part?('sidebar').should == true @page.has_part?(:obviously_false_part_name).should == false end it 'should allow you to tell if a part is inherited' do @page = pages(:child) @page.has_part?(:sidebar).should == false @page.inherits_part?(:sidebar).should == true @page = pages(:home) @page.has_part?(:sidebar).should == true @page.inherits_part?(:sidebar).should == false end it 'should allow you to tell if a part exists or is inherited' do @page = pages(:child) @page.has_part?(:sidebar).should == false @page.has_or_inherits_part?(:sidebar).should == true @page.has_or_inherits_part?(:obviously_false_part_name).should == false @page = pages(:home) @page.has_part?(:sidebar).should == true @page.has_or_inherits_part?(:sidebar).should == true @page.has_or_inherits_part?(:obviously_false_part_name).should == false end it 'should support optimistic locking' do p1, p2 = Page.find(page_id(:first)), Page.find(page_id(:first)) p1.update_attributes!(:breadcrumb => "foo") lambda { p2.update_attributes!(:breadcrumb => "blah") }.should raise_error(ActiveRecord::StaleObjectError) end end describe Page, "before save filter" do dataset :home_page before :each do Page.create(page_params(:title =>"Month Index", :class_name => "ArchiveMonthIndexPage")) @page = Page.find_by_title("Month Index") end it 'should set the class name correctly' do @page.should be_kind_of(ArchiveMonthIndexPage) end it 'should set the virtual bit correctly' do @page.virtual?.should == true @page.virtual.should == true end it 'should update virtual based on new class name' do # turn a regular page into a virtual page @page.class_name = "ArchiveMonthIndexPage" @page.save.should == true @page.virtual?.should == true @page.send(:read_attribute, :virtual).should == true # turn a virtual page into a non-virtual one ["", nil, "Page", "EnvDumpPage"].each do |value| @page = ArchiveYearIndexPage.create(page_params) @page.class_name = value @page.save.should == true @page = Page.find @page.id @page.should be_instance_of(Page.descendant_class(value)) @page.virtual?.should == false @page.send(:read_attribute, :virtual).should == false end end end describe Page, "rendering" do dataset :pages, :markup_pages, :snippets, :layouts test_helper :render before :each do @page = pages(:home) end it 'should render' do @page.render.should == 'Hello world!' end it 'should render with a filter' do pages(:textile).render.should == '
Some Textile content.
' end it 'should render with tags' do pages(:radius).render.should == "Radius body." end it 'should render with a layout' do @page.update_attribute(:layout_id, layout_id(:main)) @page.render.should == "\n \nmarkdown
}) end it 'should render a snippet with a tag' do @page.render_snippet(snippets(:radius)).should == 'Home' end it 'should render custom pages with tags' do create_page "Test Page", :body => "