def extract_file(file_id, **kw): # This message is for end users so they'll see a nice error. viewer = FileViewer(File.objects.get(pk=file_id)) msg = Message('file-viewer:%s' % viewer) msg.delete() # This flag is so that we can signal when the extraction is completed. flag = Message(viewer._extraction_cache_key()) task_log.debug('[1@%s] Unzipping %s for file viewer.' % (extract_file.rate_limit, viewer)) try: flag.save('extracting') # Set the flag to a truthy value. viewer.extract() except Exception, err: if settings.DEBUG: msg.save( _('There was an error accessing file %s. %s.') % (viewer, err)) else: msg.save(_('There was an error accessing file %s.') % viewer) task_log.error('[1@%s] Error unzipping: %s' % (extract_file.rate_limit, err))
def extract_file(file_id, **kw): # This message is for end users so they'll see a nice error. viewer = FileViewer(File.objects.get(pk=file_id)) msg = Message('file-viewer:%s' % viewer) msg.delete() # This flag is so that we can signal when the extraction is completed. flag = Message(viewer._extraction_cache_key()) task_log.debug('[1@%s] Unzipping %s for file viewer.' % ( extract_file.rate_limit, viewer)) try: flag.save('extracting') # Set the flag to a truthy value. viewer.extract() except Exception, err: if settings.DEBUG: msg.save(_('There was an error accessing file %s. %s.') % (viewer, err)) else: msg.save(_('There was an error accessing file %s.') % viewer) task_log.error('[1@%s] Error unzipping: %s' % (extract_file.rate_limit, err))
class TestFileHelper(TestCase): def setUp(self): self.viewer = FileViewer(make_file(1, get_file('dictionary-test.xpi'))) def tearDown(self): self.viewer.cleanup() def test_files_not_extracted(self): eq_(self.viewer.is_extracted(), False) def test_files_extracted(self): self.viewer.extract() eq_(self.viewer.is_extracted(), True) def test_recurse_extract(self): self.viewer.src = get_file('recurse.xpi') self.viewer.extract() eq_(self.viewer.is_extracted(), True) def test_recurse_contents(self): self.viewer.src = get_file('recurse.xpi') self.viewer.extract() files = self.viewer.get_files() nm = ['recurse/recurse.xpi/chrome/test-root.txt', 'recurse/somejar.jar/recurse/recurse.xpi/chrome/test.jar', 'recurse/somejar.jar/recurse/recurse.xpi/chrome/test.jar/test'] for name in nm: eq_(name in files, True, 'File %r not extracted' % name) def test_cleanup(self): self.viewer.extract() self.viewer.cleanup() eq_(self.viewer.is_extracted(), False) def test_truncate(self): truncate = self.viewer.truncate for x, y in (['foo.rdf', 'foo.rdf'], ['somelongfilename.rdf', 'somelongfilenam...rdf'], [u'unicode삮.txt', u'unicode\uc0ae.txt'], [u'unicodesomelong삮.txt', u'unicodesomelong...txt'], ['somelongfilename.somelongextension', 'somelongfilenam...somelonge..'],): eq_(truncate(x), y) def test_get_files_not_extracted(self): assert not self.viewer.get_files() def test_get_files_size(self): self.viewer.extract() files = self.viewer.get_files() eq_(len(files), 14) def test_get_files_directory(self): self.viewer.extract() files = self.viewer.get_files() eq_(files['install.js']['directory'], False) eq_(files['install.js']['binary'], False) eq_(files['__MACOSX']['directory'], True) eq_(files['__MACOSX']['binary'], False) def test_url_file(self): self.viewer.extract() files = self.viewer.get_files() url = reverse('mkt.files.list', args=[self.viewer.file.id, 'file', 'install.js']) assert files['install.js']['url'].endswith(url) def test_get_files_depth(self): self.viewer.extract() files = self.viewer.get_files() eq_(files['dictionaries/license.txt']['depth'], 1) def test_bom(self): dest = os.path.join(settings.TMP_PATH, 'test_bom') open(dest, 'w').write('foo'.encode('utf-16')) self.viewer.select('foo') self.viewer.selected = {'full': dest, 'size': 1} eq_(self.viewer.read_file(), u'foo') os.remove(dest) def test_syntax(self): for filename, syntax in [('foo.rdf', 'xml'), ('foo.xul', 'xml'), ('foo.json', 'js'), ('foo.jsm', 'js'), ('foo.js', 'js'), ('manifest.webapp', 'js'), ('foo.html', 'html'), ('foo.css', 'css'), ('foo.bar', 'plain')]: eq_(self.viewer.get_syntax(filename), syntax) def test_file_order(self): self.viewer.extract() dest = self.viewer.dest open(os.path.join(dest, 'chrome.manifest'), 'w') subdir = os.path.join(dest, 'chrome') os.mkdir(subdir) open(os.path.join(subdir, 'foo'), 'w') cache.clear() files = self.viewer.get_files().keys() rt = files.index(u'chrome') eq_(files[rt:rt + 3], [u'chrome', u'chrome/foo', u'dictionaries']) @patch.object(settings, 'FILE_VIEWER_SIZE_LIMIT', 5) def test_file_size(self): self.viewer.extract() self.viewer.get_files() self.viewer.select('install.js') res = self.viewer.read_file() eq_(res, '') assert self.viewer.selected['msg'].startswith('File size is') @patch.object(settings, 'FILE_VIEWER_SIZE_LIMIT', 5) def test_file_size_unicode(self): with self.activate(locale='he'): self.viewer.extract() self.viewer.get_files() self.viewer.select('install.js') res = self.viewer.read_file() eq_(res, '') assert self.viewer.selected['msg'].startswith('File size is') @patch.object(settings, 'FILE_UNZIP_SIZE_LIMIT', 5) def test_contents_size(self): self.assertRaises(forms.ValidationError, self.viewer.extract) def test_default(self): eq_(self.viewer.get_default(None), 'manifest.webapp') def test_delete_mid_read(self): self.viewer.extract() self.viewer.select('install.js') os.remove(os.path.join(self.viewer.dest, 'install.js')) res = self.viewer.read_file() eq_(res, '') assert self.viewer.selected['msg'].startswith('That file no') @patch('mkt.files.helpers.get_md5') def test_delete_mid_tree(self, get_md5): get_md5.side_effect = IOError('ow') self.viewer.extract() eq_({}, self.viewer.get_files())
class FilesBase(object): def login_as_editor(self): assert self.client.login(username='******', password='******') def setUp(self): self.app = Webapp.objects.get(pk=337141) self.app.update(is_packaged=True, status=amo.WEBAPPS_UNREVIEWED_STATUS) self.dev = self.app.authors.all()[0] self.regular = UserProfile.objects.get(pk=999) self.version = self.app.versions.latest() self.file = self.version.all_files[0] self.versions = [self.version, self.app.versions.create( version='%s.1' % self.version.version)] self.files = [self.file, File.objects.create(version=self.versions[1], filename='webapp.zip')] self.login_as_editor() for file_obj in self.files: src = os.path.join(settings.ROOT, packaged_app) try: os.makedirs(os.path.dirname(file_obj.file_path)) except OSError: pass shutil.copyfile(src, file_obj.file_path) self.file_viewer = FileViewer(self.file) def tearDown(self): self.file_viewer.cleanup() def files_redirect(self, file): return reverse('mkt.files.redirect', args=[self.file.pk, file]) def files_serve(self, file): return reverse('mkt.files.serve', args=[self.file.pk, file]) def test_view_access_anon(self): self.client.logout() self.check_urls(403) def test_view_access_editor(self): self.file_viewer.extract() self.check_urls(200) def test_view_access_developer(self): self.client.logout() assert self.client.login(username=self.dev.email, password='******') self.file_viewer.extract() self.check_urls(200) def test_view_access_another_developer(self): self.client.logout() assert self.client.login(username=self.regular.email, password='******') self.file_viewer.extract() self.check_urls(403) def test_poll_extracted(self): self.file_viewer.extract() res = self.client.get(self.poll_url()) eq_(res.status_code, 200) eq_(json.loads(res.content)['status'], True) def test_poll_not_extracted(self): res = self.client.get(self.poll_url()) eq_(res.status_code, 200) eq_(json.loads(res.content)['status'], False) def test_poll_extracted_anon(self): self.client.logout() res = self.client.get(self.poll_url()) eq_(res.status_code, 403) def test_content_headers(self): self.file_viewer.extract() res = self.client.get(self.file_url('manifest.webapp')) assert 'etag' in res._headers assert 'last-modified' in res._headers def test_content_headers_etag(self): self.file_viewer.extract() self.file_viewer.select('manifest.webapp') obj = getattr(self.file_viewer, 'left', self.file_viewer) etag = obj.selected.get('md5') res = self.client.get(self.file_url('manifest.webapp'), HTTP_IF_NONE_MATCH=etag) eq_(res.status_code, 304) def test_content_headers_if_modified(self): self.file_viewer.extract() self.file_viewer.select('manifest.webapp') obj = getattr(self.file_viewer, 'left', self.file_viewer) date = http_date(obj.selected.get('modified')) res = self.client.get(self.file_url('manifest.webapp'), HTTP_IF_MODIFIED_SINCE=date) eq_(res.status_code, 304) def test_file_header(self): self.file_viewer.extract() res = self.client.get(self.file_url(not_binary)) eq_(res.status_code, 200) url = res.context['file_link']['url'] eq_(url, reverse('reviewers.apps.review', args=[self.app.app_slug])) def test_content_no_file(self): self.file_viewer.extract() res = self.client.get(self.file_url()) doc = pq(res.content) eq_(len(doc('#content')), 0) def test_no_files(self): self.file_viewer.cleanup() res = self.client.get(self.file_url()) eq_(res.status_code, 200) assert 'files' in res.context def test_files(self): self.file_viewer.extract() res = self.client.get(self.file_url()) eq_(res.status_code, 200) assert 'files' in res.context def test_files_anon(self): self.client.logout() res = self.client.get(self.file_url()) eq_(res.status_code, 403) def test_files_file(self): self.file_viewer.extract() res = self.client.get(self.file_url(not_binary)) eq_(res.status_code, 200) assert 'selected' in res.context def test_files_back_link(self): self.file_viewer.extract() res = self.client.get(self.file_url(not_binary)) doc = pq(res.content) eq_(doc('#commands td:last').text(), 'Back to review') def test_diff_redirect(self): ids = self.files[0].id, self.files[1].id res = self.client.post(self.file_url(), {'left': ids[0], 'right': ids[1]}) eq_(res.status_code, 302) self.assert3xx(res, reverse('mkt.files.compare', args=ids)) def test_browse_redirect(self): ids = self.files[0].id, res = self.client.post(self.file_url(), {'left': ids[0]}) eq_(res.status_code, 302) self.assert3xx(res, reverse('mkt.files.list', args=ids)) def test_browse_deleted_version(self): self.file.version.delete() res = self.client.post(self.file_url(), {'left': self.file.id}) eq_(res.status_code, 404) def test_file_chooser(self): res = self.client.get(self.file_url()) doc = pq(res.content) left = doc('#id_left') eq_(len(left), 1) vers = left('option') eq_(len(vers), 3) # Only one file per version on Marketplace for the time being. eq_(vers.eq(0).text(), '') f = self.versions[1].all_files[0] eq_(vers.eq(1).text(), '%s (%s)' % (self.versions[1].version, amo.STATUS_CHOICES_API[f.status])) f = self.versions[0].all_files[0] eq_(vers.eq(2).text(), '%s (%s)' % (self.versions[0].version, amo.STATUS_CHOICES_API[f.status]))
class TestFileHelper(TestCase): def setUp(self): fn = get_file('dictionary-test.xpi') if storage_is_remote(): copy_stored_file(fn, fn, src_storage=local_storage) self.viewer = FileViewer(make_file(1, fn)) def tearDown(self): self.viewer.cleanup() def test_files_not_extracted(self): eq_(self.viewer.is_extracted(), False) def test_files_extracted(self): self.viewer.extract() eq_(self.viewer.is_extracted(), True) def test_cleanup(self): self.viewer.extract() self.viewer.cleanup() eq_(self.viewer.is_extracted(), False) def test_truncate(self): truncate = self.viewer.truncate for x, y in ( ['foo.rdf', 'foo.rdf'], ['somelongfilename.rdf', 'somelongfilenam...rdf'], [u'unicode삮.txt', u'unicode\uc0ae.txt'], [u'unicodesomelong삮.txt', u'unicodesomelong...txt'], [ 'somelongfilename.somelongextension', 'somelongfilenam...somelonge..' ], ): eq_(truncate(x), y) def test_get_files_not_extracted(self): assert not self.viewer.get_files() def test_get_files_size(self): self.viewer.extract() files = self.viewer.get_files() eq_(len(files), 15) def test_get_files_directory(self): self.viewer.extract() files = self.viewer.get_files() eq_(files['install.js']['directory'], False) eq_(files['install.js']['binary'], False) eq_(files['__MACOSX']['directory'], True) eq_(files['__MACOSX']['binary'], False) def test_url_file(self): self.viewer.extract() files = self.viewer.get_files() url = reverse('mkt.files.list', args=[self.viewer.file.id, 'file', 'install.js']) assert files['install.js']['url'].endswith(url) def test_get_files_depth(self): self.viewer.extract() files = self.viewer.get_files() eq_(files['dictionaries/license.txt']['depth'], 1) def test_bom(self): dest = os.path.join(settings.TMP_PATH, 'test_bom') with storage.open(dest, 'w') as f: f.write('foo'.encode('utf-16')) self.viewer.select('foo') self.viewer.selected = {'full': dest, 'size': 1} eq_(self.viewer.read_file(), u'foo') storage.delete(dest) def test_syntax(self): for filename, syntax in [('foo.rdf', 'xml'), ('foo.xul', 'xml'), ('foo.json', 'js'), ('foo.jsm', 'js'), ('foo.js', 'js'), ('manifest.webapp', 'js'), ('foo.html', 'html'), ('foo.css', 'css'), ('foo.bar', 'plain')]: eq_(self.viewer.get_syntax(filename), syntax) def test_file_order(self): self.viewer.extract() dest = self.viewer.dest storage.open(os.path.join(dest, 'manifest.webapp'), 'w').close() subdir = os.path.join(dest, 'chrome') with storage.open(os.path.join(subdir, 'foo'), 'w') as f: f.write('.') if not storage.exists(subdir): # Might be on S3, which doesn't have directories (and # django-storages doesn't support empty files). with storage.open(subdir, 'w') as f: f.write('.') cache.clear() files = self.viewer.get_files().keys() rt = files.index(u'chrome') eq_(files[rt:rt + 3], [u'chrome', u'chrome/foo', u'dictionaries']) @patch.object(settings, 'FILE_VIEWER_SIZE_LIMIT', 5) def test_file_size(self): self.viewer.extract() self.viewer.get_files() self.viewer.select('install.js') res = self.viewer.read_file() eq_(res, '') assert self.viewer.selected['msg'].startswith('File size is') @patch.object(settings, 'FILE_VIEWER_SIZE_LIMIT', 5) def test_file_size_unicode(self): with self.activate(locale='he'): self.viewer.extract() self.viewer.get_files() self.viewer.select('install.js') res = self.viewer.read_file() eq_(res, '') assert self.viewer.selected['msg'].startswith('File size is') @patch.object(settings, 'FILE_UNZIP_SIZE_LIMIT', 5) def test_contents_size(self): self.assertRaises(forms.ValidationError, self.viewer.extract) def test_default(self): eq_(self.viewer.get_default(None), 'manifest.webapp') def test_delete_mid_read(self): self.viewer.extract() self.viewer.select('install.js') storage.delete(os.path.join(self.viewer.dest, 'install.js')) res = self.viewer.read_file() eq_(res, '') assert self.viewer.selected['msg'].startswith('That file no') @patch('mkt.files.helpers.get_md5') def test_delete_mid_tree(self, get_md5): get_md5.side_effect = IOError('ow') self.viewer.extract() eq_({}, self.viewer.get_files())
class FilesBase(object): def login_as_editor(self): self.login('*****@*****.**') def setUp(self): self.app = Webapp.objects.get(pk=337141) self.app.update(is_packaged=True, status=mkt.WEBAPPS_UNREVIEWED_STATUS) self.dev = self.app.authors.all()[0] self.regular = UserProfile.objects.get(pk=999) self.version = self.app.versions.latest() self.file = self.version.all_files[0] self.versions = [ self.version, self.app.versions.create(version='%s.1' % self.version.version) ] self.files = [ self.file, File.objects.create(version=self.versions[1], filename='webapp.zip') ] self.login_as_editor() for file_obj in self.files: src = os.path.join(settings.ROOT, packaged_app) try: os.makedirs(os.path.dirname(file_obj.file_path)) except OSError: pass shutil.copyfile(src, file_obj.file_path) self.file_viewer = FileViewer(self.file) def tearDown(self): self.file_viewer.cleanup() def files_redirect(self, file): return reverse('mkt.files.redirect', args=[self.file.pk, file]) def files_serve(self, file): return reverse('mkt.files.serve', args=[self.file.pk, file]) def test_view_access_anon(self): self.client.logout() self.check_urls(403) def test_view_access_editor(self): self.file_viewer.extract() self.check_urls(200) def test_view_access_developer(self): self.client.logout() self.login(self.dev.email) self.file_viewer.extract() self.check_urls(200) def test_view_access_another_developer(self): self.client.logout() self.login(self.regular.email) self.file_viewer.extract() self.check_urls(403) def test_poll_extracted(self): self.file_viewer.extract() res = self.client.get(self.poll_url()) eq_(res.status_code, 200) eq_(json.loads(res.content)['status'], True) def test_poll_not_extracted(self): res = self.client.get(self.poll_url()) eq_(res.status_code, 200) eq_(json.loads(res.content)['status'], False) def test_poll_extracted_anon(self): self.client.logout() res = self.client.get(self.poll_url()) eq_(res.status_code, 403) def test_content_headers(self): self.file_viewer.extract() res = self.client.get(self.file_url('manifest.webapp')) assert 'etag' in res._headers assert 'last-modified' in res._headers def test_content_headers_etag(self): self.file_viewer.extract() self.file_viewer.select('manifest.webapp') obj = getattr(self.file_viewer, 'left', self.file_viewer) etag = obj.selected.get('md5') res = self.client.get(self.file_url('manifest.webapp'), HTTP_IF_NONE_MATCH=etag) eq_(res.status_code, 304) def test_content_headers_if_modified(self): self.file_viewer.extract() self.file_viewer.select('manifest.webapp') obj = getattr(self.file_viewer, 'left', self.file_viewer) date = http_date(obj.selected.get('modified')) res = self.client.get(self.file_url('manifest.webapp'), HTTP_IF_MODIFIED_SINCE=date) eq_(res.status_code, 304) def test_file_header(self): self.file_viewer.extract() res = self.client.get(self.file_url(not_binary)) eq_(res.status_code, 200) url = res.context['file_link']['url'] eq_(url, reverse('reviewers.apps.review', args=[self.app.app_slug])) def test_content_no_file(self): self.file_viewer.extract() res = self.client.get(self.file_url()) doc = pq(res.content) eq_(len(doc('#content')), 0) def test_no_files(self): self.file_viewer.cleanup() res = self.client.get(self.file_url()) eq_(res.status_code, 200) assert 'files' in res.context def test_files(self): self.file_viewer.extract() res = self.client.get(self.file_url()) eq_(res.status_code, 200) assert 'files' in res.context def test_files_anon(self): self.client.logout() res = self.client.get(self.file_url()) eq_(res.status_code, 403) def test_files_file(self): self.file_viewer.extract() res = self.client.get(self.file_url(not_binary)) eq_(res.status_code, 200) assert 'selected' in res.context def test_files_back_link(self): self.file_viewer.extract() res = self.client.get(self.file_url(not_binary)) doc = pq(res.content) eq_(doc('#commands td')[-1].text_content(), 'Back to review') def test_diff_redirect(self): ids = self.files[0].id, self.files[1].id res = self.client.post(self.file_url(), { 'left': ids[0], 'right': ids[1] }) eq_(res.status_code, 302) self.assert3xx(res, reverse('mkt.files.compare', args=ids)) def test_browse_redirect(self): ids = self.files[0].id, res = self.client.post(self.file_url(), {'left': ids[0]}) eq_(res.status_code, 302) self.assert3xx(res, reverse('mkt.files.list', args=ids)) def test_browse_deleted_version(self): self.file.version.delete() res = self.client.post(self.file_url(), {'left': self.file.id}) eq_(res.status_code, 404) def test_file_chooser(self): res = self.client.get(self.file_url()) doc = pq(res.content) left = doc('#id_left') eq_(len(left), 1) vers = left('option') eq_(len(vers), 3) # Only one file per version on Marketplace for the time being. eq_(vers.eq(0).text(), '') f = self.versions[1].all_files[0] eq_( vers.eq(1).text(), '%s (%s)' % (self.versions[1].version, mkt.STATUS_CHOICES_API[f.status])) f = self.versions[0].all_files[0] eq_( vers.eq(2).text(), '%s (%s)' % (self.versions[0].version, mkt.STATUS_CHOICES_API[f.status]))
class TestFileHelper(amo.tests.TestCase): def setUp(self): self.viewer = FileViewer(make_file(1, get_file('dictionary-test.xpi'))) def tearDown(self): self.viewer.cleanup() def test_files_not_extracted(self): eq_(self.viewer.is_extracted(), False) def test_files_extracted(self): self.viewer.extract() eq_(self.viewer.is_extracted(), True) def test_recurse_extract(self): self.viewer.src = get_file('recurse.xpi') self.viewer.extract() eq_(self.viewer.is_extracted(), True) def test_recurse_contents(self): self.viewer.src = get_file('recurse.xpi') self.viewer.extract() files = self.viewer.get_files() nm = [ 'recurse/recurse.xpi/chrome/test-root.txt', 'recurse/somejar.jar/recurse/recurse.xpi/chrome/test.jar', 'recurse/somejar.jar/recurse/recurse.xpi/chrome/test.jar/test' ] for name in nm: eq_(name in files, True, 'File %r not extracted' % name) def test_cleanup(self): self.viewer.extract() self.viewer.cleanup() eq_(self.viewer.is_extracted(), False) def test_truncate(self): truncate = self.viewer.truncate for x, y in ( ['foo.rdf', 'foo.rdf'], ['somelongfilename.rdf', 'somelongfilenam...rdf'], [u'unicode삮.txt', u'unicode\uc0ae.txt'], [u'unicodesomelong삮.txt', u'unicodesomelong...txt'], [ 'somelongfilename.somelongextension', 'somelongfilenam...somelonge..' ], ): eq_(truncate(x), y) def test_get_files_not_extracted(self): assert not self.viewer.get_files() def test_get_files_size(self): self.viewer.extract() files = self.viewer.get_files() eq_(len(files), 14) def test_get_files_directory(self): self.viewer.extract() files = self.viewer.get_files() eq_(files['install.js']['directory'], False) eq_(files['install.js']['binary'], False) eq_(files['__MACOSX']['directory'], True) eq_(files['__MACOSX']['binary'], False) def test_url_file(self): self.viewer.extract() files = self.viewer.get_files() url = reverse('mkt.files.list', args=[self.viewer.file.id, 'file', 'install.js']) assert files['install.js']['url'].endswith(url) def test_get_files_depth(self): self.viewer.extract() files = self.viewer.get_files() eq_(files['dictionaries/license.txt']['depth'], 1) def test_bom(self): dest = os.path.join(settings.TMP_PATH, 'test_bom') open(dest, 'w').write('foo'.encode('utf-16')) self.viewer.select('foo') self.viewer.selected = {'full': dest, 'size': 1} eq_(self.viewer.read_file(), u'foo') os.remove(dest) def test_syntax(self): for filename, syntax in [('foo.rdf', 'xml'), ('foo.xul', 'xml'), ('foo.json', 'js'), ('foo.jsm', 'js'), ('foo.js', 'js'), ('manifest.webapp', 'js'), ('foo.html', 'html'), ('foo.css', 'css'), ('foo.bar', 'plain')]: eq_(self.viewer.get_syntax(filename), syntax) def test_file_order(self): self.viewer.extract() dest = self.viewer.dest open(os.path.join(dest, 'chrome.manifest'), 'w') subdir = os.path.join(dest, 'chrome') os.mkdir(subdir) open(os.path.join(subdir, 'foo'), 'w') cache.clear() files = self.viewer.get_files().keys() rt = files.index(u'chrome') eq_(files[rt:rt + 3], [u'chrome', u'chrome/foo', u'dictionaries']) @patch.object(settings, 'FILE_VIEWER_SIZE_LIMIT', 5) def test_file_size(self): self.viewer.extract() self.viewer.get_files() self.viewer.select('install.js') res = self.viewer.read_file() eq_(res, '') assert self.viewer.selected['msg'].startswith('File size is') @patch.object(settings, 'FILE_VIEWER_SIZE_LIMIT', 5) def test_file_size_unicode(self): with self.activate(locale='he'): self.viewer.extract() self.viewer.get_files() self.viewer.select('install.js') res = self.viewer.read_file() eq_(res, '') assert self.viewer.selected['msg'].startswith('File size is') @patch.object(settings, 'FILE_UNZIP_SIZE_LIMIT', 5) def test_contents_size(self): self.assertRaises(forms.ValidationError, self.viewer.extract) def test_default(self): eq_(self.viewer.get_default(None), 'manifest.webapp') def test_delete_mid_read(self): self.viewer.extract() self.viewer.select('install.js') os.remove(os.path.join(self.viewer.dest, 'install.js')) res = self.viewer.read_file() eq_(res, '') assert self.viewer.selected['msg'].startswith('That file no') @patch('mkt.files.helpers.get_md5') def test_delete_mid_tree(self, get_md5): get_md5.side_effect = IOError('ow') self.viewer.extract() eq_({}, self.viewer.get_files())
class TestFileHelper(TestCase): def setUp(self): fn = get_file('dictionary-test.xpi') if storage_is_remote(): copy_stored_file( fn, fn, src_storage=local_storage, dst_storage=private_storage) self.viewer = FileViewer(make_file(1, fn)) def tearDown(self): self.viewer.cleanup() def test_files_not_extracted(self): eq_(self.viewer.is_extracted(), False) def test_files_extracted(self): self.viewer.extract() eq_(self.viewer.is_extracted(), True) def test_cleanup(self): self.viewer.extract() self.viewer.cleanup() eq_(self.viewer.is_extracted(), False) def test_truncate(self): truncate = self.viewer.truncate for x, y in (['foo.rdf', 'foo.rdf'], ['somelongfilename.rdf', 'somelongfilenam...rdf'], [u'unicode삮.txt', u'unicode\uc0ae.txt'], [u'unicodesomelong삮.txt', u'unicodesomelong...txt'], ['somelongfilename.somelongextension', 'somelongfilenam...somelonge..'],): eq_(truncate(x), y) def test_get_files_not_extracted(self): assert not self.viewer.get_files() def test_get_files_size(self): self.viewer.extract() files = self.viewer.get_files() eq_(len(files), 15) def test_get_files_directory(self): self.viewer.extract() files = self.viewer.get_files() eq_(files['install.js']['directory'], False) eq_(files['install.js']['binary'], False) eq_(files['__MACOSX']['directory'], True) eq_(files['__MACOSX']['binary'], False) def test_url_file(self): self.viewer.extract() files = self.viewer.get_files() url = reverse('mkt.files.list', args=[self.viewer.file.id, 'file', 'install.js']) assert files['install.js']['url'].endswith(url) def test_get_files_depth(self): self.viewer.extract() files = self.viewer.get_files() eq_(files['dictionaries/license.txt']['depth'], 1) def test_bom(self): dest = os.path.join(settings.TMP_PATH, 'test_bom') with private_storage.open(dest, 'w') as f: f.write('foo'.encode('utf-16')) self.viewer.select('foo') self.viewer.selected = {'full': dest, 'size': 1} eq_(self.viewer.read_file(), u'foo') private_storage.delete(dest) def test_syntax(self): for filename, syntax in [('foo.rdf', 'xml'), ('foo.xul', 'xml'), ('foo.json', 'js'), ('foo.jsm', 'js'), ('foo.js', 'js'), ('manifest.webapp', 'js'), ('foo.html', 'html'), ('foo.css', 'css'), ('foo.bar', 'plain')]: eq_(self.viewer.get_syntax(filename), syntax) def test_file_order(self): self.viewer.extract() dest = self.viewer.dest private_storage.open(os.path.join(dest, 'manifest.webapp'), 'w').close() subdir = os.path.join(dest, 'chrome') with private_storage.open(os.path.join(subdir, 'foo'), 'w') as f: f.write('.') if not private_storage.exists(subdir): # Might be on S3, which doesn't have directories (and # django-storages doesn't support empty files). with private_storage.open(subdir, 'w') as f: f.write('.') cache.clear() files = self.viewer.get_files().keys() rt = files.index(u'chrome') eq_(files[rt:rt + 3], [u'chrome', u'chrome/foo', u'dictionaries']) @patch.object(settings, 'FILE_VIEWER_SIZE_LIMIT', 5) def test_file_size(self): self.viewer.extract() self.viewer.get_files() self.viewer.select('install.js') res = self.viewer.read_file() eq_(res, '') assert self.viewer.selected['msg'].startswith('File size is') @patch.object(settings, 'FILE_VIEWER_SIZE_LIMIT', 5) def test_file_size_unicode(self): with self.activate(locale='he'): self.viewer.extract() self.viewer.get_files() self.viewer.select('install.js') res = self.viewer.read_file() eq_(res, '') assert self.viewer.selected['msg'].startswith('File size is') @patch.object(settings, 'FILE_UNZIP_SIZE_LIMIT', 5) def test_contents_size(self): self.assertRaises(forms.ValidationError, self.viewer.extract) def test_default(self): eq_(self.viewer.get_default(None), 'manifest.webapp') def test_delete_mid_read(self): self.viewer.extract() self.viewer.select('install.js') private_storage.delete(os.path.join(self.viewer.dest, 'install.js')) res = self.viewer.read_file() eq_(res, '') assert self.viewer.selected['msg'].startswith('That file no') @patch('mkt.files.helpers.get_md5') def test_delete_mid_tree(self, get_md5): get_md5.side_effect = IOError('ow') self.viewer.extract() eq_({}, self.viewer.get_files())