2020-12-19 01:11:45 -05:00
|
|
|
# typed: false
|
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2021-08-10 11:09:55 -04:00
|
|
|
require "livecheck/strategy"
|
|
|
|
require "bundle_version"
|
2020-12-19 01:11:45 -05:00
|
|
|
|
|
|
|
describe Homebrew::Livecheck::Strategy::Sparkle do
|
|
|
|
subject(:sparkle) { described_class }
|
|
|
|
|
2021-08-10 17:39:11 -04:00
|
|
|
let(:appcast_url) { "https://www.example.com/example/appcast.xml" }
|
|
|
|
let(:non_http_url) { "ftp://brew.sh/" }
|
2020-12-19 01:11:45 -05:00
|
|
|
|
2020-12-20 01:56:54 -05:00
|
|
|
let(:appcast_data) {
|
|
|
|
{
|
2021-04-04 03:00:34 +02:00
|
|
|
title: "Version 1.2.3",
|
2021-08-10 11:09:55 -04:00
|
|
|
pub_date: "Fri, 01 Jan 2021 01:23:45 +0000",
|
2021-04-04 03:00:34 +02:00
|
|
|
url: "https://www.example.com/example/example.tar.gz",
|
|
|
|
short_version: "1.2.3",
|
|
|
|
version: "1234",
|
2020-12-20 01:56:54 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let(:appcast_xml) {
|
|
|
|
<<~EOS
|
|
|
|
<?xml version="1.0" encoding="utf-8"?>
|
|
|
|
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle">
|
|
|
|
<channel>
|
|
|
|
<title>Example Changelog</title>
|
2021-08-10 17:39:11 -04:00
|
|
|
<link>#{appcast_url}</link>
|
2020-12-20 01:56:54 -05:00
|
|
|
<description>Most recent changes with links to updates.</description>
|
|
|
|
<language>en</language>
|
|
|
|
<item>
|
|
|
|
<title>#{appcast_data[:title]}</title>
|
|
|
|
<sparkle:minimumSystemVersion>10.10</sparkle:minimumSystemVersion>
|
|
|
|
<sparkle:releaseNotesLink>https://www.example.com/example/1.2.3.html</sparkle:releaseNotesLink>
|
2021-08-10 11:09:55 -04:00
|
|
|
<pubDate>#{appcast_data[:pub_date]}</pubDate>
|
2020-12-20 01:56:54 -05:00
|
|
|
<enclosure url="#{appcast_data[:url]}" sparkle:shortVersionString="#{appcast_data[:short_version]}" sparkle:version="#{appcast_data[:version]}" length="12345678" type="application/octet-stream" sparkle:dsaSignature="ABCDEF+GHIJKLMNOPQRSTUVWXYZab/cdefghijklmnopqrst/uvwxyz1234567==" />
|
|
|
|
</item>
|
|
|
|
</channel>
|
|
|
|
</rss>
|
|
|
|
EOS
|
|
|
|
}
|
|
|
|
|
2021-11-16 12:31:54 -05:00
|
|
|
let(:title_regex) { /Version\s+v?(\d+(?:\.\d+)+)\s*$/i }
|
|
|
|
|
2021-08-10 11:09:55 -04:00
|
|
|
let(:item) {
|
|
|
|
Homebrew::Livecheck::Strategy::Sparkle::Item.new(
|
|
|
|
title: appcast_data[:title],
|
|
|
|
pub_date: Time.parse(appcast_data[:pub_date]),
|
|
|
|
url: appcast_data[:url],
|
|
|
|
bundle_version: Homebrew::BundleVersion.new(appcast_data[:short_version], appcast_data[:version]),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
let(:versions) { [item.bundle_version.nice_version] }
|
|
|
|
|
2020-12-19 01:11:45 -05:00
|
|
|
describe "::match?" do
|
2021-08-10 17:39:11 -04:00
|
|
|
it "returns true for an HTTP URL" do
|
|
|
|
expect(sparkle.match?(appcast_url)).to be true
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns false for a non-HTTP URL" do
|
|
|
|
expect(sparkle.match?(non_http_url)).to be false
|
2020-12-19 01:11:45 -05:00
|
|
|
end
|
|
|
|
end
|
2020-12-20 01:56:54 -05:00
|
|
|
|
|
|
|
describe "::item_from_content" do
|
|
|
|
let(:item_from_appcast_xml) { sparkle.item_from_content(appcast_xml) }
|
|
|
|
|
|
|
|
it "returns nil if content is blank" do
|
2022-03-01 00:01:13 +00:00
|
|
|
expect(sparkle.item_from_content("")).to be_nil
|
2020-12-20 01:56:54 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it "returns an Item when given XML data" do
|
|
|
|
expect(item_from_appcast_xml).to be_a(Homebrew::Livecheck::Strategy::Sparkle::Item)
|
2021-08-10 11:09:55 -04:00
|
|
|
expect(item_from_appcast_xml).to eq(item)
|
2021-04-04 03:00:34 +02:00
|
|
|
expect(item_from_appcast_xml.title).to eq(appcast_data[:title])
|
2021-08-10 11:09:55 -04:00
|
|
|
expect(item_from_appcast_xml.pub_date).to eq(Time.parse(appcast_data[:pub_date]))
|
2021-04-04 03:00:34 +02:00
|
|
|
expect(item_from_appcast_xml.url).to eq(appcast_data[:url])
|
|
|
|
expect(item_from_appcast_xml.short_version).to eq(appcast_data[:short_version])
|
|
|
|
expect(item_from_appcast_xml.version).to eq(appcast_data[:version])
|
2020-12-20 01:56:54 -05:00
|
|
|
end
|
|
|
|
end
|
2021-08-10 11:09:55 -04:00
|
|
|
|
|
|
|
describe "::versions_from_content" do
|
|
|
|
it "returns an array of version strings when given content" do
|
|
|
|
expect(sparkle.versions_from_content(appcast_xml)).to eq(versions)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns an array of version strings when given content and a block" do
|
|
|
|
# Returning a string from block
|
|
|
|
expect(
|
|
|
|
sparkle.versions_from_content(appcast_xml) do |item|
|
|
|
|
item.bundle_version&.nice_version&.sub("3", "4")
|
|
|
|
end,
|
|
|
|
).to eq([item.bundle_version.nice_version.sub("3", "4")])
|
|
|
|
|
2021-11-16 12:31:54 -05:00
|
|
|
# Returning an array of strings from block (unlikely to be used)
|
2021-08-10 11:09:55 -04:00
|
|
|
expect(sparkle.versions_from_content(appcast_xml) { versions }).to eq(versions)
|
|
|
|
end
|
|
|
|
|
2021-11-16 12:31:54 -05:00
|
|
|
it "returns an array of version strings when given content, a regex, and a block" do
|
|
|
|
# Returning a string from block
|
|
|
|
expect(
|
|
|
|
sparkle.versions_from_content(appcast_xml, title_regex) do |item, regex|
|
|
|
|
item.title[regex, 1]
|
|
|
|
end,
|
|
|
|
).to eq([item.bundle_version.short_version])
|
|
|
|
|
|
|
|
# Returning an array of strings from block (unlikely to be used)
|
|
|
|
expect(
|
|
|
|
sparkle.versions_from_content(appcast_xml, title_regex) do |item, regex|
|
|
|
|
[item.title[regex, 1]]
|
|
|
|
end,
|
|
|
|
).to eq([item.bundle_version.short_version])
|
|
|
|
end
|
|
|
|
|
2021-08-10 11:09:55 -04:00
|
|
|
it "allows a nil return from a block" do
|
|
|
|
expect(sparkle.versions_from_content(appcast_xml) { next }).to eq([])
|
|
|
|
end
|
|
|
|
|
|
|
|
it "errors on an invalid return type from a block" do
|
|
|
|
expect { sparkle.versions_from_content(appcast_xml) { 123 } }
|
|
|
|
.to raise_error(TypeError, Homebrew::Livecheck::Strategy::INVALID_BLOCK_RETURN_VALUE_MSG)
|
|
|
|
end
|
|
|
|
end
|
2020-12-19 01:11:45 -05:00
|
|
|
end
|