# 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.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helpers'))
require 'fileutils'

describe Artifact do
  before do
    Buildr.repositories.instance_eval do
      @local = @remote = @release_to = nil
    end
    @spec = { :group=>'com.example', :id=>'library', :type=>:jar, :version=>'2.0' }
    @artifact = artifact(@spec)
    @classified = artifact(@spec.merge(:classifier=>'all'))
    @snapshot = artifact(@spec.merge({ :version=>'2.1-SNAPSHOT' }))
  end


  it 'should act as one' do
    @artifact.should respond_to(:to_spec)
  end

  it 'should have an artifact identifier' do
    @artifact.id.should eql('library')
  end

  it 'should have a group identifier' do
    @artifact.group.should eql('com.example')
  end

  it 'should have a version number' do
    @artifact.version.should eql('2.0')
  end

  it 'should know if it is a snapshot' do
    @artifact.should_not be_snapshot
    @classified.should_not be_snapshot
    @snapshot.should be_snapshot
  end

  it 'should have a file type' do
    @artifact.type.should eql(:jar)
  end

  it 'should understand classifier' do
    @artifact.classifier.should be_nil
    @classified.classifier.should eql('all')
  end

  it 'should return hash specification' do
    @artifact.to_hash.should == @spec
    @artifact.to_spec_hash.should == @spec
    @classified.to_hash.should == @spec.merge(:classifier=>'all')
  end

  it 'should return string specification' do
    @artifact.to_spec.should eql('com.example:library:jar:2.0')
    @classified.to_spec.should eql('com.example:library:jar:all:2.0')
  end

  it 'should have associated POM artifact' do
    @artifact.pom.to_hash.should == @artifact.to_hash.merge(:type=>:pom)
  end

  it 'should have one POM artifact for all classifiers' do
    @classified.pom.to_hash.should == @classified.to_hash.merge(:type=>:pom).except(:classifier)
  end

  it 'should have associated sources artifact' do
    @artifact.sources_artifact.to_hash.should == @artifact.to_hash.merge(:classifier=>'sources')
  end

  it 'should have associated javadoc artifact' do
    @artifact.javadoc_artifact.to_hash.should == @artifact.to_hash.merge(:classifier=>'javadoc')
  end

  it 'should download file if file does not exist' do
    lambda { @artifact.invoke }.should raise_error(Exception, /No remote repositories/)
    lambda { @classified.invoke }.should raise_error(Exception, /No remote repositories/)
  end

  it 'should not download file if file exists' do
    write repositories.locate(@artifact)
    lambda { @artifact.invoke }.should_not raise_error
    write repositories.locate(@classified)
    lambda { @classified.invoke }.should_not raise_error
  end

  it 'should handle lack of POM gracefully' do
    repositories.remote = 'http://buildr.apache.org/repository/noexist'
    URI.should_receive(:download).twice { |*args| raise URI::NotFoundError if args[0].to_s.end_with?('.pom') }
    lambda { @artifact.invoke }.should_not raise_error
  end

  it 'should pass if POM provided' do
    repositories.remote = 'http://buildr.apache.org/repository/noexist'
    @artifact.pom.enhance { |task| write task.name, @artifact.pom_xml.call }
    write repositories.locate(@artifact)
    lambda { @artifact.invoke }.should_not raise_error
  end

  it 'should pass if POM not required' do
    repositories.remote = 'http://buildr.apache.org/repository/noexist'
    class << @artifact ; def pom() ; end ; end
    write repositories.locate(@artifact)
    lambda { @artifact.invoke }.should_not raise_error
  end

  it 'should not download file if dry-run' do
    dryrun do
      lambda { @artifact.invoke }.should_not raise_error
      lambda { @classified.invoke }.should_not raise_error
    end
  end

  it 'should resolve to path in local repository' do
    @artifact.to_s.should == File.join(repositories.local, 'com/example/library/2.0/library-2.0.jar')
    @classified.to_s.should == File.join(repositories.local, 'com/example/library/2.0/library-2.0-all.jar')
  end

  it 'should return a list of all registered artifact specifications' do
    define('foo', :version=>'1.0') { package :jar }
    Artifact.list.should include(@artifact.to_spec)
    Artifact.list.should include(@classified.to_spec)
    Artifact.list.should include('foo:foo:jar:1.0')
  end

  it 'should accept user-defined string content' do
    a = artifact(@spec)
    a.content 'foo'
    install a
    lambda { install.invoke }.should change { File.exist?(a.to_s) && File.exist?(repositories.locate(a)) }.to(true)
    read(repositories.locate(a)).should eql('foo')
  end
end


describe Repositories, 'local' do
  before do
    Buildr.repositories.instance_eval do
      @local = @remote = @release_to = nil
    end
  end

  it 'should default to .m2 path' do
    # For convenience, sandbox actually sets the local repository to a temp directory
    repositories.local = nil
    repositories.local.should eql(File.expand_path('.m2/repository', ENV['HOME']))
  end

  it 'should be settable' do
    repositories.local = '.m2/local'
    repositories.local.should eql(File.expand_path('.m2/local'))
  end

  it 'should reset to default' do
    repositories.local = '.m2/local'
    repositories.local = nil
    repositories.local.should eql(File.expand_path('~/.m2/repository'))
  end

  it 'should locate file from string specification' do
    repositories.local = nil
    repositories.locate('com.example:library:jar:2.0').should eql(
      File.expand_path('~/.m2/repository/com/example/library/2.0/library-2.0.jar'))
  end

  it 'should locate file from hash specification' do
    repositories.local = nil
    repositories.locate(:group=>'com.example', :id=>'library', :version=>'2.0').should eql(
      File.expand_path('~/.m2/repository/com/example/library/2.0/library-2.0.jar'))
  end

  it 'should load path from settings file' do
    write 'home/.buildr/settings.yaml', <<-YAML
    repositories:
      local: my_repo
    YAML
    repositories.local.should eql(File.expand_path('my_repo'))
  end

  it 'should not override custom install methods defined when extending an object' do
    class MyOwnInstallTask

      attr_accessor :result

      def install
        result = true
      end

    end
    task = MyOwnInstallTask.new
    task.result = "maybe"
    task.extend ActsAsArtifact
    task.install
    task.result.should be_true
  end
end

