# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with this
# work for additional information regarding copyright ownership. The ASF
# licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
require File.join(File.dirname(__FILE__), 'spec_helpers')
describe Buildr::TestTask do
def test_task
@test_task ||= define('foo').test
end
it 'should respond to :compile and return compile task' do
test_task.compile.should be_kind_of(Buildr::CompileTask)
end
it 'should respond to :compile and add sources to compile' do
test_task.compile 'sources'
test_task.compile.sources.should include('sources')
end
it 'should respond to :compile and add action for test:compile' do
write 'src/test/java/Test.java', 'class Test {}'
test_task.compile { task('action').invoke }
lambda { test_task.compile.invoke }.should run_tasks('action')
end
it 'should execute compile tasks first' do
write 'src/main/java/Nothing.java', 'class Nothing {}'
write 'src/test/java/Test.java', 'class Test {}'
define 'foo'
lambda { project('foo').test.compile.invoke }.should run_tasks(['foo:compile', 'foo:test:compile'])
end
it 'should respond to :resources and return resources task' do
test_task.resources.should be_kind_of(Buildr::ResourcesTask)
end
it 'should respond to :resources and add prerequisites to test:resources' do
file('prereq').should_receive :invoke_prerequisites
test_task.resources 'prereq'
test_task.compile.invoke
end
it 'should respond to :resources and add action for test:resources' do
task 'action'
test_task.resources { task('action').invoke }
lambda { test_task.resources.invoke }.should run_tasks('action')
end
it 'should respond to :setup and return setup task' do
test_task.setup.name.should =~ /test:setup$/
end
it 'should respond to :setup and add prerequisites to test:setup' do
test_task.setup 'prereq'
test_task.setup.prerequisites.should include('prereq')
end
it 'should respond to :setup and add action for test:setup' do
task 'action'
test_task.setup { task('action').invoke }
lambda { test_task.setup.invoke }.should run_tasks('action')
end
it 'should respond to :teardown and return teardown task' do
test_task.teardown.name.should =~ /test:teardown$/
end
it 'should respond to :teardown and add prerequisites to test:teardown' do
test_task.teardown 'prereq'
test_task.teardown.prerequisites.should include('prereq')
end
it 'should respond to :teardown and add action for test:teardown' do
task 'action'
test_task.teardown { task('action').invoke }
lambda { test_task.teardown.invoke }.should run_tasks('action')
end
it 'should respond to :with and return self' do
test_task.with.should be(test_task)
end
it 'should respond to :with and add artifacfs to compile task dependencies' do
test_task.with 'test.jar', 'acme:example:jar:1.0'
test_task.compile.dependencies.should include(File.expand_path('test.jar'))
test_task.compile.dependencies.should include(artifact('acme:example:jar:1.0'))
end
it 'should respond to :with and add artifacfs to task dependencies' do
test_task.with 'test.jar', 'acme:example:jar:1.0'
test_task.dependencies.should include(File.expand_path('test.jar'))
test_task.dependencies.should include(artifact('acme:example:jar:1.0'))
end
it 'should response to :options and return test framework options' do
test_task.using :foo=>'bar'
test_task.options[:foo].should eql('bar')
end
it 'should respond to :using and return self' do
test_task.using.should be(test_task)
end
it 'should respond to :using and set value options' do
test_task.using('foo'=>'FOO', 'bar'=>'BAR')
test_task.options[:foo].should eql('FOO')
test_task.options[:bar].should eql('BAR')
end
it 'should start without pre-selected test framework' do
test_task.framework.should be_nil
end
it 'should respond to :using and select test framework' do
test_task.using(:testng)
test_task.framework.should eql(:testng)
end
it 'should infer test framework from compiled language' do
lambda { test_task.compile.using(:javac) }.should change { test_task.framework }.to(:junit)
end
it 'should respond to :include and return self' do
test_task.include.should be(test_task)
end
it 'should respond to :include and add inclusion patterns' do
test_task.include 'Foo', 'Bar'
test_task.send(:include?, 'Foo').should be_true
test_task.send(:include?, 'Bar').should be_true
end
it 'should respond to :exclude and return self' do
test_task.exclude.should be(test_task)
end
it 'should respond to :exclude and add exclusion patterns' do
test_task.exclude 'FooTest', 'BarTest'
test_task.send(:include?, 'FooTest').should be_false
test_task.send(:include?, 'BarTest').should be_false
test_task.send(:include?, 'BazTest').should be_true
end
it 'should execute setup task before running tests' do
mock = mock('actions')
test_task.setup { mock.setup }
test_task.enhance { mock.tests }
mock.should_receive(:setup).ordered
mock.should_receive(:tests).ordered
test_task.invoke
end
it 'should execute teardown task after running tests' do
mock = mock('actions')
test_task.teardown { mock.teardown }
test_task.enhance { mock.tests }
mock.should_receive(:tests).ordered
mock.should_receive(:teardown).ordered
test_task.invoke
end
it 'should not execute teardown if setup failed' do
test_task.setup { fail }
lambda { test_task.invoke rescue nil }.should_not run_task(test_task.teardown)
end
it 'should use the main compile dependencies' do
define('foo') { compile.using(:javac).with 'group:id:jar:1.0' }
project('foo').test.dependencies.should include(artifact('group:id:jar:1.0'))
end
it 'should include the main compile target in its dependencies' do
define('foo') { compile.using(:javac) }
project('foo').test.dependencies.should include(project('foo').compile.target)
end
it 'should include the main resources target in its dependencies' do
write 'src/main/resources/test'
define('foo').test.dependencies.should include(project('foo').resources.target)
end
it 'should not use the test compile dependencies' do
define('foo') { test.compile.using(:javac).with 'group:id:jar:1.0' }
project('foo').test.dependencies.should_not include(artifact('group:id:jar:1.0'))
end
it 'should include the test compile target in its dependencies' do
define('foo') { test.compile.using(:javac) }
project('foo').test.dependencies.should include(project('foo').test.compile.target)
end
it 'should include the test resources target in its dependencies' do
write 'src/test/resources/test'
define('foo').test.dependencies.should include(project('foo').test.resources.target)
end
it 'should clean after itself (test files)' do
define('foo') { test.compile.using(:javac) }
mkpath project('foo').test.compile.target.to_s
lambda { task('clean').invoke }.should change { File.exist?(project('foo').test.compile.target.to_s) }.to(false)
end
it 'should clean after itself (reports)' do
define 'foo'
mkpath project('foo').test.report_to.to_s
lambda { task('clean').invoke }.should change { File.exist?(project('foo').test.report_to.to_s) }.to(false)
end
end
describe Buildr::TestTask, 'with no tests' do
it 'should pass' do
lambda { define('foo').test.invoke }.should_not raise_error
end
it 'should report no failed tests' do
lambda { verbose(true) { define('foo').test.invoke } }.should_not warn_that(/fail/i)
end
it 'should return no failed tests' do
define('foo') { test.using(:junit) }
project('foo').test.invoke
project('foo').test.failed_tests.should be_empty
end
it 'should return no passing tests' do
define('foo') { test.using(:junit) }
project('foo').test.invoke
project('foo').test.passed_tests.should be_empty
end
it 'should execute teardown task' do
lambda { define('foo').test.invoke }.should run_task('foo:test:teardown')
end
end
describe Buildr::TestTask, 'with passing tests' do
def test_task
@test_task ||= begin
define 'foo' do
test.using(:junit)
test.instance_eval do
@framework.stub!(:tests).and_return(['PassingTest1', 'PassingTest2'])
@framework.stub!(:run).and_return(['PassingTest1', 'PassingTest2'])
end
end
project('foo').test
end
end
it 'should pass' do
lambda { test_task.invoke }.should_not raise_error
end
it 'should report no failed tests' do
lambda { verbose(true) { test_task.invoke } }.should_not warn_that(/fail/i)
end
it 'should return passed tests' do
test_task.invoke
test_task.passed_tests.should == ['PassingTest1', 'PassingTest2']
end
it 'should return no failed tests' do
test_task.invoke
test_task.failed_tests.should be_empty
end
it 'should execute teardown task' do
lambda { test_task.invoke }.should run_task('foo:test:teardown')
end
end
describe Buildr::TestTask, 'with failed test' do
def test_task
@test_task ||= begin
define 'foo' do
test.using(:junit)
test.instance_eval do
@framework.stub!(:tests).and_return(['FailingTest', 'PassingTest'])
@framework.stub!(:run).and_return(['PassingTest'])
end
end
project('foo').test
end
end
it 'should fail' do
lambda { test_task.invoke }.should raise_error(RuntimeError, /Tests failed/)
end
it 'should report failed tests' do
lambda { verbose(true) { test_task.invoke rescue nil } }.should warn_that(/FailingTest/)
end
it 'should return failed tests' do
test_task.invoke rescue nil
test_task.failed_tests.should == ['FailingTest']
end
it 'should return passing tests as well' do
test_task.invoke rescue nil
test_task.passed_tests.should == ['PassingTest']
end
it 'should not fail if fail_on_failure is false' do
test_task.using(:fail_on_failure=>false).invoke
lambda { test_task.invoke }.should_not raise_error
end
it 'should report failed tests even if fail_on_failure is false' do
test_task.using(:fail_on_failure=>false)
lambda { verbose(true) { test_task.invoke } }.should warn_that(/FailingTest/)
end
it 'should return failed tests even if fail_on_failure is false' do
test_task.using(:fail_on_failure=>false).invoke
test_task.failed_tests.should == ['FailingTest']
end
it 'should execute teardown task' do
lambda { test_task.invoke rescue nil }.should run_task('foo:test:teardown')
end
end
describe Buildr::Project, '#test' do
it 'should return the project\'s test task' do
define('foo') { test.should be(task('test')) }
end
it 'should accept prerequisites for task' do
define('foo') { test 'prereq' }
project('foo').test.prerequisites.should include('prereq')
end
it 'should accept actions for task' do
task 'action'
define('foo') { test { task('action').invoke } }
lambda { project('foo').test.invoke }.should run_tasks('action')
end
it 'should set fail_on_failure true by default' do
define('foo').test.options[:fail_on_failure].should be_true
end
it 'should set fork mode by default' do
define('foo').test.options[:fork].should == :once
end
it 'should set properties to empty hash by default' do
define('foo').test.options[:properties].should == {}
end
it 'should set environment variables to empty hash by default' do
define('foo').test.options[:environment].should == {}
end
it 'should inherit options from parent project' do
define 'foo' do
test.using :fail_on_failure=>false, :fork=>:each, :properties=>{ :foo=>'bar' }, :environment=>{ 'config'=>'config.yaml' }
define 'bar' do
test.using :junit
test.options[:fail_on_failure].should be_false
test.options[:fork].should == :each
test.options[:properties][:foo].should == 'bar'
test.options[:environment]['config'].should == 'config.yaml'
end
end
end
it 'should clone options from parent project' do
define 'foo' do
define 'bar' do
test.using :fail_on_failure=>false, :fork=>:each, :properties=>{ :foo=>'bar' }, :environment=>{ 'config'=>'config.yaml' }
test.using :junit
end.invoke
test.options[:fail_on_failure].should be_true
test.options[:fork].should == :once
test.options[:properties].should be_empty
test.options[:environment].should be_empty
end
end
end
describe Buildr::Project, '#test.compile' do
it 'should identify compiler from project' do
write 'src/test/java/com/example/Test.java'
define('foo') do
test.compile.compiler.should eql(:javac)
end
end
it 'should include identified sources' do
write 'src/test/java/Test.java'
define('foo') do
test.compile.sources.should include(_('src/test/java'))
end
end
it 'should compile to target/test/<code>' do
define 'foo', :target=>'targeted' do
test.compile.using(:javac)
test.compile.target.should eql(file('targeted/test/classes'))
end
end
it 'should use main compile dependencies' do
define 'foo' do
compile.using(:javac).with 'group:id:jar:1.0'
test.compile.using(:javac)
end
project('foo').test.compile.dependencies.should include(artifact('group:id:jar:1.0'))
end
it 'should include the main compiled target in its dependencies' do
define 'foo' do
compile.using(:javac).into 'bytecode'
test.compile.using(:javac)
end
project('foo').test.compile.dependencies.