require File.dirname(__FILE__) + '/../test_helper' require 'stringio' class SubversionTest < Test::Unit::TestCase include FileSandbox def teardown FileUtils.rm_f "./svn.err" end LOG_ENTRY = <<-EOF alexey 2006-01-11T13:58:58.000007Z Goofin around with integration test for the builder alexey 2006-01-11T12:44:54.000007Z Moved builder from vendor, made bulder's integration tests talk to a subversion repository in the local file system stellsmi 2006-01-11T10:37:32.000007Z integration test does a checkout EOF EMPTY_LOG = <<-EOF EOF def test_options svn = Subversion.new(:url => "file://foo", :username => "bob", :password => 'cha') assert_equal("file://foo", svn.url) assert_equal("bob", svn.username) assert_equal("cha", svn.password) end def test_only_except_known_options assert_raises("don't know how to handle 'sugar'") do Subversion.new(:sugar => "1/2 cup") end end def test_update_with_revision_number revision_number = 10 svn = Subversion.new svn.expects(:execute).with("svn --non-interactive update --revision #{revision_number}", {:stderr => './svn.err'}).returns("your mom") svn.update(dummy_project, Revision.new(revision_number)) end def test_latest_revision svn = Subversion.new svn.expects(:info).with(dummy_project).returns(Subversion::Info.new(10, 10)) svn.expects(:execute).with("svn --non-interactive log --revision HEAD:10 --verbose --xml", {:stderr => './svn.err'}).yields(StringIO.new(LOG_ENTRY)) revision = svn.latest_revision(dummy_project) assert_equal 18, revision.number end def test_revisions_since_should_reverse_the_log_entries_and_skip_the_one_corresponding_to_current_revision svn = Subversion.new svn.expects(:execute).with("svn --non-interactive log --revision HEAD:15 --verbose --xml", {:stderr => './svn.err'}).yields(StringIO.new(LOG_ENTRY)) revisions = svn.revisions_since(dummy_project, 15) assert_equal [17, 18], numbers(revisions) end def test_revisions_since_should_return_all_revisions_when_curreent_revision_is_not_in_the_log_output svn = Subversion.new svn.expects(:execute).with("svn --non-interactive log --revision HEAD:14 --verbose --xml", {:stderr => './svn.err'}).yields(StringIO.new(LOG_ENTRY)) revisions = svn.revisions_since(dummy_project, 14) assert_equal [15, 17, 18], numbers(revisions) end def test_revisions_since_should_return_an_empty_array_for_empty_log_output svn = Subversion.new svn.expects(:execute).with("svn --non-interactive log --revision HEAD:14 --verbose --xml", {:stderr => './svn.err'}).yields(StringIO.new(EMPTY_LOG)) revisions = svn.revisions_since(dummy_project, 14) assert_equal [], numbers(revisions) end def test_checkout_with_no_user_password svn = Subversion.new(:url => 'http://foo.com/svn/project') svn.expects(:execute).with("svn --non-interactive co http://foo.com/svn/project .") svn.checkout('.') end def test_should_write_error_info_to_log_when_svn_server_not_available in_sandbox do |sandbox| sandbox.new :file => "project/work/empty", :with_content => "" project = Object.new project.stubs(:local_checkout).returns("#{sandbox.root}/project/work") project.stubs(:path).returns("#{sandbox.root}/project") svn = Subversion.new begin svn.revisions_since(project, 1) flunk rescue BuilderError => e assert_match /not a working copy/, e.message end end end def test_checkout_with_user_password svn = Subversion.new(:url => 'http://foo.com/svn/project', :username => 'jer', :password => "crap") svn.expects(:execute).with("svn --non-interactive co http://foo.com/svn/project . --username jer --password crap") svn.checkout('.') end def test_checkout_with_revision svn = Subversion.new(:url => 'http://foo.com/svn/project') svn.expects(:execute).with("svn --non-interactive co http://foo.com/svn/project . --revision 5") svn.checkout('.', Revision.new(5)) end def test_allowing_interaction svn = Subversion.new(:url => 'svn://foo.com/', :interactive => true) svn.expects(:execute).with("svn co svn://foo.com/ .") svn.checkout('.') svn.verify end def test_checkout_requires_url assert_raises('URL not specified') { Subversion.new.checkout('.') } end def test_new_does_not_allow_random_params assert_raises("don't know how to handle 'lollipop'") do Subversion.new(:url => 'http://foo.com/svn/project', :lollipop => 'http://foo.com/svn/project') end end def numbers(revisions) revisions.map { |r| r.number } end DummyProject = Struct.new :local_checkout, :path def dummy_project DummyProject.new('.', '.') end end