|
16 | 16 | import copy
|
17 | 17 | import http
|
18 | 18 | import textwrap
|
| 19 | +import types |
19 | 20 |
|
20 | 21 | import freezegun
|
21 | 22 | from google.api_core import exceptions
|
@@ -308,7 +309,7 @@ def test_cancelled(self):
|
308 | 309 |
|
309 | 310 | self.assertTrue(job.cancelled())
|
310 | 311 |
|
311 |
| -def test_done(self): |
| 312 | +def test_done_job_complete(self): |
312 | 313 | client = _make_client(project=self.PROJECT)
|
313 | 314 | resource = self._make_resource(ended=True)
|
314 | 315 | job = self._get_target_class().from_api_repr(resource, client)
|
@@ -356,6 +357,84 @@ def test_done_w_timeout_and_longer_internal_api_timeout(self):
|
356 | 357 | call_args = fake_reload.call_args
|
357 | 358 | self.assertAlmostEqual(call_args.kwargs.get("timeout"), expected_timeout)
|
358 | 359 |
|
| 360 | +def test_done_w_query_results_error_reload_ok_job_finished(self): |
| 361 | +client = _make_client(project=self.PROJECT) |
| 362 | +bad_request_error = exceptions.BadRequest("Error in query") |
| 363 | +client._get_query_results = mock.Mock(side_effect=bad_request_error) |
| 364 | + |
| 365 | +resource = self._make_resource(ended=False) |
| 366 | +job = self._get_target_class().from_api_repr(resource, client) |
| 367 | +job._exception = None |
| 368 | + |
| 369 | +def fake_reload(self, *args, **kwargs): |
| 370 | +self._properties["status"]["state"] = "DONE" |
| 371 | +self.set_exception(copy.copy(bad_request_error)) |
| 372 | + |
| 373 | +fake_reload_method = types.MethodType(fake_reload, job) |
| 374 | + |
| 375 | +with mock..object(job, "reload", new=fake_reload_method): |
| 376 | +is_done = job.done() |
| 377 | + |
| 378 | +assert is_done |
| 379 | +assert isinstance(job._exception, exceptions.BadRequest) |
| 380 | + |
| 381 | +def test_done_w_query_results_error_reload_ok_job_still_running(self): |
| 382 | +client = _make_client(project=self.PROJECT) |
| 383 | +retry_error = exceptions.RetryError("Too many retries", cause=TimeoutError) |
| 384 | +client._get_query_results = mock.Mock(side_effect=retry_error) |
| 385 | + |
| 386 | +resource = self._make_resource(ended=False) |
| 387 | +job = self._get_target_class().from_api_repr(resource, client) |
| 388 | +job._exception = None |
| 389 | + |
| 390 | +def fake_reload(self, *args, **kwargs): |
| 391 | +self._properties["status"]["state"] = "RUNNING" |
| 392 | + |
| 393 | +fake_reload_method = types.MethodType(fake_reload, job) |
| 394 | + |
| 395 | +with mock..object(job, "reload", new=fake_reload_method): |
| 396 | +is_done = job.done() |
| 397 | + |
| 398 | +assert not is_done |
| 399 | +assert job._exception is None |
| 400 | + |
| 401 | +def test_done_w_query_results_error_reload_error(self): |
| 402 | +client = _make_client(project=self.PROJECT) |
| 403 | +bad_request_error = exceptions.BadRequest("Error in query") |
| 404 | +client._get_query_results = mock.Mock(side_effect=bad_request_error) |
| 405 | + |
| 406 | +resource = self._make_resource(ended=False) |
| 407 | +job = self._get_target_class().from_api_repr(resource, client) |
| 408 | +reload_error = exceptions.DataLoss("Oops, sorry!") |
| 409 | +job.reload = mock.Mock(side_effect=reload_error) |
| 410 | +job._exception = None |
| 411 | + |
| 412 | +is_done = job.done() |
| 413 | + |
| 414 | +assert is_done |
| 415 | +assert job._exception is bad_request_error |
| 416 | + |
| 417 | +def test_done_w_job_query_results_ok_reload_error(self): |
| 418 | +client = _make_client(project=self.PROJECT) |
| 419 | +query_results = google.cloud.bigquery.query._QueryResults( |
| 420 | +properties={ |
| 421 | +"jobComplete": True, |
| 422 | +"jobReference": {"projectId": self.PROJECT, "jobId": "12345"}, |
| 423 | +} |
| 424 | +) |
| 425 | +client._get_query_results = mock.Mock(return_value=query_results) |
| 426 | + |
| 427 | +resource = self._make_resource(ended=False) |
| 428 | +job = self._get_target_class().from_api_repr(resource, client) |
| 429 | +retry_error = exceptions.RetryError("Too many retries", cause=TimeoutError) |
| 430 | +job.reload = mock.Mock(side_effect=retry_error) |
| 431 | +job._exception = None |
| 432 | + |
| 433 | +is_done = job.done() |
| 434 | + |
| 435 | +assert is_done |
| 436 | +assert job._exception is retry_error |
| 437 | + |
359 | 438 | def test_query_plan(self):
|
360 | 439 | from google.cloud._helpers import _RFC3339_MICROS
|
361 | 440 | from google.cloud.bigquery.job import QueryPlanEntry
|
@@ -973,7 +1052,7 @@ def test_result_w_retry(self):
|
973 | 1052 | initial=0.001,
|
974 | 1053 | maximum=0.001,
|
975 | 1054 | multiplier=1.0,
|
976 |
| -deadline=0.001, |
| 1055 | +deadline=0.1, |
977 | 1056 | predicate=custom_predicate,
|
978 | 1057 | )
|
979 | 1058 |
|
|
0 commit comments