describe Repositories, 'remote_uri' do
  before do
    Buildr.repositories.instance_eval do
      @local = @remote = @release_to = nil
    end

    @repos = [ 'https://oss.sonatype.org/', 'http://www.ibiblio.org/maven2', { :url => 'http://repo1.maven.org/maven2', :username => 'user', :password => 'password' } ]
  end
  
  it 'should convert remote to array of uri' do
      uri = URI.parse( 'http://repo1.maven.org/maven2' )
      uri.user = 'user' 
      uri.password = 'password'
    
      uris = [ URI.parse( 'https://oss.sonatype.org/'), URI.parse( 'http://www.ibiblio.org/maven2' ), uri ]
      
      repositories.remote = @repos
      repositories.remote_uri.should eql(uris)
  end
end

describe Repositories, 'mirrors' do
  before do
    Buildr.repositories.instance_eval do
      @local = @remote = @release_to = @mirrors = nil
    end
    
    @repos = [ 'http://www.ibiblio.org/maven2', 'http://repo1.maven.org/maven2' ]
  end
  
  it 'should be empty initially' do
    repositories.mirrors.should be_empty
  end

  it 'should be settable' do
    repositories.mirrors = @repos.first
    repositories.mirrors.should eql([@repos.first])
  end
  
  it 'should be settable from array' do
    repositories.mirrors = @repos
    repositories.mirrors.should eql(@repos)
  end

  it 'should add and return repositories in order' do
    @repos.each { |url| repositories.mirrors << url }
    repositories.mirrors.should eql(@repos)
  end
  
  it 'should log that it is overridding the remote repositories with the mirrors' do
    @repos.each { |url| repositories.mirrors << url }
    lambda { repositories.remote }.should show_info /Remote repositories overridden by mirrors /
  end
  
  it 'should load with all repositories specified in settings file' do
    write 'home/.buildr/settings.yaml', <<-YAML
    repositories:
      mirrors:
      - http://example.com/repository/noexist
      remote:
      - http://foobar.com
    YAML
    repositories.mirrors.should include('http://example.com/repository/noexist')
  end

  it 'should load with all repositories specified in build.yaml file' do
    write 'build.yaml', <<-YAML
    repositories:
      mirrors:
      - http://example.com/repository/noexist
      remote:
      - http://foobar.com
    YAML
    repositories.mirrors.should include('http://example.com/repository/noexist')
  end

  it 'should load with all repositories specified in settings and build.yaml files' do
    write 'home/.buildr/settings.yaml', <<-YAML
    repositories:
      mirrors:
      - http://example.com/repository/noexist
      remote:
      - http://foobar.com
    YAML
    write 'build.yaml', <<-YAML
    repositories:
      mirrors:
      - http://example.com/repo2
      remote:
      - http://foobar.com
    YAML
    repositories.mirrors.should include('http://example.com/repository/noexist', 'http://example.com/repo2')
  end
end

