Index: tests/rietveld_test.py |
diff --git a/tests/rietveld_test.py b/tests/rietveld_test.py |
index ab84a375bd8d5c566c492618aab8cf2bb423671f..47af5a0c5ca2dfe76990cca8a49d86aaeb01332b 100755 |
--- a/tests/rietveld_test.py |
+++ b/tests/rietveld_test.py |
@@ -20,60 +20,158 @@ import rietveld |
# pylint: disable=W0212 |
+def _api(files): |
+ """Mock a rietveld api request.""" |
+ return rietveld.json.dumps({'files': files}) |
+ |
+ |
+def _file( |
+ status, is_binary=False, num_chunks=1, chunk_id=789, property_changes=''): |
+ """Mock a file in a rietveld api request.""" |
+ return { |
+ 'status': status, |
+ 'is_binary': is_binary, |
+ 'num_chunks': num_chunks, |
+ 'id': chunk_id, |
+ 'property_changes': property_changes, |
+ } |
+ |
+ |
class RietveldTest(unittest.TestCase): |
+ def setUp(self): |
+ self.rietveld = rietveld.Rietveld('url', 'email', 'password') |
+ self.rietveld._send = self._rietveld_send |
+ self.requests = [] |
+ |
+ def tearDown(self): |
+ self.assertEquals([], self.requests) |
+ |
+ def _rietveld_send(self, url, *args, **kwargs): |
+ self.assertTrue(self.requests, url) |
+ request = self.requests.pop(0) |
+ self.assertEquals(2, len(request)) |
+ self.assertEquals(url, request[0]) |
+ return request[1] |
+ |
def test_get_patch_empty(self): |
- r = rietveld.Rietveld('url', 'email', 'password') |
- r._send = lambda *args, **kwargs: '{}' |
- patches = r.get_patch(123, 456) |
+ self.requests = [('/api/123/456', '{}')] |
+ patches = self.rietveld.get_patch(123, 456) |
self.assertTrue(isinstance(patches, patch.PatchSet)) |
self.assertEquals([], patches.patches) |
+ def _check_patch(self, |
+ p, |
+ filename, |
+ diff, |
+ is_binary=False, |
+ is_delete=False, |
+ is_git_diff=False, |
+ is_new=False, |
+ patchlevel=0, |
+ svn_properties=None): |
+ svn_properties = svn_properties or [] |
+ self.assertEquals(p.filename, filename) |
+ self.assertEquals(p.is_binary, is_binary) |
+ self.assertEquals(p.is_delete, is_delete) |
+ if hasattr(p, 'is_git_diff'): |
+ self.assertEquals(p.is_git_diff, is_git_diff) |
+ self.assertEquals(p.is_new, is_new) |
+ if hasattr(p, 'patchlevel'): |
+ self.assertEquals(p.patchlevel, patchlevel) |
+ if diff: |
+ self.assertEquals(p.get(), diff) |
+ if hasattr(p, 'svn_properties'): |
+ self.assertEquals(p.svn_properties, svn_properties) |
+ |
def test_get_patch_no_status(self): |
- r = rietveld.Rietveld('url', 'email', 'password') |
- r._send = lambda *args, **kwargs: ( |
- '{' |
- ' "files":' |
- ' {' |
- ' "file_a":' |
- ' {' |
- ' }' |
- ' }' |
- '}') |
+ self.requests = [('/api/123/456', _api({'file_a': {}}))] |
try: |
- r.get_patch(123, 456) |
+ self.rietveld.get_patch(123, 456) |
self.fail() |
except patch.UnsupportedPatchFormat, e: |
self.assertEquals('file_a', e.filename) |
- def test_get_patch_two_files(self): |
- output = ( |
- '{' |
- ' "files":' |
- ' {' |
- ' "file_a":' |
- ' {' |
- ' "status": "A",' |
- ' "is_binary": false,' |
- ' "num_chunks": 1,' |
- ' "id": 789' |
- ' }' |
- ' }' |
- '}') |
- r = rietveld.Rietveld('url', 'email', 'password') |
- r._send = lambda *args, **kwargs: output |
- patches = r.get_patch(123, 456) |
- self.assertTrue(isinstance(patches, patch.PatchSet)) |
+ def test_get_patch_2_files(self): |
+ diff1 = ( |
+ '--- /dev/null\n' |
+ '+++ file_a\n' |
+ '@@ -0,0 +1 @@\n' |
+ '+bar\n') |
+ diff2 = ( |
+ '--- file_b\n' |
+ '+++ file_b\n' |
+ '@@ -0,0 +1,1 @@\n' |
+ '+bar\n') |
+ self.requests = [ |
+ ('/api/123/456', |
+ _api({'file_a': _file('A'), 'file_b': _file('M', chunk_id=790)})), |
+ ('/download/issue123_456_789.diff', diff1), |
+ ('/download/issue123_456_790.diff', diff2), |
+ ] |
+ patches = self.rietveld.get_patch(123, 456) |
+ self.assertEquals(2, len(patches.patches)) |
+ self._check_patch(patches.patches[0], 'file_a', diff1, is_new=True) |
+ self._check_patch(patches.patches[1], 'file_b', diff2) |
+ |
+ def test_get_patch_add(self): |
+ diff = ( |
+ '--- /dev/null\n' |
+ '+++ file_a\n' |
+ '@@ -0,0 +1 @@\n' |
+ '+bar\n') |
+ self.requests = [ |
+ ('/api/123/456', _api({'file_a': _file('A')})), |
+ ('/download/issue123_456_789.diff', diff), |
+ ] |
+ patches = self.rietveld.get_patch(123, 456) |
+ self.assertEquals(1, len(patches.patches)) |
+ self._check_patch(patches.patches[0], 'file_a', diff, is_new=True) |
+ |
+ def test_invalid_status(self): |
+ self.requests = [ |
+ ('/api/123/456', _api({'file_a': _file('B')})), |
+ ] |
+ try: |
+ self.rietveld.get_patch(123, 456) |
+ self.fail() |
+ except patch.UnsupportedPatchFormat, e: |
+ self.assertEquals('file_a', e.filename) |
+ |
+ def test_add_plus(self): |
+ properties = ( |
+ '\nAdded: svn:mergeinfo\n' |
+ ' Merged /branches/funky/file_b:r69-2775\n') |
+ self.requests = [ |
+ ('/api/123/456', |
+ _api({'file_a': _file('A+', property_changes=properties)})), |
+ ] |
+ try: |
+ self.rietveld.get_patch(123, 456) |
+ self.fail() |
+ except patch.UnsupportedPatchFormat, e: |
+ self.assertEquals('file_a', e.filename) |
+ |
+ def test_delete(self): |
+ self.requests = [ |
+ ('/api/123/456', _api({'file_a': _file('D')})), |
+ ] |
+ patches = self.rietveld.get_patch(123, 456) |
self.assertEquals(1, len(patches.patches)) |
- obj = patches.patches[0] |
- self.assertEquals(patch.FilePatchDiff, obj.__class__) |
- self.assertEquals('file_a', obj.filename) |
- self.assertEquals([], obj.svn_properties) |
- self.assertEquals(False, obj.is_git_diff) |
- self.assertEquals(0, obj.patchlevel) |
- # This is because Rietveld._send() always returns the same buffer. |
- self.assertEquals(output, obj.get()) |
- |
- def testSvnProperties(self): |
+ self._check_patch(patches.patches[0], 'file_a', None, is_delete=True) |
+ |
+ def test_m_plus(self): |
+ properties = '\nAdded: svn:eol-style\n + LF\n' |
+ self.requests = [ |
+ ('/api/123/456', |
+ _api({'file_a': _file('M+', property_changes=properties)})), |
+ ] |
+ try: |
+ self.rietveld.get_patch(123, 456) |
+ self.fail() |
+ except patch.UnsupportedPatchFormat, e: |
+ self.assertEquals('file_a', e.filename) |
+ |
+ def test_svn_properties(self): |
# Line too long (N/80) |
# pylint: disable=C0301 |