class TestSearchEngineHelper(amo.tests.TestCase): fixtures = ["base/addon_4594_a9"] def setUp(self): self.left = File.objects.get(pk=25753) self.viewer = FileViewer(self.left) if not os.path.exists(os.path.dirname(self.viewer.src)): os.makedirs(os.path.dirname(self.viewer.src)) open(self.viewer.src, "w") def tearDown(self): self.viewer.cleanup() def test_is_search_engine(self): assert self.viewer.is_search_engine() def test_extract_search_engine(self): self.viewer.extract() assert os.path.exists(self.viewer.dest) def test_default(self): self.viewer.extract() eq_(self.viewer.get_default(None), "a9.xml") def test_default_no_files(self): self.viewer.extract() os.remove(os.path.join(self.viewer.dest, "a9.xml")) eq_(self.viewer.get_default(None), None)
class TestSearchEngineHelper(amo.tests.TestCase): fixtures = ['base/addon_4594_a9'] def setUp(self): self.left = File.objects.get(pk=25753) self.viewer = FileViewer(self.left) if not os.path.exists(os.path.dirname(self.viewer.src)): os.makedirs(os.path.dirname(self.viewer.src)) with storage.open(self.viewer.src, 'w') as f: f.write('some data\n') def tearDown(self): self.viewer.cleanup() def test_is_search_engine(self): assert self.viewer.is_search_engine() def test_extract_search_engine(self): self.viewer.extract() assert os.path.exists(self.viewer.dest) def test_default(self): self.viewer.extract() eq_(self.viewer.get_default(None), 'a9.xml') def test_default_no_files(self): self.viewer.extract() os.remove(os.path.join(self.viewer.dest, 'a9.xml')) eq_(self.viewer.get_default(None), None)
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, is_webapp=True) # Setting this to True, so we are delaying the extraction of files, # in the tests, the files won't be extracted. # Most of these tests extract as needed to. self.create_switch(name='delay-file-viewer') 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_anon_view_unreviewed_source(self): self.app.update(view_source=True) self.file_viewer.extract() self.client.logout() self.check_urls(403) def test_view_access_anon_view_source(self): self.app.update(view_source=True, status=amo.STATUS_PUBLIC) self.file_viewer.extract() self.client.logout() self.check_urls(200) def test_view_access_editor(self): self.file_viewer.extract() self.check_urls(200) def test_view_access_editor_view_source(self): self.app.update(view_source=True) 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_reviewed(self): self.app.update(view_source=True) self.file_viewer.extract() self.client.logout() for status in amo.UNREVIEWED_STATUSES: self.app.update(status=status) self.check_urls(403) for status in amo.REVIEWED_STATUSES: self.app.update(status=status) self.check_urls(200) def test_view_access_developer_view_source(self): self.client.logout() assert self.client.login(username=self.dev.email, password='******') self.app.update(view_source=True) 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_view_access_another_developer_view_source(self): self.client.logout() assert self.client.login(username=self.regular.email, password='******') self.app.update(view_source=True, status=amo.STATUS_PUBLIC) self.file_viewer.extract() self.check_urls(200) 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_file_header_anon(self): self.client.logout() self.file_viewer.extract() self.app.update(view_source=True, status=amo.STATUS_PUBLIC) res = self.client.get(self.file_url(not_binary)) eq_(res.status_code, 200) url = res.context['file_link']['url'] eq_(url, reverse('detail', args=[self.app.pk])) 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): res = self.client.get(self.file_url()) eq_(res.status_code, 200) assert 'files' not in res.context @patch('waffle.switch_is_active') def test_no_files_switch(self, switch_is_active): switch_is_active.side_effect = lambda x: x != 'delay-file-viewer' # By setting the switch to False, we are not delaying the file # extraction. The files will be extracted and there will be # files in context. 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_files_back_link_anon(self): self.file_viewer.extract() self.client.logout() self.app.update(view_source=True, status=amo.STATUS_PUBLIC) res = self.client.get(self.file_url(not_binary)) eq_(res.status_code, 200) doc = pq(res.content) eq_(doc('#commands td:last').text(), 'Back to app') 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_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 FilesBase: def login_as_editor(self): assert self.client.login(username='******', password='******') def setUp(self): self.addon = Addon.objects.get(pk=3615) self.dev = self.addon.authors.all()[0] self.regular = UserProfile.objects.get(pk=999) self.version = self.addon.versions.latest() self.file = self.version.all_files[0] p = Platform.objects.filter(id__in=(amo.PLATFORM_WIN.id, amo.PLATFORM_LINUX.id, amo.PLATFORM_MAC.id)) self.file.update(platform=p[0]) self.files = [ self.file, File.objects.create(version=self.version, platform=p[1], hash='abc123', filename='dictionary-test.xpi'), File.objects.create(version=self.version, platform=p[2], hash='abc123', filename='dictionary-test.xpi') ] self.login_as_editor() for file_obj in self.files: src = os.path.join(settings.ROOT, dictionary) 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) # Setting this to True, so we are delaying the extraction of files, # in the tests, the files won't be extracted. # Most of these tests extract as needed to. Switch.objects.get_or_create(name='delay-file-viewer', active=True) def tearDown(self): self.file_viewer.cleanup() def files_redirect(self, file): return reverse('files.redirect', args=[self.file.pk, file]) def files_serve(self, file): return reverse('files.serve', args=[self.file.pk, file]) def test_view_access_anon(self): self.client.logout() self.check_urls(403) def test_view_access_anon_view_source(self): self.addon.update(view_source=True) self.file_viewer.extract() self.client.logout() self.check_urls(200) def test_view_access_editor(self): self.file_viewer.extract() self.check_urls(200) def test_view_access_editor_view_source(self): self.addon.update(view_source=True) 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_reviewed(self): self.addon.update(view_source=True) self.file_viewer.extract() self.client.logout() for status in amo.UNREVIEWED_STATUSES: self.addon.update(status=status) self.check_urls(403) for status in amo.REVIEWED_STATUSES: self.addon.update(status=status) self.check_urls(200) def test_view_access_developer_view_source(self): self.client.logout() assert self.client.login(username=self.dev.email, password='******') self.addon.update(view_source=True) 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_view_access_another_developer_view_source(self): self.client.logout() assert self.client.login(username=self.regular.email, password='******') self.addon.update(view_source=True) self.file_viewer.extract() self.check_urls(200) 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('install.js')) 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('install.js') obj = getattr(self.file_viewer, 'left', self.file_viewer) etag = obj.selected.get('md5') res = self.client.get(self.file_url('install.js'), 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('install.js') obj = getattr(self.file_viewer, 'left', self.file_viewer) date = http_date(obj.selected.get('modified')) res = self.client.get(self.file_url('install.js'), 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)) url = res.context['file_link']['url'] eq_(url, reverse('editors.review', args=[self.addon.slug])) def test_file_header_anon(self): self.client.logout() self.file_viewer.extract() self.addon.update(view_source=True) res = self.client.get(self.file_url(not_binary)) url = res.context['file_link']['url'] eq_(url, reverse('addons.detail', args=[self.addon.pk])) 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): res = self.client.get(self.file_url()) eq_(res.status_code, 200) assert 'files' not in res.context @patch('waffle.switch_is_active') def test_no_files_switch(self, switch_is_active): switch_is_active.return_value = False # By setting the switch to False, we are not delaying the file # extraction. The files will be extracted and there will be # files in context. 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_files_back_link_anon(self): self.file_viewer.extract() self.client.logout() self.addon.update(view_source=True) res = self.client.get(self.file_url(not_binary)) eq_(res.status_code, 200) doc = pq(res.content) eq_(doc('#commands td:last').text(), 'Back to addon') 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] }) self.assert3xx(res, reverse('files.compare', args=ids)) def test_browse_redirect(self): ids = self.files[0].id, res = self.client.post(self.file_url(), {'left': ids[0]}) self.assert3xx(res, reverse('files.list', args=ids)) def test_invalid_redirect(self): res = self.client.post(self.file_url(), {}) self.assert3xx(res, self.file_url()) def test_file_chooser(self): res = self.client.get(self.file_url()) doc = pq(res.content) left = doc('#id_left') eq_(len(left), 1) ver = left('optgroup') eq_(len(ver), 1) eq_(ver.attr('label'), self.version.version) files = ver('option') eq_(len(files), 2) def test_file_chooser_coalescing(self): res = self.client.get(self.file_url()) doc = pq(res.content) files = doc('#id_left > optgroup > option') eq_([f.text for f in files], [ str(self.files[0].platform), '%s, %s' % (self.files[1].platform, self.files[2].platform) ]) eq_(files.eq(0).attr('value'), str(self.files[0].id)) eq_(files.eq(1).attr('value'), str(self.files[1].id)) def test_file_chooser_disabled_coalescing(self): self.files[1].update(status=amo.STATUS_DISABLED) res = self.client.get(self.file_url()) doc = pq(res.content) files = doc('#id_left > optgroup > option') eq_(files.eq(1).attr('value'), str(self.files[2].id))
class FilesBase: def login_as_editor(self): assert self.client.login(username='******', password='******') def setUp(self): self.addon = Addon.objects.get(pk=3615) self.dev = self.addon.authors.all()[0] self.regular = UserProfile.objects.get(pk=999) self.version = self.addon.versions.latest() self.file = self.version.all_files[0] p = [amo.PLATFORM_LINUX.id, amo.PLATFORM_WIN.id, amo.PLATFORM_MAC.id] self.file.update(platform=p[0]) self.files = [self.file, File.objects.create(version=self.version, platform=p[1], hash='abc123', filename='dictionary-test.xpi'), File.objects.create(version=self.version, platform=p[2], hash='abc123', filename='dictionary-test.xpi')] self.login_as_editor() for file_obj in self.files: src = os.path.join(settings.ROOT, dictionary) 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) # Setting this to True, so we are delaying the extraction of files, # in the tests, the files won't be extracted. # Most of these tests extract as needed to. Switch.objects.get_or_create(name='delay-file-viewer', active=True) def tearDown(self): self.file_viewer.cleanup() def files_redirect(self, file): return reverse('files.redirect', args=[self.file.pk, file]) def files_serve(self, file): return reverse('files.serve', args=[self.file.pk, file]) def test_view_access_anon(self): self.client.logout() self.check_urls(403) def test_view_access_anon_view_source(self): self.addon.update(view_source=True) self.file_viewer.extract() self.client.logout() self.check_urls(200) def test_view_access_editor(self): self.file_viewer.extract() self.check_urls(200) def test_view_access_editor_view_source(self): self.addon.update(view_source=True) 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_reviewed(self): self.addon.update(view_source=True) self.file_viewer.extract() self.client.logout() for status in amo.UNREVIEWED_STATUSES: self.addon.update(status=status) self.check_urls(403) for status in amo.REVIEWED_STATUSES: self.addon.update(status=status) self.check_urls(200) def test_view_access_developer_view_source(self): self.client.logout() assert self.client.login(username=self.dev.email, password='******') self.addon.update(view_source=True) 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_view_access_another_developer_view_source(self): self.client.logout() assert self.client.login(username=self.regular.email, password='******') self.addon.update(view_source=True) self.file_viewer.extract() self.check_urls(200) 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('install.js')) 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('install.js') obj = getattr(self.file_viewer, 'left', self.file_viewer) etag = obj.selected.get('md5') res = self.client.get(self.file_url('install.js'), 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('install.js') obj = getattr(self.file_viewer, 'left', self.file_viewer) date = http_date(obj.selected.get('modified')) res = self.client.get(self.file_url('install.js'), 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)) url = res.context['file_link']['url'] eq_(url, reverse('editors.review', args=[self.addon.slug])) def test_file_header_anon(self): self.client.logout() self.file_viewer.extract() self.addon.update(view_source=True) res = self.client.get(self.file_url(not_binary)) url = res.context['file_link']['url'] eq_(url, reverse('addons.detail', args=[self.addon.pk])) 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): res = self.client.get(self.file_url()) eq_(res.status_code, 200) assert 'files' not in res.context @patch('waffle.switch_is_active') def test_no_files_switch(self, switch_is_active): switch_is_active.return_value = False # By setting the switch to False, we are not delaying the file # extraction. The files will be extracted and there will be # files in context. 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_files_back_link_anon(self): self.file_viewer.extract() self.client.logout() self.addon.update(view_source=True) res = self.client.get(self.file_url(not_binary)) eq_(res.status_code, 200) doc = pq(res.content) eq_(doc('#commands td:last').text(), 'Back to addon') 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]}) self.assert3xx(res, reverse('files.compare', args=ids)) def test_browse_redirect(self): ids = self.files[0].id, res = self.client.post(self.file_url(), {'left': ids[0]}) self.assert3xx(res, reverse('files.list', args=ids)) def test_browse_404(self): res = self.client.get('/files/browse/file/dont/exist.png', follow=True) eq_(res.status_code, 404) def test_invalid_redirect(self): res = self.client.post(self.file_url(), {}) self.assert3xx(res, self.file_url()) def test_file_chooser(self): res = self.client.get(self.file_url()) doc = pq(res.content) left = doc('#id_left') eq_(len(left), 1) ver = left('optgroup') eq_(len(ver), 1) eq_(ver.attr('label'), self.version.version) files = ver('option') eq_(len(files), 2) def test_file_chooser_coalescing(self): res = self.client.get(self.file_url()) doc = pq(res.content) files = doc('#id_left > optgroup > option') eq_([f.text for f in files], [str(self.files[0].get_platform_display()), '%s, %s' % (self.files[1].get_platform_display(), self.files[2].get_platform_display())]) eq_(files.eq(0).attr('value'), str(self.files[0].id)) eq_(files.eq(1).attr('value'), str(self.files[1].id)) def test_file_chooser_disabled_coalescing(self): self.files[1].update(status=amo.STATUS_DISABLED) res = self.client.get(self.file_url()) doc = pq(res.content) files = doc('#id_left > optgroup > option') eq_(files.eq(1).attr('value'), str(self.files[2].id))
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_isbinary(self): binary = self.viewer._is_binary for f in ['foo.rdf', 'foo.xml', 'foo.js', 'foo.py' 'foo.html', 'foo.txt', 'foo.dtd', 'foo.xul', 'foo.sh', 'foo.properties', 'foo.json', 'foo.src', 'CHANGELOG']: m, encoding = mimetypes.guess_type(f) assert not binary(m, f), '%s should not be binary' % f for f in ['foo.png', 'foo.gif', 'foo.exe', 'foo.swf']: m, encoding = mimetypes.guess_type(f) assert binary(m, f), '%s should be binary' % f filename = os.path.join(settings.TMP_PATH, 'test_isbinary') for txt in ['#!/usr/bin/python', '#python', u'\0x2']: open(filename, 'w').write(txt) m, encoding = mimetypes.guess_type(filename) assert not binary(m, filename), '%s should not be binary' % txt for txt in ['MZ']: open(filename, 'w').write(txt) m, encoding = mimetypes.guess_type(filename) assert binary(m, filename), '%s should be binary' % txt os.remove(filename) 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('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.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), 'install.rdf') 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('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, is_webapp=True) # Setting this to True, so we are delaying the extraction of files, # in the tests, the files won't be extracted. # Most of these tests extract as needed to. self.create_switch(name='delay-file-viewer') 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_anon_view_unreviewed_source(self): self.app.update(view_source=True) self.file_viewer.extract() self.client.logout() self.check_urls(403) def test_view_access_anon_view_source(self): self.app.update(view_source=True, status=amo.STATUS_PUBLIC) self.file_viewer.extract() self.client.logout() self.check_urls(200) def test_view_access_editor(self): self.file_viewer.extract() self.check_urls(200) def test_view_access_editor_view_source(self): self.app.update(view_source=True) 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_reviewed(self): self.app.update(view_source=True) self.file_viewer.extract() self.client.logout() for status in amo.UNREVIEWED_STATUSES: self.app.update(status=status) self.check_urls(403) for status in amo.REVIEWED_STATUSES: self.app.update(status=status) self.check_urls(200) def test_view_access_developer_view_source(self): self.client.logout() assert self.client.login(username=self.dev.email, password='******') self.app.update(view_source=True) 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_view_access_another_developer_view_source(self): self.client.logout() assert self.client.login(username=self.regular.email, password='******') self.app.update(view_source=True, status=amo.STATUS_PUBLIC) self.file_viewer.extract() self.check_urls(200) 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_file_header_anon(self): self.client.logout() self.file_viewer.extract() self.app.update(view_source=True, status=amo.STATUS_PUBLIC) res = self.client.get(self.file_url(not_binary)) eq_(res.status_code, 200) url = res.context['file_link']['url'] eq_(url, reverse('detail', args=[self.app.pk])) 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): res = self.client.get(self.file_url()) eq_(res.status_code, 200) assert 'files' not in res.context @patch('waffle.switch_is_active') def test_no_files_switch(self, switch_is_active): switch_is_active.side_effect = lambda x: x != 'delay-file-viewer' # By setting the switch to False, we are not delaying the file # extraction. The files will be extracted and there will be # files in context. 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_files_back_link_anon(self): self.file_viewer.extract() self.client.logout() self.app.update(view_source=True, status=amo.STATUS_PUBLIC) res = self.client.get(self.file_url(not_binary)) eq_(res.status_code, 200) doc = pq(res.content) eq_(doc('#commands td:last').text(), 'Back to app') 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_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(), '') eq_(vers.eq(1).text(), self.versions[1].version) eq_(vers.eq(2).text(), self.versions[0].version)
class TestFileHelper(test_utils.TestCase): def setUp(self): dictionary = 'apps/files/fixtures/files/dictionary-test.xpi' src = os.path.join(settings.ROOT, dictionary) file_obj = Mock() file_obj.id = file_obj.pk = 1 file_obj.file_path = src self.viewer = FileViewer(file_obj) self.old_tmp = settings.TMP_PATH settings.TMP_PATH = tempfile.mkdtemp() def tearDown(self): self.viewer.cleanup() settings.TMP_PATH = self.old_tmp 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_isbinary(self): binary = self.viewer.is_binary for f in ['foo.rdf', 'foo.xml', 'foo.js', 'foo.py' 'foo.html', 'foo.txt', 'foo.dtd', 'foo.xul', 'foo.properties']: m, encoding = mimetypes.guess_type(f) assert not binary(m, f), '%s should not be binary' % f for f in ['foo.dtd', 'foo.xul', 'foo.properties']: m, encoding = mimetypes.guess_type(f) assert not binary(None, f), '%s should not be binary' % f for f in ['foo.png', 'foo.gif', 'foo.xls', 'foo.dic']: m, encoding = mimetypes.guess_type(f) assert binary(m, f), '%s should be binary' % f 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'], True) def test_url_file(self): self.viewer.extract() files = self.viewer.get_files() url = reverse('files.list', args=[self.viewer.file.id, '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) eq_(files['dictionaries/license.txt']['parent'], 'dictionaries')
class FilesBase: def login_as_editor(self): assert self.client.login(username='******', password='******') def setUp(self): self.addon = Addon.objects.get(pk=3615) self.dev = self.addon.authors.all()[0] self.regular = UserProfile.objects.get(pk=999) self.version = self.addon.versions.latest() self.file = self.version.all_files[0] self.file_two = File() self.file_two.version = self.version self.file_two.filename = 'dictionary-test.xpi' self.file_two.save() self.login_as_editor() self.old_tmp = settings.TMP_PATH self.old_addon = settings.ADDONS_PATH settings.TMP_PATH = tempfile.mkdtemp() settings.ADDONS_PATH = tempfile.mkdtemp() for file_obj in [self.file, self.file_two]: src = os.path.join(settings.ROOT, dictionary) 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) # Setting this to True, so we are delaying the extraction of files, # in the tests, the files won't be extracted. # Most of these tests extract as needed to. Switch.objects.create(name='delay-file-viewer', active=True) def tearDown(self): self.file_viewer.cleanup() settings.TMP_PATH = self.old_tmp settings.ADDONS_PATH = self.old_addon def files_redirect(self, file): return reverse('files.redirect', args=[self.file.pk, file]) def files_serve(self, file): return reverse('files.serve', args=[self.file.pk, file]) def test_view_access_anon(self): self.client.logout() self.check_urls(403) def test_view_access_anon_view_source(self): self.addon.update(view_source=True) self.file_viewer.extract() self.client.logout() self.check_urls(200) def test_view_access_editor(self): self.file_viewer.extract() self.check_urls(200) def test_view_access_editor_view_source(self): self.addon.update(view_source=True) 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_reviewed(self): self.addon.update(view_source=True) self.file_viewer.extract() self.client.logout() for status in amo.UNREVIEWED_STATUSES: self.addon.update(status=status) self.check_urls(403) for status in amo.REVIEWED_STATUSES: self.addon.update(status=status) self.check_urls(200) def test_view_access_developer_view_source(self): self.client.logout() assert self.client.login(username=self.dev.email, password='******') self.addon.update(view_source=True) 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_view_access_another_developer_view_source(self): self.client.logout() assert self.client.login(username=self.regular.email, password='******') self.addon.update(view_source=True) self.file_viewer.extract() self.check_urls(200) 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('install.js')) 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('install.js') obj = getattr(self.file_viewer, 'left', self.file_viewer) etag = obj.selected.get('md5') res = self.client.get(self.file_url('install.js'), 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('install.js') obj = getattr(self.file_viewer, 'left', self.file_viewer) date = http_date(obj.selected.get('modified')) res = self.client.get(self.file_url('install.js'), 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)) url = res.context['file_link']['url'] eq_(url, reverse('editors.review', args=[self.addon.slug])) def test_file_header_anon(self): self.client.logout() self.file_viewer.extract() self.addon.update(view_source=True) res = self.client.get(self.file_url(not_binary)) url = res.context['file_link']['url'] eq_(url, reverse('addons.detail', args=[self.addon.pk])) 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): res = self.client.get(self.file_url()) eq_(res.status_code, 200) assert 'files' not in res.context @patch('waffle.switch_is_active') def test_no_files_switch(self, switch_is_active): switch_is_active.return_value = False # By setting the switch to False, we are not delaying the file # extraction. The files will be extracted and there will be # files in context. 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('#files a.no-key').text(), 'Back to review') def test_files_back_link_anon(self): self.file_viewer.extract() self.client.logout() self.addon.update(view_source=True) res = self.client.get(self.file_url(not_binary)) eq_(res.status_code, 200) doc = pq(res.content) eq_(doc('#files a.no-key').text(), 'Back to addon')
class FilesBase: def login_as_editor(self): assert self.client.login(username='******', password='******') def setUp(self): self.addon = Addon.objects.get(pk=3615) self.dev = self.addon.authors.all()[0] self.regular = UserProfile.objects.get(pk=999) self.version = self.addon.versions.latest() self.file = self.version.all_files[0] self.file_two = File() self.file_two.version = self.version self.file_two.filename = 'dictionary-test.xpi' self.file_two.save() self.login_as_editor() self.old_tmp = settings.TMP_PATH self.old_addon = settings.ADDONS_PATH settings.TMP_PATH = tempfile.mkdtemp() settings.ADDONS_PATH = tempfile.mkdtemp() dictionary = 'apps/files/fixtures/files/dictionary-test.xpi' for file_obj in [self.file, self.file_two]: src = os.path.join(settings.ROOT, dictionary) 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() settings.TMP_PATH = self.old_tmp settings.ADDONS_PATH = self.old_addon def test_view_access_anon(self): self.client.logout() self.check_urls(403) def test_view_access_anon_view_source(self): self.addon.update(view_source=True) self.file_viewer.extract() self.client.logout() self.check_urls(200) def test_view_access_editor(self): self.file_viewer.extract() self.check_urls(200) def test_view_access_editor_view_source(self): self.addon.update(view_source=True) 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_developer_view_source(self): self.client.logout() assert self.client.login(username=self.dev.email, password='******') self.addon.update(view_source=True) 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_view_access_another_developer_view_source(self): self.client.logout() assert self.client.login(username=self.regular.email, password='******') self.addon.update(view_source=True) self.file_viewer.extract() self.check_urls(200) 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('install.js')) assert 'etag' in res._headers assert 'last-modified' in res._headers def test_file_header(self): self.file_viewer.extract() res = self.client.get(self.file_url('install.js')) url = res.context['file_url'] eq_(url, reverse('editors.review', args=[self.version.pk])) def test_file_header_anon(self): self.client.logout() self.file_viewer.extract() self.addon.update(view_source=True) res = self.client.get(self.file_url('install.js')) url = res.context['file_url'] eq_(url, reverse('addons.detail', args=[self.addon.pk])) 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): res = self.client.get(self.file_url()) eq_(res.status_code, 200) assert 'files' not 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('install.js')) eq_(res.status_code, 200) assert 'selected' in res.context
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_isbinary(self): binary = self.viewer._is_binary for f in [ "foo.rdf", "foo.xml", "foo.js", "foo.py" "foo.html", "foo.txt", "foo.dtd", "foo.xul", "foo.sh", "foo.properties", "foo.json", "foo.src", "CHANGELOG", ]: m, encoding = mimetypes.guess_type(f) assert not binary(m, f), "%s should not be binary" % f for f in ["foo.png", "foo.gif", "foo.exe", "foo.swf"]: m, encoding = mimetypes.guess_type(f) assert binary(m, f), "%s should be binary" % f filename = os.path.join(settings.TMP_PATH, "test_isbinary") for txt in ["#!/usr/bin/python", "#python", u"\0x2"]: open(filename, "w").write(txt) m, encoding = mimetypes.guess_type(filename) assert not binary(m, filename), "%s should not be binary" % txt for txt in ["MZ"]: open(filename, "w").write(txt) m, encoding = mimetypes.guess_type(filename) assert binary(m, filename), "%s should be binary" % txt os.remove(filename) 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("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.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"chrome.manifest"]) @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_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), "install.rdf") 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("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())