mirror of
https://github.com/jekyll/jekyll.git
synced 2026-01-29 16:58:01 -05:00
This ensures that destination files for HTML posts, pages and collections always include the proper file extension (as defined by output_ext) regardless of permalink structure. This allows for URLs that contain no extension or trailing slash to still result in proper destination files with .html extensions. Because this change relies so heavily on output_ext accurately identifying the extension of the destination file, this change also removes the feature test that tested support for permalinks with a .htm extension. In order to support alternate file extensions, a future patch or plugin will need to modify the output_ext value, at which point everything else should work as expected.
354 lines
9.3 KiB
Ruby
354 lines
9.3 KiB
Ruby
require 'helper'
|
|
|
|
class TestDocument < JekyllUnitTest
|
|
|
|
context "a document in a collection" do
|
|
setup do
|
|
@site = fixture_site({
|
|
"collections" => ["methods"]
|
|
})
|
|
@site.process
|
|
@document = @site.collections["methods"].docs.first
|
|
end
|
|
|
|
should "exist" do
|
|
assert !@document.nil?
|
|
end
|
|
|
|
should "know its relative path" do
|
|
assert_equal "_methods/configuration.md", @document.relative_path
|
|
end
|
|
|
|
should "knows its extname" do
|
|
assert_equal ".md", @document.extname
|
|
end
|
|
|
|
should "know its basename" do
|
|
assert_equal "configuration.md", @document.basename
|
|
end
|
|
|
|
should "know its basename without extname" do
|
|
assert_equal "configuration", @document.basename_without_ext
|
|
end
|
|
|
|
should "know whether its a yaml file" do
|
|
assert_equal false, @document.yaml_file?
|
|
end
|
|
|
|
should "know its data" do
|
|
assert_equal({
|
|
"title" => "Jekyll.configuration",
|
|
"whatever" => "foo.bar"
|
|
}, @document.data)
|
|
end
|
|
|
|
context "with YAML ending in three dots" do
|
|
|
|
setup do
|
|
@site = fixture_site({
|
|
"collections" => ["methods"],
|
|
})
|
|
@site.process
|
|
@document = @site.collections["methods"].docs.last
|
|
end
|
|
|
|
should "know its data" do
|
|
assert_equal({
|
|
"title" => "YAML with Dots",
|
|
"whatever" => "foo.bar"
|
|
}, @document.data)
|
|
end
|
|
end
|
|
|
|
should "output the collection name in the #to_liquid method" do
|
|
assert_equal @document.to_liquid['collection'], "methods"
|
|
end
|
|
|
|
should "output its relative path as path in Liquid" do
|
|
assert_equal @document.to_liquid['path'], "_methods/configuration.md"
|
|
end
|
|
|
|
end
|
|
|
|
context "a document as part of a collection with frontmatter defaults" do
|
|
setup do
|
|
@site = fixture_site({
|
|
"collections" => ["slides"],
|
|
"defaults" => [{
|
|
"scope"=> {"path"=>"", "type"=>"slides"},
|
|
"values"=> {
|
|
"nested"=> {
|
|
"key"=>"myval",
|
|
}
|
|
}
|
|
}]
|
|
})
|
|
@site.process
|
|
@document = @site.collections["slides"].docs.select{|d| d.is_a?(Document) }.first
|
|
end
|
|
|
|
should "know the frontmatter defaults" do
|
|
assert_equal({
|
|
"title"=>"Example slide",
|
|
"layout"=>"slide",
|
|
"nested"=> {
|
|
"key"=>"myval"
|
|
}
|
|
}, @document.data)
|
|
end
|
|
end
|
|
|
|
context "a document as part of a collection with overriden default values" do
|
|
setup do
|
|
@site = fixture_site({
|
|
"collections" => ["slides"],
|
|
"defaults" => [{
|
|
"scope"=> {"path"=>"", "type"=>"slides"},
|
|
"values"=> {
|
|
"nested"=> {
|
|
"test1"=>"default1",
|
|
"test2"=>"default1"
|
|
}
|
|
}
|
|
}]
|
|
})
|
|
@site.process
|
|
@document = @site.collections["slides"].docs[1]
|
|
end
|
|
|
|
should "override default values in the document frontmatter" do
|
|
assert_equal({
|
|
"title"=>"Override title",
|
|
"layout"=>"slide",
|
|
"nested"=> {
|
|
"test1"=>"override1",
|
|
"test2"=>"override2"
|
|
}
|
|
}, @document.data)
|
|
end
|
|
end
|
|
|
|
context "a document as part of a collection with valid path" do
|
|
setup do
|
|
@site = fixture_site({
|
|
"collections" => ["slides"],
|
|
"defaults" => [{
|
|
"scope"=> {"path"=>"slides", "type"=>"slides"},
|
|
"values"=> {
|
|
"nested"=> {
|
|
"key"=>"value123",
|
|
}
|
|
}
|
|
}]
|
|
})
|
|
@site.process
|
|
@document = @site.collections["slides"].docs.first
|
|
end
|
|
|
|
should "know the frontmatter defaults" do
|
|
assert_equal({
|
|
"title"=>"Example slide",
|
|
"layout"=>"slide",
|
|
"nested"=> {
|
|
"key"=>"value123"
|
|
}
|
|
}, @document.data)
|
|
end
|
|
end
|
|
|
|
context "a document as part of a collection with invalid path" do
|
|
setup do
|
|
@site = fixture_site({
|
|
"collections" => ["slides"],
|
|
"defaults" => [{
|
|
"scope"=> {"path"=>"somepath", "type"=>"slides"},
|
|
"values"=> {
|
|
"nested"=> {
|
|
"key"=>"myval",
|
|
}
|
|
}
|
|
}]
|
|
})
|
|
@site.process
|
|
@document = @site.collections["slides"].docs.first
|
|
end
|
|
|
|
should "not know the specified frontmatter defaults" do
|
|
assert_equal({
|
|
"title"=>"Example slide",
|
|
"layout"=>"slide"
|
|
}, @document.data)
|
|
end
|
|
end
|
|
|
|
context "a document in a collection with a custom permalink" do
|
|
setup do
|
|
@site = fixture_site({
|
|
"collections" => ["slides"]
|
|
})
|
|
@site.process
|
|
@document = @site.collections["slides"].docs[2]
|
|
@dest_file = dest_dir("slide/3/index.html")
|
|
end
|
|
|
|
should "know its permalink" do
|
|
assert_equal "/slide/3/", @document.permalink
|
|
end
|
|
|
|
should "produce the right URL" do
|
|
assert_equal "/slide/3/", @document.url
|
|
end
|
|
end
|
|
|
|
context "a document in a collection with custom filename permalinks" do
|
|
setup do
|
|
@site = fixture_site({
|
|
"collections" => {
|
|
"slides" => {
|
|
"output" => true,
|
|
"permalink" => "/slides/test/:name"
|
|
}
|
|
},
|
|
})
|
|
@site.process
|
|
@document = @site.collections["slides"].docs[0]
|
|
@dest_file = dest_dir("slides/test/example-slide-1.html")
|
|
end
|
|
|
|
should "produce the right URL" do
|
|
assert_equal "/slides/test/example-slide-1", @document.url
|
|
end
|
|
|
|
should "produce the right destination" do
|
|
assert_equal @dest_file, @document.destination(dest_dir)
|
|
end
|
|
end
|
|
|
|
context "documents in a collection with custom title permalinks" do
|
|
setup do
|
|
@site = fixture_site({
|
|
"collections" => {
|
|
"slides" => {
|
|
"output" => true,
|
|
"permalink" => "/slides/:title"
|
|
}
|
|
},
|
|
})
|
|
@site.process
|
|
@document = @site.collections["slides"].docs[3]
|
|
@document_without_slug = @site.collections["slides"].docs[4]
|
|
@document_with_strange_slug = @site.collections["slides"].docs[5]
|
|
end
|
|
|
|
should "produce the right URL if they have a slug" do
|
|
assert_equal "/slides/so-what-is-jekyll-exactly", @document.url
|
|
end
|
|
should "produce the right destination file if they have a slug" do
|
|
dest_file = dest_dir("slides/so-what-is-jekyll-exactly.html")
|
|
assert_equal dest_file, @document.destination(dest_dir)
|
|
end
|
|
|
|
should "produce the right URL if they don't have a slug" do
|
|
assert_equal "/slides/example-slide-5", @document_without_slug.url
|
|
end
|
|
should "produce the right destination file if they don't have a slug" do
|
|
dest_file = dest_dir("slides/example-slide-5.html")
|
|
assert_equal dest_file, @document_without_slug.destination(dest_dir)
|
|
end
|
|
|
|
should "produce the right URL if they have a wild slug" do
|
|
assert_equal "/slides/well-so-what-is-jekyll-then", @document_with_strange_slug.url
|
|
end
|
|
should "produce the right destination file if they have a wild slug" do
|
|
dest_file = dest_dir("/slides/well-so-what-is-jekyll-then.html")
|
|
assert_equal dest_file, @document_with_strange_slug.destination(dest_dir)
|
|
end
|
|
end
|
|
|
|
context "documents in a collection" do
|
|
setup do
|
|
@site = fixture_site({
|
|
"collections" => {
|
|
"slides" => {
|
|
"output" => true
|
|
}
|
|
},
|
|
})
|
|
@site.process
|
|
@files = @site.collections["slides"].docs
|
|
end
|
|
|
|
context "without output overrides" do
|
|
should "be output according to collection defaults" do
|
|
refute_nil @files.find { |doc| doc.relative_path == "_slides/example-slide-4.html" }
|
|
end
|
|
end
|
|
|
|
context "with output overrides" do
|
|
should "be output according its front matter" do
|
|
assert_nil @files.find { |doc| doc.relative_path == "_slides/non-outputted-slide.html" }
|
|
end
|
|
end
|
|
end
|
|
|
|
context "a static file in a collection" do
|
|
setup do
|
|
@site = fixture_site({
|
|
"collections" => {
|
|
"slides" => {
|
|
"output" => true
|
|
}
|
|
}
|
|
})
|
|
@site.process
|
|
@document = @site.collections["slides"].files.find { |doc| doc.relative_path == "_slides/octojekyll.png" }
|
|
@dest_file = dest_dir("slides/octojekyll.png")
|
|
end
|
|
|
|
should "be a static file" do
|
|
assert_equal true, @document.is_a?(StaticFile)
|
|
end
|
|
|
|
should "be set to write" do
|
|
assert @document.write?
|
|
end
|
|
|
|
should "be in the list of docs_to_write" do
|
|
assert @site.docs_to_write.include?(@document)
|
|
end
|
|
|
|
should "be output in the correct place" do
|
|
assert_equal true, File.file?(@dest_file)
|
|
end
|
|
end
|
|
|
|
context "a document in a collection with non-alphabetic file name" do
|
|
setup do
|
|
@site = fixture_site({
|
|
"collections" => {
|
|
"methods" => {
|
|
"output" => true
|
|
}
|
|
},
|
|
})
|
|
@site.process
|
|
@document = @site.collections["methods"].docs.find { |doc| doc.relative_path == "_methods/escape-+ #%20[].md" }
|
|
@dest_file = dest_dir("methods/escape-+ #%20[].html")
|
|
end
|
|
|
|
should "produce the right URL" do
|
|
assert_equal "/methods/escape-+%20%23%2520%5B%5D.html", @document.url
|
|
end
|
|
|
|
should "produce the right destination" do
|
|
assert_equal @dest_file, @document.destination(dest_dir)
|
|
end
|
|
|
|
should "be output in the correct place" do
|
|
assert_equal true, File.file?(@dest_file)
|
|
end
|
|
|
|
end
|
|
|
|
end
|