diff --git a/gcloud/storage/test_batch.py b/gcloud/storage/test_batch.py index 3184b75bd6ff..7276267aff6e 100644 --- a/gcloud/storage/test_batch.py +++ b/gcloud/storage/test_batch.py @@ -160,8 +160,35 @@ def test_finish_empty(self): self.assertRaises(ValueError, batch.finish) self.assertTrue(connection.http is http) - def test_finish_nonempty(self): + def _check_subrequest_no_payload(self, chunk, method, url): + lines = chunk.splitlines() + # blank + 2 headers + blank + request + blank + blank + self.assertEqual(len(lines), 7) + self.assertEqual(lines[0], '') + self.assertEqual(lines[1], 'Content-Type: application/http') + self.assertEqual(lines[2], 'MIME-Version: 1.0') + self.assertEqual(lines[3], '') + self.assertEqual(lines[4], '%s %s HTTP/1.1' % (method, url)) + self.assertEqual(lines[5], '') + self.assertEqual(lines[6], '') + + def _check_subrequest_payload(self, chunk, method, url, payload): import json + lines = chunk.splitlines() + # blank + 2 headers + blank + request + 2 headers + blank + body + payload_str = json.dumps(payload) + self.assertEqual(len(lines), 9) + self.assertEqual(lines[0], '') + self.assertEqual(lines[1], 'Content-Type: application/http') + self.assertEqual(lines[2], 'MIME-Version: 1.0') + self.assertEqual(lines[3], '') + self.assertEqual(lines[4], '%s %s HTTP/1.1' % (method, url)) + self.assertEqual(lines[5], 'Content-Length: %d' % len(payload_str)) + self.assertEqual(lines[6], 'Content-Type: application/json') + self.assertEqual(lines[7], '') + self.assertEqual(json.loads(lines[8]), payload) + + def test_finish_nonempty(self): URL = 'http://api.example.com/other_api' expected = _Response() expected['Content-Type'] = 'multipart/mixed; boundary="DEADBEEF="' @@ -188,7 +215,7 @@ def test_finish_nonempty(self): self.assertEqual(uri, 'http://api.example.com/batch') self.assertEqual(len(headers), 2) ctype, boundary = [x.strip() - for x in headers['Content-Type'].split(';')] + for x in headers['Content-Type'].split(';')] self.assertEqual(ctype, 'multipart/mixed') self.assertTrue(boundary.startswith('boundary="==')) self.assertTrue(boundary.endswith('=="')) @@ -198,43 +225,12 @@ def test_finish_nonempty(self): chunks = body.split(divider)[1:-1] # discard prolog / epilog self.assertEqual(len(chunks), 3) - lines = chunks[0].splitlines() - # blank + 2 headers + blank + request + 2 headers + blank + body - self.assertEqual(len(lines), 9) - self.assertEqual(lines[0], '') - self.assertEqual(lines[1], 'Content-Type: application/http') - self.assertEqual(lines[2], 'MIME-Version: 1.0') - self.assertEqual(lines[3], '') - self.assertEqual(lines[4], 'POST %s HTTP/1.1' % URL) - self.assertEqual(lines[5], 'Content-Length: 20') - self.assertEqual(lines[6], 'Content-Type: application/json') - self.assertEqual(lines[7], '') - self.assertEqual(json.loads(lines[8]), {'foo': 1, 'bar': 2}) - - lines = chunks[1].splitlines() - # blank + 2 headers + blank + request + 2 headers + blank + body - self.assertEqual(len(lines), 9) - self.assertEqual(lines[0], '') - self.assertEqual(lines[1], 'Content-Type: application/http') - self.assertEqual(lines[2], 'MIME-Version: 1.0') - self.assertEqual(lines[3], '') - self.assertEqual(lines[4], 'PATCH %s HTTP/1.1' % URL) - self.assertEqual(lines[5], 'Content-Length: 10') - self.assertEqual(lines[6], 'Content-Type: application/json') - self.assertEqual(lines[7], '') - self.assertEqual(json.loads(lines[8]), {'bar': 3}) + self._check_subrequest_payload(chunks[0], 'POST', URL, + {'foo': 1, 'bar': 2}) - lines = chunks[2].splitlines() - # blank + 2 headers + blank + request + 2 headers + blank + body - self.assertEqual(len(lines), 7) - self.assertEqual(lines[0], '') - self.assertEqual(lines[1], 'Content-Type: application/http') - self.assertEqual(lines[2], 'MIME-Version: 1.0') - self.assertEqual(lines[3], '') - self.assertEqual(lines[4], 'DELETE %s HTTP/1.1' % URL) - self.assertEqual(lines[5], '') - self.assertEqual(lines[6], '') + self._check_subrequest_payload(chunks[1], 'PATCH', URL, {'bar': 3}) + self._check_subrequest_no_payload(chunks[2], 'DELETE', URL) def test_finish_nonempty_non_multipart_response(self): URL = 'http://api.example.com/other_api'