spec/warbler/task_spec.rb in warbler-0.9.14 vs spec/warbler/task_spec.rb in warbler-1.0
- old
+ new
@@ -1,9 +1,10 @@
#--
-# (c) Copyright 2007-2009 Sun Microsystems, Inc.
-# See the file LICENSES.txt included with the distribution for
-# software license details.
+# Copyright (c) 2010 Engine Yard, Inc.
+# Copyright (c) 2007-2009 Sun Microsystems, Inc.
+# This source code is available under the MIT license.
+# See the file LICENSE.txt for details.
#++
require File.dirname(__FILE__) + '/../spec_helper'
describe Warbler::Task do
@@ -14,472 +15,67 @@
@pwd = Dir.getwd
Dir.chdir("spec/sample")
mkdir_p "log"
touch "log/test.log"
@config = Warbler::Config.new do |config|
- config.staging_dir = "tmp/war"
config.war_name = "warbler"
config.gems = ["rake"]
config.webxml.jruby.max.runtimes = 5
end
+ @task = Warbler::Task.new "warble", @config
end
after(:each) do
- define_tasks "clean"
Rake::Task["warble:clean"].invoke
rm_rf "log"
- rm_f FileList["config.ru", "*web.xml", "config/web.xml*", "config/warble.rb"]
+ rm_f FileList["config.ru", "*web.xml", "config/web.xml*", "config/warble.rb",
+ "tmp/gems.jar", "file.txt", 'manifest', 'Gemfile']
Dir.chdir(@pwd)
end
- def define_tasks(*tasks)
- options = tasks.last.kind_of?(Hash) ? tasks.pop : {}
- @defined_tasks ||= []
- tasks.each do |task|
- unless @defined_tasks.include?(task)
- meth = "define_#{task}_task"
- meth = "define_#{task}_tasks" unless Warbler::Task.private_instance_methods.include?(meth)
- Warbler::Task.new "warble", @config, meth.to_sym do |t|
- options.each {|k,v| t.send "#{k}=", v }
- end
- @defined_tasks << task
- end
- end
- end
-
- def file_list(regex)
- FileList["#{@config.staging_dir}/**/*"].select {|f| f =~ regex }
- end
-
- it "should define a clean task for removing the staging directory" do
- define_tasks "clean"
- mkdir_p @config.staging_dir
+ it "should define a clean task for removing the war file" do
+ war_file = "#{@config.war_name}.war"
+ touch war_file
Rake::Task["warble:clean"].invoke
- File.exist?(@config.staging_dir).should == false
+ File.exist?(war_file).should == false
end
- it "should define a public task for copying the public files" do
- define_tasks "public"
- Rake::Task["warble:public"].invoke
- file_list(%r{^#{@config.staging_dir}/index\.html}).should_not be_empty
+ it "should define a gemjar task for storing gems in a jar file" do
+ silence { Rake::Task["warble:gemjar"].invoke }
+ File.exist?("tmp/gems.jar").should == true
+ @task.war.files.keys.should_not include(%r{WEB-INF\/gems})
+ @task.war.files.keys.should include("WEB-INF/lib/gems.jar")
end
- it "should define a gems task for unpacking gems" do
- @config.gems << "rails"
- define_tasks "gems"
- Rake::Task["warble:gems"].invoke
- file_list(%r{WEB-INF/gems/gems/rake.*/lib/rake.rb}).should_not be_empty
- file_list(%r{WEB-INF/gems/specifications/rake.*\.gemspec}).should_not be_empty
- end
-
- it "should define a app task for copying application files" do
- define_tasks "app", "gems"
- Rake::Task["warble:app"].invoke
- file_list(%r{WEB-INF/log}).should_not be_empty
- file_list(%r{WEB-INF/log/*.log}).should be_empty
- end
-
- def expand_webxml
- define_tasks "webxml"
- Rake::Task["warble:webxml"].invoke
- require 'rexml/document'
- File.open("#{@config.staging_dir}/WEB-INF/web.xml") do |f|
- REXML::Document.new(f).root.elements
- end
- end
-
- it "should define a webxml task for creating web.xml" do
- elements = expand_webxml
- elements.to_a(
- "context-param/param-name[text()='jruby.max.runtimes']"
- ).should_not be_empty
- elements.to_a(
- "context-param/param-name[text()='jruby.max.runtimes']/../param-value"
- ).first.text.should == "5"
- end
-
- it "should include custom context parameters" do
- @config.webxml.some.custom.config = "myconfig"
- elements = expand_webxml
- elements.to_a(
- "context-param/param-name[text()='some.custom.config']"
- ).should_not be_empty
- elements.to_a(
- "context-param/param-name[text()='some.custom.config']/../param-value"
- ).first.text.should == "myconfig"
- end
-
- it "should allow one jndi resource to be included" do
- @config.webxml.jndi = 'jndi/rails'
- elements = expand_webxml
- elements.to_a(
- "resource-ref/res-ref-name[text()='jndi/rails']"
- ).should_not be_empty
- end
-
- it "should allow multiple jndi resources to be included" do
- @config.webxml.jndi = ['jndi/rails1', 'jndi/rails2']
- elements = expand_webxml
- elements.to_a(
- "resource-ref/res-ref-name[text()='jndi/rails1']"
- ).should_not be_empty
- elements.to_a(
- "resource-ref/res-ref-name[text()='jndi/rails2']"
- ).should_not be_empty
- end
-
- it "should not include any ignored context parameters" do
- @config.webxml.foo = "bar"
- @config.webxml.ignored << "foo"
- elements = expand_webxml
- elements.to_a(
- "context-param/param-name[text()='foo']"
- ).should be_empty
- elements.to_a(
- "context-param/param-name[text()='ignored']"
- ).should be_empty
- elements.to_a(
- "context-param/param-name[text()='jndi']"
- ).should be_empty
- end
-
- it "should use a config/web.xml if it exists" do
- define_tasks "webxml"
- mkdir_p "config"
- File.open("config/web.xml", "w") {|f| f << "Hi there" }
- Rake::Task["warble:webxml"].invoke
- files = file_list(%r{WEB-INF/web.xml$})
- files.should_not be_empty
- File.open(files.first) {|f| f.read}.should == "Hi there"
- end
-
- it "should use a config/web.xml.erb if it exists" do
- define_tasks "webxml"
- mkdir_p "config"
- File.open("config/web.xml.erb", "w") {|f| f << "Hi <%= webxml.public.root %>" }
- Rake::Task["warble:webxml"].invoke
- files = file_list(%r{WEB-INF/web.xml$})
- files.should_not be_empty
- File.open(files.first) {|f| f.read}.should == "Hi /"
- end
-
- it "should define a java_libs task for copying java libraries" do
- define_tasks "java_libs"
- Rake::Task["warble:java_libs"].invoke
- file_list(%r{WEB-INF/lib/jruby-.*\.jar$}).should_not be_empty
- end
-
- it "should define an app task for copying application files" do
- gems_ran = false
- task "warble:gems" do
- gems_ran = true
- end
- define_tasks "app"
- Rake::Task["warble:app"].invoke
- file_list(%r{WEB-INF/app$}).should_not be_empty
- file_list(%r{WEB-INF/config$}).should_not be_empty
- file_list(%r{WEB-INF/lib$}).should_not be_empty
- gems_ran.should == true
- end
-
- it "should define a jar task for creating the .war" do
- define_tasks "jar"
- mkdir_p @config.staging_dir
- touch "#{@config.staging_dir}/file.txt"
- Rake::Task["warble:jar"].invoke
- File.exist?("warbler.war").should == true
- end
-
- it "should define an exploded task for creating an exploded Rails app" do
- @config.java_classes = ["Rakefile"]
- @config.java_libs = []
- define_tasks "webxml", "exploded", "java_classes", "gems"
- Rake::Task['warble:exploded'].invoke
- File.exist?("web.xml").should == true
- File.exist?("sun-web.xml").should == true
- File.symlink?("gems").should == true
- File.symlink?("public/WEB-INF").should == true
- Rake::Task['warble:clean:exploded'].invoke
- end
-
- it "should accept an autodeploy directory where the war should be created" do
- define_tasks "jar"
- require 'tempfile'
- @config.autodeploy_dir = Dir::tmpdir
- mkdir_p @config.staging_dir
- touch "#{@config.staging_dir}/file.txt"
- Rake::Task["warble:jar"].invoke
- File.exist?(File.join("#{Dir::tmpdir}","warbler.war")).should == true
- end
-
it "should define a war task for bundling up everything" do
- app_ran = false; task "warble:app" do; app_ran = true; end
- public_ran = false; task "warble:public" do; public_ran = true; end
+ files_ran = false; task "warble:files" do; files_ran = true; end
jar_ran = false; task "warble:jar" do; jar_ran = true; end
- webxml_ran = false; task "warble:webxml" do; webxml_ran = true; end
- define_tasks "main"
- Rake::Task["warble"].invoke
- app_ran.should == true
- public_ran.should == true
+ silence { Rake::Task["warble"].invoke }
+ files_ran.should == true
jar_ran.should == true
- webxml_ran.should == true
end
- it "should be able to exclude files from the .war" do
- @config.excludes += FileList['lib/tasks/utils.rake']
- task "warble:gems" do; end
- define_tasks "app"
- Rake::Task["warble:app"].invoke
- file_list(%r{lib/tasks/utils.rake}).should be_empty
+ it "should define a jar task for creating the .war" do
+ touch "file.txt"
+ @task.war.files["file.txt"] = "file.txt"
+ silence { Rake::Task["warble:jar"].invoke }
+ File.exist?("#{@config.war_name}.war").should == true
end
it "should be able to define all tasks successfully" do
Warbler::Task.new "warble", @config
end
-
- it "should read configuration from #{Warbler::Config::FILE}" do
- mkdir_p "config"
- File.open(Warbler::Config::FILE, "w") do |dest|
- contents =
- File.open("#{Warbler::WARBLER_HOME}/generators/warble/templates/warble.rb") do |src|
- src.read
- end
- dest << contents.sub(/# config\.war_name/, 'config.war_name'
- ).sub(/# config.gems << "tzinfo"/, 'config.gems = []')
- end
- t = Warbler::Task.new "warble"
- t.config.war_name.should == "mywar"
- end
-
- it "should fail if a gem is requested that is not installed" do
- @config.gems = ["nonexistent-gem"]
- lambda {
- Warbler::Task.new "warble", @config
- }.should raise_error
- end
-
- it "should handle platform-specific gems" do
- spec = mock "gem spec"
- spec.stub!(:name).and_return "hpricot"
- spec.stub!(:version).and_return "0.6.157"
- spec.stub!(:platform).and_return "java"
- spec.stub!(:original_platform).and_return "java"
- spec.stub!(:loaded_from).and_return "hpricot.gemspec"
- spec.stub!(:dependencies).and_return []
- Gem.source_index.should_receive(:search).and_return do |gem|
- gem.name.should == "hpricot"
- [spec]
- end
- File.should_receive(:exist?).with(File.join(Gem.dir, 'cache', "hpricot-0.6.157-java.gem")).and_return true
- @config.gems = ["hpricot"]
- define_tasks "gems"
- end
-
- it "should allow specification of dependency by Gem::Dependency" do
- spec = mock "gem spec"
- spec.stub!(:name).and_return "hpricot"
- spec.stub!(:version).and_return "0.6.157"
- spec.stub!(:platform).and_return "java"
- spec.stub!(:original_platform).and_return "java"
- spec.stub!(:loaded_from).and_return "hpricot.gemspec"
- spec.stub!(:dependencies).and_return []
- Gem.source_index.should_receive(:search).and_return do |gem|
- gem.name.should == "hpricot"
- [spec]
- end
- File.should_receive(:exist?).with(File.join(Gem.dir, 'cache', "hpricot-0.6.157-java.gem")).and_return true
- @config.gems = [Gem::Dependency.new("hpricot", "> 0.6")]
- define_tasks "gems"
- end
-
- it "should define a java_classes task for copying loose java classes" do
- @config.java_classes = FileList["Rakefile"]
- define_tasks "java_classes"
- Rake::Task["warble:java_classes"].invoke
- file_list(%r{WEB-INF/classes/Rakefile$}).should_not be_empty
- end
-
- def mock_rails_module
- rails = Module.new
- Object.const_set("Rails", rails)
- version = Module.new
- rails.const_set("VERSION", version)
- version.const_set("STRING", "2.1.0")
- rails
- end
-
- def mock_merb_module
- merb = Module.new
- Object.const_set("Merb", merb)
- boot_loader = Module.new
- merb.const_set("BootLoader", boot_loader)
- merb.const_set("VERSION", "1.0")
- dependencies = Class.new do
- @@dependencies = []
- def self.dependencies
- @@dependencies
- end
- def self.dependencies=(deps)
- @@dependencies = deps
- end
- end
- boot_loader.const_set("Dependencies", dependencies)
- dependencies
- end
-
- it "should auto-detect a Rails application" do
- task :environment do
- mock_rails_module
- end
- @config = Warbler::Config.new
- @config.webxml.booter.should == :rails
- @config.gems["rails"].should == "2.1.0"
- end
-
- it "should provide Rails gems by default, unless vendor/rails is present" do
- rails = nil
- task :environment do
- rails = mock_rails_module
- end
-
- config = Warbler::Config.new
- config.gems.should have_key("rails")
-
- mkdir_p "vendor/rails"
- config = Warbler::Config.new
- config.gems.should be_empty
-
- rm_rf "vendor/rails"
- rails.stub!(:vendor_rails?).and_return true
- config = Warbler::Config.new
- config.gems.should be_empty
- end
-
- it "should not try to autodetect frameworks when Warbler.framework_detection is false" do
- begin
- Warbler.framework_detection = false
- task :environment
- config = Warbler::Config.new
- config.webxml.booter.should_not == :rails
- t = Rake::Task['environment']
- class << t; public :instance_variable_get; end
- t.instance_variable_get("@already_invoked").should == false
- ensure
- Warbler.framework_detection = true
- end
- end
-
- it "should auto-detect a Merb application" do
- task :merb_env do
- mock_merb_module
- end
- @config = Warbler::Config.new
- @config.webxml.booter.should == :merb
- @config.gems.keys.should_not include("rails")
- end
-
- it "should auto-detect a Rack application with a config.ru file" do
- rackup = "run Proc.new {|env| [200, {}, ['Hello World']]}"
- File.open("config.ru", "w") {|f| f << rackup }
- @config = Warbler::Config.new
- @config.webxml.booter.should == :rack
- @config.webxml.rackup.should == rackup
- end
-
- it "should automatically add Rails.configuration.gems to the list of gems" do
- task :environment do
- rails = mock_rails_module
- config = mock "config"
- rails.stub!(:configuration).and_return(config)
- gem = mock "gem"
- gem.stub!(:name).and_return "hpricot"
- gem.stub!(:requirement).and_return Gem::Requirement.new("=0.6")
- config.stub!(:gems).and_return [gem]
- end
-
- @config = Warbler::Config.new
- @config.webxml.booter.should == :rails
- @config.gems.keys.should include(Gem::Dependency.new("hpricot", Gem::Requirement.new("=0.6")))
- end
-
- it "should automatically add Merb::BootLoader::Dependencies.dependencies to the list of gems" do
- task :merb_env do
- deps = mock_merb_module
- deps.dependencies = [Gem::Dependency.new("merb-core", ">= 1.0.6.1")]
- end
- @config = Warbler::Config.new
- @config.webxml.booter.should == :merb
- @config.gems.keys.should include(Gem::Dependency.new("merb-core", ">= 1.0.6.1"))
- end
-
- it "should skip Merb development dependencies" do
- task :merb_env do
- deps = mock_merb_module
- deps.dependencies = [Gem::Dependency.new("rake", "= #{RAKEVERSION}", :development)]
- end
- @config = Warbler::Config.new
- define_tasks "copy_gems"
- Rake.application.lookup("gem:rake-#{RAKEVERSION}").should be_nil
- end
-
- it "should warn about using Merb < 1.0" do
- task :merb_env do
- Object.const_set("Merb", Module.new)
- end
- @config = Warbler::Config.new
- @config.webxml.booter.should == :merb
- end
-
- it "should set the jruby max runtimes to 1 when MT Rails is detected" do
- task :environment do
- rails = mock_rails_module
- config = mock "config"
- rails.stub!(:configuration).and_return(config)
- config.stub!(:threadsafe!)
- end
- @config = Warbler::Config.new
- @config.webxml.booter.should == :rails
- @config.webxml.jruby.max.runtimes.should == 1
- end
-
- it "should skip directories that don't exist in config.dirs and print a warning" do
- @config = Warbler::Config.new
- @config.dirs = %w(lib notexist)
- define_tasks "webinf_file"
- Rake.application.lookup("#{@config.staging_dir}/WEB-INF/lib").should_not be_nil
- Rake.application.lookup("#{@config.staging_dir}/WEB-INF/notexist").should be_nil
- end
end
-describe "The warbler.rake file" do
- it "should be able to list its contents" do
- output = `#{FileUtils::RUBY} -S rake -f #{Warbler::WARBLER_HOME}/tasks/warbler.rake -T`
- output.should =~ /war\s/
- output.should =~ /war:exploded/
- output.should =~ /war:app/
- output.should =~ /war:clean/
- output.should =~ /war:gems/
- output.should =~ /war:jar/
- output.should =~ /war:java_libs/
- output.should =~ /war:java_classes/
- output.should =~ /war:public/
- end
-end
-
describe "Debug targets" do
before(:each) do
@rake = Rake::Application.new
Rake.application = @rake
verbose(false)
silence { Warbler::Task.new :war, Object.new }
end
it "should print out lists of files" do
- capture { Rake::Task["war:debug:public"].invoke }.should =~ /public/
- capture { Rake::Task["war:debug:gems"].invoke }.should =~ /gems/
- capture { Rake::Task["war:debug:java_libs"].invoke }.should =~ /java_libs/
- capture { Rake::Task["war:debug:java_classes"].invoke }.should =~ /java_classes/
- capture { Rake::Task["war:debug:app"].invoke }.should =~ /app/
capture { Rake::Task["war:debug:includes"].invoke }.should =~ /include/
capture { Rake::Task["war:debug:excludes"].invoke }.should =~ /exclude/
capture { Rake::Task["war:debug"].invoke }.should =~ /Config/
end
end