|
1 | 1 | import inspect |
2 | 2 | import os |
3 | 3 | import shutil |
4 | | -from typing import NamedTuple |
5 | | -from unittest import TestCase |
| 4 | +from typing import Any, NamedTuple, NoReturn |
| 5 | +from unittest import TestCase, mock |
6 | 6 |
|
7 | 7 | import pytest |
8 | 8 | from click.testing import CliRunner |
| 9 | +from requests import Timeout |
| 10 | +from requests.exceptions import ConnectionError |
9 | 11 | from vcr import VCR |
10 | 12 |
|
11 | 13 | # import vcr |
|
18 | 20 | from icloudpd.status import StatusExchange |
19 | 21 | from pyicloud_ipd.file_match import FileMatchPolicy |
20 | 22 | from pyicloud_ipd.raw_policy import RawTreatmentPolicy |
| 23 | +from pyicloud_ipd.session import PyiCloudSession |
21 | 24 | from pyicloud_ipd.sms import parse_trusted_phone_numbers_payload |
22 | 25 | from tests.helpers import path_from_project_root, recreate_path |
23 | 26 |
|
@@ -413,6 +416,141 @@ def test_failed_auth_503_watch(self) -> None: |
413 | 416 | # self.assertTrue("Can't overwrite existing cassette" in str(context.exception)) |
414 | 417 | assert result.exit_code == 1 # should error for vcr |
415 | 418 |
|
| 419 | + def test_connection_error(self) -> None: |
| 420 | + base_dir = os.path.join(self.fixtures_path, inspect.stack()[0][3]) |
| 421 | + cookie_dir = os.path.join(base_dir, "cookie") |
| 422 | + |
| 423 | + for dir in [base_dir, cookie_dir]: |
| 424 | + recreate_path(dir) |
| 425 | + |
| 426 | + def mock_raise_response_error(_a1: Any, _a2: Any, _a3: Any, **kwargs) -> NoReturn: # type: ignore [no-untyped-def] |
| 427 | + raise ConnectionError("Simulated Connection Error") |
| 428 | + |
| 429 | + with ( |
| 430 | + mock.patch.object( |
| 431 | + PyiCloudSession, "request", side_effect=mock_raise_response_error, autospec=True |
| 432 | + ) as pa_request, |
| 433 | + vcr.use_cassette(os.path.join(self.vcr_path, "failed_auth_503.yml")), |
| 434 | + ): # noqa: SIM117 |
| 435 | + # errors.CannotOverwriteExistingCassetteException |
| 436 | + runner = CliRunner(env={"CLIENT_ID": "EC5646DE-9423-11E8-BF21-14109FE0B321"}) |
| 437 | + result = runner.invoke( |
| 438 | + main, |
| 439 | + [ |
| 440 | + "--username", |
| 441 | + "jdoe@gmail.com", |
| 442 | + "--password", |
| 443 | + "password1", |
| 444 | + "--no-progress-bar", |
| 445 | + "--directory", |
| 446 | + base_dir, |
| 447 | + "--cookie-directory", |
| 448 | + cookie_dir, |
| 449 | + # "--watch-with-interval", |
| 450 | + # "1", |
| 451 | + ], |
| 452 | + ) |
| 453 | + pa_request.assert_called_once() |
| 454 | + self.assertIn( |
| 455 | + "Authenticating...", |
| 456 | + self._caplog.text, |
| 457 | + ) |
| 458 | + self.assertIn( |
| 459 | + "INFO Cannot connect to Apple iCloud service", |
| 460 | + self._caplog.text, |
| 461 | + ) |
| 462 | + assert result.exit_code == 1 # should error for vcr |
| 463 | + |
| 464 | + def test_timeout_error(self) -> None: |
| 465 | + base_dir = os.path.join(self.fixtures_path, inspect.stack()[0][3]) |
| 466 | + cookie_dir = os.path.join(base_dir, "cookie") |
| 467 | + |
| 468 | + for dir in [base_dir, cookie_dir]: |
| 469 | + recreate_path(dir) |
| 470 | + |
| 471 | + def mock_raise_response_error(_a1: Any, _a2: Any, _a3: Any, **kwargs) -> NoReturn: # type: ignore [no-untyped-def] |
| 472 | + raise TimeoutError("Simulated TimeoutError") |
| 473 | + |
| 474 | + with ( |
| 475 | + mock.patch.object( |
| 476 | + PyiCloudSession, "request", side_effect=mock_raise_response_error, autospec=True |
| 477 | + ) as pa_request, |
| 478 | + vcr.use_cassette(os.path.join(self.vcr_path, "failed_auth_503.yml")), |
| 479 | + ): # noqa: SIM117 |
| 480 | + # errors.CannotOverwriteExistingCassetteException |
| 481 | + runner = CliRunner(env={"CLIENT_ID": "EC5646DE-9423-11E8-BF21-14109FE0B321"}) |
| 482 | + result = runner.invoke( |
| 483 | + main, |
| 484 | + [ |
| 485 | + "--username", |
| 486 | + "jdoe@gmail.com", |
| 487 | + "--password", |
| 488 | + "password1", |
| 489 | + "--no-progress-bar", |
| 490 | + "--directory", |
| 491 | + base_dir, |
| 492 | + "--cookie-directory", |
| 493 | + cookie_dir, |
| 494 | + # "--watch-with-interval", |
| 495 | + # "1", |
| 496 | + ], |
| 497 | + ) |
| 498 | + pa_request.assert_called_once() |
| 499 | + self.assertIn( |
| 500 | + "Authenticating...", |
| 501 | + self._caplog.text, |
| 502 | + ) |
| 503 | + self.assertIn( |
| 504 | + "INFO Cannot connect to Apple iCloud service", |
| 505 | + self._caplog.text, |
| 506 | + ) |
| 507 | + assert result.exit_code == 1 # should error for vcr |
| 508 | + |
| 509 | + def test_timeout(self) -> None: |
| 510 | + base_dir = os.path.join(self.fixtures_path, inspect.stack()[0][3]) |
| 511 | + cookie_dir = os.path.join(base_dir, "cookie") |
| 512 | + |
| 513 | + for dir in [base_dir, cookie_dir]: |
| 514 | + recreate_path(dir) |
| 515 | + |
| 516 | + def mock_raise_response_error(_a1: Any, _a2: Any, _a3: Any, **kwargs) -> NoReturn: # type: ignore [no-untyped-def] |
| 517 | + raise Timeout("Simulated Timeout") |
| 518 | + |
| 519 | + with ( |
| 520 | + mock.patch.object( |
| 521 | + PyiCloudSession, "request", side_effect=mock_raise_response_error, autospec=True |
| 522 | + ) as pa_request, |
| 523 | + vcr.use_cassette(os.path.join(self.vcr_path, "failed_auth_503.yml")), |
| 524 | + ): # noqa: SIM117 |
| 525 | + # errors.CannotOverwriteExistingCassetteException |
| 526 | + runner = CliRunner(env={"CLIENT_ID": "EC5646DE-9423-11E8-BF21-14109FE0B321"}) |
| 527 | + result = runner.invoke( |
| 528 | + main, |
| 529 | + [ |
| 530 | + "--username", |
| 531 | + "jdoe@gmail.com", |
| 532 | + "--password", |
| 533 | + "password1", |
| 534 | + "--no-progress-bar", |
| 535 | + "--directory", |
| 536 | + base_dir, |
| 537 | + "--cookie-directory", |
| 538 | + cookie_dir, |
| 539 | + # "--watch-with-interval", |
| 540 | + # "1", |
| 541 | + ], |
| 542 | + ) |
| 543 | + pa_request.assert_called_once() |
| 544 | + self.assertIn( |
| 545 | + "Authenticating...", |
| 546 | + self._caplog.text, |
| 547 | + ) |
| 548 | + self.assertIn( |
| 549 | + "INFO Cannot connect to Apple iCloud service", |
| 550 | + self._caplog.text, |
| 551 | + ) |
| 552 | + assert result.exit_code == 1 # should error for vcr |
| 553 | + |
416 | 554 |
|
417 | 555 | class _TrustedDevice(NamedTuple): |
418 | 556 | id: int |
|
0 commit comments