1010from homebrew_releaser .formula import Formula
1111
1212
13- formula_path = 'test/formulas'
14-
13+ FORMULA_PATH = 'test/formulas'
1514USERNAME = 'Justintime50'
1615VERSION = '0.1.0'
1716CHECKSUM = '0' * 64 # `brew audit` wants a 64 character number here, this would be true with real data
4241'''
4342
4443
45- def _record_formula (formula_path : str , formula_name : str , formula_data : str ):
44+ def _record_formula (formula_path : str , formula_name : str , formula_data : str , skip_assertions : bool = False ):
4645 """Read from an existing formula file or create a new formula file if it's not present.
4746
4847 Tests using this function will generate a formula into a file (similar to how
@@ -56,8 +55,9 @@ def _record_formula(formula_path: str, formula_name: str, formula_data: str):
5655 full_formula_filename = os .path .join (formula_path , formula_name )
5756
5857 if os .path .isfile (full_formula_filename ):
59- with open (full_formula_filename , 'r' ) as formula_file :
60- assert formula_data == formula_file .read ()
58+ if skip_assertions is False :
59+ with open (full_formula_filename , 'r' ) as formula_file :
60+ assert formula_data == formula_file .read ()
6161 else :
6262 os .makedirs (formula_path , exist_ok = True )
6363 with open (full_formula_filename , 'w' ) as formula_file :
@@ -104,7 +104,7 @@ def test_generate_formula():
104104 test = TEST ,
105105 )
106106
107- _record_formula (formula_path , formula_filename , formula )
107+ _record_formula (FORMULA_PATH , formula_filename , formula )
108108
109109 # The following assertions are explicitly listed as the "gold standard" for generic formula generation
110110 assert (
@@ -174,7 +174,7 @@ def test_generate_formula_no_article_description():
174174 test = None ,
175175 )
176176
177- _record_formula (formula_path , formula_filename , formula )
177+ _record_formula (FORMULA_PATH , formula_filename , formula )
178178
179179 assert 'desc "Release scripts, binaries, and executables to github"' in formula
180180
@@ -215,7 +215,7 @@ def test_generate_formula_formula_name_starts_description():
215215 test = None ,
216216 )
217217
218- _record_formula (formula_path , formula_filename , formula )
218+ _record_formula (FORMULA_PATH , formula_filename , formula )
219219
220220 assert 'desc "Is a tool"' in formula
221221
@@ -254,7 +254,7 @@ def test_generate_formula_no_depends_on():
254254 test = TEST ,
255255 )
256256
257- _record_formula (formula_path , formula_filename , formula )
257+ _record_formula (FORMULA_PATH , formula_filename , formula )
258258
259259 assert 'depends_on' not in formula
260260
@@ -293,7 +293,7 @@ def test_generate_formula_no_test():
293293 test = None ,
294294 )
295295
296- _record_formula (formula_path , formula_filename , formula )
296+ _record_formula (FORMULA_PATH , formula_filename , formula )
297297
298298 assert 'test do' not in formula
299299
@@ -334,7 +334,7 @@ def test_generate_formula_multiline_fields():
334334 test = MULTILINE_TEST ,
335335 )
336336
337- _record_formula (formula_path , formula_filename , formula )
337+ _record_formula (FORMULA_PATH , formula_filename , formula )
338338
339339 assert (
340340 '''
@@ -436,7 +436,7 @@ def test_generate_formula_complete_matrix():
436436 test = TEST ,
437437 )
438438
439- _record_formula (formula_path , formula_filename , formula )
439+ _record_formula (FORMULA_PATH , formula_filename , formula )
440440
441441 assert formula .count ('url' ) == 5
442442 assert formula .count ('sha256' ) == 5
@@ -498,7 +498,7 @@ def test_generate_formula_darwin_matrix():
498498 test = None ,
499499 )
500500
501- _record_formula (formula_path , formula_filename , formula )
501+ _record_formula (FORMULA_PATH , formula_filename , formula )
502502
503503 assert 'on_macos' in formula
504504 assert 'on_intel' in formula
@@ -558,7 +558,7 @@ def test_generate_formula_linux_matrix():
558558 test = None ,
559559 )
560560
561- _record_formula (formula_path , formula_filename , formula )
561+ _record_formula (FORMULA_PATH , formula_filename , formula )
562562
563563 assert 'on_macos' not in formula
564564 assert 'on_intel' in formula
@@ -619,7 +619,7 @@ def test_one_of_each_matrix():
619619 test = None ,
620620 )
621621
622- _record_formula (formula_path , formula_filename , formula )
622+ _record_formula (FORMULA_PATH , formula_filename , formula )
623623
624624 assert 'on_macos' in formula
625625 assert 'on_intel' in formula
@@ -666,7 +666,7 @@ def test_generate_formula_string_false_configs():
666666 test = None ,
667667 )
668668
669- _record_formula (formula_path , formula_filename , formula )
669+ _record_formula (FORMULA_PATH , formula_filename , formula )
670670
671671 assert 'on_macos' not in formula
672672 assert 'on_intel' not in formula
@@ -707,7 +707,7 @@ def test_generate_formula_empty_fields():
707707 test = None ,
708708 )
709709
710- _record_formula (formula_path , formula_filename , formula )
710+ _record_formula (FORMULA_PATH , formula_filename , formula )
711711
712712 assert 'desc "NA"' in formula
713713 assert 'license' not in formula
@@ -785,7 +785,7 @@ def test_generate_formula_download_strategy():
785785 custom_require = '../formula_imports/mock_download_strategy' ,
786786 )
787787
788- _record_formula (formula_path , formula_filename , formula )
788+ _record_formula (FORMULA_PATH , formula_filename , formula )
789789
790790 assert formula .count (', using: CustomDownloadStrategy' ) == 5
791791 assert 'require_relative "../formula_imports/mock_download_strategy"' in formula
@@ -824,7 +824,7 @@ def test_generate_formula_override_version():
824824 version = '9.8.7' ,
825825 )
826826
827- _record_formula (formula_path , formula_filename , formula )
827+ _record_formula (FORMULA_PATH , formula_filename , formula )
828828
829829 assert '9.8.7' in formula
830830
@@ -862,9 +862,60 @@ def test_generate_formula_formula_includes():
862862 formula_includes = 'include Language::Python::Virtualenv' ,
863863 )
864864
865- _record_formula (formula_path , formula_filename , formula )
865+ _record_formula (FORMULA_PATH , formula_filename , formula )
866+
867+ assert 'include Language::Python::Virtualenv' in formula
868+
869+
870+ def test_generate_formula_update_python_resources ():
871+ """Tests that we generate the formula content correctly when using the update_python_resources param.
872+
873+ NOTE: See docstring in `_record_formula` for more details on how recording formulas works.
874+
875+ NOTE: This test is unique since we call a subprocess to update our formula after we've generated it, will
876+ require a different test flow than the others.
877+ """
878+ formula_filename = 'homebrew_releaser.rb'
879+ repo_name = 'homebrew-releaser'
880+ mock_tar_url = f'https://github.com/justintime50/{ repo_name } /archive/refs/tags/v1.0.0.tar.gz'
881+
882+ repository = {
883+ 'description' : DESCRIPTION ,
884+ 'license' : LICENSE ,
885+ }
886+
887+ formula = Formula .generate_formula_data (
888+ owner = USERNAME ,
889+ repo_name = repo_name ,
890+ repository = repository ,
891+ checksums = [
892+ {
893+ f'{ repo_name } .tar.gz' : {
894+ 'checksum' : CHECKSUM ,
895+ 'url' : (
896+ f'https://github.com/justintime50/{ repo_name } /releases/download/1.0.0/{ repo_name } -1.0.0.tar.gz' # noqa
897+ ),
898+ },
899+ }
900+ ],
901+ install = 'virtualenv_install_with_resources' ,
902+ tar_url = mock_tar_url ,
903+ formula_includes = 'include Language::Python::Virtualenv' ,
904+ )
905+
906+ update_resources = False
907+ full_formula_filename = os .path .join (os .getcwd (), FORMULA_PATH , formula_filename )
908+ if not os .path .isfile (full_formula_filename ):
909+ update_resources = True
910+ _record_formula (FORMULA_PATH , formula_filename , formula , skip_assertions = True )
911+ if update_resources :
912+ Formula .update_python_resources (full_formula_filename , repo_name )
913+ with open (full_formula_filename , 'r' ) as formula_file :
914+ formula = formula_file .read ()
866915
867916 assert 'include Language::Python::Virtualenv' in formula
917+ assert 'resource "requests" do' in formula
918+ assert 'virtualenv_install_with_resources' in formula
868919
869920
870921@pytest .mark .parametrize (
@@ -885,19 +936,20 @@ def test_generate_class_name(repo_name, expected_class_name):
885936 assert class_name == expected_class_name
886937
887938
888- @patch ('subprocess.check_output' , side_effect = Exception ('Test error' ))
939+ @patch (
940+ 'subprocess.check_output' ,
941+ side_effect = subprocess .CalledProcessError (cmd = 'subprocess.check_output' , returncode = 1 ),
942+ )
889943def test_update_python_resources_error (mock_subprocess ):
890- formula_path = '/path/to/formula.rb'
944+ FORMULA_PATH = '/path/to/formula.rb'
891945 formula_name = 'test-formula'
892946
893- with pytest .raises (SystemExit ) as error :
894- Formula .update_python_resources (formula_path , formula_name )
895-
896- assert str (error .value ) == 'An error occurred while updating Python resources: Test error'
947+ with pytest .raises (SystemExit ):
948+ Formula .update_python_resources (FORMULA_PATH , formula_name )
897949
898950 brew_path = shutil .which ('brew' )
899951 mock_subprocess .assert_called_once_with (
900- [brew_path , 'update-python-resources' , formula_path ],
952+ [brew_path , 'update-python-resources' , FORMULA_PATH ],
901953 stderr = subprocess .STDOUT ,
902954 text = True ,
903955 timeout = TIMEOUT ,
0 commit comments