def test_recreate_parent_dir_of_deleted_file(self): addon, repo, parent_version, new_version = \ self.create_new_version_for_addon( 'webextension_signed_already.xpi') apply_changes(repo, new_version, '', 'META-INF/mozilla.rsa', delete=True) data = self.serialize(new_version.current_file, parent_version=parent_version) entries_by_file = {e['path']: e for e in data['entries'].values()} parent_dir = 'META-INF' assert parent_dir in entries_by_file.keys() parent = entries_by_file[parent_dir] assert parent['depth'] == 0 assert parent['filename'] == parent_dir assert parent['sha256'] is None assert parent['mime_category'] == 'directory' assert parent['mimetype'] == 'application/octet-stream' assert parent['path'] == parent_dir assert parent['size'] is None assert parent['modified'] is None
def test_do_not_recreate_parent_dir_if_it_exists(self): addon, repo, parent_version, new_version = \ self.create_new_version_for_addon('https-everywhere.xpi') # Delete a file within a directory but modify another file. # This will preserve the directory, i.e. we won't have to # recreate it. apply_changes(repo, new_version, '', 'chrome-resources/css/chrome_shared.css', delete=True) apply_changes(repo, new_version, '/* new content */', 'chrome-resources/css/widgets.css') data = self.serialize(new_version.current_file, parent_version=parent_version) entries_by_file = {e['path']: e for e in data['entries'].values()} parent_dir = 'chrome-resources/css' assert parent_dir in entries_by_file.keys() parent = entries_by_file[parent_dir] assert parent['mime_category'] == 'directory' assert parent['mimetype'] == 'application/octet-stream' assert parent['path'] == parent_dir # Since the directory is returned from git, it will have a real # modified timestamp. assert parent['modified'] is not None
def test_expose_grandparent_dir_deleted_subfolders(self): addon, repo, parent_version, new_version = \ self.create_new_version_for_addon('deeply-nested.zip') apply_changes( repo, new_version, '', 'chrome/icons/de/foo.png', delete=True) data = self.serialize( new_version.current_file, parent_version=parent_version) entries_by_file = { e['path']: e for e in data['entries'].values() } # Check that we correctly include grand-parent folders too # See https://github.com/mozilla/addons-server/issues/13092 grandparent_dir = 'chrome' assert grandparent_dir in entries_by_file.keys() parent = entries_by_file[grandparent_dir] assert parent['mime_category'] == 'directory' assert parent['mimetype'] == 'application/octet-stream' assert parent['path'] == grandparent_dir assert parent['depth'] == 0
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 # We deleted the selected file, so there should be a diff. assert data['diff'] is not None assert data['diff']['mode'] == 'D'
def test_do_not_recreate_parent_dir_of_deleted_root_file(self): addon, repo, parent_version, new_version = \ self.create_new_version_for_addon( 'webextension_signed_already.xpi') apply_changes(repo, new_version, '', 'manifest.json', delete=True) data = self.serialize(new_version.current_file, parent_version=parent_version) entries_by_file = {e['path']: e for e in data['entries'].values()} # Since we just deleted a root file, no additional entries # should have been added for its parent directory. assert list(sorted(entries_by_file.keys())) == [ 'META-INF', 'META-INF/mozilla.rsa', 'index.js', 'manifest.json', ]
def test_recreate_nested_parent_dir_of_deleted_file(self): addon, repo, parent_version, new_version = \ self.create_new_version_for_addon('https-everywhere.xpi') apply_changes(repo, new_version, '', '_locales/ru/messages.json', delete=True) data = self.serialize(new_version.current_file, parent_version=parent_version) entries_by_file = {e['path']: e for e in data['entries'].values()} parent_dir = '_locales/ru' assert parent_dir in entries_by_file.keys() parent = entries_by_file[parent_dir] assert parent['depth'] == 1 assert parent['filename'] == 'ru' assert parent['path'] == parent_dir
def test_basic(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, 'Updated test file\n', 'test.txt') apply_changes(repo, new_version, '', 'README.md', delete=True) file = self.addon.current_version.current_file data = self.serialize(file, parent_version=parent_version) assert data['id'] == file.pk assert data['status'] == 'public' assert data['hash'] == '' assert data['is_webextension'] is True assert data['created'] == ( file.created.replace(microsecond=0).isoformat() + 'Z') assert data['url'] == ('http://testserver/firefox/downloads/file/{}' '/webextension_no_id.xpi?src=').format(file.pk) assert data['selected_file'] == 'manifest.json' assert data['download_url'] == absolutify( reverse('reviewers.download_git_file', kwargs={ 'version_id': self.addon.current_version.pk, 'filename': 'manifest.json' })) assert set(data['entries'].keys()) == { 'manifest.json', 'README.md', 'test.txt' } # Unmodified file manifest_data = data['entries']['manifest.json'] assert manifest_data['depth'] == 0 assert manifest_data['filename'] == u'manifest.json' assert manifest_data['sha256'] == ( 'bf9b0744c0011cad5caa55236951eda523f17676e91353a64a32353eac798631') assert manifest_data['mimetype'] == 'application/json' assert manifest_data['mime_category'] == 'text' assert manifest_data['path'] == u'manifest.json' assert manifest_data['size'] == 621 assert manifest_data['status'] == '' assert isinstance(manifest_data['modified'], datetime) # Added a new file test_txt_data = data['entries']['test.txt'] assert test_txt_data['depth'] == 0 assert test_txt_data['filename'] == u'test.txt' assert test_txt_data['sha256'] == ( 'f8b40fc302692ea4f552cb3d60bc89dd8b4616e398de5585e471cee73e2c0618') assert test_txt_data['mimetype'] == 'text/plain' assert test_txt_data['mime_category'] == 'text' assert test_txt_data['path'] == u'test.txt' assert test_txt_data['size'] == 18 assert test_txt_data['status'] == 'A' # Deleted file readme_data = data['entries']['README.md'] assert readme_data['status'] == 'D' assert readme_data['depth'] == 0 assert readme_data['filename'] == 'README.md' assert readme_data['sha256'] is None # Not testing mimetype as text/markdown is missing in travis mimetypes # database. But it doesn't matter much here since we're primarily # after the git status. assert readme_data['mime_category'] is None assert readme_data['path'] == u'README.md' assert readme_data['size'] is None assert readme_data['modified'] is None
def test_basic(self): expected_file_type = 'text' expected_filename = 'manifest.json' expected_mimetype = 'application/json' expected_sha256 = ( 'bf9b0744c0011cad5caa55236951eda523f17676e91353a64a32353eac798631') expected_size = 621 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, 'Updated test file\n', 'test.txt') apply_changes(repo, new_version, '', 'README.md', delete=True) file = self.addon.current_version.current_file data = self.serialize(file, parent_version=parent_version) assert data['id'] == file.pk assert data['base_file'] == {'id': parent_version.current_file.pk} assert data['status'] == 'public' assert data['hash'] == '' assert data['is_webextension'] is True assert data['created'] == ( file.created.replace(microsecond=0).isoformat() + 'Z') assert data['url'] == ('http://testserver/firefox/downloads/file/{}' '/webextension_no_id.xpi?src=').format(file.pk) assert data['selected_file'] == 'manifest.json' assert data['download_url'] == absolutify( reverse('reviewers.download_git_file', kwargs={ 'version_id': self.addon.current_version.pk, 'filename': 'manifest.json' })) assert not data['uses_unknown_minified_code'] assert data['mimetype'] == expected_mimetype assert data['sha256'] == expected_sha256 assert data['size'] == expected_size assert data['mime_category'] == expected_file_type assert data['filename'] == expected_filename assert set(data['entries'].keys()) == { 'manifest.json', 'README.md', 'test.txt' } # The API always renders a diff, even for unmodified files. assert data['diff'] is not None assert not data['uses_unknown_minified_code'] # Unmodified file manifest_data = data['entries']['manifest.json'] assert manifest_data['depth'] == 0 assert manifest_data['filename'] == expected_filename assert manifest_data['mime_category'] == expected_file_type assert manifest_data['path'] == u'manifest.json' assert manifest_data['status'] == '' # Added a new file test_txt_data = data['entries']['test.txt'] assert test_txt_data['depth'] == 0 assert test_txt_data['filename'] == u'test.txt' assert test_txt_data['mime_category'] == 'text' assert test_txt_data['path'] == u'test.txt' assert test_txt_data['status'] == 'A' # Deleted file readme_data = data['entries']['README.md'] assert readme_data['status'] == 'D' assert readme_data['depth'] == 0 assert readme_data['filename'] == 'README.md' # Not testing mimetype as text/markdown is missing in travis mimetypes # database. But it doesn't matter much here since we're primarily # after the git status. assert readme_data['mime_category'] is None assert readme_data['path'] == u'README.md'