Merge lp:~cjwatson/launchpad/git-register-merge-missing-path into lp:launchpad

Proposed by Colin Watson
Status: Merged
Merged at revision: 17476
Proposed branch: lp:~cjwatson/launchpad/git-register-merge-missing-path
Merge into: lp:launchpad
Diff against target: 143 lines (+92/-26)
2 files modified
lib/lp/code/browser/gitref.py (+26/-26)
lib/lp/code/browser/tests/test_branchmergeproposal.py (+66/-0)
To merge this branch: bzr merge lp:~cjwatson/launchpad/git-register-merge-missing-path
Reviewer Review Type Date Requested Status
William Grant code Approve
Review via email: mp+258121@code.launchpad.net

Commit message

Fix GitRefRegisterMergeProposalView.validate to stop assuming that all required fields are present.

Description of the change

Fix GitRefRegisterMergeProposalView.validate to stop assuming that all required fields are present.

To post a comment you must log in.
Revision history for this message
William Grant (wgrant) wrote :

Probably worth factoring the target/prereq validate bits out.

review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/lp/code/browser/gitref.py'
--- lib/lp/code/browser/gitref.py 2015-04-28 16:48:22 +0000
+++ lib/lp/code/browser/gitref.py 2015-05-05 10:16:00 +0000
@@ -293,36 +293,36 @@
293 except InvalidBranchMergeProposal as error:293 except InvalidBranchMergeProposal as error:
294 self.addError(str(error))294 self.addError(str(error))
295295
296 def _validateRef(self, data, name):
297 repository = data.get('%s_git_repository' % name)
298 path = data.get('%s_git_path' % name)
299 if path:
300 ref = repository.getRefByPath(path)
301 else:
302 ref = None
303 if ref is None:
304 self.setFieldError(
305 '%s_git_path' % name,
306 "The %s path must be the path of a reference in the "
307 "%s repository." % (name, name))
308 elif ref == self.context:
309 self.setFieldError(
310 '%s_git_path' % name,
311 "The %s repository and path together cannot be the same "
312 "as the source repository and path." % name)
313 return repository
314
296 def validate(self, data):315 def validate(self, data):
297 source_ref = self.context316 source_ref = self.context
298 target_repository = data['target_git_repository']317 target_repository = self._validateRef(data, 'target')
299 target_ref = target_repository.getRefByPath(data['target_git_path'])318 if not target_repository.isRepositoryMergeable(source_ref.repository):
300 if target_ref is None:
301 self.setFieldError(
302 'target_git_path',
303 "The target path must be the path of a reference in the "
304 "target repository.")
305 elif source_ref == target_ref:
306 self.setFieldError(
307 'target_git_path',
308 "The target repository and path together cannot be the same "
309 "as the source repository and path.")
310 elif not target_repository.isRepositoryMergeable(self.context):
311 self.setFieldError(319 self.setFieldError(
312 'target_git_repository',320 'target_git_repository',
313 "This repository is not mergeable into %s." %321 "%s is not mergeable into this repository." %
314 target_repository.identity)322 source_ref.repository.identity)
315 elif (data.get('prerequisite_git_repository') is not None and323 if data.get('prerequisite_git_repository') is not None:
316 data.get('prerequisite_git_path') is not None):324 prerequisite_repository = self._validateRef(data, 'prerequisite')
317 prerequisite_repository = data['prerequisite_git_repository']325 if not target_repository.isRepositoryMergeable(
318 prerequisite_ref = prerequisite_repository.getRefByPath(
319 data['prerequisite_git_path'])
320 if prerequisite_ref is None:
321 self.setFieldError(
322 'prerequisite_git_path',
323 "The prerequisite path must be the path of a reference in "
324 "the prerequisite repository.")
325 elif not target_repository.isRepositoryMergeable(
326 prerequisite_repository):326 prerequisite_repository):
327 self.setFieldError(327 self.setFieldError(
328 'prerequisite_git_repository',328 'prerequisite_git_repository',
329329
=== modified file 'lib/lp/code/browser/tests/test_branchmergeproposal.py'
--- lib/lp/code/browser/tests/test_branchmergeproposal.py 2015-04-28 16:48:22 +0000
+++ lib/lp/code/browser/tests/test_branchmergeproposal.py 2015-05-05 10:16:00 +0000
@@ -808,6 +808,72 @@
808 'form_wide_errors': []},808 'form_wide_errors': []},
809 simplejson.loads(view.form_result))809 simplejson.loads(view.form_result))
810810
811 def test_register_ajax_request_with_missing_target_git_path(self):
812 # A missing target_git_path is a validation error.
813 owner = self.factory.makePerson()
814 target_branch = self._makeTargetBranch(
815 owner=owner, information_type=InformationType.USERDATA)
816 extra = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
817 with person_logged_in(owner):
818 request = LaunchpadTestRequest(
819 method='POST', principal=owner,
820 form={
821 'field.actions.register': 'Propose Merge',
822 'field.target_git_repository.target_git_repository':
823 target_branch.repository.unique_name,
824 },
825 **extra)
826 view = create_initialized_view(
827 self.source_branch,
828 name='+register-merge',
829 request=request)
830 self.assertEqual(
831 '400 Validation', view.request.response.getStatusString())
832 self.assertEqual(
833 {'error_summary': 'There is 1 error.',
834 'errors': {
835 'field.target_git_path':
836 ('The target path must be the path of a reference in the '
837 'target repository.')},
838 'form_wide_errors': []},
839 simplejson.loads(view.form_result))
840
841 def test_register_ajax_request_with_missing_prerequisite_git_path(self):
842 # A missing prerequisite_git_path is a validation error if
843 # prerequisite_git_repository is present.
844 owner = self.factory.makePerson()
845 target_branch = self._makeTargetBranch(
846 owner=owner, information_type=InformationType.USERDATA)
847 prerequisite_branch = self._makeTargetBranch(
848 owner=owner, information_type=InformationType.USERDATA)
849 extra = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
850 with person_logged_in(owner):
851 request = LaunchpadTestRequest(
852 method='POST', principal=owner,
853 form={
854 'field.actions.register': 'Propose Merge',
855 'field.target_git_repository.target_git_repository':
856 target_branch.repository.unique_name,
857 'field.target_git_path': target_branch.path,
858 'field.prerequisite_git_repository':
859 prerequisite_branch.repository.unique_name,
860 },
861 **extra)
862 view = create_initialized_view(
863 self.source_branch,
864 name='+register-merge',
865 request=request)
866 self.assertEqual(
867 '400 Validation', view.request.response.getStatusString())
868 self.assertEqual(
869 {'error_summary': 'There is 1 error.',
870 'errors': {
871 'field.prerequisite_git_path':
872 ('The prerequisite path must be the path of a reference '
873 'in the prerequisite repository.')},
874 'form_wide_errors': []},
875 simplejson.loads(view.form_result))
876
811877
812class TestBranchMergeProposalResubmitViewMixin:878class TestBranchMergeProposalResubmitViewMixin:
813 """Test BranchMergeProposalResubmitView."""879 """Test BranchMergeProposalResubmitView."""