require File.expand_path('../../../spec_helper', __FILE__)

module Pod
  describe Command::Update do
    it 'tells the user that no Podfile was found in the project dir' do
      exception = lambda { run_command('update', '--no-repo-update') }.should.raise Informative
      exception.message.should.include "No `Podfile' found in the project directory."
    end

    describe 'with Podfile' do
      extend SpecHelper::TemporaryRepos

      before do
        file = temporary_directory + 'Podfile'
        File.open(file, 'w') do |f|
          f.puts('platform :ios')
          f.puts('pod "BananaLib", "1.0"')
        end
      end

      def generate_lockfile
        podfile = Podfile.new do
          platform :ios
          pod 'BananaLib', '1.0'
        end
        specs = [
          Specification.new do |s|
            s.name = 'BananaLib'
            s.version = '1.0'
          end,
        ]
        external_sources = {}
        Lockfile.generate(podfile, specs, external_sources).write_to_disk(temporary_directory + 'Podfile.lock')
      end

      describe 'updates of the spec repos' do
        before do
          Installer.any_instance.expects(:install!)
        end

        it 'updates the spec repos by default' do
          Installer.any_instance.expects(:repo_update=).with(true)
          run_command('update')
        end

        it "doesn't update the spec repos if that option was given" do
          Installer.any_instance.expects(:repo_update=).with(false)
          run_command('update', '--no-repo-update')
        end
      end

      describe 'installs the updates' do
        before do
          Installer.any_instance.expects(:install!)
        end

        describe 'all pods' do
          it 'updates all pods' do
            Installer.any_instance.expects(:update=).with(true)
            run_command('update')
          end
        end

        describe 'selected pods' do
          before do
            generate_lockfile
          end

          it 'updates selected pods' do
            Installer.any_instance.expects(:update=).with(:pods => ['BananaLib'])
            run_command('update', 'BananaLib')
          end
        end

        describe 'selected repo' do
          before do
            generate_lockfile
            set_up_test_repo
            config.repos_dir = SpecHelper.tmp_repos_path

            spec1 = (fixture('spec-repos') + 'test_repo/JSONKit/1.4/JSONKit.podspec').read
            spec2 = (fixture('spec-repos') + 'test_repo/BananaLib/1.0/BananaLib.podspec').read

            File.open(temporary_directory + 'JSONKit.podspec', 'w') { |f| f.write(spec1) }
            File.open(temporary_directory + 'BananaLib.podspec', 'w') { |f| f.write(spec2) }
          end

          it 'updates pods in repo and in lockfile' do
            Installer.any_instance.expects(:update=).with(:pods => ['BananaLib'])
            run_command('update', '--sources=master')
          end
        end
      end

      it 'tells the user that no Lockfile was found in the project dir' do
        exception = lambda { run_command('update', 'BananaLib', '--no-repo-update') }.should.raise Informative
        exception.message.should.include "No `Podfile.lock' found in the project directory"
      end

      describe 'tells the user that the Pods cannot be updated unless they are installed' do
        before do
          generate_lockfile
        end

        it 'for a single missing Pod' do
          should.raise Informative do
            run_command('update', 'Reachability', '--no-repo-update')
          end.message.should.include 'The `Reachability` Pod is not ' \
            'installed and cannot be updated'
        end

        it 'for multiple missing Pods' do
          exception = lambda { run_command('update', 'Reachability', 'BananaLib2', '--no-repo-update') }.should.raise Informative
          exception.message.should.include 'Pods `Reachability`, `BananaLib2` are not installed and cannot be updated'
        end
      end
    end
  end
end
