| 
									
										
										
										
											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 |