describe Repositories, 'remote' do
  before do
    Buildr.repositories.instance_eval do
      @local = @remote = @release_to = nil
    end

    @repos = [ 'http://www.ibiblio.org/maven2', 'http://repo1.maven.org/maven2' ]
  end

  it 'should be empty initially' do
    repositories.remote.should be_empty
  end

  it 'should be settable' do
    repositories.remote = @repos.first
    repositories.remote.should eql([@repos.first])
  end

  it 'should be settable from array' do
    repositories.remote = @repos
    repositories.remote.should eql(@repos)
  end

  it 'should add and return repositories in order' do
    @repos.each { |url| repositories.remote << url }
    repositories.remote.should eql(@repos)
  end

  it 'should be used to download artifact' do
    repositories.remote = 'http://buildr.apache.org/repository/noexist'
    URI.should_receive(:download).twice.and_return { |uri, target, options| write target }
    lambda { artifact('com.example:library:jar:2.0').invoke }.
      should change { File.exist?(File.join(repositories.local, 'com/example/library/2.0/library-2.0.jar')) }.to(true)
  end

  it 'should lookup in array order' do
    repositories.remote = [ 'http://buildr.apache.org/repository/noexist', 'http://example.org' ]
    order = ['com', 'org']
    URI.stub(:download) do |uri, target, options|
      order.shift if order.first && uri.to_s[order.first]
      fail URI::NotFoundError unless order.empty?
      write target
    end
    lambda { artifact('com.example:library:jar:2.0').invoke }.should change { order.empty? }
  end

  it 'should fail if artifact not found' do
    repositories.remote = 'http://buildr.apache.org/repository/noexist'
    URI.should_receive(:download).once.ordered.and_return { fail URI::NotFoundError }
    lambda { artifact('com.example:library:jar:2.0').invoke }.should raise_error(RuntimeError, /Failed to download/)
    File.exist?(File.join(repositories.local, 'com/example/library/2.0/library-2.0.jar')).should be_false
  end

  it 'should support artifact classifier' do
    repositories.remote = 'http://buildr.apache.org/repository/noexist'
    URI.should_receive(:download).once.and_return { |uri, target, options| write target }
    lambda { artifact('com.example:library:jar:all:2.0').invoke }.
      should change { File.exist?(File.join(repositories.local, 'com/example/library/2.0/library-2.0-all.jar')) }.to(true)
  end

  it 'should deal well with repositories URL that lack the last slash' do
    repositories.remote = 'http://buildr.apache.org/repository/noexist/base'
    uri = nil
    URI.should_receive(:download).twice.and_return { |_uri, args| uri = _uri }
    artifact('group:id:jar:1.0').invoke
    uri.to_s.should eql('http://buildr.apache.org/repository/noexist/base/group/id/1.0/id-1.0.pom')
  end

  it 'should deal well with repositories URL that have the last slash' do
    repositories.remote = 'http://buildr.apache.org/repository/noexist/base/'
    uri = nil
    URI.should_receive(:download).twice.and_return { |_uri, args| uri = _uri }
    artifact('group:id:jar:1.0').invoke
    uri.to_s.should eql('http://buildr.apache.org/repository/noexist/base/group/id/1.0/id-1.0.pom')
  end

  it 'should resolve m2-style deployed snapshots' do
    metadata = <<-XML
    <?xml version='1.0' encoding='UTF-8'?>
    <metadata>
      <groupId>com.example</groupId>
      <artifactId>library</artifactId>
      <version>2.1-SNAPSHOT</version>
      <versioning>
        <snapshot>
          <timestamp>20071012.190008</timestamp>
          <buildNumber>8</buildNumber>
        </snapshot>
        <lastUpdated>20071012190008</lastUpdated>
      </versioning>
    </metadata>
    XML
    repositories.remote = 'http://buildr.apache.org/repository/noexist'
    URI.should_receive(:download).twice.with(uri(/2.1-SNAPSHOT\/library-2.1-SNAPSHOT.(jar|pom)$/), anything()).
      and_return { fail URI::NotFoundError }
    URI.should_receive(:download).twice.with(uri(/2.1-SNAPSHOT\/maven-metadata.xml$/), duck_type(:write)).
      and_return { |uri, target, options| target.write(metadata) }
    URI.should_receive(:download).twice.with(uri(/2.1-SNAPSHOT\/library-2.1-20071012.190008-8.(jar|pom)$/), /2.1-SNAPSHOT\/library-2.1-SNAPSHOT.(jar|pom).(\d){1,}$/).
      and_return { |uri, target, options| write target }
    lambda { artifact('com.example:library:jar:2.1-SNAPSHOT').invoke }.
      should change { File.exist?(File.join(repositories.local, 'com/example/library/2.1-SNAPSHOT/library-2.1-SNAPSHOT.jar')) }.to(true)
  end

  it 'should resolve m2-style deployed snapshots with classifiers' do
    metadata = <<-XML
    <?xml version='1.0' encoding='UTF-8'?>
    <metadata>
      <groupId>com.example</groupId>
      <artifactId>library</artifactId>
      <version>2.1-SNAPSHOT</version>
      <versioning>
        <snapshot>
          <timestamp>20071012.190008</timestamp>
          <buildNumber>8</buildNumber>
        </snapshot>
        <lastUpdated>20071012190008</lastUpdated>
      </versioning>
    </metadata>
    XML
    repositories.remote = 'http://buildr.apache.org/repository/noexist'
    URI.should_receive(:download).once.with(uri(/2.1-SNAPSHOT\/library-2.1-20071012.190008-8-classifier.jar$/), anything()).
      and_return { |uri, target, options| write target }
    URI.should_receive(:download).once.with(uri(/2.1-SNAPSHOT\/maven-metadata.xml$/), duck_type(:write)).
      and_return { |uri, target, options| target.write(metadata) }
    puts repositories.local
    lambda { artifact('com.example:library:jar:classifier:2.1-SNAPSHOT').invoke}.
      should change {File.exists?(File.join(repositories.local, 'com/example/library/2.1-SNAPSHOT/library-2.1-SNAPSHOT-classifier.jar')) }.to(true)
  end

  it 'should fail resolving m2-style deployed snapshots if a timestamp is missing' do
    metadata = <<-XML
    <?xml version='1.0' encoding='UTF-8'?>
    <metadata>
      <groupId>com.example</groupId>
      <artifactId>library</artifactId>
      <version>2.1-SNAPSHOT</version>
      <versioning>
        <snapshot>
          <buildNumber>8</buildNumber>
        </snapshot>
        <lastUpdated>20071012190008</lastUpdated>
      </versioning>
    </metadata>
    XML
    repositories.remote = 'http://buildr.apache.org/repository/noexist'
    URI.should_receive(:download).once.with(uri(/2.1-SNAPSHOT\/library-2.1-SNAPSHOT.(jar|pom)$/), anything()).
      and_return { fail URI::NotFoundError }
    URI.should_receive(:download).once.with(uri(/2.1-SNAPSHOT\/maven-metadata.xml$/), duck_type(:write)).
      and_return { |uri, target, options| target.write(metadata) }
    lambda {
      lambda { artifact('com.example:library:jar:2.1-SNAPSHOT').invoke }.should raise_error(RuntimeError, /Failed to download/)
    }.should show_error "No timestamp provided for the snapshot com.example:library:jar:2.1-SNAPSHOT"
    File.exist?(File.join(repositories.local, 'com/example/library/2.1-SNAPSHOT/library-2.1-SNAPSHOT.jar')).should be_false
  end

  it 'should fail resolving m2-style deployed snapshots if a build number is missing' do
    metadata = <<-XML
    <?xml version='1.0' encoding='UTF-8'?>
    <metadata>
      <groupId>com.example</groupId>
      <artifactId>library</artifactId>
      <version>2.1-SNAPSHOT</version>
      <versioning>
        <snapshot>
          <timestamp>20071012.190008</timestamp>
        </snapshot>
        <lastUpdated>20071012190008</lastUpdated>
      </versioning>
    </metadata>
    XML
    repositories.remote = 'http://buildr.apache.org/repository/noexist'
    URI.should_receive(:download).once.with(uri(/2.1-SNAPSHOT\/library-2.1-SNAPSHOT.(jar|pom)$/), anything()).
      and_return { fail URI::NotFoundError }
    URI.should_receive(:download).once.with(uri(/2.1-SNAPSHOT\/maven-metadata.xml$/), duck_type(:write)).
      and_return { |uri, target, options| target.write(metadata) }
    lambda {
      lambda { artifact('com.example:library:jar:2.1-SNAPSHOT').invoke }.should raise_error(RuntimeError, /Failed to download/)
    }.should show_error "No build number provided for the snapshot com.example:library:jar:2.1-SNAPSHOT"
    File.exist?(File.join(repositories.local, 'com/example/library/2.1-SNAPSHOT/library-2.1-SNAPSHOT.jar')).should be_false
  end

  it 'should handle missing maven metadata by reporting the artifact unavailable' do
    repositories.remote = 'http://buildr.apache.org/repository/noexist'
    URI.should_receive(:download).with(uri(/2.1-SNAPSHOT\/library-2.1-SNAPSHOT.jar$/), anything()).
      and_return { fail URI::NotFoundError }
    URI.should_receive(:download).with(uri(/2.1-SNAPSHOT\/maven-metadata.xml$/), duck_type(:write)).
      and_return { fail URI::NotFoundError }
    lambda { artifact('com.example:library:jar:2.1-SNAPSHOT').invoke }.should raise_error(RuntimeError, /Failed to download/)
    File.exist?(File.join(repositories.local, 'com/example/library/2.1-SNAPSHOT/library-2.1-SNAPSHOT.jar')).should be_false
  end

  it 'should handle missing m2 snapshots by reporting the artifact unavailable' do
    metadata = <<-XML
    <?xml version='1.0' encoding='UTF-8'?>
    <metadata>
      <groupId>com.example</groupId>
      <artifactId>library</artifactId>
      <version>2.1-SNAPSHOT</version>
      <versioning>
        <snapshot>
          <timestamp>20071012.190008</timestamp>
          <buildNumber>8</buildNumber>
        </snapshot>
        <lastUpdated>20071012190008</lastUpdated>
      </versioning>
    </metadata>
    XML
    repositories.remote = 'http://buildr.apache.org/repository/noexist'
    URI.should_receive(:download).with(uri(/2.1-SNAPSHOT\/library-2.1-SNAPSHOT.jar$/), anything()).
      and_return { fail URI::NotFoundError }
    URI.should_receive(:download).with(uri(/2.1-SNAPSHOT\/maven-metadata.xml$/), duck_type(:write)).
      and_return { |uri, target, options| target.write(metadata) }
    URI.should_receive(:download).with(uri(/2.1-SNAPSHOT\/library-2.1-20071012.190008-8.jar$/), anything()).
      and_return { fail URI::NotFoundError }
    lambda { artifact('com.example:library:jar:2.1-SNAPSHOT').invoke }.should raise_error(RuntimeError, /Failed to download/)
    File.exist?(File.join(repositories.local, 'com/example/library/2.1-SNAPSHOT/library-2.1-SNAPSHOT.jar')).should be_false
  end

  it 'should load with all repositories specified in settings file' do
    write 'home/.buildr/settings.yaml', <<-YAML
    repositories:
      remote:
      - http://buildr.apache.org/repository/noexist
      - http://example.org
    YAML
    repositories.remote.should include('http://buildr.apache.org/repository/noexist', 'http://example.org')
  end

  it 'should load with all repositories specified in build.yaml file' do
    write 'build.yaml', <<-YAML
    repositories:
      remote:
      - http://buildr.apache.org/repository/noexist
      - http://example.org
    YAML
    repositories.remote.should include('http://buildr.apache.org/repository/noexist', 'http://example.org')
  end

  it 'should load with all repositories specified in settings and build.yaml files' do
    write 'home/.buildr/settings.yaml', <<-YAML
    repositories:
      remote:
      - http://buildr.apache.org/repository/noexist
    YAML
    write 'build.yaml', <<-YAML
    repositories:
      remote:
      - http://example.org
    YAML
    repositories.remote.should include('http://buildr.apache.org/repository/noexist', 'http://example.org')
  end
