|
1 |
| -""" Test cases for api/v2/search/all """ |
| 1 | +""" Test cases for api/v2/search/all endpoint """ |
2 | 2 |
|
3 | 3 | import json
|
| 4 | +from urllib.parse import parse_qs, urlparse |
4 | 5 |
|
5 | 6 | import ddt
|
6 | 7 | from django.urls import reverse
|
|
17 | 18 | class AggregateSearchViewSetV2Tests(mixins.LoginMixin, ElasticsearchTestMixin, mixins.APITestCase):
|
18 | 19 | list_path = reverse("api:v2:search-all-list")
|
19 | 20 |
|
20 |
| - def fetch_page_data(self, page_size, search_after=None): |
21 |
| - query_params = {"page_size": page_size} |
22 |
| - if search_after: |
23 |
| - query_params["search_after"] = search_after |
24 |
| - response = self.client.get(self.list_path, data=query_params) |
| 21 | + def fetch_page_data(self, page_size, next_url=None): |
| 22 | + """ |
| 23 | + Fetch a page of data using the provided page size and next_url. |
| 24 | + If next_url is not provided, fetch the first page. |
| 25 | + """ |
| 26 | + if next_url: |
| 27 | + response = self.client.get(next_url) |
| 28 | + else: |
| 29 | + query_params = {"page_size": page_size} |
| 30 | + response = self.client.get(self.list_path, data=query_params) |
25 | 31 | assert response.status_code == 200
|
26 | 32 | return response.json()
|
27 | 33 |
|
@@ -96,20 +102,27 @@ def test_search_after_pagination(self):
|
96 | 102 | self.validate_page_data(response_data, page_size)
|
97 | 103 |
|
98 | 104 | all_results = response_data["results"]
|
99 |
| - next_token = response_data.get("next") |
| 105 | + next_url = response_data.get("next") |
| 106 | + |
| 107 | + while next_url: |
| 108 | + # Parse the `search_after` value from the next_url query params |
| 109 | + parsed_url = urlparse(next_url) |
| 110 | + query_params = parse_qs(parsed_url.query) |
| 111 | + search_after = query_params.get("search_after", [None])[0] |
| 112 | + assert search_after is not None, "'search_after' parameter is missing in the next_url" |
100 | 113 |
|
101 |
| - while next_token: |
102 |
| - response_data = self.fetch_page_data(page_size, search_after=json.dumps(next_token)) |
| 114 | + last_sort_value = all_results[-1]["sort"] |
| 115 | + assert ( |
| 116 | + json.loads(search_after) == last_sort_value |
| 117 | + ), "The 'search_after' value in the next_url does not match the 'sort' field of the last result" |
| 118 | + |
| 119 | + response_data = self.fetch_page_data(page_size, next_url=next_url) |
103 | 120 |
|
104 | 121 | expected_size = min(page_size, 75 - len(all_results))
|
105 | 122 | self.validate_page_data(response_data, expected_size)
|
106 | 123 |
|
107 | 124 | all_results.extend(response_data["results"])
|
108 |
| - next_token = response_data.get("next") |
109 |
| - |
110 |
| - if next_token: |
111 |
| - last_sort_value = response_data["results"][-1]["sort"] |
112 |
| - assert last_sort_value == next_token |
| 125 | + next_url = response_data.get("next") |
113 | 126 |
|
114 | 127 | assert len(all_results) == 75, "The total number of results does not match the expected count"
|
115 | 128 |
|
|
0 commit comments