blob: 855f162f73f9e5f63f4f68cde4207c2727b920d1 [file] [log] [blame]
require File.expand_path('../../../spec_helper', __FILE__)
module Pod
describe Downloader::Cache do
before do
@cache = Downloader::Cache.new(Dir.mktmpdir)
@spec = fixture_spec('banana-lib/BananaLib.podspec')
@spec.source = { :git => SpecHelper.fixture('banana-lib') }
@request = Downloader::Request.new(:spec => @spec, :released => true)
@unreleased_request = Downloader::Request.new(:name => 'BananaLib', :params => @spec.source)
@stub_download = lambda do |&blk|
original_download_source = Downloader.method(:download_source)
Downloader.define_singleton_method(:download_source) do |target, _params|
FileUtils.mkdir_p target
Dir.chdir(target) do
result = blk.call
Downloader.define_singleton_method(:download_source, original_download_source)
result
end
end
end
end
after do
@cache.root.rmtree if @cache.root.directory?
end
it 'returns the root' do
@cache.root.should.be.directory?
end
it 'implodes when the cache is from a different CocoaPods version' do
root = Pathname(Dir.mktmpdir)
root.+('VERSION').open('w') { |f| f << '0.0.0' }
root.+('FILE').open('w') { |f| f << '0.0.0' }
@cache = Downloader::Cache.new(root)
root.+('VERSION').read.should == Pod::VERSION
root.+('FILE').should.not.exist?
end
it 'groups subspecs by platform' do
@spec = Specification.new do |s|
s.ios.deployment_target = '6.0'
s.osx.deployment_target = '10.7'
s.subspec 'subspec' do |ss|
ss.ios.deployment_target = '8.0'
end
end
@cache.send(:group_subspecs_by_platform, @spec).should == {
Platform.new(:ios, '8.0') => [@spec.subspecs.first],
Platform.new(:ios, '6.0') => [@spec],
Platform.new(:osx, '10.7') => [@spec],
}
end
describe 'when the download is not cached' do
describe 'when downloading a released pod' do
it 'downloads the source' do
Downloader::Git.any_instance.expects(:download)
Downloader::Git.any_instance.expects(:checkout_options).returns(@spec.source)
response = @cache.download_pod(@request)
response.should == Downloader::Response.new(@cache.root + @request.slug, @spec, @spec.source)
end
end
describe 'when downloading an un-released pod' do
before do
@stub_download.call do
File.open('BananaLib.podspec.json', 'w') { |f| f << @spec.to_pretty_json }
File.open('OrangeLib.podspec.json', 'w') { |f| f << @spec.to_pretty_json.sub(/"name": "BananaLib"/, '"name": "OrangeLib"') }
@spec.source
end
end
it 'downloads the source' do
@cache.expects(:copy_and_clean).twice
response = @cache.download_pod(@unreleased_request)
response.should == Downloader::Response.new(@cache.root + @unreleased_request.slug, @spec, @spec.source)
end
end
end
describe 'when the cache is incomplete' do
shared 'it falls back to download the pod' do
describe 'when downloading a released pod' do
it 'does download the source' do
Downloader::Git.any_instance.expects(:download).never
@cache.expects(:uncached_pod).once
@cache.download_pod(@request)
end
end
describe 'when downloading an unreleased pod' do
it 'does download the source' do
Downloader::Git.any_instance.expects(:download).never
@cache.expects(:uncached_pod).once
@cache.download_pod(@unreleased_request)
end
it 'does not return a location when there is no spec with the request name' do
@stub_download.call do
@spec.name = 'OrangeLib'
File.open('BananaLib.podspec.json', 'w') { |f| f << @spec.to_pretty_json }
@spec.source
end
result = @cache.download_pod(@unreleased_request)
result.location.should.be.nil
result.spec.should.be.nil
end
end
end
before do
[@request, @unreleased_request].each do |request|
path_for_pod = @cache.send(:path_for_pod, request)
path_for_pod.mkpath
Dir.chdir(path_for_pod) do
FileUtils.mkdir_p 'Classes'
File.open('Classes/a.m', 'w') {}
end
end
end
describe 'because the spec is missing' do
behaves_like 'it falls back to download the pod'
end
describe 'because the spec is invalid' do
before do
[@request, @unreleased_request].each do |request|
path_for_spec = @cache.send(:path_for_spec, request)
path_for_spec.dirname.mkpath
path_for_spec.open('w') { |f| f << '{' }
end
end
behaves_like 'it falls back to download the pod'
end
end
describe 'when the download is cached' do
before do
[@request, @unreleased_request].each do |request|
path_for_spec = @cache.send(:path_for_spec, request)
path_for_spec.dirname.mkpath
path_for_spec.open('w') { |f| f << @spec.to_pretty_json }
path_for_pod = @cache.send(:path_for_pod, request)
path_for_pod.mkpath
Dir.chdir(path_for_pod) do
FileUtils.mkdir_p 'Classes'
File.open('Classes/a.m', 'w') {}
end
end
end
describe 'when downloading a released pod' do
it 'does not download the source' do
Downloader::Git.any_instance.expects(:download).never
@cache.expects(:uncached_pod).never
response = @cache.download_pod(@request)
response.should == Downloader::Response.new(@cache.root + @request.slug, @spec, @spec.source)
end
end
describe 'when downloading an unreleased pod' do
it 'does not download the source' do
Downloader::Git.any_instance.expects(:download).never
@cache.expects(:uncached_pod).never
response = @cache.download_pod(@unreleased_request)
response.should == Downloader::Response.new(@cache.root + @unreleased_request.slug, @spec, @spec.source)
end
end
end
end
end