diff --git a/tests/rietveld_test.py b/tests/rietveld_test.py index ab84a375b..47af5a0c5 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