| 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 |