require 'helper' class TestPage < JekyllUnitTest def setup_page(*args) dir, file = args dir, file = ['', dir] if file.nil? @page = Page.new(@site, source_dir, dir, file) end def do_render(page) layouts = { "default" => Layout.new(@site, source_dir('_layouts'), "simple.html")} page.render(layouts, @site.site_payload) end context "A Page" do setup do clear_dest @site = Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir, "skip_config_files" => true })) end context "processing pages" do should "create url based on filename" do @page = setup_page('contacts.html') assert_equal "/contacts.html", @page.url end should "not published when published yaml is false" do @page = setup_page("unpublished.html") assert_equal false, @page.published? end should "create url with non-alphabetic characters" do @page = setup_page('+', '%# +.md') assert_equal "/+/%25%23%20+.html", @page.url end context "in a directory hierarchy" do should "create url based on filename" do @page = setup_page('/contacts', 'bar.html') assert_equal "/contacts/bar.html", @page.url end should "create index url based on filename" do @page = setup_page('/contacts', 'index.html') assert_equal "/contacts/", @page.url end end should "deal properly with extensions" do @page = setup_page('deal.with.dots.html') assert_equal ".html", @page.ext end should "deal properly with non-html extensions" do @page = setup_page('dynamic_page.php') @dest_file = dest_dir("dynamic_page.php") assert_equal ".php", @page.ext assert_equal "dynamic_page", @page.basename assert_equal "/dynamic_page.php", @page.url assert_equal @dest_file, @page.destination(dest_dir) end should "deal properly with dots" do @page = setup_page('deal.with.dots.html') @dest_file = dest_dir("deal.with.dots.html") assert_equal "deal.with.dots", @page.basename assert_equal "/deal.with.dots", @page.url assert_equal @dest_file, @page.destination(dest_dir) end should "make properties accessible through #[]" do page = setup_page('properties.html') attrs = { content: "All the properties.\n", dir: "/properties/", excerpt: nil, foo: 'bar', layout: 'default', name: "properties.html", path: "properties.html", permalink: '/properties/', published: nil, title: 'Properties Page', url: "/properties/" } attrs.each do |attr, val| attr_str = attr.to_s result = page[attr_str] assert_equal val, result, "For :" end end context "with pretty permalink style" do setup do @site.permalink_style = :pretty end should "return dir, url, and destination correctly" do @page = setup_page('contacts.html') @dest_file = dest_dir("contacts/index.html") assert_equal '/contacts/', @page.dir assert_equal '/contacts/', @page.url assert_equal @dest_file, @page.destination(dest_dir) end should "return dir correctly for index page" do @page = setup_page('index.html') assert_equal '/', @page.dir end context "in a directory hierarchy" do should "create url based on filename" do @page = setup_page('/contacts', 'bar.html') assert_equal "/contacts/bar/", @page.url end should "create index url based on filename" do @page = setup_page('/contacts', 'index.html') assert_equal "/contacts/", @page.url end should "return dir correctly" do @page = setup_page('/contacts', 'bar.html') assert_equal '/contacts/bar/', @page.dir end should "return dir correctly for index page" do @page = setup_page('/contacts', 'index.html') assert_equal '/contacts/', @page.dir end end end context "with date permalink style" do setup do @site.permalink_style = :date end should "return url and destination correctly" do @page = setup_page('contacts.html') @dest_file = dest_dir("contacts.html") assert_equal '/contacts.html', @page.url assert_equal @dest_file, @page.destination(dest_dir) end end context "with custom permalink style with trailing slash" do setup do @site.permalink_style = "/:title/" end should "return url and destination correctly" do @page = setup_page('contacts.html') @dest_file = dest_dir("contacts/index.html") assert_equal '/contacts/', @page.url assert_equal @dest_file, @page.destination(dest_dir) end end context "with custom permalink style with file extension" do setup do @site.permalink_style = "/:title:output_ext" end should "return url and destination correctly" do @page = setup_page('contacts.html') @dest_file = dest_dir("contacts.html") assert_equal '/contacts.html', @page.url assert_equal @dest_file, @page.destination(dest_dir) end end context "with custom permalink style with no extension" do setup do @site.permalink_style = "/:title" end should "return url and destination correctly" do @page = setup_page('contacts.html') @dest_file = dest_dir("contacts.html") assert_equal '/contacts', @page.url assert_equal @dest_file, @page.destination(dest_dir) end end context "with any other permalink style" do should "return dir correctly" do @site.permalink_style = nil @page = setup_page('contacts.html') assert_equal '/', @page.dir end end should "respect permalink in yaml front matter" do file = "about.html" @page = setup_page(file) assert_equal "/about/", @page.permalink assert_equal @page.permalink, @page.url assert_equal "/about/", @page.dir end should "not be writable outside of destination" do unexpected = File.expand_path("../../../baddie.html", dest_dir) File.delete unexpected if File.exist?(unexpected) page = setup_page("exploit.md") do_render(page) page.write(dest_dir) assert !File.exist?(unexpected) end end context "with specified layout of nil" do setup do @page = setup_page('sitemap.xml') end should "layout of nil is respected" do assert_equal "nil", @page.data["layout"] end end context "rendering" do setup do clear_dest end should "write properly" do page = setup_page('contacts.html') do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert File.exist?(File.join(dest_dir, 'contacts.html')) end should "write even when the folder name is plus and permalink has +" do page = setup_page('+', 'foo.md') do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert File.exist?(File.join(dest_dir, '+', 'plus+in+url.html')) end should "write even when permalink has '%# +'" do page = setup_page('+', '%# +.md') do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert File.exist?(File.join(dest_dir, '+', '%# +.html')) end should "write properly without html extension" do page = setup_page('contacts.html') page.site.permalink_style = :pretty do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert File.exist?(File.join(dest_dir, 'contacts', 'index.html')) end should "support .htm extension and respects that" do page = setup_page('contacts.htm') page.site.permalink_style = :pretty do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert File.exist?(File.join(dest_dir, 'contacts', 'index.htm')) end should "support .xhtml extension and respects that" do page = setup_page('contacts.xhtml') page.site.permalink_style = :pretty do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert File.exist?(File.join(dest_dir, 'contacts', 'index.xhtml')) end should "write properly with extension different from html" do page = setup_page("sitemap.xml") page.site.permalink_style = :pretty do_render(page) page.write(dest_dir) assert_equal("/sitemap.xml", page.url) assert_nil(page.url[/\.html$/]) assert File.directory?(dest_dir) assert File.exist?(File.join(dest_dir,'sitemap.xml')) end should "write dotfiles properly" do page = setup_page('.htaccess') do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert File.exist?(File.join(dest_dir, '.htaccess')) end context "in a directory hierarchy" do should "write properly the index" do page = setup_page('/contacts', 'index.html') do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert File.exist?(File.join(dest_dir, 'contacts', 'index.html')) end should "write properly" do page = setup_page('/contacts', 'bar.html') do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert File.exist?(File.join(dest_dir, 'contacts', 'bar.html')) end should "write properly without html extension" do page = setup_page('/contacts', 'bar.html') page.site.permalink_style = :pretty do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert File.exist?(File.join(dest_dir, 'contacts', 'bar', 'index.html')) end end end end end