middleman/middleman-core/spec/middleman-core/util_spec.rb

224 lines
8.7 KiB
Ruby

require 'spec_helper'
require 'middleman-core'
describe Middleman::Util do
describe "::path_match" do
it "matches a literal string" do
expect(Middleman::Util.path_match '/index.html', '/index.html').to be true
end
it "won't match a wrong string" do
expect(Middleman::Util.path_match '/foo.html', '/index.html').to be false
end
it "won't match a partial string" do
expect(Middleman::Util.path_match 'ind', '/index.html').to be false
end
it "works with a regex" do
expect(Middleman::Util.path_match /\.html$/, '/index.html').to be true
expect(Middleman::Util.path_match /\.js$/, '/index.html').to be false
end
it "works with a proc" do
matcher = lambda {|p| p.length > 5 }
expect(Middleman::Util.path_match matcher, '/index.html').to be true
expect(Middleman::Util.path_match matcher, '/i').to be false
end
it "works with globs" do
expect(Middleman::Util.path_match '/foo/*.html', '/foo/index.html').to be true
expect(Middleman::Util.path_match '/foo/*.html', '/foo/index.js').to be false
expect(Middleman::Util.path_match '/bar/*.html', '/foo/index.js').to be false
expect(Middleman::Util.path_match '/foo/*', '/foo/bar/index.html').to be true
expect(Middleman::Util.path_match '/foo/**/*', '/foo/bar/index.html').to be true
expect(Middleman::Util.path_match '/foo/**', '/foo/bar/index.html').to be true
end
end
describe "::binary?" do
%w(plain.txt unicode.txt unicode).each do |file|
it "recognizes #{file} as not binary" do
expect(Middleman::Util.binary?(File.join(File.dirname(__FILE__), "binary_spec/#{file}"))).to be false
end
end
%w(middleman.png middleman stars.svgz).each do |file|
it "recognizes #{file} as binary" do
expect(Middleman::Util.binary?(File.join(File.dirname(__FILE__), "binary_spec/#{file}"))).to be true
end
end
end
describe "::recursively_enhance" do
it "returns Hashie extended Hash if given a hash" do
input = {test: "subject"}
subject = Middleman::Util.recursively_enhance input
expect( subject.test ).to eq "subject"
end
it "returns Array with strings, or IndifferentHash, true, false" do
indifferent_hash = {test: "subject"}
regular_hash = {regular: "hash"}
input = [ indifferent_hash, regular_hash, true, false ]
subject = Middleman::Util.recursively_enhance input
expect( subject[1].regular ).to eq "hash"
expect( subject[2] ).to eq true
expect( subject[3] ).to eq false
end
end
describe "::asset_url" do
after(:each) do
Given.cleanup!
end
context "when http_prefix is activated" do
before(:each) do
Given.fixture 'clean-dir-app'
Given.file 'source/images/blank.gif', ''
@mm = Middleman::Application.new do
config[:http_prefix] = 'http_prefix'
end
end
it "returns path with http_prefix pre-pended if resource is found" do
expect( Middleman::Util.asset_url( @mm, 'blank.gif', 'images', http_prefix: 'http_prefix' ) ).to eq 'http_prefix/images/blank.gif'
end
it "returns path with http_prefix pre-pended if resource is not found" do
expect( Middleman::Util.asset_url( @mm, 'missing.gif', 'images', http_prefix: 'http_prefix' ) ).to eq 'http_prefix/images/missing.gif'
end
end
it "returns path relative to the provided current_resource" do
Given.fixture 'clean-dir-app'
Given.file 'source/a-path/index.html', ''
Given.file 'source/a-path/images/blank.gif', ''
@mm = Middleman::Application.new
current_resource = @mm.sitemap.find_resource_by_path('a-path/index.html')
expect( Middleman::Util.asset_url( @mm, 'images/blank.gif', 'images', current_resource: current_resource ) ).to eq '/a-path/images/blank.gif'
end
context "when relative is true" do
before(:each) do
Given.fixture 'relative-assets-app'
@mm = Middleman::Application.new
end
it "returns path relative to the provided current_resource" do
current_resource = instance_double("Middleman::Sitemap::Resource", destination_path: 'a-path/index.html', path: 'a-path/index.html')
expect( Middleman::Util.asset_url( @mm, 'blank.gif', 'images', current_resource: current_resource,
relative: true ) ).to eq '../images/blank.gif'
end
context "when the asset is stored in the same directory as current_resource" do
before do
Given.file 'source/a-path/index.html', ''
Given.file 'source/a-path/blank.gif', ''
@mm = Middleman::Application.new
end
it "returns path relative to the provided current_resource" do
current_resource = @mm.sitemap.find_resource_by_path('a-path/index.html')
expect( Middleman::Util.asset_url( @mm, 'blank.gif', 'images', current_resource: current_resource,
relative: true) ).to eq 'blank.gif'
end
end
it "raises error if not given a current_resource" do
expect{
Middleman::Util.asset_url( @mm, 'blank.gif', 'images', relative: true )
}.to raise_error ArgumentError
end
end
it "returns path if it is already a full path" do
expect( Middleman::Util.asset_url( @mm, 'http://example.com' ) ).to eq 'http://example.com'
expect( Middleman::Util.asset_url( @mm, 'data:example' ) ).to eq 'data:example'
end
it "returns a resource url if given a resource's destination path" do
Given.fixture 'clean-dir-app' # includes directory indexes extension
Given.file 'source/how/about/that.html', ''
@mm = Middleman::Application.new
expect( Middleman::Util.asset_url( @mm, '/how/about/that/index.html' ) ).to eq '/how/about/that/'
end
it "returns a resource url if given a resources path" do
Given.fixture 'clean-dir-app' # includes directory indexes extension
Given.file 'source/how/about/that.html', ''
@mm = Middleman::Application.new
expect( Middleman::Util.asset_url( @mm, '/how/about/that.html' ) ).to eq '/how/about/that/'
end
end
describe "::find_related_files" do
after(:each) do
Given.cleanup!
end
before(:each) do
Given.fixture 'related-files-app'
@mm = Middleman::Application.new
end
def source_file(path)
Pathname(File.expand_path("source/#{path}"))
end
it "Finds partials possibly related to ERb files" do
related = Middleman::Util.find_related_files(@mm, [source_file('partials/_test.erb')]).map { |f| f[:full_path].to_s }
expect(related).to include File.expand_path("source/index.html.erb")
related = Middleman::Util.find_related_files(@mm, [source_file('partials/_test2.haml')]).map { |f| f[:full_path].to_s }
expect(related).to include File.expand_path("source/index.html.erb")
end
it "Finds partials possible related to Scss files" do
related = Middleman::Util.find_related_files(@mm, [source_file('stylesheets/_include4.scss')]).map { |f| f[:full_path].to_s }
expect(related).to include File.expand_path("source/stylesheets/site.css.scss")
expect(related).to include File.expand_path("source/stylesheets/include2.css.scss")
related = Middleman::Util.find_related_files(@mm, [source_file('stylesheets/include2.css.scss')]).map { |f| f[:full_path].to_s }
expect(related).to include File.expand_path("source/stylesheets/site.css.scss")
expect(related).not_to include File.expand_path("source/stylesheets/include2.css.scss")
related = Middleman::Util.find_related_files(@mm, [source_file('stylesheets/include1.css')]).map { |f| f[:full_path].to_s }
expect(related).to include File.expand_path("source/stylesheets/site.css.scss")
expect(related).to include File.expand_path("source/stylesheets/include2.css.scss")
related = Middleman::Util.find_related_files(@mm, [source_file('stylesheets/_include3.sass')]).map { |f| f[:full_path].to_s }
expect(related).to include File.expand_path("source/stylesheets/site.css.scss")
expect(related).to include File.expand_path("source/stylesheets/include2.css.scss")
end
end
describe "::step_through_extensions" do
it "returns the base name after templating engine extensions are removed" do
result = Middleman::Util.step_through_extensions('my_file.html.haml.erb')
expect(result).to eq 'my_file.html'
end
it "does not loop infinitely when file name is a possible templating engine" do
expect do
Timeout::timeout(0.5) do
result = Middleman::Util.step_through_extensions("markdown.scss")
expect(result).to eq "markdown"
end
end.not_to raise_error
end
end
end