| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require "rubocops/rubocop-cask" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-18 15:11:11 -08:00
										 |  |  | RSpec.describe RuboCop::Cop::Cask::OnSystemConditionals, :config do | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  |   context "when auditing `postflight` stanzas" do | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |     it "accepts when there are no `on_*` blocks" do | 
					
						
							|  |  |  |       expect_no_offenses <<~CASK | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           postflight do | 
					
						
							|  |  |  |             foobar | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |     it "reports an offense it contains an `on_intel` block" do | 
					
						
							|  |  |  |       expect_offense <<~CASK | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           postflight do | 
					
						
							|  |  |  |             on_intel do | 
					
						
							| 
									
										
										
										
											2025-05-30 16:42:32 -04:00
										 |  |  |             ^^^^^^^^ Instead of using `on_intel` in `postflight do`, use `if Hardware::CPU.intel?`. | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |               foobar | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # FIXME: Infinite loop alternating between `if Hardware::CPU.intel?` and `on_intel do`. | 
					
						
							|  |  |  |       expect_correction <<~CASK, loop: false | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           postflight do | 
					
						
							|  |  |  |             if Hardware::CPU.intel? | 
					
						
							|  |  |  |               foobar | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |     it "reports an offense when it contains an `on_monterey` block" do | 
					
						
							|  |  |  |       expect_offense <<~CASK | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           postflight do | 
					
						
							|  |  |  |             on_monterey do | 
					
						
							| 
									
										
										
										
											2025-05-30 16:42:32 -04:00
										 |  |  |             ^^^^^^^^^^^ Instead of using `on_monterey` in `postflight do`, use `if MacOS.version == :monterey`. | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |               foobar | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # FIXME: Infinite loop alternating between `if MacOS.version == :monterey` and `on_monterey do`. | 
					
						
							|  |  |  |       expect_correction <<~CASK, loop: false | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           postflight do | 
					
						
							|  |  |  |             if MacOS.version == :monterey | 
					
						
							|  |  |  |               foobar | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |     it "reports an offense when it contains an `on_monterey :or_older` block" do | 
					
						
							|  |  |  |       expect_offense <<~CASK | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           postflight do | 
					
						
							|  |  |  |             on_monterey :or_older do | 
					
						
							| 
									
										
										
										
											2025-05-30 16:42:32 -04:00
										 |  |  |             ^^^^^^^^^^^^^^^^^^^^^ Instead of using `on_monterey :or_older` in `postflight do`, use `if MacOS.version <= :monterey`. | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |               foobar | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # FIXME: Infinite loop alternating between `if MacOS.version <= :monterey` and `on_monterey :or_older do`. | 
					
						
							|  |  |  |       expect_correction <<~CASK, loop: false | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           postflight do | 
					
						
							|  |  |  |             if MacOS.version <= :monterey | 
					
						
							|  |  |  |               foobar | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2022-08-16 01:42:24 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |   context "when auditing `sha256` stanzas inside `on_arch` blocks" do | 
					
						
							|  |  |  |     it "accepts when there are no `on_arch` blocks" do | 
					
						
							|  |  |  |       expect_no_offenses <<~CASK | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2022-08-16 01:42:24 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |     it "accepts when the `sha256` stanza is used with keyword arguments" do | 
					
						
							|  |  |  |       expect_no_offenses <<~CASK | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           sha256 arm:   "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94", | 
					
						
							|  |  |  |                  intel: "8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							| 
									
										
										
										
											2022-08-16 01:42:24 -04:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-18 21:45:05 +00:00
										 |  |  |     it "reports an offense when `sha256` has identical values for different architectures" do | 
					
						
							|  |  |  |       expect_offense <<~CASK | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           sha256 arm:   "5f42cb017dd07270409eaee7c3b4a164ffa7c0f21d85c65840c4f81aab21d457", | 
					
						
							|  |  |  |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ sha256 values for different architectures should not be identical. | 
					
						
							|  |  |  |                  intel: "5f42cb017dd07270409eaee7c3b4a164ffa7c0f21d85c65840c4f81aab21d457" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |     it "accepts when there is only one `on_arch` block" do | 
					
						
							|  |  |  |       expect_no_offenses <<~CASK | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           on_intel do | 
					
						
							|  |  |  |             sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94" | 
					
						
							| 
									
										
										
										
											2022-08-16 01:42:24 -04:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							| 
									
										
										
										
											2022-08-16 01:42:24 -04:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |     it "reports an offense when `sha256` is specified in all `on_arch` blocks" do | 
					
						
							|  |  |  |       expect_offense <<~CASK | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           on_intel do | 
					
						
							|  |  |  |             sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94" | 
					
						
							| 
									
										
										
										
											2022-08-16 01:42:24 -04:00
										 |  |  |           end | 
					
						
							|  |  |  |           on_arm do | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |           ^^^^^^^^^ Use `sha256 arm: "8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b", intel: "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94"` instead of nesting the `sha256` stanzas in `on_intel` and `on_arm` blocks | 
					
						
							|  |  |  |             sha256 "8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b" | 
					
						
							| 
									
										
										
										
											2022-08-16 01:42:24 -04:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							| 
									
										
										
										
											2022-08-16 01:42:24 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |       expect_correction <<~CASK | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |         #{"  "} | 
					
						
							|  |  |  |           sha256 arm: "8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b", intel: "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							| 
									
										
										
										
											2022-08-16 01:42:24 -04:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |     it "accepts when there is also a `version` stanza inside the `on_arch` blocks" do | 
					
						
							|  |  |  |       expect_no_offenses <<~CASK | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           on_intel do | 
					
						
							|  |  |  |             version "1.0.0" | 
					
						
							|  |  |  |             sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94" | 
					
						
							| 
									
										
										
										
											2022-08-16 01:42:24 -04:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |           on_arm do | 
					
						
							|  |  |  |             version "2.0.0" | 
					
						
							|  |  |  |             sha256 "8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							| 
									
										
										
										
											2022-08-16 01:42:24 -04:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |     it "accepts when there is also a `version` stanza inside only a single `on_arch` block" do | 
					
						
							|  |  |  |       expect_no_offenses <<~CASK | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           on_intel do | 
					
						
							|  |  |  |             version "2.0.0" | 
					
						
							|  |  |  |             sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94" | 
					
						
							| 
									
										
										
										
											2022-08-16 01:42:24 -04:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |           on_arm do | 
					
						
							|  |  |  |             sha256 "8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							| 
									
										
										
										
											2022-08-16 01:42:24 -04:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2022-08-25 01:22:41 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   context "when auditing loose `Hardware::CPU` method calls" do | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |     it "reports an offense when `Hardware::CPU.arm?` is used" do | 
					
						
							|  |  |  |       expect_offense <<~CASK | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           if Hardware::CPU.arm? && other_condition | 
					
						
							| 
									
										
										
										
											2025-05-30 16:42:32 -04:00
										 |  |  |              ^^^^^^^^^^^^^^^^^^ Instead of `Hardware::CPU.arm?`, use `on_arm` and `on_intel` blocks. | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |             sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94" | 
					
						
							|  |  |  |           else | 
					
						
							|  |  |  |             sha256 "8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b" | 
					
						
							| 
									
										
										
										
											2022-08-25 01:22:41 -04:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							| 
									
										
										
										
											2022-08-25 01:22:41 -04:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |     it "reports an offense when `Hardware::CPU.intel?` is used" do | 
					
						
							|  |  |  |       expect_offense <<~CASK | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           if Hardware::CPU.intel? && other_condition | 
					
						
							| 
									
										
										
										
											2025-05-30 16:42:32 -04:00
										 |  |  |              ^^^^^^^^^^^^^^^^^^^^ Instead of `Hardware::CPU.intel?`, use `on_arm` and `on_intel` blocks. | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |             sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94" | 
					
						
							|  |  |  |           else | 
					
						
							|  |  |  |             sha256 "8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b" | 
					
						
							| 
									
										
										
										
											2022-08-25 01:22:41 -04:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							| 
									
										
										
										
											2022-08-25 01:22:41 -04:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |     it "reports an offense when `Hardware::CPU.arch` is used" do | 
					
						
							|  |  |  |       expect_offense <<~'CASK' | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           version "1.2.3" | 
					
						
							|  |  |  |           sha256 "67cdb8a02803ef37fdbf7e0be205863172e41a561ca446cd84f0d7ab35a99d94" | 
					
						
							| 
									
										
										
										
											2022-08-25 01:22:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |           url "https://example.com/foo-#{version}-#{Hardware::CPU.arch}.zip" | 
					
						
							| 
									
										
										
										
											2025-05-30 16:42:32 -04:00
										 |  |  |                                                     ^^^^^^^^^^^^^^^^^^ Instead of `Hardware::CPU.arch`, use `on_arm` and `on_intel` blocks. | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							| 
									
										
										
										
											2022-08-25 01:22:41 -04:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2022-12-28 16:09:05 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   context "when auditing loose `MacOS.version` method calls" do | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |     it "reports an offense when `MacOS.version ==` is used" do | 
					
						
							|  |  |  |       expect_offense <<~CASK | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           if MacOS.version == :catalina | 
					
						
							| 
									
										
										
										
											2025-05-30 16:42:32 -04:00
										 |  |  |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Instead of `if MacOS.version == :catalina`, use `on_catalina do`. | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |             version "1.0.0" | 
					
						
							|  |  |  |           else | 
					
						
							|  |  |  |             version "2.0.0" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "reports an offense when `MacOS.version <=` is used" do | 
					
						
							|  |  |  |       expect_offense <<~CASK | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           if MacOS.version <= :catalina | 
					
						
							| 
									
										
										
										
											2025-05-30 16:42:32 -04:00
										 |  |  |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Instead of `if MacOS.version <= :catalina`, use `on_catalina :or_older do`. | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |             version "1.0.0" | 
					
						
							|  |  |  |           else | 
					
						
							|  |  |  |             version "2.0.0" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "reports an offense when `MacOS.version >=` is used" do | 
					
						
							|  |  |  |       expect_offense <<~CASK | 
					
						
							|  |  |  |         cask 'foo' do | 
					
						
							|  |  |  |           if MacOS.version >= :catalina | 
					
						
							| 
									
										
										
										
											2025-05-30 16:42:32 -04:00
										 |  |  |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Instead of `if MacOS.version >= :catalina`, use `on_catalina :or_newer do`. | 
					
						
							| 
									
										
										
										
											2023-05-08 11:02:44 +02:00
										 |  |  |             version "1.0.0" | 
					
						
							|  |  |  |           else | 
					
						
							|  |  |  |             version "2.0.0" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       CASK | 
					
						
							| 
									
										
										
										
											2022-12-28 16:09:05 -05:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  | end |