diff --git a/Library/Homebrew/test/cask/cask_spec.rb b/Library/Homebrew/test/cask/cask_spec.rb index 6927a656ca..eb90f5090c 100644 --- a/Library/Homebrew/test/cask/cask_spec.rb +++ b/Library/Homebrew/test/cask/cask_spec.rb @@ -41,6 +41,12 @@ describe Cask::Cask, :cask do expect(c.token).to eq("local-caffeine") end + it "returns an instance of the Cask from a JSON file" do + c = Cask::CaskLoader.load("#{tap_path}/caffeine.json") + expect(c).to be_a(described_class) + expect(c.token).to eq("caffeine") + end + it "returns an instance of the Cask from a URL" do c = Cask::CaskLoader.load("file://#{tap_path}/Casks/local-caffeine.rb") expect(c).to be_a(described_class) @@ -49,9 +55,7 @@ describe Cask::Cask, :cask do it "raises an error when failing to download a Cask from a URL" do expect { - url = "file://#{tap_path}/Casks/notacask.rb" - - Cask::CaskLoader.load(url) + Cask::CaskLoader.load("file://#{tap_path}/Casks/notacask.rb") }.to raise_error(Cask::CaskUnavailableError) end @@ -212,6 +216,33 @@ describe Cask::Cask, :cask do end end + describe "#to_h" do + let(:json_file) { "#{TEST_FIXTURE_DIR}/cask/everything.json" } + let(:expected_json) { File.read(json_file).strip } + + context "when loaded from cask file" do + it "returns expected hash" do + hash = Cask::CaskLoader.load("everything").to_h + + expect(hash).to be_a(Hash) + expect(JSON.pretty_generate(hash)).to eq(expected_json) + end + end + + context "when loaded from json file" do + it "returns expected hash" do + expect(Homebrew::API::Cask).not_to receive(:fetch_source) + hash = Cask::CaskLoader::FromAPILoader + .new("everything", from_json: JSON.parse(expected_json)) + .load(config: nil) + .to_h + + expect(hash).to be_a(Hash) + expect(JSON.pretty_generate(hash)).to eq(expected_json) + end + end + end + describe "#to_hash_with_variations" do let!(:original_macos_version) { MacOS.full_version.to_s } let(:expected_versions_variations) { diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/everything.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/everything.rb new file mode 100644 index 0000000000..b253c3d787 --- /dev/null +++ b/Library/Homebrew/test/support/fixtures/cask/Casks/everything.rb @@ -0,0 +1,48 @@ +# Used to test cask hash generation. +cask "everything" do + version "1.2.3" + + language "en", default: true do + sha256 "c64c05bdc0be845505d6e55e69e696a7f50d40846e76155f0c85d5ff5e7bbb84" + "en-US" + end + language "eo" do + sha256 "e8ffa07370a7fb7e1696b04c269e01d3459725965a32facdd54629a95d148908" + "eo" + end + + url "https://cachefly.everything.app/releases/Everything_#{version}.zip", + user_agent: :fake, + cookies: { "ALL" => "1234" } + name "Everything" + desc "Little bit of everything" + homepage "https://www.everything.app/" + + auto_updates true + conflicts_with formula: "nothing" + depends_on cask: "something" + container type: :naked + + app "Everything.app" + installer script: { + executable: "~/just/another/path/install.sh", + args: ["--mode=silent"], + sudo: true, + print_stderr: false, + } + + uninstall launchctl: "com.every.thing.agent", + delete: ["/Library/EverythingHelperTools"], + kext: "com.every.thing.driver", + signal: [ + ["TERM", "com.every.thing.controller#{version.major}"], + ["TERM", "com.every.thing.bin"], + ] + + zap trash: [ + "~/.everything", + "~/Library/Everything", + ] + + caveats "Installing everything might take a while..." +end diff --git a/Library/Homebrew/test/support/fixtures/cask/caffeine.json b/Library/Homebrew/test/support/fixtures/cask/caffeine.json new file mode 100644 index 0000000000..0907739b63 --- /dev/null +++ b/Library/Homebrew/test/support/fixtures/cask/caffeine.json @@ -0,0 +1,42 @@ +{ + "token": "caffeine", + "full_token": "caffeine", + "tap": null, + "name": [ + + ], + "desc": null, + "homepage": "https://brew.sh/", + "url": "https://www.example.com/cask/caffeine.zip", + "appcast": null, + "version": "1.2.3", + "versions": { + }, + "installed": null, + "outdated": false, + "sha256": "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94", + "artifacts": [ + { + "app": [ + "Caffeine.app" + ] + }, + { + "zap": [ + { + "trash": "/$HOME/support/fixtures/cask/caffeine/org.example.caffeine.plist" + } + ] + } + ], + "caveats": null, + "depends_on": { + }, + "conflicts_with": null, + "container": null, + "auto_updates": null, + "tap_git_head": null, + "languages": [ + + ] +} diff --git a/Library/Homebrew/test/support/fixtures/cask/everything.json b/Library/Homebrew/test/support/fixtures/cask/everything.json new file mode 100644 index 0000000000..9ac6b3d522 --- /dev/null +++ b/Library/Homebrew/test/support/fixtures/cask/everything.json @@ -0,0 +1,99 @@ +{ + "token": "everything", + "full_token": "everything", + "tap": "homebrew/cask", + "name": [ + "Everything" + ], + "desc": "Little bit of everything", + "homepage": "https://www.everything.app/", + "url": "https://cachefly.everything.app/releases/Everything_1.2.3.zip", + "url_specs": { + "cookies": { + "ALL": "1234" + }, + "user_agent": ":fake" + }, + "appcast": null, + "version": "1.2.3", + "versions": { + }, + "installed": null, + "outdated": false, + "sha256": "c64c05bdc0be845505d6e55e69e696a7f50d40846e76155f0c85d5ff5e7bbb84", + "artifacts": [ + { + "uninstall": [ + { + "launchctl": "com.every.thing.agent", + "delete": [ + "/Library/EverythingHelperTools" + ], + "kext": "com.every.thing.driver", + "signal": [ + [ + "TERM", + "com.every.thing.controller1" + ], + [ + "TERM", + "com.every.thing.bin" + ] + ] + } + ] + }, + { + "installer": [ + { + "script": { + "executable": "~/just/another/path/install.sh", + "args": [ + "--mode=silent" + ], + "sudo": true, + "print_stderr": false + } + } + ] + }, + { + "app": [ + "Everything.app" + ] + }, + { + "zap": [ + { + "trash": [ + "~/.everything", + "~/Library/Everything" + ] + } + ] + } + ], + "caveats": "Installing everything might take a while...\n\neverything requires a kernel extension to work.\nIf the installation fails, retry after you enable it in:\n System Preferences → Security & Privacy → General\n\nFor more information, refer to vendor documentation or this Apple Technical Note:\n https://developer.apple.com/library/content/technotes/tn2459/_index.html\n", + "depends_on": { + "cask": [ + "something" + ] + }, + "conflicts_with": { + "formula": [ + "nothing" + ] + }, + "container": { + "type": "naked" + }, + "auto_updates": true, + "tap_git_head": null, + "languages": [ + "en", + "eo" + ], + "ruby_source_checksum": { + "sha256": "b2707d1952f02c3fa566b7ad2a707a847a959d36f51d3dee642dbe5deec12f27" + } +}