You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by he...@apache.org on 2016/01/27 22:39:24 UTC
[22/29] allura git commit: [#8054] delete Google Code importers and
tests
http://git-wip-us.apache.org/repos/asf/allura/blob/b956fe30/ForgeImporters/forgeimporters/tests/google/test_extractor.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/tests/google/test_extractor.py b/ForgeImporters/forgeimporters/tests/google/test_extractor.py
deleted file mode 100644
index 72a7d6c..0000000
--- a/ForgeImporters/forgeimporters/tests/google/test_extractor.py
+++ /dev/null
@@ -1,607 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-from unittest import TestCase
-import pkg_resources
-from urllib2 import HTTPError
-
-import mock
-from datadiff.tools import assert_equal
-from IPython.testing.decorators import skipif, module_not_available
-from BeautifulSoup import BeautifulSoup
-
-from allura.tests.decorators import without_module
-from forgeimporters import google
-from forgeimporters import base
-
-
-class TestGoogleCodeProjectExtractor(TestCase):
-
- def setUp(self):
- self._p_urlopen = mock.patch.object(base.ProjectExtractor, 'urlopen')
- self._p_soup = mock.patch.object(base, 'BeautifulSoup')
- self.urlopen = self._p_urlopen.start()
- self.soup = self._p_soup.start()
- self.project = mock.Mock(name='project')
- self.project.get_tool_data.return_value = 'my-project'
-
- def tearDown(self):
- for patcher in ('_p_urlopen', '_p_soup'):
- try:
- getattr(self, patcher).stop()
- except RuntimeError as e:
- if 'unstarted patcher' in str(e):
- pass # test case might stop them early
- else:
- raise
-
- def test_init(self):
- extractor = google.GoogleCodeProjectExtractor(
- 'my-project', 'project_info')
-
- self.urlopen.assert_called_once_with(
- 'http://code.google.com/p/my-project/')
- self.soup.assert_called_once_with(self.urlopen.return_value, convertEntities=self.soup.HTML_ENTITIES)
- self.assertEqual(extractor.page, self.soup.return_value)
-
- def test_get_page(self):
- extractor = google.GoogleCodeProjectExtractor(
- 'my-project', 'project_info')
- self.assertEqual(1, self.urlopen.call_count)
- page = extractor.get_page('project_info')
- self.assertEqual(1, self.urlopen.call_count)
- self.assertEqual(
- page, extractor._page_cache['http://code.google.com/p/my-project/'])
- page = extractor.get_page('project_info')
- self.assertEqual(1, self.urlopen.call_count)
- self.assertEqual(
- page, extractor._page_cache['http://code.google.com/p/my-project/'])
- page = extractor.get_page('source_browse')
- self.assertEqual(2, self.urlopen.call_count)
- self.assertEqual(
- page, extractor._page_cache['http://code.google.com/p/my-project/source/browse/'])
- parser = mock.Mock(return_value='parsed')
- page = extractor.get_page('url', parser=parser)
- self.assertEqual(page, 'parsed')
- self.assertEqual(page, extractor._page_cache['url'])
-
- def test_get_page_url(self):
- extractor = google.GoogleCodeProjectExtractor('my-project')
- self.assertEqual(extractor.get_page_url('project_info'),
- 'http://code.google.com/p/my-project/')
-
- def test_get_page_url_hosted(self):
- extractor = google.GoogleCodeProjectExtractor('a/eclipselabs.org/p/restclient-tool')
- self.assertEqual(extractor.get_page_url('project_info'),
- 'http://code.google.com/a/eclipselabs.org/p/restclient-tool/')
-
- def test_get_short_description(self):
- extractor = google.GoogleCodeProjectExtractor(
- 'my-project', 'project_info')
- extractor.page.find.return_value.text = 'My Super Project'
-
- extractor.get_short_description(self.project)
-
- extractor.page.find.assert_called_once_with(itemprop='description')
- self.assertEqual(self.project.short_description, 'My Super Project')
-
- @mock.patch.object(google, 'File')
- @mock.patch.object(google, 'M')
- def test_get_icon(self, M, File):
- File.return_value.type = 'image/png'
- File.return_value.file = 'data'
- extractor = google.GoogleCodeProjectExtractor(
- 'my-project', 'project_info')
- extractor.page.find.return_value.get.return_value = 'http://example.com/foo/bar/my-logo.png'
-
- extractor.get_icon(self.project)
-
- extractor.page.find.assert_called_once_with(itemprop='image')
- File.assert_called_once_with(
- 'http://example.com/foo/bar/my-logo.png', 'my-logo.png')
- M.ProjectFile.save_image.assert_called_once_with(
- 'my-logo.png', 'data', 'image/png', square=True,
- thumbnail_size=(48, 48), thumbnail_meta={
- 'project_id': self.project._id, 'category': 'icon'})
-
- @mock.patch.object(google, 'M')
- def test_get_license(self, M):
- self.project.trove_license = []
- extractor = google.GoogleCodeProjectExtractor(
- 'my-project', 'project_info')
- extractor.page.find.return_value.findNext.return_value.find.return_value.text = ' New BSD License '
- trove = M.TroveCategory.query.get.return_value
-
- extractor.get_license(self.project)
-
- extractor.page.find.assert_called_once_with(text='Code license')
- extractor.page.find.return_value.findNext.assert_called_once_with()
- extractor.page.find.return_value.findNext.return_value.find.assert_called_once_with(
- 'a')
- self.assertEqual(self.project.trove_license, [trove._id])
- M.TroveCategory.query.get.assert_called_once_with(
- fullname='BSD License')
-
- M.TroveCategory.query.get.reset_mock()
- extractor.page.find.return_value.findNext.return_value.find.return_value.text = 'non-existant license'
- extractor.get_license(self.project)
- M.TroveCategory.query.get.assert_called_once_with(
- fullname='Other/Proprietary License')
-
- def _make_extractor(self, html):
- with mock.patch.object(base.ProjectExtractor, 'urlopen'):
- extractor = google.GoogleCodeProjectExtractor('allura-google-importer')
- extractor.page = BeautifulSoup(html)
- extractor.get_page = lambda pagename: extractor.page
- extractor.url = "http://test/source/browse"
- return extractor
-
- def test_get_repo_type_happy_path(self):
- extractor = self._make_extractor(
- '<span id="crumb_root">\nsvn/ </span>')
- self.assertEqual('svn', extractor.get_repo_type())
-
- def test_get_repo_type_no_crumb_root(self):
- extractor = self._make_extractor('')
- with self.assertRaises(Exception) as cm:
- extractor.get_repo_type()
- self.assertEqual(str(cm.exception),
- "Couldn't detect repo type: no #crumb_root in "
- "http://test/source/browse")
-
- def test_get_repo_type_unknown_repo_type(self):
- extractor = self._make_extractor(
- '<span id="crumb_root">cvs</span>')
- with self.assertRaises(Exception) as cm:
- extractor.get_repo_type()
- self.assertEqual(str(cm.exception), "Unknown repo type: cvs")
-
- def test_empty_issue(self):
- empty_issue = open(pkg_resources.resource_filename(
- 'forgeimporters', 'tests/data/google/empty-issue.html')).read()
- gpe = self._make_extractor(empty_issue)
- self.assertIsNone(gpe.get_issue_owner())
- self.assertEqual(gpe.get_issue_status(), '')
- self.assertEqual(gpe.get_issue_attachments(), [])
- self.assertEqual(list(gpe.iter_comments()), [])
- self.assertEqual(gpe.get_issue_mod_date(), 'Thu Aug 8 14:56:23 2013')
-
- @without_module('html2text')
- def test_get_issue_basic_fields(self):
- test_issue = open(pkg_resources.resource_filename(
- 'forgeimporters', 'tests/data/google/test-issue.html')).read()
- gpe = self._make_extractor(test_issue)
-
- self.assertEqual(gpe.get_issue_creator().name, 'john...@gmail.com')
- self.assertEqual(gpe.get_issue_creator().url,
- 'http://code.google.com/u/101557263855536553789/')
- self.assertEqual(gpe.get_issue_owner().name, 'john...@gmail.com')
- self.assertEqual(gpe.get_issue_owner().url,
- 'http://code.google.com/u/101557263855536553789/')
- self.assertEqual(gpe.get_issue_status(), 'Started')
- self._p_soup.stop()
- self.assertEqual(gpe.get_issue_summary(), 'Test "Issue"')
- assert_equal(gpe.get_issue_description(),
- 'Test \\*Issue\\* for testing\n'
- '\n'
- ' 1\\. Test List\n'
- ' 2\\. Item\n'
- '\n'
- '\\*\\*Testing\\*\\*\n'
- '\n'
- ' \\* Test list 2\n'
- ' \\* Item\n'
- '\n'
- '\\# Test Section\n'
- '\n'
- ' p = source\\.test\\_issue\\.post\\(\\)\n'
- ' p\\.count = p\\.count \\*5 \\#\\* 6\n'
- ' if p\\.count > 5:\n'
- ' print "Not < 5 & \\!= 5"\n'
- '\n'
- 'References: [issue 1](#1), [r2]\n'
- '\n'
- 'That\'s all'
- )
- self.assertEqual(gpe.get_issue_created_date(),
- 'Thu Aug 8 15:33:52 2013')
- self.assertEqual(gpe.get_issue_stars(), 1)
-
- @skipif(module_not_available('html2text'))
- def test_get_issue_basic_fields_html2text(self):
- test_issue = open(pkg_resources.resource_filename(
- 'forgeimporters', 'tests/data/google/test-issue.html')).read()
- gpe = self._make_extractor(test_issue)
- self.assertEqual(gpe.get_issue_creator().name, 'john...@gmail.com')
- self.assertEqual(gpe.get_issue_creator().url,
- 'http://code.google.com/u/101557263855536553789/')
- self.assertEqual(gpe.get_issue_owner().name, 'john...@gmail.com')
- self.assertEqual(gpe.get_issue_owner().url,
- 'http://code.google.com/u/101557263855536553789/')
- self.assertEqual(gpe.get_issue_status(), 'Started')
- self._p_soup.stop()
- self.assertEqual(gpe.get_issue_summary(), 'Test "Issue"')
- assert_equal(gpe.get_issue_description(),
- 'Test \\*Issue\\* for testing\n'
- '\n'
- ' 1. Test List\n'
- ' 2. Item\n'
- '\n'
- '\\*\\*Testing\\*\\*\n'
- '\n'
- ' \\* Test list 2\n'
- ' \\* Item\n'
- '\n'
- '\\# Test Section\n'
- '\n'
- ' p = source.test\\_issue.post\\(\\)\n'
- ' p.count = p.count \\*5 \\#\\* 6\n'
- ' if p.count > 5:\n'
- ' print "Not < 5 & \\!= 5"\n'
- '\n'
- 'References: [issue 1](#1), [r2]\n'
- '\n'
- 'That\'s all'
- )
- self.assertEqual(gpe.get_issue_created_date(),
- 'Thu Aug 8 15:33:52 2013')
- self.assertEqual(gpe.get_issue_stars(), 1)
-
- def test_get_issue_summary(self):
- html = u"""
- <div id="issueheader">
- <table>
- <tbody>
- <tr>
- <td></td>
- <td><span>%s</span></td>
- </tr>
- </tbody>
- </table>
- </div>
- """
- gpe = self._make_extractor(html % u'')
- self.assertEqual(gpe.get_issue_summary(), u'')
- gpe = self._make_extractor(html % u'My Summary')
- self.assertEqual(gpe.get_issue_summary(), u'My Summary')
-
- def test_get_issue_labels(self):
- test_issue = open(pkg_resources.resource_filename(
- 'forgeimporters', 'tests/data/google/test-issue.html')).read()
- gpe = self._make_extractor(test_issue)
- self.assertEqual(gpe.get_issue_labels(), [
- 'Type-Defect',
- 'Priority-Medium',
- 'Milestone-Release1.0',
- 'OpSys-All',
- 'Component-Logic',
- 'Performance',
- 'Security',
- 'OpSys-Windows',
- 'OpSys-OSX',
- ])
-
- @mock.patch.object(base, 'StringIO')
- def test_get_issue_attachments(self, StringIO):
- self.urlopen.return_value.info.return_value = {
- 'content-type': 'text/plain; foo'}
- test_issue = open(pkg_resources.resource_filename(
- 'forgeimporters', 'tests/data/google/test-issue.html')).read()
- gpe = self._make_extractor(test_issue)
- attachments = gpe.get_issue_attachments()
- self.assertEqual(len(attachments), 1)
- self.assertEqual(attachments[0].filename, 'at1.txt')
- self.assertEqual(attachments[0].url,
- 'http://allura-google-importer.googlecode.com/issues/attachment?aid=70000000&name=at1.txt'
- '&token=3REU1M3JUUMt0rJUg7ldcELt6LA%3A1376059941255')
- self.assertEqual(attachments[0].type, 'text/plain')
-
- def test_get_issue_ids(self):
- extractor = google.GoogleCodeProjectExtractor(None)
- extractor.get_page = mock.Mock(side_effect=((1, 2, 3), (2, 3, 4), ()))
- self.assertItemsEqual(extractor.get_issue_ids(start=10), (1, 2, 3, 4))
- self.assertEqual(extractor.get_page.call_count, 3)
- extractor.get_page.assert_has_calls([
- mock.call('issues_csv', parser=google.csv_parser, start=10),
- mock.call('issues_csv', parser=google.csv_parser, start=110),
- mock.call('issues_csv', parser=google.csv_parser, start=210),
- ])
-
- @mock.patch.object(google.GoogleCodeProjectExtractor, 'get_page')
- @mock.patch.object(google.GoogleCodeProjectExtractor, 'get_issue_ids')
- def test_iter_issue_ids(self, get_issue_ids, get_page):
- get_issue_ids.side_effect = [set([1, 2]), set([2, 3, 4])]
- issue_ids = [i for i,
- e in list(google.GoogleCodeProjectExtractor.iter_issues('foo'))]
- self.assertEqual(issue_ids, [1, 2, 3, 4])
- get_issue_ids.assert_has_calls([
- mock.call(start=0),
- mock.call(start=-8),
- ])
-
- @mock.patch.object(google.GoogleCodeProjectExtractor, '__init__')
- @mock.patch.object(google.GoogleCodeProjectExtractor, 'get_issue_ids')
- def test_iter_issue_ids_raises(self, get_issue_ids, __init__):
- get_issue_ids.side_effect = [set([1, 2, 3, 4, 5])]
- __init__.side_effect = [
- None,
- None,
- # should skip but keep going
- HTTPError('fourohfour', 404, 'fourohfour', {}, mock.Mock()),
- None,
- # should be re-raised
- HTTPError('fubar', 500, 'fubar', {}, mock.Mock()),
- None,
- ]
- issue_ids = []
- try:
- for issue_id, extractor in google.GoogleCodeProjectExtractor.iter_issues('foo'):
- issue_ids.append(issue_id)
- except HTTPError as e:
- self.assertEqual(e.code, 500)
- else:
- assert False, 'Missing expected raised exception'
- self.assertEqual(issue_ids, [1, 3])
-
- @mock.patch.object(google.requests, 'head')
- def test_check_readable(self, head):
- head.return_value.status_code = 200
- assert google.GoogleCodeProjectExtractor('my-project').check_readable()
- head.return_value.status_code = 404
- assert not google.GoogleCodeProjectExtractor('my-project').check_readable()
-
-
-class TestWithSetupForComments(TestCase):
- # The main test suite did too much patching for how we want these tests to work
- # These tests use iter_comments and 2 HTML pages of comments.
-
- def _create_extractor(self):
- test_issue = open(pkg_resources.resource_filename(
- 'forgeimporters', 'tests/data/google/test-issue-first-page.html')).read()
- test_issue_older = open(pkg_resources.resource_filename(
- 'forgeimporters', 'tests/data/google/test-issue-prev-page.html')).read()
-
- class LocalTestExtractor(google.GoogleCodeProjectExtractor):
- def urlopen(self, url, **kw):
- return self.urlopen_results.pop(0)
-
- def setup_urlopen_results(self, results):
- self.urlopen_results = results
-
- gpe = LocalTestExtractor('allura-google-importer')
- gpe.setup_urlopen_results([test_issue, test_issue_older])
-
- return gpe
-
- def test_get_issue_mod_date(self):
- gpe = self._create_extractor()
- gpe.get_page('detail?id=6')
- self.assertEqual(gpe.get_issue_mod_date(), 'Thu Aug 8 15:36:57 2013')
-
- @without_module('html2text')
- @mock.patch.object(base, 'StringIO')
- def test_iter_comments(self, StringIO):
- gpe = self._create_extractor()
- gpe.get_page('detail?id=6')
-
- with mock.patch.object(base.ProjectExtractor, 'urlopen'): # for attachments, which end up using a different Extractor urlopen
- comments = list(gpe.iter_comments())
-
- self.assertEqual(len(comments), 6)
- expected = [
- {
- 'author.name': 'john...@gmail.com',
- 'author.url': 'http://code.google.com/u/101557263855536553789/',
- 'created_date': 'Thu Aug 8 15:34:01 2013',
- 'body': 'Simple comment',
- 'updates': {},
- 'attachments': [],
- },
- {
- 'author.name': 'john...@gmail.com',
- 'author.url': 'http://code.google.com/u/101557263855536553789/',
- 'created_date': 'Thu Aug 8 15:34:09 2013',
- 'body': 'Boring comment',
- 'updates': {},
- 'attachments': [],
- },
- {
- 'author.name': 'john...@gmail.com',
- 'author.url': 'http://code.google.com/u/101557263855536553789/',
- 'created_date': 'Thu Aug 8 15:35:15 2013',
- 'body': 'Test \\*comment\\* is a comment',
- 'updates': {'Status:': 'Started', 'Labels:': '-OpSys-Linux OpSys-Windows'},
- 'attachments': ['at2.txt'],
- },
- {
- 'author.name': 'john...@gmail.com',
- 'author.url': 'http://code.google.com/u/101557263855536553789/',
- 'created_date': 'Thu Aug 8 15:35:34 2013',
- 'body': 'Another comment with references: [issue 2](#2), [r1]',
- 'updates': {},
- 'attachments': [],
- },
- {
- 'author.name': 'john...@gmail.com',
- 'author.url': 'http://code.google.com/u/101557263855536553789/',
- 'created_date': 'Thu Aug 8 15:36:39 2013',
- 'body': 'Last comment',
- 'updates': {},
- 'attachments': ['at4.txt', 'at1.txt'],
- },
- {
- 'author.name': 'john...@gmail.com',
- 'author.url': 'http://code.google.com/u/101557263855536553789/',
- 'created_date': 'Thu Aug 8 15:36:57 2013',
- 'body': 'Oh, I forgot one \\(with an inter\\-project reference to '
- '[issue other\\-project:1](https://code.google.com/p/other-project/issues/detail?id=1)\\)',
- 'updates': {'Labels:': 'OpSys-OSX'},
- 'attachments': [],
- },
- ]
- for actual, expected in zip(comments, expected):
- self.assertEqual(actual.author.name, expected['author.name'])
- self.assertEqual(actual.author.url, expected['author.url'])
- self.assertEqual(actual.created_date, expected['created_date'])
- self.assertEqual(actual.body, expected['body'])
- self.assertEqual(actual.updates, expected['updates'])
- self.assertEqual(
- [a.filename for a in actual.attachments], expected['attachments'])
-
- @skipif(module_not_available('html2text'))
- @mock.patch.object(base, 'StringIO')
- def test_iter_comments_html2text(self, StringIO):
- gpe = self._create_extractor()
- gpe.get_page('detail?id=6')
-
- with mock.patch.object(base.ProjectExtractor, 'urlopen'): # for attachments, which end up using a different Extractor urlopen
- comments = list(gpe.iter_comments())
-
- self.assertEqual(len(comments), 6)
- expected = [
- {
- 'author.name': 'john...@gmail.com',
- 'author.url': 'http://code.google.com/u/101557263855536553789/',
- 'created_date': 'Thu Aug 8 15:34:01 2013',
- 'body': 'Simple comment',
- 'updates': {},
- 'attachments': [],
- },
- {
- 'author.name': 'john...@gmail.com',
- 'author.url': 'http://code.google.com/u/101557263855536553789/',
- 'created_date': 'Thu Aug 8 15:34:09 2013',
- 'body': 'Boring comment',
- 'updates': {},
- 'attachments': [],
- },
- {
- 'author.name': 'john...@gmail.com',
- 'author.url': 'http://code.google.com/u/101557263855536553789/',
- 'created_date': 'Thu Aug 8 15:35:15 2013',
- 'body': 'Test \\*comment\\* is a comment',
- 'updates': {'Status:': 'Started', 'Labels:': '-OpSys-Linux OpSys-Windows'},
- 'attachments': ['at2.txt'],
- },
- {
- 'author.name': 'john...@gmail.com',
- 'author.url': 'http://code.google.com/u/101557263855536553789/',
- 'created_date': 'Thu Aug 8 15:35:34 2013',
- 'body': 'Another comment with references: [issue 2](#2), [r1]',
- 'updates': {},
- 'attachments': [],
- },
- {
- 'author.name': 'john...@gmail.com',
- 'author.url': 'http://code.google.com/u/101557263855536553789/',
- 'created_date': 'Thu Aug 8 15:36:39 2013',
- 'body': 'Last comment',
- 'updates': {},
- 'attachments': ['at4.txt', 'at1.txt'],
- },
- {
- 'author.name': 'john...@gmail.com',
- 'author.url': 'http://code.google.com/u/101557263855536553789/',
- 'created_date': 'Thu Aug 8 15:36:57 2013',
- 'body': 'Oh, I forgot one \\(with an inter-project reference to '
- '[issue other-project:1](https://code.google.com/p/other-project/issues/detail?id=1)\\)',
- 'updates': {'Labels:': 'OpSys-OSX'},
- 'attachments': [],
- },
- ]
- for actual, expected in zip(comments, expected):
- self.assertEqual(actual.author.name, expected['author.name'])
- self.assertEqual(actual.author.url, expected['author.url'])
- self.assertEqual(actual.created_date, expected['created_date'])
- self.assertEqual(actual.body, expected['body'])
- self.assertEqual(actual.updates, expected['updates'])
- self.assertEqual(
- [a.filename for a in actual.attachments], expected['attachments'])
-
-
-class TestUserLink(TestCase):
-
- def test_plain(self):
- tag = mock.Mock()
- tag.text.strip.return_value = 'name'
- tag.get.return_value = None
- link = google.UserLink(tag)
- self.assertEqual(str(link), 'name')
-
- def test_linked(self):
- tag = mock.Mock()
- tag.text.strip.return_value = 'name'
- tag.get.return_value = '/p/project'
- link = google.UserLink(tag)
- self.assertEqual(str(link), '[name](http://code.google.com/p/project)')
-
-
-class TestComment(TestCase):
- html = """
- <div class="cursor_off vt issuecomment" id="hc2">
- <div style="float:right; margin-right:.3em; text-align:right">
- <span class="date" title="Tue Jun 25 03:20:09 2013">
- Jun 25, 2013
- </span>
- </div>
- <span class="author">
- <span class="role_label">Project Member</span>
- <a name="c2" href="/p/pychess/issues/detail?id=267#c2">#2</a>
- <a class="userlink" href="/u/gbtami/">gbtami</a></span>
- <pre><i>(No comment was entered for this change.)</i>
- </pre>
- <div class="updates">
- <div class="round4"></div>
- <div class="round2"></div>
- <div class="round1"></div>
- <div class="box-inner">
- <b>Summary:</b>
- Make PyChess keyboard accessible
- <span class="oldvalue">
- (was: Make PyChess keyboard accecible)
- </span>
- <br>
- <b>Status:</b>
- Accepted
- <br>
- </div>
- <div class="round1"></div>
- <div class="round2"></div>
- <div class="round4"></div>
- </div>
- </div>
- """
-
- def test_init(self):
- from BeautifulSoup import BeautifulSoup
- html = BeautifulSoup(self.html)
- comment = google.Comment(html.find('div', 'issuecomment'), 'pychess')
- self.assertEqual(comment.updates, {
- u'Summary:': u'Make PyChess keyboard accessible',
- u'Status:': u'Accepted',
- })
-
-
-class TestAsMarkdown(TestCase):
-
- def soup(self, tag):
- return BeautifulSoup(u'<pre>%s</pre>' % tag).first()
-
- def test_unicode(self):
- tag = self.soup(u'\ua000 foo <a href="http://example.com/">bar</a>')
- res = google._as_markdown(tag, 'pn')
- self.assertEqual(res, u'\ua000 foo [bar](http://example.com/)')
http://git-wip-us.apache.org/repos/asf/allura/blob/b956fe30/ForgeImporters/forgeimporters/tests/google/test_tasks.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/tests/google/test_tasks.py b/ForgeImporters/forgeimporters/tests/google/test_tasks.py
deleted file mode 100644
index 01bab68..0000000
--- a/ForgeImporters/forgeimporters/tests/google/test_tasks.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import mock
-
-from ...google import tasks
-
-
-@mock.patch.object(tasks, 'GoogleCodeProjectExtractor')
-@mock.patch.object(tasks, 'ThreadLocalORMSession')
-@mock.patch.object(tasks, 'c')
-def test_import_project_info(c, session, gpe):
- c.project = mock.Mock(name='project')
- tasks.import_project_info('my-project')
- gpe.assert_called_once_with('my-project', 'project_info')
- gpe.return_value.get_short_description.assert_called_once_with(c.project)
- gpe.return_value.get_icon.assert_called_once_with(c.project)
- gpe.return_value.get_license.assert_called_once_with(c.project)
- session.flush_all.assert_called_once_with()
http://git-wip-us.apache.org/repos/asf/allura/blob/b956fe30/ForgeImporters/forgeimporters/tests/google/test_tracker.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/tests/google/test_tracker.py b/ForgeImporters/forgeimporters/tests/google/test_tracker.py
deleted file mode 100644
index e8f12bb..0000000
--- a/ForgeImporters/forgeimporters/tests/google/test_tracker.py
+++ /dev/null
@@ -1,336 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-from datetime import datetime
-from unittest import TestCase
-
-import mock
-from mock import patch
-from ming.odm import ThreadLocalORMSession
-
-from allura.tests import TestController
-from allura.tests.decorators import with_tracker
-
-from allura import model as M
-from forgeimporters.google import tracker
-
-
-class TestTrackerImporter(TestCase):
-
- @mock.patch.object(tracker, 'g')
- @mock.patch.object(tracker, 'c')
- @mock.patch.object(tracker, 'ThreadLocalORMSession')
- @mock.patch.object(tracker, 'session')
- @mock.patch.object(tracker, 'M')
- @mock.patch.object(tracker, 'TM')
- @mock.patch.object(tracker, 'GoogleCodeProjectExtractor')
- def test_import_tool(self, gpe, TM, M, session, tlos, c, g):
- importer = tracker.GoogleCodeTrackerImporter()
- importer.process_fields = mock.Mock()
- importer.process_labels = mock.Mock()
- importer.process_comments = mock.Mock()
- importer.postprocess_custom_fields = mock.Mock()
- project, user = mock.Mock(), mock.Mock()
- app = project.install_app.return_value
- app.config.options.mount_point = 'mount_point'
- app.config.options.import_id = {
- 'source': 'Google Code',
- 'project_name': 'project_name',
- }
- app.config.options.get = lambda *a: getattr(app.config.options, *a)
- app.url = 'foo'
- issues = gpe.iter_issues.return_value = [
- (50, mock.Mock()), (100, mock.Mock())]
- tickets = TM.Ticket.side_effect = [mock.Mock(), mock.Mock()]
-
- importer.import_tool(project, user, project_name='project_name',
- mount_point='mount_point', mount_label='mount_label')
-
- project.install_app.assert_called_once_with(
- 'tickets', 'mount_point', 'mount_label',
- EnableVoting=True,
- open_status_names='New Accepted Started',
- closed_status_names='Fixed Verified Invalid Duplicate WontFix Done',
- import_id={
- 'source': 'Google Code',
- 'project_name': 'project_name',
- }
- )
- gpe.iter_issues.assert_called_once_with('project_name')
- self.assertEqual(importer.process_fields.call_args_list, [
- mock.call(tickets[0], issues[0][1]),
- mock.call(tickets[1], issues[1][1]),
- ])
- self.assertEqual(importer.process_labels.call_args_list, [
- mock.call(tickets[0], issues[0][1]),
- mock.call(tickets[1], issues[1][1]),
- ])
- self.assertEqual(importer.process_comments.call_args_list, [
- mock.call(tickets[0], issues[0][1]),
- mock.call(tickets[1], issues[1][1]),
- ])
- self.assertEqual(tlos.flush_all.call_args_list, [
- mock.call(),
- mock.call(),
- ])
- self.assertEqual(session.return_value.flush.call_args_list, [
- mock.call(tickets[0]),
- mock.call(tickets[1]),
- ])
- self.assertEqual(session.return_value.expunge.call_args_list, [
- mock.call(tickets[0]),
- mock.call(tickets[1]),
- ])
- self.assertEqual(app.globals.last_ticket_num, 100)
- M.AuditLog.log.assert_called_once_with(
- 'import tool mount_point from project_name on Google Code',
- project=project, user=user, url='foo')
- g.post_event.assert_called_once_with('project_updated')
- app.globals.invalidate_bin_counts.assert_called_once_with()
-
- @mock.patch.object(tracker, 'ThreadLocalORMSession')
- @mock.patch.object(tracker, 'M')
- @mock.patch.object(tracker, 'h')
- def test_import_tool_failure(self, h, M, ThreadLocalORMSession):
- h.push_config.side_effect = ValueError
- project = mock.Mock()
- user = mock.Mock()
-
- importer = tracker.GoogleCodeTrackerImporter()
- self.assertRaises(
- ValueError, importer.import_tool, project, user, project_name='project_name',
- mount_point='mount_point', mount_label='mount_label')
-
- h.make_app_admin_only.assert_called_once_with(
- project.install_app.return_value)
-
- def test_custom_fields(self):
- importer = tracker.GoogleCodeTrackerImporter()
- importer.custom_fields = {}
- importer.custom_field('Foo')
- importer.custom_field('Milestone')
- importer.custom_field('Priority')
- importer.custom_field('Type')
- self.assertEqual(importer.custom_fields, {
- 'Foo': {
- 'type': 'string',
- 'label': 'Foo',
- 'name': '_foo',
- 'options': set(),
- },
- 'Milestone': {
- 'type': 'milestone',
- 'label': 'Milestone',
- 'name': '_milestone',
- 'options': set(),
- },
- 'Priority': {
- 'type': 'select',
- 'label': 'Priority',
- 'name': '_priority',
- 'options': set(),
- },
- 'Type': {
- 'type': 'select',
- 'label': 'Type',
- 'name': '_type',
- 'options': set(),
- },
- })
- importer.custom_fields = {'Foo': {}}
- importer.custom_field('Foo')
- self.assertEqual(importer.custom_fields, {'Foo': {}})
-
- def test_process_fields(self):
- ticket = mock.Mock()
- issue = mock.Mock(
- get_issue_summary=lambda: 'summary',
- get_issue_description=lambda: 'my *description* fool',
- get_issue_status=lambda: 'status',
- get_issue_created_date=lambda: 'created_date',
- get_issue_mod_date=lambda: 'mod_date',
- get_issue_creator=lambda: 'creator',
- get_issue_owner=lambda: 'owner',
- )
- importer = tracker.GoogleCodeTrackerImporter()
- with mock.patch.object(tracker, 'dateutil') as dt:
- dt.parser.parse.side_effect = lambda s: s
- importer.process_fields(ticket, issue)
- self.assertEqual(ticket.summary, 'summary')
- self.assertEqual(ticket.description,
- '*Originally created by:* creator\n*Originally owned by:* owner\n\nmy *description* fool')
- self.assertEqual(ticket.status, 'status')
- self.assertEqual(ticket.created_date, 'created_date')
- self.assertEqual(ticket.mod_date, 'mod_date')
- self.assertEqual(dt.parser.parse.call_args_list, [
- mock.call('created_date'),
- mock.call('mod_date'),
- ])
-
- def test_process_labels(self):
- ticket = mock.Mock(custom_fields={}, labels=[])
- issue = mock.Mock(get_issue_labels=lambda:
- ['Foo-Bar', 'Baz', 'Foo-Qux'])
- importer = tracker.GoogleCodeTrackerImporter()
- importer.custom_field = mock.Mock(
- side_effect=lambda n: {'name': '_%s' % n.lower(), 'options': set()})
- importer.process_labels(ticket, issue)
- self.assertEqual(ticket.labels, ['Baz'])
- self.assertEqual(ticket.custom_fields, {'_foo': 'Bar, Qux'})
-
- def test_process_comments(self):
- def _author(n):
- a = mock.Mock()
- a.name = 'author%s' % n
- a.link = 'author%s_link' % n
- return a
- ticket = mock.Mock()
- issue = mock.Mock()
- comments = issue.iter_comments.return_value = [
- mock.Mock(
- author=_author(1),
- body='text1',
- annotated_text='annotated1',
- attachments='attachments1',
- created_date='Mon Jul 15 00:00:00 2013',
- ),
- mock.Mock(
- author=_author(2),
- body='text2',
- annotated_text='annotated2',
- attachments='attachments2',
- created_date='Mon Jul 16 00:00:00 2013',
- ),
- ]
- comments[0].updates.items.return_value = [
- ('Foo:', 'Bar'), ('Baz:', 'Qux')]
- comments[1].updates.items.return_value = []
- posts = ticket.discussion_thread.add_post.side_effect = [
- mock.Mock(),
- mock.Mock(),
- ]
- importer = tracker.GoogleCodeTrackerImporter()
- importer.process_comments(ticket, issue)
- self.assertEqual(ticket.discussion_thread.add_post.call_args_list[0], mock.call(
- text='annotated1',
- timestamp=datetime(2013, 7, 15),
- ignore_security=True,
- ))
- posts[0].add_multiple_attachments.assert_called_once_with(
- 'attachments1')
- self.assertEqual(ticket.discussion_thread.add_post.call_args_list[1], mock.call(
- text='annotated2',
- timestamp=datetime(2013, 7, 16),
- ignore_security=True,
- ))
- posts[1].add_multiple_attachments.assert_called_once_with(
- 'attachments2')
-
- @mock.patch.object(tracker, 'c')
- def test_postprocess_custom_fields(self, c):
- importer = tracker.GoogleCodeTrackerImporter()
- importer.open_milestones = set(['m2', 'm3'])
- importer.custom_fields = {
- 'Foo': {
- 'name': '_foo',
- 'type': 'string',
- 'options': set(['foo', 'bar']),
- },
- 'Milestone': {
- 'name': '_milestone',
- 'type': 'milestone',
- 'options': set(['m3', 'm1', 'm2']),
- },
- 'Priority': {
- 'name': '_priority',
- 'type': 'select',
- 'options': set(['foo', 'bar']),
- },
- }
- custom_fields = importer.postprocess_custom_fields()
- self.assertItemsEqual(custom_fields, [
- {
- 'name': '_foo',
- 'type': 'string',
- 'options': '',
- },
- {
- 'name': '_milestone',
- 'type': 'milestone',
- 'options': '',
- 'milestones': [
- {'name': 'm1', 'due_date': None, 'complete': True},
- {'name': 'm2', 'due_date': None, 'complete': False},
- {'name': 'm3', 'due_date': None, 'complete': False},
- ],
- },
- {
- 'name': '_priority',
- 'type': 'select',
- 'options': 'foo bar',
- },
- ])
-
-
-class TestGoogleCodeTrackerImportController(TestController, TestCase):
-
- def setUp(self):
- """Mount Google Code importer on the Tracker admin controller"""
- super(TestGoogleCodeTrackerImportController, self).setUp()
- from forgetracker.tracker_main import TrackerAdminController
- TrackerAdminController._importer = \
- tracker.GoogleCodeTrackerImportController(
- tracker.GoogleCodeTrackerImporter())
-
- @with_tracker
- def test_index(self):
- r = self.app.get('/p/test/admin/bugs/_importer/')
- self.assertIsNotNone(r.html.find(attrs=dict(name="gc_project_name")))
- self.assertIsNotNone(r.html.find(attrs=dict(name="mount_label")))
- self.assertIsNotNone(r.html.find(attrs=dict(name="mount_point")))
-
- @with_tracker
- @patch('forgeimporters.base.import_tool')
- def test_create(self, import_tool):
- params = dict(gc_project_name='test',
- mount_label='mylabel',
- mount_point='mymount',
- )
- r = self.app.post('/p/test/admin/bugs/_importer/create', params,
- status=302)
- self.assertEqual(r.location, 'http://localhost/p/test/admin/')
- self.assertEqual(
- u'mymount', import_tool.post.call_args[1]['mount_point'])
- self.assertEqual(
- u'mylabel', import_tool.post.call_args[1]['mount_label'])
- self.assertEqual(
- u'test', import_tool.post.call_args[1]['project_name'])
-
- @with_tracker
- @patch('forgeimporters.base.import_tool')
- def test_create_limit(self, import_tool):
- project = M.Project.query.get(shortname='test')
- project.set_tool_data('GoogleCodeTrackerImporter', pending=1)
- ThreadLocalORMSession.flush_all()
- params = dict(gc_project_name='test',
- mount_label='mylabel',
- mount_point='mymount',
- )
- r = self.app.post('/p/test/admin/bugs/_importer/create', params,
- status=302).follow()
- self.assertIn('Please wait and try again', r)
- self.assertEqual(import_tool.post.call_count, 0)