From 72d9673dab277174a56e077060a6673ef5a716bd Mon Sep 17 00:00:00 2001 From: saadmk11 Date: Fri, 29 Mar 2019 02:15:52 +0600 Subject: [PATCH 1/5] "Default branch: latest" does not exist Fix. --- readthedocs/projects/forms.py | 2 +- readthedocs/rtd_tests/tests/test_project_forms.py | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/readthedocs/projects/forms.py b/readthedocs/projects/forms.py index d8e3e9d326e..06d97078ff4 100644 --- a/readthedocs/projects/forms.py +++ b/readthedocs/projects/forms.py @@ -246,7 +246,7 @@ def __init__(self, *args, **kwargs): # the special cases of LATEST and STABLE. all_versions_choices = [ (v.commit_name, v.verbose_name) - for v in self.instance.versions.all() + for v in self.instance.versions.filter(machine=False) ] self.fields['default_branch'].widget = forms.Select( choices=[default_choice] + all_versions_choices, diff --git a/readthedocs/rtd_tests/tests/test_project_forms.py b/readthedocs/rtd_tests/tests/test_project_forms.py index f8603ef818c..52dbe807d63 100644 --- a/readthedocs/rtd_tests/tests/test_project_forms.py +++ b/readthedocs/rtd_tests/tests/test_project_forms.py @@ -264,17 +264,23 @@ def test_list_only_active_versions_on_default_version(self): def test_list_all_versions_on_default_branch(self): form = ProjectAdvancedForm(instance=self.project) # This version is created automatically by the project on save - self.assertTrue(self.project.versions.filter(slug=LATEST).exists()) + latest = self.project.versions.filter(slug=LATEST) + self.assertTrue(latest.exists()) self.assertEqual( { identifier for identifier, _ in form.fields['default_branch'].widget.choices }, { - None, 'master', 'public-1', 'public-2', + None, 'public-1', 'public-2', 'public-3', 'public/4', 'protected', 'private', }, ) + self.assertNotIn( + latest.first().identifier, + [identifier for identifier, _ in form.fields[ + 'default_branch'].widget.choices], + ) def test_default_version_field_if_no_active_version(self): project_1 = get(Project) From 74a0a1c41d562d0acf093dae15080e3a93d4b80b Mon Sep 17 00:00:00 2001 From: saadmk11 Date: Fri, 29 Mar 2019 02:24:05 +0600 Subject: [PATCH 2/5] test name changed --- readthedocs/rtd_tests/tests/test_project_forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readthedocs/rtd_tests/tests/test_project_forms.py b/readthedocs/rtd_tests/tests/test_project_forms.py index 52dbe807d63..b0ced70cecc 100644 --- a/readthedocs/rtd_tests/tests/test_project_forms.py +++ b/readthedocs/rtd_tests/tests/test_project_forms.py @@ -261,7 +261,7 @@ def test_list_only_active_versions_on_default_version(self): {'latest', 'public-1', 'public-2', 'private', 'protected'}, ) - def test_list_all_versions_on_default_branch(self): + def test_list_only_non_auto_generated_versions_on_default_branch(self): form = ProjectAdvancedForm(instance=self.project) # This version is created automatically by the project on save latest = self.project.versions.filter(slug=LATEST) From 1616f5cd99ba5621775387c3f518cb58446b1f8d Mon Sep 17 00:00:00 2001 From: saadmk11 Date: Fri, 29 Mar 2019 15:43:58 +0600 Subject: [PATCH 3/5] Updated Choice field values and added tests --- readthedocs/projects/forms.py | 13 +++++------ .../rtd_tests/tests/test_project_forms.py | 23 +++++++++++++++---- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/readthedocs/projects/forms.py b/readthedocs/projects/forms.py index 06d97078ff4..631633e6a6e 100644 --- a/readthedocs/projects/forms.py +++ b/readthedocs/projects/forms.py @@ -242,14 +242,13 @@ def __init__(self, *args, **kwargs): self.helper.add_input(Submit('save', _('Save'))) default_choice = (None, '-' * 9) - # commit_name is used as the id because it handles - # the special cases of LATEST and STABLE. - all_versions_choices = [ - (v.commit_name, v.verbose_name) - for v in self.instance.versions.filter(machine=False) - ] + versions_choices = self.instance.versions.filter( + machine=False).values_list('verbose_name', flat=True) + self.fields['default_branch'].widget = forms.Select( - choices=[default_choice] + all_versions_choices, + choices=[default_choice] + list( + zip(versions_choices, versions_choices) + ), ) active_versions = self.get_all_active_versions() diff --git a/readthedocs/rtd_tests/tests/test_project_forms.py b/readthedocs/rtd_tests/tests/test_project_forms.py index b0ced70cecc..6b10b70c001 100644 --- a/readthedocs/rtd_tests/tests/test_project_forms.py +++ b/readthedocs/rtd_tests/tests/test_project_forms.py @@ -5,7 +5,7 @@ from django_dynamic_fixture import get from textclassifier.validators import ClassifierValidator -from readthedocs.builds.constants import LATEST +from readthedocs.builds.constants import LATEST, STABLE from readthedocs.builds.models import Version from readthedocs.projects.constants import ( PRIVATE, @@ -230,6 +230,15 @@ def setUp(self): identifier='public/4', verbose_name='public/4', ) + get( + Version, + project=self.project, + slug='stable', + active=True, + privacy_level=PUBLIC, + identifier='ab96cbff71a8f40a4240aaf9d12e6c10', + verbose_name='stable', + ) get( Version, project=self.project, @@ -258,13 +267,14 @@ def test_list_only_active_versions_on_default_version(self): slug for slug, _ in form.fields['default_version'].widget.choices }, - {'latest', 'public-1', 'public-2', 'private', 'protected'}, + {'latest', 'public-1', 'public-2', 'stable', 'private', 'protected'}, ) def test_list_only_non_auto_generated_versions_on_default_branch(self): form = ProjectAdvancedForm(instance=self.project) # This version is created automatically by the project on save latest = self.project.versions.filter(slug=LATEST) + stable = self.project.versions.filter(slug=STABLE) self.assertTrue(latest.exists()) self.assertEqual( { @@ -273,11 +283,16 @@ def test_list_only_non_auto_generated_versions_on_default_branch(self): }, { None, 'public-1', 'public-2', - 'public-3', 'public/4', 'protected', 'private', + 'public-3', 'public/4', 'stable', 'protected', 'private', }, ) self.assertNotIn( - latest.first().identifier, + latest.first().verbose_name, + [identifier for identifier, _ in form.fields[ + 'default_branch'].widget.choices], + ) + self.assertNotIn( + stable.first().commit_name, [identifier for identifier, _ in form.fields[ 'default_branch'].widget.choices], ) From 1af5e1dd3726b12c5b3d32b7729f705158da12d6 Mon Sep 17 00:00:00 2001 From: saadmk11 Date: Tue, 2 Apr 2019 20:56:39 +0600 Subject: [PATCH 4/5] Tests Updated --- .../rtd_tests/tests/test_project_forms.py | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/readthedocs/rtd_tests/tests/test_project_forms.py b/readthedocs/rtd_tests/tests/test_project_forms.py index 6b10b70c001..975c84d623e 100644 --- a/readthedocs/rtd_tests/tests/test_project_forms.py +++ b/readthedocs/rtd_tests/tests/test_project_forms.py @@ -230,15 +230,6 @@ def setUp(self): identifier='public/4', verbose_name='public/4', ) - get( - Version, - project=self.project, - slug='stable', - active=True, - privacy_level=PUBLIC, - identifier='ab96cbff71a8f40a4240aaf9d12e6c10', - verbose_name='stable', - ) get( Version, project=self.project, @@ -267,30 +258,43 @@ def test_list_only_active_versions_on_default_version(self): slug for slug, _ in form.fields['default_version'].widget.choices }, - {'latest', 'public-1', 'public-2', 'stable', 'private', 'protected'}, + {'latest', 'public-1', 'public-2', 'private', 'protected'}, ) def test_list_only_non_auto_generated_versions_on_default_branch(self): + user_created_stable_version = get( + Version, + project=self.project, + slug='stable', + active=True, + privacy_level=PUBLIC, + identifier='ab96cbff71a8f40a4240aaf9d12e6c10', + verbose_name='stable', + ) form = ProjectAdvancedForm(instance=self.project) # This version is created automatically by the project on save latest = self.project.versions.filter(slug=LATEST) + # User created `stable` version stable = self.project.versions.filter(slug=STABLE) self.assertTrue(latest.exists()) + # show only the versions that are not auto generated as choices self.assertEqual( { identifier for identifier, _ in form.fields['default_branch'].widget.choices }, { - None, 'public-1', 'public-2', - 'public-3', 'public/4', 'stable', 'protected', 'private', + None, 'stable', 'public-1', 'public-2', + 'public-3', 'public/4', 'protected', 'private', }, ) + # Auto generated version `latest` should not be among the choices self.assertNotIn( latest.first().verbose_name, [identifier for identifier, _ in form.fields[ 'default_branch'].widget.choices], ) + # `commit_name` can not be used as the value of the choice for `stable` self.assertNotIn( stable.first().commit_name, [identifier for identifier, _ in form.fields[ From 4340888ce95bd66398f623d2eca8a68e29ef8f63 Mon Sep 17 00:00:00 2001 From: saadmk11 Date: Wed, 3 Apr 2019 20:57:59 +0600 Subject: [PATCH 5/5] Created new test case for Default branch --- .../rtd_tests/tests/test_project_forms.py | 107 +++++++++++++++--- 1 file changed, 89 insertions(+), 18 deletions(-) diff --git a/readthedocs/rtd_tests/tests/test_project_forms.py b/readthedocs/rtd_tests/tests/test_project_forms.py index 975c84d623e..50d9815d051 100644 --- a/readthedocs/rtd_tests/tests/test_project_forms.py +++ b/readthedocs/rtd_tests/tests/test_project_forms.py @@ -261,21 +261,63 @@ def test_list_only_active_versions_on_default_version(self): {'latest', 'public-1', 'public-2', 'private', 'protected'}, ) - def test_list_only_non_auto_generated_versions_on_default_branch(self): + def test_default_version_field_if_no_active_version(self): + project_1 = get(Project) + project_1.versions.filter(active=True).update(active=False) + + # No active versions of project exists + self.assertFalse(project_1.versions.filter(active=True).exists()) + + form = ProjectAdvancedForm(instance=project_1) + self.assertTrue(form.fields['default_version'].widget.attrs['readonly']) + self.assertEqual(form.fields['default_version'].initial, 'latest') + + +class TestProjectAdvancedFormDefaultBranch(TestCase): + + def setUp(self): + self.project = get(Project) user_created_stable_version = get( Version, project=self.project, slug='stable', active=True, privacy_level=PUBLIC, - identifier='ab96cbff71a8f40a4240aaf9d12e6c10', + identifier='ab96cbff71a8f40a4340aaf9d12e6c10', verbose_name='stable', ) + get( + Version, + project=self.project, + slug='public-1', + active=True, + privacy_level=PUBLIC, + identifier='public-1', + verbose_name='public-1', + ) + get( + Version, + project=self.project, + slug='private', + active=True, + privacy_level=PRIVATE, + identifier='private', + verbose_name='private', + ) + get( + Version, + project=self.project, + slug='protected', + active=True, + privacy_level=PROTECTED, + identifier='protected', + verbose_name='protected', + ) + + def test_list_only_non_auto_generated_versions_on_default_branch(self): form = ProjectAdvancedForm(instance=self.project) # This version is created automatically by the project on save latest = self.project.versions.filter(slug=LATEST) - # User created `stable` version - stable = self.project.versions.filter(slug=STABLE) self.assertTrue(latest.exists()) # show only the versions that are not auto generated as choices self.assertEqual( @@ -284,8 +326,7 @@ def test_list_only_non_auto_generated_versions_on_default_branch(self): for identifier, _ in form.fields['default_branch'].widget.choices }, { - None, 'stable', 'public-1', 'public-2', - 'public-3', 'public/4', 'protected', 'private', + None, 'stable', 'public-1', 'protected', 'private', }, ) # Auto generated version `latest` should not be among the choices @@ -294,23 +335,53 @@ def test_list_only_non_auto_generated_versions_on_default_branch(self): [identifier for identifier, _ in form.fields[ 'default_branch'].widget.choices], ) - # `commit_name` can not be used as the value of the choice for `stable` - self.assertNotIn( - stable.first().commit_name, + + def test_list_user_created_latest_and_stable_versions_on_default_branch(self): + self.project.versions.filter(slug=LATEST).first().delete() + user_created_latest_version = get( + Version, + project=self.project, + slug='latest', + active=True, + privacy_level=PUBLIC, + identifier='ab96cbff71a8f40a4240aaf9d12e6c10', + verbose_name='latest', + ) + form = ProjectAdvancedForm(instance=self.project) + # This version is created by the user + latest = self.project.versions.filter(slug=LATEST) + # This version is created by the user + stable = self.project.versions.filter(slug=STABLE) + + self.assertIn( + latest.first().verbose_name, + [identifier for identifier, _ in form.fields[ + 'default_branch'].widget.choices], + ) + self.assertIn( + stable.first().verbose_name, [identifier for identifier, _ in form.fields[ 'default_branch'].widget.choices], ) - def test_default_version_field_if_no_active_version(self): - project_1 = get(Project) - project_1.versions.filter(active=True).update(active=False) - - # No active versions of project exists - self.assertFalse(project_1.versions.filter(active=True).exists()) + def test_commit_name_not_in_default_branch_choices(self): + form = ProjectAdvancedForm(instance=self.project) + # This version is created by the user + latest = self.project.versions.filter(slug=LATEST) + # This version is created by the user + stable = self.project.versions.filter(slug=STABLE) - form = ProjectAdvancedForm(instance=project_1) - self.assertTrue(form.fields['default_version'].widget.attrs['readonly']) - self.assertEqual(form.fields['default_version'].initial, 'latest') + # `commit_name` can not be used as the value for the choices + self.assertNotIn( + latest.first().commit_name, + [identifier for identifier, _ in form.fields[ + 'default_branch'].widget.choices], + ) + self.assertNotIn( + stable.first().commit_name, + [identifier for identifier, _ in form.fields[ + 'default_branch'].widget.choices], + ) class TestTranslationForms(TestCase):