|
1 | | -from unittest.mock import ANY, Mock, patch |
| 1 | +from json import dumps |
| 2 | +from unittest.mock import ANY, Mock, call, patch |
| 3 | +from urllib.parse import quote |
2 | 4 |
|
3 | 5 | import pytest |
4 | 6 |
|
5 | 7 | from scilog import SciCat |
6 | 8 |
|
| 9 | +ADDRESS = "http://scicat" |
| 10 | + |
7 | 11 |
|
8 | 12 | @patch("requests.post") |
9 | 13 | @patch("requests.get") |
|
16 | 20 | ], |
17 | 21 | ) |
18 | 22 | def test_get_proposals(mock_get, mock_post, token_prefix): |
19 | | - address = "http://scicat" |
20 | 23 | options = { |
21 | 24 | "username": f"username{token_prefix}", |
22 | 25 | "password": "password", |
23 | | - "login_path": f"{address}/login", |
| 26 | + "login_path": f"{ADDRESS}/login", |
24 | 27 | "token_prefix": token_prefix, |
25 | 28 | } |
26 | 29 | headers = {"Content-type": "application/json", "Accept": "application/json"} |
27 | 30 | token = "token123" |
28 | 31 |
|
29 | | - scicat = SciCat(address, options=options) |
| 32 | + scicat = SciCat(ADDRESS, options=options) |
| 33 | + scicat.http_client.config = {} |
30 | 34 | mock_response = Mock() |
31 | 35 | mock_response.json.return_value = {"id": token} |
32 | 36 | mock_post.return_value = mock_response |
33 | | - scicat.http_client.config = {} |
34 | | - scicat.proposals |
| 37 | + list(scicat.proposals) |
35 | 38 | mock_post.assert_called_with( |
36 | 39 | options["login_path"], |
37 | 40 | json={"username": options["username"], "password": options["password"]}, |
38 | 41 | headers=headers, |
39 | 42 | timeout=ANY, |
40 | 43 | verify=True, |
41 | 44 | ) |
| 45 | + filter = {"limits": {"skip": 0, "limit": 500}} |
42 | 46 | mock_get.assert_called_with( |
43 | | - f"{address}/proposals", |
| 47 | + f"{ADDRESS}/proposals?filter={quote(dumps(filter))}", |
44 | 48 | params=None, |
45 | 49 | headers={**headers, "Authorization": f"{token_prefix or ''}{token}"}, |
46 | 50 | timeout=ANY, |
47 | 51 | verify=True, |
48 | 52 | ) |
| 53 | + |
| 54 | + |
| 55 | +@patch("scilog.scicat.SciCatRestAPI.get_request") |
| 56 | +def test__proposals_batch(mock_get): |
| 57 | + scicat = SciCat(ADDRESS) |
| 58 | + scicat.http_client.config = {} |
| 59 | + |
| 60 | + mock_get.side_effect = [[1, 2], [3, 4], []] |
| 61 | + filters = [{"limits": {"skip": 0, "limit": 500}}, {"limits": {"skip": 500, "limit": 500}}] |
| 62 | + for _ in scicat._proposals_batch(): |
| 63 | + continue |
| 64 | + |
| 65 | + assert mock_get.call_count == 3 |
| 66 | + |
| 67 | + expected_calls = [ |
| 68 | + call(f"{ADDRESS}/proposals?filter={quote(dumps(filters[0]))}", headers=ANY), |
| 69 | + call(f"{ADDRESS}/proposals?filter={quote(dumps(filters[1]))}", headers=ANY), |
| 70 | + ] |
| 71 | + mock_get.assert_has_calls(expected_calls, any_order=False) |
| 72 | + |
| 73 | + |
| 74 | +@patch("scilog.scicat.SciCatRestAPI.get_request") |
| 75 | +@pytest.mark.parametrize( |
| 76 | + "return_options", |
| 77 | + [ |
| 78 | + None, |
| 79 | + {"lazy": True}, |
| 80 | + {"lazy": False}, |
| 81 | + ], |
| 82 | +) |
| 83 | +def test_proposals(mock_get, return_options): |
| 84 | + scicat = SciCat(ADDRESS, return_options=return_options) |
| 85 | + scicat.http_client.config = {} |
| 86 | + mock_get.side_effect = [[1, 2], [3, 4], []] |
| 87 | + proposals = [1, 2, 3, 4] |
| 88 | + scicat_proposals = scicat.proposals |
| 89 | + for i, p in enumerate(scicat_proposals): |
| 90 | + assert p == proposals[i] |
| 91 | + lazy = return_options.get("lazy", False) if return_options else False |
| 92 | + assert len(list(scicat_proposals)) == (0 if lazy else len(proposals)) |
0 commit comments