Fix download_url when requested file is known but does not exist in the tree anymore (#11368)

This commit is contained in:
William Durand 2019-05-08 14:12:20 +02:00 коммит произвёл GitHub
Родитель 0d4f6d0722
Коммит 1dabe26160
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
4 изменённых файлов: 47 добавлений и 2 удалений

Просмотреть файл

@ -159,7 +159,7 @@ This endpoint allows you to compare two Add-on versions with each other.
.. http:get:: /api/v4/reviewers/addon/(int:addon_id)/versions/(int:version_id)/compare_to/(int:version_id)/
Inherits most properties from :ref:`browse detail <reviewers-versions-browse-detail>`, except that most of the `file.entries[]` properties
can be `null` in case of a deleted file.
and `file.download_url` can be `null` in case of a deleted file.
Properties specific to this endpoint:

Просмотреть файл

@ -203,7 +203,12 @@ class FileEntriesSerializer(FileSerializer):
commit = self._get_commit(obj)
tree = self.repo.get_root_tree(commit)
selected_file = self.get_selected_file(obj)
blob_or_tree = tree[selected_file]
try:
blob_or_tree = tree[selected_file]
except KeyError:
# This can happen when the file has been deleted.
return None
if blob_or_tree.type == 'tree':
return None

Просмотреть файл

@ -286,6 +286,23 @@ class TestFileEntriesDiffSerializer(TestCase):
assert readme_data['size'] is None
assert readme_data['modified'] is None
def test_serialize_deleted_file(self):
parent_version = self.addon.current_version
new_version = version_factory(
addon=self.addon, file_kw={
'filename': 'webextension_no_id.xpi',
'is_webextension': True,
}
)
repo = AddonGitRepository.extract_and_commit_from_version(new_version)
apply_changes(repo, new_version, '', 'manifest.json', delete=True)
file = self.addon.current_version.current_file
data = self.serialize(file, parent_version=parent_version)
assert data['download_url'] is None
@pytest.mark.parametrize(
'entry, filename, expected_category, expected_mimetype',

Просмотреть файл

@ -5726,6 +5726,29 @@ class TestReviewAddonVersionCompareViewSet(
}
]
def test_get_deleted_file(self):
new_version = version_factory(
addon=self.addon, file_kw={'filename': 'webextension_no_id.xpi'})
repo = AddonGitRepository.extract_and_commit_from_version(new_version)
deleted_file = 'README.md'
apply_changes(repo, new_version, '', deleted_file, delete=True)
user = UserProfile.objects.create(username='reviewer')
self.grant_permission(user, 'Addons:Review')
self.client.login_api(user)
self.url = reverse_ns('reviewers-versions-compare-detail', kwargs={
'addon_pk': self.addon.pk,
'version_pk': self.version.pk,
'pk': new_version.pk})
response = self.client.get(self.url + '?file=' + deleted_file)
assert response.status_code == 200
result = json.loads(response.content)
assert result['file']['download_url'] is None
class TestDownloadGitFileView(TestCase):
def setUp(self):