require 'spec_helper'
require 'image_optim/worker/optipng'
require 'image_optim/path'

describe ImageOptim::Worker::Optipng do
  describe 'strip option' do
    subject{ described_class.new(ImageOptim.new, options) }

    let(:options){ {} }
    let(:optipng_version){ '0.7' }
    let(:src){ instance_double(ImageOptim::Path, :copy => nil) }
    let(:dst){ instance_double(ImageOptim::Path) }

    before do
      optipng_bin = instance_double(ImageOptim::BinResolver::Bin)
      allow(subject).to receive(:resolve_bin!).
        with(:optipng).and_return(optipng_bin)
      allow(optipng_bin).to receive(:version).
        and_return(ImageOptim::BinResolver::SimpleVersion.new(optipng_version))

      allow(subject).to receive(:optimized?)
    end

    context 'by default' do
      it 'should add -strip all to arguments' do
        expect(subject).to receive(:execute) do |_bin, *args|
          expect(args.join(' ')).to match(/(^| )-strip all($| )/)
        end

        subject.optimize(src, dst)
      end
    end

    context 'when strip is disabled' do
      let(:options){ {:strip => false} }

      it 'should not add -strip all to arguments' do
        expect(subject).to receive(:execute) do |_bin, *args|
          expect(args.join(' ')).not_to match(/(^| )-strip all($| )/)
        end

        subject.optimize(src, dst)
      end
    end

    context 'when optipng version is < 0.7' do
      let(:optipng_version){ '0.6.999' }

      it 'should not add -strip all to arguments' do
        expect(subject).to receive(:execute) do |_bin, *args|
          expect(args.join(' ')).not_to match(/(^| )-strip all($| )/)
        end

        subject.optimize(src, dst)
      end
    end
  end

  describe '#optimized?' do
    let(:src){ instance_double(ImageOptim::Path, src_options) }
    let(:dst){ instance_double(ImageOptim::Path, dst_options) }
    let(:src_options){ {:size => 10} }
    let(:dst_options){ {:size? => 9} }
    let(:instance){ described_class.new(ImageOptim.new, instance_options) }
    let(:instance_options){ {} }

    subject{ instance.optimized?(src, dst) }

    context 'when interlace option is enabled' do
      let(:instance_options){ {:interlace => true} }

      context 'when dst is empty' do
        let(:dst_options){ {:size? => nil} }
        it{ is_expected.to be_falsy }
      end

      context 'when dst is not empty' do
        let(:dst_options){ {:size? => 20} }
        it{ is_expected.to be_truthy }
      end
    end

    context 'when interlace option is disabled' do
      let(:instance_options){ {:interlace => false} }

      context 'when dst is empty' do
        let(:dst_options){ {:size? => nil} }
        it{ is_expected.to be_falsy }
      end

      context 'when dst is greater than or equal to src' do
        let(:dst_options){ {:size? => 10} }
        it{ is_expected.to be_falsy }
      end

      context 'when dst is less than src' do
        let(:dst_options){ {:size? => 9} }
        it{ is_expected.to be_truthy }
      end
    end
  end
end
