brew/Library/Homebrew/test/livecheck/strategy/electron_builder_spec.rb
Sam Ford 9e8900fb6e
Allow regex to be passed into all strategy blocks
This modifies cask-related livecheck strategies to allow passing a
regex into a `strategy` block, when appropriate. These strategies
were outliers that explicitly rejected a regex even if a `strategy`
block was used, forcing any regex to be inlined in the `strategy`
block (instead of being defined using `#regex`).

With these changes, all `strategy` blocks will be able to accept a
regex, further simplifying the mental model. This also helps to
better align the various `find_versions` and `versions_from_*`
methods across strategies.
2021-11-19 23:58:54 -05:00

93 lines
3.1 KiB
Ruby

# typed: false
# frozen_string_literal: true
require "livecheck/strategy"
describe Homebrew::Livecheck::Strategy::ElectronBuilder do
subject(:electron_builder) { described_class }
let(:yaml_url) { "https://www.example.com/example/latest-mac.yml" }
let(:non_yaml_url) { "https://brew.sh/test" }
let(:electron_builder_yaml) {
<<~EOS
version: 1.2.3
files:
- url: Example-1.2.3-mac.zip
sha512: MDXR0pxozBJjxxbtUQJOnhiaiiQkryLAwtcVjlnNiz30asm/PtSxlxWKFYN3kV/kl+jriInJrGypuzajTF6XIA==
size: 92031237
blockMapSize: 96080
- url: Example-1.2.3.dmg
sha512: k6WRDlZEfZGZHoOfUShpHxXZb5p44DRp+FAO2FXNx2kStZvyW9VuaoB7phPMfZpcMKrzfRfncpP8VEM8OB2y9g==
size: 94972630
path: Example-1.2.3-mac.zip
sha512: MDXR0pxozBJjxxbtUQJOnhiaiiQkryLAwtcVjlnNiz30asm/PtSxlxWKFYN3kV/kl+jriInJrGypuzajTF6XIA==
releaseDate: '2000-01-01T00:00:00.000Z'
EOS
}
let(:mac_regex) { /Example[._-]v?(\d+(?:\.\d+)+)[._-]mac\.zip/i }
let(:versions) { ["1.2.3"] }
describe "::match?" do
it "returns true for a YAML file URL" do
expect(electron_builder.match?(yaml_url)).to be true
end
it "returns false for non-YAML URL" do
expect(electron_builder.match?(non_yaml_url)).to be false
end
end
describe "::versions_from_content" do
it "returns an empty array if content is blank" do
expect(electron_builder.versions_from_content("")).to eq([])
end
it "returns an array of version strings when given YAML text" do
expect(electron_builder.versions_from_content(electron_builder_yaml)).to eq(versions)
end
it "returns an array of version strings when given YAML text and a block" do
# Returning a string from block
expect(
electron_builder.versions_from_content(electron_builder_yaml) do |yaml|
yaml["version"].sub("3", "4")
end,
).to eq(["1.2.4"])
# Returning an array of strings from block
expect(electron_builder.versions_from_content(electron_builder_yaml) { versions }).to eq(versions)
end
it "returns an array of version strings when given YAML text, a regex, and a block" do
# Returning a string from block
expect(
electron_builder.versions_from_content(electron_builder_yaml, mac_regex) do |yaml, regex|
yaml["path"][regex, 1]
end,
).to eq(versions)
# Returning an array of strings from block
expect(
electron_builder.versions_from_content(electron_builder_yaml, mac_regex) do |yaml, regex|
yaml["files"]&.map do |file|
next if file["url"].blank?
file["url"][regex, 1]
end
end,
).to eq(versions)
end
it "allows a nil return from a block" do
expect(electron_builder.versions_from_content(electron_builder_yaml) { next }).to eq([])
end
it "errors on an invalid return type from a block" do
expect { electron_builder.versions_from_content(electron_builder_yaml) { 123 } }
.to raise_error(TypeError, Homebrew::Livecheck::Strategy::INVALID_BLOCK_RETURN_VALUE_MSG)
end
end
end