end


describe Repositories, 'release_to' do
  it 'should accept URL as first argument' do
    repositories.release_to = 'http://buildr.apache.org/repository/noexist'
    repositories.release_to.should == { :url=>'http://buildr.apache.org/repository/noexist' }
  end

  it 'should accept hash with options' do
    repositories.release_to = { :url=>'http://buildr.apache.org/repository/noexist', :username=>'john' }
    repositories.release_to.should == { :url=>'http://buildr.apache.org/repository/noexist', :username=>'john' }
  end

  it 'should allow the hash to be manipulated' do
    repositories.release_to = 'http://buildr.apache.org/repository/noexist'
    repositories.release_to.should == { :url=>'http://buildr.apache.org/repository/noexist' }
    repositories.release_to[:username] = 'john'
    repositories.release_to.should == { :url=>'http://buildr.apache.org/repository/noexist', :username=>'john' }
  end

  it 'should load URL from settings file' do
    write 'home/.buildr/settings.yaml', <<-YAML
    repositories:
      release_to: http://john:secret@buildr.apache.org/repository/noexist
    YAML
    repositories.release_to.should == { :url=>'http://john:secret@buildr.apache.org/repository/noexist' }
  end

  it 'should load URL from build settings file' do
    write 'build.yaml', <<-YAML
    repositories:
      release_to: http://john:secret@buildr.apache.org/repository/noexist
    YAML
    repositories.release_to.should == { :url=>'http://john:secret@buildr.apache.org/repository/noexist' }
  end

  it 'should load URL, username and password from settings file' do
    write 'home/.buildr/settings.yaml', <<-YAML
    repositories:
      release_to:
        url: http://buildr.apache.org/repository/noexist
        username: john
        password: secret
    YAML
    repositories.release_to.should == { :url=>'http://buildr.apache.org/repository/noexist', :username=>'john', :password=>'secret' }
  end
end

describe Repositories, 'snapshot_to' do
  it 'should accept URL as first argument' do
    repositories.snapshot_to = 'http://buildr.apache.org/repository/noexist'
    repositories.snapshot_to.should == { :url=>'http://buildr.apache.org/repository/noexist' }
  end

  it 'should accept hash with options' do
    repositories.snapshot_to = { :url=>'http://buildr.apache.org/repository/noexist', :username=>'john' }
    repositories.snapshot_to.should == { :url=>'http://buildr.apache.org/repository/noexist', :username=>'john' }
  end

  it 'should allow the hash to be manipulated' do
    repositories.snapshot_to = 'http://buildr.apache.org/repository/noexist'
    repositories.snapshot_to.should == { :url=>'http://buildr.apache.org/repository/noexist' }
    repositories.snapshot_to[:username] = 'john'
    repositories.snapshot_to.should == { :url=>'http://buildr.apache.org/repository/noexist', :username=>'john' }
  end

  it 'should load URL from settings file' do
    write 'home/.buildr/settings.yaml', <<-YAML
    repositories:
      snapshot_to: http://john:secret@buildr.apache.org/repository/noexist
    YAML
    repositories.snapshot_to.should == { :url=>'http://john:secret@buildr.apache.org/repository/noexist' }
  end

  it 'should load URL from build settings file' do
    write 'build.yaml', <<-YAML
    repositories:
      snapshot_to: http://john:secret@buildr.apache.org/repository/noexist
    YAML
    repositories.snapshot_to.should == { :url=>'http://john:secret@buildr.apache.org/repository/noexist' }
  end

  it 'should load URL, username and password from settings file' do
    write 'home/.buildr/settings.yaml', <<-YAML
    repositories:
      snapshot_to:
        url: http://buildr.apache.org/repository/noexist
        username: john
        password: secret
    YAML
    repositories.snapshot_to.should == { :url=>'http://buildr.apache.org/repository/noexist', :username=>'john', :password=>'secret' }
  end
end

