describe "download strategies", :cask do let(:url) { "http://example.com/cask.dmg" } let(:url_options) { {} } let(:cask) { instance_double(Hbc::Cask, token: "some-cask", url: Hbc::URL.new(url, url_options), version: "1.2.3.4") } describe Hbc::CurlDownloadStrategy do let(:downloader) { Hbc::CurlDownloadStrategy.new(cask) } before do allow(downloader.temporary_path).to receive(:rename) end it "properly assigns a name and uri based on the Cask" do expect(downloader.name).to eq("some-cask") expect(downloader.url).to eq("http://example.com/cask.dmg") expect(downloader.version.to_s).to eq("1.2.3.4") end it "calls curl with default arguments for a simple Cask" do allow(downloader).to receive(:curl) downloader.fetch expect(downloader).to have_received(:curl).with( cask.url.to_s, "-C", 0, "-o", kind_of(Pathname) ) end context "with an explicit user agent" do let(:url_options) { { user_agent: "Mozilla/25.0.1" } } it "adds the appropriate curl args" do curl_args = [] allow(downloader).to receive(:curl) { |*args| curl_args = args } downloader.fetch expect(curl_args.each_cons(2)).to include(["-A", "Mozilla/25.0.1"]) end end context "with a generalized fake user agent" do let(:url_options) { { user_agent: :fake } } it "adds the appropriate curl args" do curl_args = [] allow(downloader).to receive(:curl) { |*args| curl_args = args } downloader.fetch expect(curl_args.each_cons(2)).to include(["-A", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10) https://caskroom.github.io"]) end end context "with cookies set" do let(:url_options) { { cookies: { coo: "kie", mon: "ster", }, } } it "adds curl args for cookies" do curl_args = [] allow(downloader).to receive(:curl) { |*args| curl_args = args } downloader.fetch expect(curl_args.each_cons(2)).to include(["-b", "coo=kie;mon=ster"]) end end context "with referer set" do let(:url_options) { { referer: "http://somehost/also" } } it "adds curl args for referer" do curl_args = [] allow(downloader).to receive(:curl) { |*args| curl_args = args } downloader.fetch expect(curl_args.each_cons(2)).to include(["-e", "http://somehost/also"]) end end end describe Hbc::CurlPostDownloadStrategy do let(:downloader) { Hbc::CurlPostDownloadStrategy.new(cask) } before do allow(downloader.temporary_path).to receive(:rename) end context "with :using and :data specified" do let(:url_options) { { using: :post, data: { form: "data", is: "good", }, } } it "adds curl args for post arguments" do curl_args = [] allow(downloader).to receive(:curl) { |*args| curl_args = args } downloader.fetch expect(curl_args.each_cons(2)).to include(["-d", "form=data"]) expect(curl_args.each_cons(2)).to include(["-d", "is=good"]) end end context "with :using but no :data" do let(:url_options) { { using: :post } } it "adds curl args for a POST request" do curl_args = [] allow(downloader).to receive(:curl) { |*args| curl_args = args } downloader.fetch expect(curl_args.each_cons(2)).to include(["-X", "POST"]) end end end describe Hbc::SubversionDownloadStrategy do let(:url_options) { { using: :svn } } let(:fake_system_command) { class_double(Hbc::SystemCommand) } let(:downloader) { Hbc::SubversionDownloadStrategy.new(cask, command: fake_system_command) } before do allow(fake_system_command).to receive(:run!) end it "returns a tarball path on fetch" do allow(downloader).to receive(:compress) allow(downloader).to receive(:fetch_repo) expect(downloader.fetch).to equal(downloader.cached_location) end it "calls fetch_repo with default arguments for a simple Cask" do allow(downloader).to receive(:compress) allow(downloader).to receive(:fetch_repo) downloader.fetch expect(downloader).to have_received(:fetch_repo).with( downloader.cached_location, cask.url.to_s, ) end it "calls svn with default arguments for a simple Cask" do allow(downloader).to receive(:compress) downloader.fetch expect(fake_system_command).to have_received(:run!).with( "/usr/bin/svn", hash_including(args: [ "checkout", "--force", "--config-option", "config:miscellany:use-commit-times=yes", cask.url.to_s, downloader.cached_location, ]), ) end context "with trust_cert set on the URL" do let(:url_options) { { using: :svn, trust_cert: true, } } it "adds svn arguments for :trust_cert" do allow(downloader).to receive(:compress) downloader.fetch expect(fake_system_command).to have_received(:run!).with( "/usr/bin/svn", hash_including(args: [ "checkout", "--force", "--config-option", "config:miscellany:use-commit-times=yes", "--trust-server-cert", "--non-interactive", cask.url.to_s, downloader.cached_location, ]), ) end end context "with :revision set on url" do let(:url_options) { { using: :svn, revision: "10", } } it "adds svn arguments for :revision" do allow(downloader).to receive(:compress) downloader.fetch expect(fake_system_command).to have_received(:run!).with( "/usr/bin/svn", hash_including(args: [ "checkout", "--force", "--config-option", "config:miscellany:use-commit-times=yes", cask.url.to_s, downloader.cached_location, "-r", "10", ]), ) end end end end