# 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'
    write artifact('org.sonatype.oss:oss-parent:pom:8').pom.to_s, <<-XML
<project>
  <artifactId>oss-parent</artifactId>
  <groupId>org.sonatype.oss</groupId>
  <version>8</version>
</project>
XML

    @simple = %w(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