describe Buildr, '#artifact' do
  before do
    @spec = { :group=>'com.example', :id=>'library', :type=>'jar', :version=>'2.0' }
    @snapshot_spec = 'group:id:jar:1.0-SNAPSHOT'
    write @file = 'testartifact.jar'
  end

  it 'should accept hash specification' do
    artifact(:group=>'com.example', :id=>'library', :type=>'jar', :version=>'2.0').should respond_to(:invoke)
  end

  it 'should reject partial hash specifier' do
    lambda { artifact(@spec.merge(:group=>nil)) }.should raise_error
    lambda { artifact(@spec.merge(:id=>nil)) }.should raise_error
    lambda { artifact(@spec.merge(:version=>nil)) }.should raise_error
  end

  it 'should complain about invalid key' do
    lambda { artifact(@spec.merge(:error=>true)) }.should raise_error(ArgumentError, /no such option/i)
  end

  it 'should use JAR type by default' do
    artifact(@spec.merge(:type=>nil)).should respond_to(:invoke)
  end

  it 'should use JAR type if type is set to bundle' do
    artifact(@spec.merge(:type=>:bundle)).to_s.should match('\.jar$')
  end

  it 'should accept string specification' do
    artifact('com.example:library:jar:2.0').should respond_to(:invoke)
  end

  it 'should reject partial string specifier' do
    artifact('com.example:library::2.0')
    lambda { artifact('com.example:library:jar') }.should raise_error
    lambda { artifact('com.example:library:jar:') }.should raise_error
    lambda { artifact('com.example:library::2.0') }.should_not raise_error
    lambda { artifact('com.example::jar:2.0') }.should raise_error
    lambda { artifact(':library:jar:2.0') }.should raise_error
  end

  it 'should create a task naming the artifact in the local repository' do
    file = File.join(repositories.local, 'com', 'example', 'library', '2.0', 'library-2.0.jar')
    Rake::Task.task_defined?(file).should be_false
    artifact('com.example:library:jar:2.0').name.should eql(file)
  end

  it 'should use from method to install artifact from existing file' do
    write 'test.jar'
    artifact = artifact('group:id:jar:1.0').from('test.jar')
    lambda { artifact.invoke }.should change { File.exist?(artifact.to_s) }.to(true)
  end

  it 'should use from method to install artifact from a file task' do
    test_jar = file('test.jar')
    test_jar.enhance do
      #nothing...
    end
    write 'test.jar'
    artifact = artifact('group:id:jar:1.0').from(test_jar)
    lambda { artifact.invoke }.should change { File.exist?(artifact.to_s) }.to(true)
  end

  it 'should invoke the artifact associated file task if the file doesnt exist' do
    test_jar = file('test.jar')
    called = false
    test_jar.enhance do
      write 'test.jar'
      called = true
    end
    artifact = artifact('group:id:jar:1.0').from(test_jar)
    artifact.invoke
    unless called
      raise "The file task was not called."
    end
  end

  it 'should not invoke the artifact associated file task if the file already exists' do
    test_jar = file('test.jar')
    test_jar.enhance do
      raise 'the test.jar file is created again!'
    end
    write 'test.jar'
    artifact = artifact('group:id:jar:1.0').from(test_jar)
    artifact.invoke
  end

  it 'should reference artifacts defined on build.yaml by using ruby symbols' do
    write 'build.yaml', <<-YAML
      artifacts:
        j2ee: geronimo-spec:geronimo-spec-j2ee:jar:1.4-rc4
    YAML
    Buildr.application.send(:load_artifact_ns)
    artifact(:j2ee).to_s.pathmap('%f').should == 'geronimo-spec-j2ee-1.4-rc4.jar'
  end

  it 'should try to download snapshot artifact' do
    run_with_repo
    snapshot = artifact(@snapshot_spec)

    URI.should_receive(:download).at_least(:twice).and_return { |uri, target, options| write target }
    FileUtils.should_receive(:mv).at_least(:twice)
    snapshot.invoke
  end

  it 'should not try to update snapshot in offline mode if it exists' do
    run_with_repo
    snapshot = artifact(@snapshot_spec)
    write snapshot.to_s
    Buildr.application.options.work_offline = true
    URI.should_receive(:download).exactly(0).times
    snapshot.invoke
  end

  it 'should download snapshot even in offline mode if it doesn''t exist' do
    run_with_repo
    snapshot = artifact(@snapshot_spec)
    Buildr.application.options.work_offline = true
    URI.should_receive(:download).exactly(2).times
    snapshot.invoke
  end

  it 'should update snapshots if --update-snapshots' do
    run_with_repo
    snapshot = artifact(@snapshot_spec)
    write snapshot.to_s
    Buildr.application.options.update_snapshots = true

    URI.should_receive(:download).at_least(:twice).and_return { |uri, target, options| write target }
    FileUtils.should_receive(:mv).at_least(:twice)
    snapshot.invoke
  end

  it 'should update snapshot if it''s older than 24 hours' do
    run_with_repo
    snapshot = artifact(@snapshot_spec)
    write snapshot.to_s
    time = Time.at((Time.now - (60 * 60 * 24) - 10 ).to_i)
    File.utime(time, time, snapshot.to_s)
    URI.should_receive(:download).at_least(:once).and_return { |uri, target, options| write target }
    snapshot.invoke
  end

  def run_with_repo
    repositories.remote = 'http://buildr.apache.org/repository/noexist'
  end

end


describe Buildr, '#artifacts' do
  it 'should return a list of artifacts from all its arguments' do
    specs = [ 'saxon:saxon:jar:8.4', 'saxon:saxon-dom:jar:8.4', 'saxon:saxon-xpath:jar:8.4' ]
    artifacts(*specs).should eql(specs.map { |spec| artifact(spec) })
  end

  it 'should accept nested arrays' do
    specs = [ 'saxon:saxon:jar:8.4', 'saxon:saxon-dom:jar:8.4', 'saxon:saxon-xpath:jar:8.4' ]
    artifacts([[specs[0]]], [[specs[1]], specs[2]]).should eql(specs.map { |spec| artifact(spec) })
  end

  it 'should accept struct' do
    specs = struct(:main=>'saxon:saxon:jar:8.4', :dom=>'saxon:saxon-dom:jar:8.4', :xpath=>'saxon:saxon-xpath:jar:8.4')
    artifacts(specs).should eql(specs.values.map { |spec| artifact(spec) })
  end

  it 'should ignore duplicates' do
    artifacts('saxon:saxon:jar:8.4', 'saxon:saxon:jar:8.4').size.should be(1)
  end

  it 'should accept and return existing tasks' do
    artifacts(task('foo'), task('bar')).should eql([task('foo'), task('bar')])
  end

  it 'should accept filenames and expand them' do
    artifacts('test').map(&:to_s).should eql([File.expand_path('test')])
  end

  it 'should accept filenames and return filenames' do
    artifacts('c:test').first.should be_kind_of(String)
  end

  it 'should accept any object responding to :to_spec' do
    obj = Object.new
    class << obj
      def to_spec; "org.example:artifact:jar:1.1"; end
    end
    artifacts(obj).size.should be(1)
  end

  it 'should accept project and return all its packaging tasks' do
    define 'foobar', :group=>'group', :version=>'1.0' do
      package :jar, :id=>'code'
      package :war, :id=>'webapp'
    end
    foobar = project('foobar')
    artifacts(foobar).should eql([
      task(foobar.path_to('target/code-1.0.jar')),
      task(foobar.path_to('target/webapp-1.0.war'))
    ])
  end

  it 'should complain about an invalid specification' do
    lambda { artifacts(5) }.should raise_error
    lambda { artifacts('group:no:version:') }.should raise_error
  end
end


