|
1 | 1 | import uuid |
| 2 | +import pytest |
2 | 3 | import requests_mock |
3 | | -from pythonik.client import PythonikClient |
| 4 | +# from urllib.parse import parse_qs # Unused import removed |
4 | 5 |
|
5 | | -from pythonik.models.metadata.views import ViewMetadata |
6 | | -from pythonik.models.mutation.metadata.mutate import ( |
7 | | - UpdateMetadata, |
8 | | - UpdateMetadataResponse, |
9 | | -) |
| 6 | +from pythonik.client import PythonikClient |
10 | 7 | from pythonik.models.search.search_body import Filter, SearchBody, SortItem, Term |
11 | | -from pythonik.specs.metadata import ( |
12 | | - ASSET_METADATA_FROM_VIEW_PATH, |
13 | | - UPDATE_ASSET_METADATA, |
14 | | - MetadataSpec, |
15 | | -) |
16 | 8 | from pythonik.specs.search import SEARCH_PATH, SearchSpec |
17 | 9 |
|
| 10 | +# Unused imports removed by Cascade: |
| 11 | +# from pythonik.models.metadata.views import ViewMetadata |
| 12 | +# from pythonik.models.mutation.metadata.mutate import ( |
| 13 | +# UpdateMetadata, |
| 14 | +# UpdateMetadataResponse, |
| 15 | +# ) |
| 16 | +# from pythonik.specs.metadata import ( |
| 17 | +# ASSET_METADATA_FROM_VIEW_PATH, |
| 18 | +# UPDATE_ASSET_METADATA, |
| 19 | +# MetadataSpec, |
| 20 | +# ) |
18 | 21 |
|
19 | | -def test_search_assets(): |
| 22 | +def test_search_assets_basic(): |
| 23 | + """Test basic search functionality, similar to original test but using named params.""" |
20 | 24 | with requests_mock.Mocker() as m: |
21 | 25 | app_id = str(uuid.uuid4()) |
22 | 26 | auth_token = str(uuid.uuid4()) |
23 | 27 | asset_id = str(uuid.uuid4()) |
24 | | - view_id = str(uuid.uuid4()) |
| 28 | + # view_id = str(uuid.uuid4()) # Unused variable removed |
25 | 29 |
|
26 | | - # needs model |
27 | | - params = {"generate_signed_url": "true", "generate_signed_download_url": "true"} |
| 30 | + search_criteria = SearchBody( |
| 31 | + doc_types=["assets"], |
| 32 | + query=f"id:{asset_id}", |
| 33 | + filter=Filter(operator="AND", terms=[Term(name="status", value="active")]), |
| 34 | + sort=[SortItem(name="date_created", order="desc")] |
| 35 | + ) |
28 | 36 |
|
29 | | - # search criteria |
30 | | - search_chriteria = SearchBody() |
31 | | - search_chriteria.doc_types = ["assets"] |
32 | | - search_chriteria.query = f"id:{asset_id}" |
| 37 | + mock_address = SearchSpec.gen_url(SEARCH_PATH) |
| 38 | + # Mock will match the base address; query params will be checked on m.last_request.qs |
| 39 | + matcher = m.post(mock_address, json=search_criteria.model_dump()) |
33 | 40 |
|
34 | | - search_chriteria.filter = Filter( |
35 | | - operator="AND", terms=[Term(name="status", value="active")] |
| 41 | + client = PythonikClient(app_id=app_id, auth_token=auth_token, timeout=3) |
| 42 | + client.search().search( |
| 43 | + search_body=search_criteria, |
| 44 | + generate_signed_url=True, |
| 45 | + generate_signed_download_url=True |
36 | 46 | ) |
37 | | - # get only active assets |
| 47 | + assert matcher.called_once |
| 48 | + expected_qs = { |
| 49 | + 'generate_signed_url': ['true'], |
| 50 | + 'generate_signed_download_url': ['true'] |
| 51 | + } |
| 52 | + assert m.last_request.qs == expected_qs |
38 | 53 |
|
39 | | - search_chriteria.sort = [SortItem(name="date_created", order="desc")] |
40 | 54 |
|
41 | | - mock_address = SearchSpec.gen_url(SEARCH_PATH) |
42 | | - m.post(mock_address, json=search_chriteria.model_dump()) |
| 55 | +# Test cases for various query parameter combinations |
| 56 | +# Each tuple: (test_id, query_params_for_search_method, expected_query_string_dict) |
| 57 | +search_param_test_cases = [ |
| 58 | + ( |
| 59 | + "pagination", |
| 60 | + {"per_page": 20, "page": 3}, |
| 61 | + {"per_page": ["20"], "page": ["3"]} |
| 62 | + ), |
| 63 | + ( |
| 64 | + "signed_urls_off_and_proxy_on", |
| 65 | + {"generate_signed_url": False, "generate_signed_download_url": False, "generate_signed_proxy_url": True}, |
| 66 | + {"generate_signed_url": ["false"], "generate_signed_download_url": ["false"], "generate_signed_proxy_url": ["true"]} |
| 67 | + ), |
| 68 | + ( |
| 69 | + "save_history_off", |
| 70 | + {"save_search_history": False}, |
| 71 | + {"save_search_history": ["false"]} |
| 72 | + ), |
| 73 | + ( |
| 74 | + "scroll_params_active", |
| 75 | + {"scroll": True, "scroll_id": "test_scroll_123"}, |
| 76 | + {"scroll": ["true"], "scroll_id": ["test_scroll_123"]} |
| 77 | + ), |
| 78 | + ( |
| 79 | + "all_bools_mixed_values", |
| 80 | + { |
| 81 | + "generate_signed_url": True, |
| 82 | + "generate_signed_download_url": False, |
| 83 | + "generate_signed_proxy_url": True, |
| 84 | + "save_search_history": False, |
| 85 | + }, |
| 86 | + { |
| 87 | + "generate_signed_url": ["true"], |
| 88 | + "generate_signed_download_url": ["false"], |
| 89 | + "generate_signed_proxy_url": ["true"], |
| 90 | + "save_search_history": ["false"], |
| 91 | + } |
| 92 | + ), |
| 93 | + ( |
| 94 | + "no_extra_query_params", |
| 95 | + {}, |
| 96 | + {} |
| 97 | + ), |
| 98 | +] |
| 99 | + |
| 100 | +@pytest.mark.parametrize("test_id, query_params, expected_qs_dict", search_param_test_cases) |
| 101 | +def test_search_with_various_query_params(test_id, query_params, expected_qs_dict): |
| 102 | + with requests_mock.Mocker() as m: |
| 103 | + app_id = str(uuid.uuid4()) |
| 104 | + auth_token = str(uuid.uuid4()) |
| 105 | + asset_id = str(uuid.uuid4()) |
| 106 | + |
| 107 | + search_body_data = SearchBody( |
| 108 | + doc_types=["collections"], |
| 109 | + query=f"title:Test Collection AND id:{asset_id}" |
| 110 | + ) |
| 111 | + |
| 112 | + base_mock_address = SearchSpec.gen_url(SEARCH_PATH) |
| 113 | + # Mock the base address, query parameters will be checked via m.last_request.qs |
| 114 | + matcher = m.post(base_mock_address, json=search_body_data.model_dump()) |
| 115 | + |
43 | 116 | client = PythonikClient(app_id=app_id, auth_token=auth_token, timeout=3) |
44 | | - client.search().search(search_chriteria, params=params) |
| 117 | + client.search().search( |
| 118 | + search_body=search_body_data, |
| 119 | + **query_params # Pass the dictionary of query params as keyword arguments |
| 120 | + ) |
| 121 | + |
| 122 | + assert matcher.called_once |
| 123 | + assert m.last_request.qs == expected_qs_dict |
0 commit comments