92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| 
								 | 
							
								# frozen_string_literal: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								require "language/php"
							 | 
						||
| 
								 | 
							
								require "utils/shebang"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								RSpec.describe Language::PHP::Shebang do
							 | 
						||
| 
								 | 
							
								  let(:file) { Tempfile.new("php-shebang") }
							 | 
						||
| 
								 | 
							
								  let(:broken_file) { Tempfile.new("php-shebang") }
							 | 
						||
| 
								 | 
							
								  let(:f) do
							 | 
						||
| 
								 | 
							
								    f = {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    f[:php81] = formula "php@8.1" do
							 | 
						||
| 
								 | 
							
								      url "https://brew.sh/node-18.0.0.tgz"
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    f[:versioned_php_dep] = formula "foo" do
							 | 
						||
| 
								 | 
							
								      url "https://brew.sh/foo-1.0.tgz"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      depends_on "php@8.1"
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    f[:no_deps] = formula "foo" do
							 | 
						||
| 
								 | 
							
								      url "https://brew.sh/foo-1.0.tgz"
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    f[:multiple_deps] = formula "foo" do
							 | 
						||
| 
								 | 
							
								      url "https://brew.sh/foo-1.0.tgz"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      depends_on "php"
							 | 
						||
| 
								 | 
							
								      depends_on "php@8.1"
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    f
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  before do
							 | 
						||
| 
								 | 
							
								    file.write <<~EOS
							 | 
						||
| 
								 | 
							
								      #!/usr/bin/env php
							 | 
						||
| 
								 | 
							
								      a
							 | 
						||
| 
								 | 
							
								      b
							 | 
						||
| 
								 | 
							
								      c
							 | 
						||
| 
								 | 
							
								    EOS
							 | 
						||
| 
								 | 
							
								    file.flush
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    broken_file.write <<~EOS
							 | 
						||
| 
								 | 
							
								      #!php
							 | 
						||
| 
								 | 
							
								      a
							 | 
						||
| 
								 | 
							
								      b
							 | 
						||
| 
								 | 
							
								      c
							 | 
						||
| 
								 | 
							
								    EOS
							 | 
						||
| 
								 | 
							
								    broken_file.flush
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  after { [file, broken_file].each(&:unlink) }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  describe "#detected_php_shebang" do
							 | 
						||
| 
								 | 
							
								    it "can be used to replace PHP shebangs" do
							 | 
						||
| 
								 | 
							
								      allow(Formulary).to receive(:factory).with(f[:php81].name).and_return(f[:php81])
							 | 
						||
| 
								 | 
							
								      Utils::Shebang.rewrite_shebang described_class.detected_php_shebang(f[:versioned_php_dep]), file.path
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      expect(File.read(file)).to eq <<~EOS
							 | 
						||
| 
								 | 
							
								        #!#{HOMEBREW_PREFIX/"opt/php@8.1/bin/php"}
							 | 
						||
| 
								 | 
							
								        a
							 | 
						||
| 
								 | 
							
								        b
							 | 
						||
| 
								 | 
							
								        c
							 | 
						||
| 
								 | 
							
								      EOS
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    it "can fix broken shebang like `#!php`" do
							 | 
						||
| 
								 | 
							
								      allow(Formulary).to receive(:factory).with(f[:php81].name).and_return(f[:php81])
							 | 
						||
| 
								 | 
							
								      Utils::Shebang.rewrite_shebang described_class.detected_php_shebang(f[:versioned_php_dep]), broken_file.path
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      expect(File.read(broken_file)).to eq <<~EOS
							 | 
						||
| 
								 | 
							
								        #!#{HOMEBREW_PREFIX/"opt/php@8.1/bin/php"}
							 | 
						||
| 
								 | 
							
								        a
							 | 
						||
| 
								 | 
							
								        b
							 | 
						||
| 
								 | 
							
								        c
							 | 
						||
| 
								 | 
							
								      EOS
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    it "errors if formula doesn't depend on PHP" do
							 | 
						||
| 
								 | 
							
								      expect { Utils::Shebang.rewrite_shebang described_class.detected_php_shebang(f[:no_deps]), file.path }
							 | 
						||
| 
								 | 
							
								        .to raise_error(ShebangDetectionError, "Cannot detect PHP shebang: formula does not depend on PHP.")
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    it "errors if formula depends on more than one php" do
							 | 
						||
| 
								 | 
							
								      expect { Utils::Shebang.rewrite_shebang described_class.detected_php_shebang(f[:multiple_deps]), file.path }
							 | 
						||
| 
								 | 
							
								        .to raise_error(ShebangDetectionError, "Cannot detect PHP shebang: formula has multiple PHP dependencies.")
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								end
							 |