describe Buildr, '#group' do
  it 'should accept list of artifact identifiers' do
    list = group('saxon', 'saxon-dom', 'saxon-xpath', :under=>'saxon', :version=>'8.4')
    list.should include(artifact('saxon:saxon:jar:8.4'))
    list.should include(artifact('saxon:saxon-dom:jar:8.4'))
    list.should include(artifact('saxon:saxon-xpath:jar:8.4'))
    list.size.should be(3)
  end

  it 'should accept array with artifact identifiers' do
    list = group(%w{saxon saxon-dom saxon-xpath}, :under=>'saxon', :version=>'8.4')
    list.should include(artifact('saxon:saxon:jar:8.4'))
    list.should include(artifact('saxon:saxon-dom:jar:8.4'))
    list.should include(artifact('saxon:saxon-xpath:jar:8.4'))
    list.size.should be(3)
  end

  it 'should accept a type' do
    list = group('struts-bean', 'struts-html', :under=>'struts', :type=>'tld', :version=>'1.1')
    list.should include(artifact('struts:struts-bean:tld:1.1'))
    list.should include(artifact('struts:struts-html:tld:1.1'))
    list.size.should be(2)
  end

  it 'should accept a classifier' do
    list = group('camel-core', :under=>'org.apache.camel', :version=>'2.2.0', :classifier=>'spring3')
    list.should include(artifact('org.apache.camel:camel-core:jar:spring3:2.2.0'))
    list.size.should be(1)
  end

end

describe Buildr, '#install' do
  before do
    @spec = 'group:id:jar:1.0'
    write @file = 'test.jar'
    @snapshot_spec = 'group:id:jar:1.0-SNAPSHOT'
  end

  it 'should return the install task' do
    install.should be(task('install'))
  end

  it 'should accept artifacts to install' do
    install artifact(@spec)
    lambda { install @file }.should raise_error(ArgumentError)
  end

  it 'should install artifact when install task is run' do
    write @file
    install artifact(@spec).from(@file)
    lambda { install.invoke }.should change { File.exist?(artifact(@spec).to_s) }.to(true)
  end

  it 'should re-install artifact when "from" is newer' do
    install artifact(@spec).from(@file)
    write artifact(@spec).to_s # install a version of the artifact
    old_mtime = File.mtime(artifact(@spec).to_s)
    sleep 1; write @file       # make sure the "from" file has newer modification time
    lambda { install.invoke }.should change { modified?(old_mtime, @spec) }.to(true)
  end

  it 'should re-install snapshot artifact when "from" is newer' do
    install artifact(@snapshot_spec).from(@file)
    write artifact(@snapshot_spec).to_s # install a version of the artifact
    old_mtime = File.mtime(artifact(@snapshot_spec).to_s)
    sleep 1; write @file       # make sure the "from" file has newer modification time
    lambda { install.invoke }.should change { modified?(old_mtime, @snapshot_spec) }.to(true)
  end

  it 'should download snapshot to temporary location' do
    repositories.remote = 'http://buildr.apache.org/repository/noexist'
    snapshot = artifact(@snapshot_spec)
    same_time = Time.new
    download_file = "#{Dir.tmpdir}/#{File.basename(snapshot.name)}#{same_time.to_i}"

    Time.should_receive(:new).twice.and_return(same_time)
    URI.should_receive(:download).at_least(:twice).and_return { |uri, target, options| write target }
    FileUtils.should_receive(:mv).at_least(:twice)
    snapshot.invoke
  end

  it 'should install POM alongside artifact (if artifact has no classifier)' do
    pom = artifact(@spec).pom
    write @file
    install artifact(@spec).from(@file)
    lambda { install.invoke }.should change { File.exist?(repositories.locate(pom)) }.to(true)
  end

  it 'should not install POM alongside artifact if artifact has classifier' do
    @spec = 'group:id:jar:all:1.0'
    pom = artifact(@spec).pom
    write @file
    install artifact(@spec).from(@file)
    lambda { install.invoke }.should_not change { File.exist?(repositories.locate(pom)) }.to(true)
  end

  it 'should reinstall POM alongside artifact' do
    pom = artifact(@spec).pom
    write @file
    write repositories.locate(pom)
    sleep 1

    install artifact(@spec).from(@file)
    lambda { install.invoke }.should change { File.mtime(repositories.locate(pom)) }
  end
end


describe Buildr, '#upload' do
  before do
    @spec = 'group:id:jar:1.0'
    write @file = 'test.jar'
    repositories.release_to = 'sftp://buildr.apache.org/repository/noexist/base'
  end

  it 'should return the upload task' do
    upload.should be(task('upload'))
  end

  it 'should accept artifacts to upload' do
    upload artifact(@spec)
    lambda { upload @file }.should raise_error(ArgumentError)
  end

  it 'should upload artifact when upload task is run' do
    write @file
    upload artifact(@spec).from(@file)
    URI.should_receive(:upload).once.
      with(URI.parse('sftp://buildr.apache.org/repository/noexist/base/group/id/1.0/id-1.0.jar'), artifact(@spec).to_s, anything)
    URI.should_receive(:upload).once.
      with(URI.parse('sftp://buildr.apache.org/repository/noexist/base/group/id/1.0/id-1.0.pom'), artifact(@spec).pom.to_s, anything)
    upload.invoke
  end
end


