@@ -36,7 +36,7 @@ def test_nuke_option_deletes_directory_first(self, mock_subprocess, fake_home, v
3636 mock_subprocess .check_call .side_effect = lambda * _ , ** __ : Path (project .project_path ).mkdir ()
3737
3838 project .download_repo ("repo" , nuke = True )
39- assert "old-thing.txt" not in project .project_path .iterdir ()
39+ assert ( project . project_path / "old-thing.txt" ) not in project .project_path .iterdir ()
4040
4141 def test_nuke_option_ignores_directory_doesnt_exist (self , mock_subprocess , fake_home , virtualenvs_folder ):
4242 project = DjangoProject ("www.a.domain.com" , "py.version" )
@@ -47,6 +47,92 @@ def test_nuke_option_ignores_directory_doesnt_exist(self, mock_subprocess, fake_
4747 assert project .project_path .is_dir ()
4848
4949
50+ class TestEnsureBranch :
51+ def test_checks_happy_path_with_one_branch (self , mock_subprocess , fake_home , virtualenvs_folder ):
52+ project = DjangoProject ("www.a.domain.com" , "py.version" )
53+ mock_subprocess .check_output .side_effect = [
54+ b" origin/HEAD -> origin/bar\n origin/bar\n " , b"bar\n "
55+ ]
56+ project .ensure_branch ("None" ) # should not raise
57+
58+ def test_checks_if_branch_exists (self , mock_subprocess , fake_home , virtualenvs_folder ):
59+ project = DjangoProject ("www.a.domain.com" , "py.version" )
60+ mock_subprocess .check_output .side_effect = [
61+ b" origin/HEAD -> origin/bar\n origin/foo\n origin/bar\n origin/baz\n " , b"bar\n "
62+ ]
63+ project .ensure_branch ("foo" ) # should not raise
64+
65+ def test_checks_if_branch_exists (self , mock_subprocess , fake_home , virtualenvs_folder ):
66+ project = DjangoProject ("www.a.domain.com" , "py.version" )
67+ mock_subprocess .check_output .side_effect = [
68+ b" origin/HEAD -> origin/bar\n origin/foo\n origin/bar\n origin/baz\n " , b"bar\n "
69+ ]
70+
71+ project .ensure_branch ("foo" ) # should not raise
72+
73+ def test_deletes_directory_if_branch_does_not_exist (self , mock_subprocess , fake_home , virtualenvs_folder ):
74+ project = DjangoProject ("www.a.domain.com" , "py.version" )
75+ project .project_path .mkdir ()
76+ mock_subprocess .check_output .return_value = b" origin/HEAD -> origin/bar\n origin/bar\n origin/baz\n "
77+
78+ with pytest .raises (SanityException ):
79+ project .ensure_branch ("foo" )
80+
81+ assert not project .project_path .exists ()
82+
83+ def test_program_raises_if_branch_does_not_exist (self , mock_subprocess , fake_home , virtualenvs_folder ):
84+ project = DjangoProject ("www.a.domain.com" , "py.version" )
85+ project .project_path .mkdir ()
86+ mock_subprocess .check_output .return_value = b" origin/HEAD -> origin/bar\n origin/bar\n origin/baz\n "
87+
88+ with pytest .raises (SanityException ) as e :
89+ project .ensure_branch ("foo" )
90+
91+ assert "You do not have a foo branch in your repo" in str (e .value )
92+
93+ def test_deletes_directory_if_multiple_branches (self , mock_subprocess , fake_home , virtualenvs_folder ):
94+ project = DjangoProject ("www.a.domain.com" , "py.version" )
95+ project .project_path .mkdir ()
96+ mock_subprocess .check_output .return_value = b" origin/HEAD -> origin/bar\n origin/foo\n origin/bar\n origin/baz\n "
97+
98+ with pytest .raises (SanityException ) as e :
99+ project .ensure_branch ("None" )
100+
101+ assert not project .project_path .exists ()
102+
103+ def test_raises_if_multiple_branches (self , mock_subprocess , fake_home , virtualenvs_folder ):
104+ project = DjangoProject ("www.a.domain.com" , "py.version" )
105+ project .project_path .mkdir ()
106+ mock_subprocess .check_output .return_value = b" origin/HEAD -> origin/bar\n origin/foo\n origin/bar\n origin/baz\n "
107+
108+ with pytest .raises (SanityException ) as e :
109+ project .ensure_branch ("None" )
110+
111+ assert "There are many branches in your repo." in str (e .value )
112+
113+ def test_checkouts_branch_if_not_current_head (self , mock_subprocess , fake_home , virtualenvs_folder ):
114+ project = DjangoProject ("www.a.domain.com" , "py.version" )
115+ mock_subprocess .check_output .side_effect = [
116+ b" origin/HEAD -> origin/bar\n origin/foo\n origin/bar\n origin/baz\n " , b"bar\n "
117+ ]
118+
119+ project .ensure_branch ("baz" )
120+
121+ assert mock_subprocess .check_call .call_args == call (
122+ ["git" , "-C" , str (project .project_path ), "checkout" , "baz" ]
123+ )
124+
125+ def test_does_not_checkouts_branch_if_current_head (self , mock_subprocess , fake_home , virtualenvs_folder ):
126+ project = DjangoProject ("www.a.domain.com" , "py.version" )
127+ mock_subprocess .check_output .side_effect = [
128+ b" origin/HEAD -> origin/bar\n origin/foo\n origin/bar\n origin/baz\n " , b"bar\n "
129+ ]
130+
131+ project .ensure_branch ("bar" )
132+
133+ assert mock_subprocess .check_call .call_count == 0
134+
135+
50136class TestDetectDjangoVersion :
51137 def test_is_versionless_django_by_default (self , fake_home , virtualenvs_folder ):
52138 project = DjangoProject ("mydomain.com" , "python.version" )
0 commit comments