diff --git a/airlock/business_logic.py b/airlock/business_logic.py index 21c59ae5..9d68e336 100644 --- a/airlock/business_logic.py +++ b/airlock/business_logic.py @@ -266,6 +266,14 @@ def all_files_set(self): for request_file in filegroup.files.values() } + def output_files_set(self): + """Return the relpaths for output files on the request""" + return { + request_file.relpath + for filegroup in self.filegroups.values() + for request_file in filegroup.output_files + } + def is_supporting_file(self, urlpath: UrlPath): try: return self.get_request_file(urlpath).filetype == RequestFileType.SUPPORTING @@ -633,8 +641,10 @@ def _verify_permission_to_review_file( "only an output checker can approve a file" ) - if path not in release_request.file_set(): - raise self.ApprovalPermissionDenied("file is not part of the request") + if path not in release_request.output_files_set(): + raise self.ApprovalPermissionDenied( + "file is not an output file on this request" + ) def approve_file(self, release_request: ReleaseRequest, user: User, path: Path): """ "Approve a file""" diff --git a/tests/unit/test_business_logic.py b/tests/unit/test_business_logic.py index f91a22d4..caca33f3 100644 --- a/tests/unit/test_business_logic.py +++ b/tests/unit/test_business_logic.py @@ -610,6 +610,20 @@ def test_approve_file_not_part_of_request(bll): bll.approve_file(release_request, checker, bad_path) +def test_approve_supporting_file(bll): + release_request, path, author = setup_empty_release_request() + checker = factories.create_user("checker", [], True) + + bll.add_file_to_request( + release_request, path, author, filetype=RequestFileType.SUPPORTING + ) + bll.set_status( + release_request=release_request, to_status=RequestStatus.SUBMITTED, user=author + ) + with pytest.raises(bll.ApprovalPermissionDenied): + bll.approve_file(release_request, checker, path) + + def test_approve_file(bll): release_request, path, author = setup_empty_release_request() checker = factories.create_user("checker", [], True)