describe ActsAsArtifact, '#upload' do
  
  it 'should be used to upload artifact' do
    artifact = artifact('com.example:library:jar:2.0')
    # Prevent artifact from downloading anything.
    write repositories.locate(artifact)
    write repositories.locate(artifact.pom)
    URI.should_receive(:upload).once.
      with(URI.parse('sftp://buildr.apache.org/repository/noexist/base/com/example/library/2.0/library-2.0.pom'), artifact.pom.to_s, anything)
    URI.should_receive(:upload).once.
      with(URI.parse('sftp://buildr.apache.org/repository/noexist/base/com/example/library/2.0/library-2.0.jar'), artifact.to_s, anything)
    verbose(false) { artifact.upload(:url=>'sftp://buildr.apache.org/repository/noexist/base') }
  end

  it 'should support artifact classifier and should not upload pom if artifact has classifier' do
    artifact = artifact('com.example:library:jar:all:2.0')
    # Prevent artifact from downloading anything.
    write repositories.locate(artifact)
    URI.should_receive(:upload).exactly(:once).
      with(URI.parse('sftp://buildr.apache.org/repository/noexist/base/com/example/library/2.0/library-2.0-all.jar'), artifact.to_s, anything)
    verbose(false) { artifact.upload(:url=>'sftp://buildr.apache.org/repository/noexist/base') }
  end

  it 'should complain without any repository configuration' do
    artifact = artifact('com.example:library:jar:2.0')
    # Prevent artifact from downloading anything.
    write repositories.locate(artifact)
    write repositories.locate(artifact.pom)
    lambda { artifact.upload }.should raise_error(Exception, /where to upload/)
  end
  
  it 'should upload SNAPSHOT with timestamped unique version and maven metadata' do
    artifact = artifact('com.example:library:jar:2.0-SNAPSHOT')
    # Prevent artifact from downloading anything.
    write repositories.locate(artifact)
    write repositories.locate(artifact.pom)

    time = Time.gm(2011,"mar",11,14,02,36,123)
    Time.stub(:now).and_return(time)

    URI.should_receive(:upload).once.
    with(URI.parse('sftp://example.com/base/com/example/library/2.0-SNAPSHOT/library-2.0-20110311.140236-1.pom'), artifact.pom.to_s, anything)
    URI.should_receive(:upload).once.
    with(URI.parse('sftp://example.com/base/com/example/library/2.0-SNAPSHOT/library-2.0-20110311.140236-1.jar'), artifact.to_s, anything)
    URI.should_receive(:write).once.
    with(URI.parse('sftp://example.com/base/com/example/library/2.0-SNAPSHOT/maven_metadata.xml'), anything, anything)
    verbose(false) { artifact.upload(:url=>'sftp://example.com/base') }
  end

  it 'should accept repositories.release_to setting' do
    artifact = artifact('com.example:library:jar:2.0')
    # Prevent artifact from downloading anything.
    write repositories.locate(artifact)
    write repositories.locate(artifact.pom)
    URI.should_receive(:upload).at_least(:once)
    repositories.release_to = 'sftp://buildr.apache.org/repository/noexist/base'
    artifact.upload
    lambda { artifact.upload }.should_not raise_error
  end

  it 'should use repositories.release_to setting even for snapshots when snapshot_to is not set' do
    time = Time.gm(2016,"nov",11,14,02,36,123)
    Time.stub(:now).and_return(time)
    artifact = artifact('com.example:library:jar:2.0-SNAPSHOT')
    # Prevent artifact from downloading anything.
    write repositories.locate(artifact)
    write repositories.locate(artifact.pom)
    URI.should_receive(:upload).once.
      with(URI.parse('sftp://buildr.apache.org/repository/noexist/base/com/example/library/2.0-SNAPSHOT/library-2.0-20161111.140236-1.pom'), artifact.pom.to_s, anything)
    URI.should_receive(:upload).once.
      with(URI.parse('sftp://buildr.apache.org/repository/noexist/base/com/example/library/2.0-SNAPSHOT/library-2.0-20161111.140236-1.jar'), artifact.to_s, anything)
    URI.should_receive(:write).once.
      with(URI.parse('sftp://buildr.apache.org/repository/noexist/base/com/example/library/2.0-SNAPSHOT/maven_metadata.xml'), anything, anything)
    repositories.release_to = 'sftp://buildr.apache.org/repository/noexist/base'
    artifact.upload
    lambda { artifact.upload }.should_not raise_error
  end

  it 'should use repositories.snapshot_to setting when snapshot_to is set' do
    time = Time.gm(2016,"nov",11,14,02,36,123)
    Time.stub(:now).and_return(time)
    artifact = artifact('com.example:library:jar:2.0-SNAPSHOT')
    # Prevent artifact from downloading anything.
    write repositories.locate(artifact)
    write repositories.locate(artifact.pom)
    URI.should_receive(:upload).once.
      with(URI.parse('sftp://buildr.apache.org/repository/noexist/snapshot/com/example/library/2.0-SNAPSHOT/library-2.0-20161111.140236-1.pom'), artifact.pom.to_s, anything)
    URI.should_receive(:upload).once.
      with(URI.parse('sftp://buildr.apache.org/repository/noexist/snapshot/com/example/library/2.0-SNAPSHOT/library-2.0-20161111.140236-1.jar'), artifact.to_s, anything)
      URI.should_receive(:write).once.
        with(URI.parse('sftp://buildr.apache.org/repository/noexist/snapshot/com/example/library/2.0-SNAPSHOT/maven_metadata.xml'), anything, anything)
    repositories.release_to = 'sftp://buildr.apache.org/repository/noexist/base'
    repositories.snapshot_to = 'sftp://buildr.apache.org/repository/noexist/snapshot'
    artifact.upload
    lambda { artifact.upload }.should_not raise_error
  end

  it 'should complain when only a snapshot repo is set but the artifact is not a snapshot' do
    artifact = artifact('com.example:library:jar:2.0')
    # Prevent artifact from downloading anything.
    write repositories.locate(artifact)
    write repositories.locate(artifact.pom)
    repositories.snapshot_to = 'sftp://buildr.apache.org/repository/noexist/snapshot'
    lambda { artifact.upload }.should raise_error(Exception, /where to upload/)
  end
end


describe Rake::Task, ' artifacts' do
  before do
    Buildr.repositories.instance_eval do
      @local = @remote = @release_to = nil
    end
  end

  it 'should download all specified artifacts' do
    artifact 'group:id:jar:1.0'
    repositories.remote = 'http://buildr.apache.org/repository/noexist'
    URI.should_receive(:download).twice.and_return { |uri, target, options| write target }
    task('artifacts').invoke
  end

  it 'should fail if failed to download an artifact' do
    artifact 'group:id:jar:1.0'
    lambda { task('artifacts').invoke }.should raise_error(RuntimeError, /No remote repositories/)
  end

  it 'should succeed if artifact already exists' do
    write repositories.locate(artifact('group:id:jar:1.0'))
    suppress_stdout do
      lambda { task('artifacts').invoke }.should_not raise_error
    end
  end
end


describe Rake::Task, ' artifacts:sources' do

  before do
    Buildr.repositories.instance_eval do
      @local = @remote = @release_to = nil
    end
    task('artifacts:sources').clear
    repositories.remote = 'http://buildr.apache.org/repository/noexist'
  end

  it 'should download sources for all specified artifacts' do
    artifact 'group:id:jar:1.0'
    URI.stub(:download).and_return { |uri, target| write target }
    lambda { task('artifacts:sources').invoke }.should change { File.exist?('home/.m2/repository/group/id/1.0/id-1.0-sources.jar') }.to(true)
  end

  it "should not try to download sources for the project's artifacts" do
    define('foo', :version=>'1.0') { package(:jar) }
    URI.should_not_receive(:download)
    task('artifacts:sources').invoke
  end

  describe 'when the source artifact does not exist' do

    before do
      artifact 'group:id:jar:1.0'
      URI.should_receive(:download).and_raise(URI::NotFoundError)
    end

    it 'should not fail' do
      lambda { task('artifacts:sources').invoke }.should_not raise_error
    end

    it 'should inform the user' do
      lambda { task('artifacts:sources').invoke }.should show_info('Failed to download group:id:jar:sources:1.0. Skipping it.')
    end
  end
