|
1 | 1 | import pytest |
| 2 | +import requests |
2 | 3 |
|
3 | 4 | from databricks.sdk import errors |
4 | 5 |
|
5 | 6 |
|
| 7 | +def fake_response(status_code: int) -> requests.Response: |
| 8 | + resp = requests.Response() |
| 9 | + resp.status_code = status_code |
| 10 | + resp.request = requests.Request('GET', 'https://databricks.com/api/2.0/service').prepare() |
| 11 | + return resp |
| 12 | + |
| 13 | + |
6 | 14 | def test_error_code_has_precedence_over_http_status(): |
7 | | - err = errors.error_mapper(400, {'error_code': 'INVALID_PARAMETER_VALUE', 'message': 'nope'}) |
| 15 | + err = errors.error_mapper(fake_response(400), { |
| 16 | + 'error_code': 'INVALID_PARAMETER_VALUE', |
| 17 | + 'message': 'nope' |
| 18 | + }) |
8 | 19 | assert errors.InvalidParameterValue == type(err) |
9 | 20 |
|
10 | 21 |
|
11 | 22 | def test_http_status_code_maps_fine(): |
12 | | - err = errors.error_mapper(400, {'error_code': 'MALFORMED_REQUEST', 'message': 'nope'}) |
| 23 | + err = errors.error_mapper(fake_response(400), {'error_code': 'MALFORMED_REQUEST', 'message': 'nope'}) |
13 | 24 | assert errors.BadRequest == type(err) |
14 | 25 |
|
15 | 26 |
|
16 | 27 | def test_other_errors_also_map_fine(): |
17 | | - err = errors.error_mapper(417, {'error_code': 'WHOOPS', 'message': 'nope'}) |
| 28 | + err = errors.error_mapper(fake_response(417), {'error_code': 'WHOOPS', 'message': 'nope'}) |
18 | 29 | assert errors.DatabricksError == type(err) |
19 | 30 |
|
20 | 31 |
|
21 | 32 | def test_missing_error_code(): |
22 | | - err = errors.error_mapper(522, {'message': 'nope'}) |
| 33 | + err = errors.error_mapper(fake_response(522), {'message': 'nope'}) |
23 | 34 | assert errors.DatabricksError == type(err) |
24 | 35 |
|
25 | 36 |
|
@@ -48,6 +59,31 @@ def test_missing_error_code(): |
48 | 59 | (444, ..., errors.DatabricksError), (444, ..., IOError), ]) |
49 | 60 | def test_subclasses(status_code, error_code, klass): |
50 | 61 | try: |
51 | | - raise errors.error_mapper(status_code, {'error_code': error_code, 'message': 'nope'}) |
| 62 | + raise errors.error_mapper(fake_response(status_code), {'error_code': error_code, 'message': 'nope'}) |
52 | 63 | except klass: |
53 | 64 | return |
| 65 | + |
| 66 | + |
| 67 | +@pytest.mark.parametrize('verb, path, status_code, error_code, message, expected_error', |
| 68 | + [[ |
| 69 | + 'GET', '/api/2.0/clusters/get', 400, 'INVALID_PARAMETER_VALUE', |
| 70 | + 'Cluster abcde does not exist', errors.ResourceDoesNotExist |
| 71 | + ], |
| 72 | + [ |
| 73 | + 'GET', '/api/2.0/jobs/get', 400, 'INVALID_PARAMETER_VALUE', |
| 74 | + 'Job abcde does not exist', errors.ResourceDoesNotExist |
| 75 | + ], |
| 76 | + [ |
| 77 | + 'GET', '/api/2.1/jobs/get', 400, 'INVALID_PARAMETER_VALUE', |
| 78 | + 'Job abcde does not exist', errors.ResourceDoesNotExist |
| 79 | + ], |
| 80 | + [ |
| 81 | + 'GET', '/api/2.1/jobs/get', 400, 'INVALID_PARAMETER_VALUE', |
| 82 | + 'Invalid spark version', errors.InvalidParameterValue |
| 83 | + ], ]) |
| 84 | +def test_error_overrides(verb, path, status_code, error_code, message, expected_error): |
| 85 | + resp = requests.Response() |
| 86 | + resp.status_code = status_code |
| 87 | + resp.request = requests.Request(verb, f'https://databricks.com{path}').prepare() |
| 88 | + with pytest.raises(expected_error): |
| 89 | + raise errors.error_mapper(resp, {'error_code': error_code, 'message': message}) |
0 commit comments