154 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| require "helper"
 | |
| 
 | |
| class TestPluginManager < JekyllUnitTest
 | |
|   def with_no_gemfile
 | |
|     FileUtils.mv "Gemfile", "Gemfile.old"
 | |
|     yield
 | |
|   ensure
 | |
|     FileUtils.mv "Gemfile.old", "Gemfile"
 | |
|   end
 | |
| 
 | |
|   context "JEKYLL_NO_BUNDLER_REQUIRE set to `nil`" do
 | |
|     should "require from bundler" do
 | |
|       with_env("JEKYLL_NO_BUNDLER_REQUIRE", nil) do
 | |
|         assert Jekyll::PluginManager.require_from_bundler,
 | |
|                "require_from_bundler should return true."
 | |
|         assert ENV["JEKYLL_NO_BUNDLER_REQUIRE"], "Gemfile plugins were not required."
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   context "JEKYLL_NO_BUNDLER_REQUIRE set to `true`" do
 | |
|     should "not require from bundler" do
 | |
|       with_env("JEKYLL_NO_BUNDLER_REQUIRE", "true") do
 | |
|         refute Jekyll::PluginManager.require_from_bundler,
 | |
|                      "Gemfile plugins were required but shouldn't have been"
 | |
|         assert ENV["JEKYLL_NO_BUNDLER_REQUIRE"]
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   context "JEKYLL_NO_BUNDLER_REQUIRE set to `nil` and no Gemfile present" do
 | |
|     should "not require from bundler" do
 | |
|       with_env("JEKYLL_NO_BUNDLER_REQUIRE", nil) do
 | |
|         with_no_gemfile do
 | |
|           refute Jekyll::PluginManager.require_from_bundler,
 | |
|                        "Gemfile plugins were required but shouldn't have been"
 | |
|           assert_nil ENV["JEKYLL_NO_BUNDLER_REQUIRE"]
 | |
|         end
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   context "require gems" do
 | |
|     should "invoke `require_with_graceful_fail`" do
 | |
|       gems = %w(jemojii foobar)
 | |
| 
 | |
|       expect(Jekyll::External).to(
 | |
|         receive(:require_with_graceful_fail).with(gems).and_return(nil)
 | |
|       )
 | |
|       site = double(:gems => gems)
 | |
|       plugin_manager = PluginManager.new(site)
 | |
| 
 | |
|       allow(plugin_manager).to receive(:plugin_allowed?).with("foobar").and_return(true)
 | |
|       allow(plugin_manager).to receive(:plugin_allowed?).with("jemojii").and_return(true)
 | |
| 
 | |
|       plugin_manager.require_gems
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   context "site is not marked as safe" do
 | |
|     should "allow all plugins" do
 | |
|       site = double(:safe => false)
 | |
|       plugin_manager = PluginManager.new(site)
 | |
| 
 | |
|       assert plugin_manager.plugin_allowed?("foobar")
 | |
|     end
 | |
| 
 | |
|     should "require plugin files" do
 | |
|       site = double({ :safe          => false,
 | |
|                       :config        => { "plugins_dir" => "_plugins" },
 | |
|                       :in_source_dir => "/tmp/" })
 | |
|       plugin_manager = PluginManager.new(site)
 | |
| 
 | |
|       expect(Jekyll::External).to receive(:require_with_graceful_fail)
 | |
|       plugin_manager.require_plugin_files
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   context "site is marked as safe" do
 | |
|     should "allow plugins if they are whitelisted" do
 | |
|       site = double({ :safe => true, :config => { "whitelist" => ["jemoji"] } })
 | |
|       plugin_manager = PluginManager.new(site)
 | |
| 
 | |
|       assert plugin_manager.plugin_allowed?("jemoji")
 | |
|       assert !plugin_manager.plugin_allowed?("not_allowed_plugin")
 | |
|     end
 | |
| 
 | |
|     should "not require plugin files" do
 | |
|       site = double({ :safe => true })
 | |
|       plugin_manager = PluginManager.new(site)
 | |
| 
 | |
|       expect(Jekyll::External).to_not receive(:require_with_graceful_fail)
 | |
|       plugin_manager.require_plugin_files
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   context "plugins_dir is set to the default" do
 | |
|     should "call site's in_source_dir" do
 | |
|       site = double({
 | |
|         :config        => {
 | |
|           "plugins_dir" => Jekyll::Configuration::DEFAULTS["plugins_dir"]
 | |
|         },
 | |
|         :in_source_dir => "/tmp/"
 | |
|       })
 | |
|       plugin_manager = PluginManager.new(site)
 | |
| 
 | |
|       expect(site).to receive(:in_source_dir).with("_plugins")
 | |
|       plugin_manager.plugins_path
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   context "plugins_dir is set to a different dir" do
 | |
|     should "expand plugin path" do
 | |
|       site = double({ :config => { "plugins_dir" => "some_other_plugins_path" } })
 | |
|       plugin_manager = PluginManager.new(site)
 | |
| 
 | |
|       expect(File).to receive(:expand_path).with("some_other_plugins_path")
 | |
|       plugin_manager.plugins_path
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   context "`paginate` config is activated" do
 | |
|     should "print deprecation warning if jekyll-paginate is not present" do
 | |
|       site = double({ :config => { "paginate" => true } })
 | |
|       plugin_manager = PluginManager.new(site)
 | |
| 
 | |
|       expect(Jekyll::Deprecator).to(
 | |
|         receive(:deprecation_message).with(%r!jekyll-paginate!)
 | |
|       )
 | |
|       plugin_manager.deprecation_checks
 | |
|     end
 | |
| 
 | |
|     should "print no deprecation warning if jekyll-paginate is present" do
 | |
|       site = double({
 | |
|         :config => { "paginate" => true, "gems" => ["jekyll-paginate"] }
 | |
|       })
 | |
|       plugin_manager = PluginManager.new(site)
 | |
| 
 | |
|       expect(Jekyll::Deprecator).to_not receive(:deprecation_message)
 | |
|       plugin_manager.deprecation_checks
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   should "conscientious require" do
 | |
|     site = double
 | |
|     plugin_manager = PluginManager.new(site)
 | |
| 
 | |
|     expect(plugin_manager).to(
 | |
|       receive_messages([:require_plugin_files, :require_gems, :deprecation_checks])
 | |
|     )
 | |
|     plugin_manager.conscientious_require
 | |
|   end
 | |
| end
 |