end

describe Rake::Task, ' artifacts:javadoc' do

  before do
    Buildr.repositories.instance_eval do
      @local = @remote = @release_to = nil
    end
    task('artifacts:javadoc').clear
    repositories.remote = 'http://buildr.apache.org/repository/noexist'
  end

  it 'should download javadoc for all specified artifacts' do
    artifact 'group:id:jar:1.0'
    URI.should_receive(:download).and_return { |uri, target| write target }
    lambda { task('artifacts:javadoc').invoke }.should change { File.exist?('home/.m2/repository/group/id/1.0/id-1.0-javadoc.jar') }.to(true)
  end

  it "should not try to download javadoc for the project's artifacts" do
    define('foo', :version=>'1.0') { package(:jar) }
    URI.should_not_receive(:download)
    task('artifacts:javadoc').invoke
  end

  describe 'when the javadoc artifact does not exist' do

    before do
      artifact 'group:id:jar:1.0'
      URI.should_receive(:download).and_raise(URI::NotFoundError)
    end

    it 'should not fail' do
      lambda { task('artifacts:javadoc').invoke }.should_not raise_error
    end

    it 'should inform the user' do
      lambda { task('artifacts:javadoc').invoke }.should show_info('Failed to download group:id:jar:javadoc:1.0. Skipping it.')
    end
  end
end

describe Buildr, '#transitive' do
  before do
    repositories.remote = 'http://buildr.apache.org/repository/noexist'
    @simple = [ 'saxon:saxon:jar:8.4', 'saxon:saxon-dom:jar:8.4', 'saxon:saxon-xpath:jar:8.4' ]
    @simple.map { |spec| artifact(spec).pom }.each { |task| write task.name, task.pom_xml.call }
    @provided = @simple.first
    @complex = 'group:app:jar:1.0'
    write artifact(@complex).pom.to_s, <<-XML
<project>
  <artifactId>app</artifactId>
  <groupId>group</groupId>
  <dependencies>
    <dependency>
      <artifactId>saxon</artifactId>
      <groupId>saxon</groupId>
      <version>8.4</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <artifactId>saxon-dom</artifactId>
      <groupId>saxon</groupId>
      <version>8.4</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <artifactId>saxon-xpath</artifactId>
      <groupId>saxon</groupId>
      <version>8.4</version>
    </dependency>
    <dependency>
      <artifactId>saxon-nosuch</artifactId>
      <groupId>saxon</groupId>
      <version>8.4</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <artifactId>jlib-optional</artifactId>
      <groupId>jlib</groupId>
      <version>1.4</version>
      <scope>runtime</scope>
      <optional>true</optional>
    </dependency>
  </dependencies>
</project>
XML
    @transitive = 'master:app:war:1.0'
    write artifact(@transitive).pom.to_s, <<-XML
<project>
  <artifactId>app</artifactId>
  <groupId>group</groupId>
  <dependencies>
    <dependency>
      <artifactId>app</artifactId>
      <groupId>group</groupId>
      <version>1.0</version>
    </dependency>
  </dependencies>
</project>
XML
  end

  it 'should return a list of artifacts from all its arguments' do
    specs = [ 'saxon:saxon:jar:8.4', 'saxon:saxon-dom:jar:8.4', 'saxon:saxon-xpath:jar:8.4' ]
    transitive(*specs).should eql(specs.map { |spec| artifact(spec) })
  end

  it 'should accept nested arrays' do
    specs = [ 'saxon:saxon:jar:8.4', 'saxon:saxon-dom:jar:8.4', 'saxon:saxon-xpath:jar:8.4' ]
    transitive([[specs[0]]], [[specs[1]], specs[2]]).should eql(specs.map { |spec| artifact(spec) })
  end

  it 'should accept struct' do
    specs = struct(:main=>'saxon:saxon:jar:8.4', :dom=>'saxon:saxon-dom:jar:8.4', :xpath=>'saxon:saxon-xpath:jar:8.4')
    transitive(specs).should eql(specs.values.map { |spec| artifact(spec) })
  end

  it 'should ignore duplicates' do
    transitive('saxon:saxon:jar:8.4', 'saxon:saxon:jar:8.4').size.should be(1)
  end

  it 'should accept and return existing tasks' do
    transitive(task('foo'), task('bar')).should eql([task('foo'), task('bar')])
  end

  it 'should accept filenames and expand them' do
    transitive('test').map(&:to_s).should eql([File.expand_path('test')])
  end

  it 'should accept filenames and return file task' do
    transitive('c:test').first.should be_kind_of(Rake::FileTask)
  end

  it 'should accept project and return all its packaging tasks' do
    define 'foobar', :group=>'group', :version=>'1.0' do
      package :jar, :id=>'code'
      package :war, :id=>'webapp'
    end
    foobar = project('foobar')
    transitive(foobar).should eql([
      task(foobar.path_to('target/code-1.0.jar')),
      task(foobar.path_to('target/webapp-1.0.war'))
    ])
  end

  it 'should complain about an invalid specification' do
    lambda { transitive(5) }.should raise_error
    lambda { transitive('group:no:version:') }.should raise_error
  end

  it 'should bring artifact and its dependencies' do
    transitive(@complex).should eql(artifacts(@complex, @simple - [@provided]))
  end

  it 'should bring dependencies of POM without artifact itself' do
    transitive(@complex.sub(/jar/, 'pom')).should eql(artifacts(@simple - [@provided]))
  end

  it 'should bring artifact and transitive depenencies' do
    transitive(@transitive).should eql(artifacts(@transitive, @complex, @simple - [@provided]))
  end

  it 'should filter dependencies based on :scopes argument' do
    specs = [@complex, 'saxon:saxon-dom:jar:8.4']
    transitive(@complex, :scopes => [:runtime]).should eql(specs.map { |spec| artifact(spec) })
  end

  it 'should filter dependencies based on :optional argument' do
    specs = [@complex, 'saxon:saxon-dom:jar:8.4', 'jlib:jlib-optional:jar:1.4']
    transitive(@complex, :scopes => [:runtime], :optional => true).should eql(specs.map { |spec| artifact(spec) })
  end
end

def modified?(old_mtime, spec)
  File.exist?(artifact(spec).to_s) && old_mtime < File.mtime(artifact(spec).to_s)
end
