@@ -44,8 +44,9 @@ def test_contains_content_items(self, mock_oauth_client, mock_json):
4444
4545 assert contains_content_items
4646
47+ expected_endpoint = client .enterprise_catalog_endpoint + str (ent_uuid ) + '/contains_content_items/'
4748 mock_oauth_client .return_value .get .assert_called_with (
48- f'http://enterprise-catalog.example.com/api/v2/enterprise-catalogs/ { ent_uuid } /contains_content_items/' ,
49+ expected_endpoint ,
4950 params = {'course_run_ids' : ['AB+CD101' ]},
5051 )
5152
@@ -75,8 +76,9 @@ def test_catalog_content_metadata(self, mock_oauth_client):
7576 fetched_metadata = client .catalog_content_metadata (customer_uuid , content_keys )
7677
7778 self .assertEqual (fetched_metadata ['results' ], mock_response_json ['results' ])
79+ expected_endpoint = f'{ client .enterprise_catalog_endpoint } { customer_uuid } /get_content_metadata/'
7880 mock_oauth_client .return_value .get .assert_called_with (
79- f'http://enterprise-catalog.example.com/api/v2/enterprise-catalogs/ { customer_uuid } /get_content_metadata/' ,
81+ expected_endpoint ,
8082 params = {
8183 'content_keys' : content_keys ,
8284 'traverse_pagination' : True ,
@@ -88,6 +90,8 @@ def test_catalog_content_metadata_raises_http_error(self, mock_oauth_client):
8890 content_keys = ['course+A' , 'course+B' ]
8991 request_response = Response ()
9092 request_response .status_code = 400
93+ request_response .url = 'http://test.example.com'
94+ request_response .raise_for_status = mock .Mock (side_effect = HTTPError ())
9195
9296 mock_oauth_client .return_value .get .return_value = request_response
9397
@@ -97,14 +101,40 @@ def test_catalog_content_metadata_raises_http_error(self, mock_oauth_client):
97101 with self .assertRaises (HTTPError ):
98102 client .catalog_content_metadata (customer_uuid , content_keys )
99103
104+ expected_endpoint = f'{ client .enterprise_catalog_endpoint } { customer_uuid } /get_content_metadata/'
100105 mock_oauth_client .return_value .get .assert_called_with (
101- f'http://enterprise-catalog.example.com/api/v2/enterprise-catalogs/ { customer_uuid } /get_content_metadata/' ,
106+ expected_endpoint ,
102107 params = {
103108 'content_keys' : content_keys ,
104109 'traverse_pagination' : True ,
105110 },
106111 )
107112
113+ @mock .patch ('enterprise_access.apps.api_client.base_oauth.OAuthAPIClient' )
114+ def test_catalog_content_metadata_raises_for_empty_keys_with_traverse_pagination (self , mock_oauth_client ):
115+ """
116+ catalog_content_metadata raises when content_keys is empty and traverse_pagination=True,
117+ to prevent fetching all metadata for an entire catalog (potentially thousands of records).
118+ """
119+ catalog_uuid = uuid4 ()
120+ client = EnterpriseCatalogApiClient ()
121+
122+ with self .assertRaises (Exception ) as ctx :
123+ client .catalog_content_metadata (catalog_uuid , content_keys = [], traverse_pagination = True )
124+
125+ self .assertIn ('Cannot request all metadata' , str (ctx .exception ))
126+ mock_oauth_client .return_value .get .assert_not_called ()
127+
128+ @mock .patch ('enterprise_access.apps.api_client.base_oauth.OAuthAPIClient' )
129+ def test_content_metadata_v2_raises_not_implemented (self , mock_oauth_client ):
130+ """EnterpriseCatalogApiClient.content_metadata (V2) is intentionally unimplemented."""
131+ client = EnterpriseCatalogApiClient ()
132+
133+ with self .assertRaises (NotImplementedError ):
134+ client .content_metadata ('course+SomeKey' )
135+
136+ mock_oauth_client .return_value .get .assert_not_called ()
137+
108138 @mock .patch ('enterprise_access.apps.api_client.base_oauth.OAuthAPIClient' )
109139 def test_get_content_metadata_count (self , mock_oauth_client ):
110140 mock_response_json = {
@@ -119,8 +149,9 @@ def test_get_content_metadata_count(self, mock_oauth_client):
119149 fetched_metadata = client .get_content_metadata_count (catalog_uuid )
120150
121151 self .assertEqual (fetched_metadata , mock_response_json ['count' ])
152+ expected_endpoint = client .enterprise_catalog_endpoint + str (catalog_uuid ) + '/get_content_metadata/'
122153 mock_oauth_client .return_value .get .assert_called_with (
123- f'http://enterprise-catalog.example.com/api/v2/enterprise-catalogs/ { catalog_uuid } /get_content_metadata/' ,
154+ expected_endpoint ,
124155 )
125156
126157
@@ -154,8 +185,9 @@ def test_content_metadata(self, mock_oauth_client, coerce_to_parent_course):
154185 expected_query_params_kwarg = {}
155186 if coerce_to_parent_course :
156187 expected_query_params_kwarg |= {'params' : {'coerce_to_parent_course' : True }}
188+ expected_endpoint = f'{ client .content_metadata_endpoint } { content_key } '
157189 mock_oauth_client .return_value .get .assert_called_with (
158- f'http://enterprise-catalog.example.com/api/v1/content-metadata/ { content_key } ' ,
190+ expected_endpoint ,
159191 ** expected_query_params_kwarg ,
160192 )
161193
@@ -164,6 +196,8 @@ def test_content_metadata_raises_http_error(self, mock_oauth_client):
164196 content_key = 'course+A'
165197 request_response = Response ()
166198 request_response .status_code = 400
199+ request_response .url = 'http://test.example.com'
200+ request_response .raise_for_status = mock .Mock (side_effect = HTTPError ())
167201
168202 mock_oauth_client .return_value .get .return_value = request_response
169203
@@ -172,8 +206,9 @@ def test_content_metadata_raises_http_error(self, mock_oauth_client):
172206 with self .assertRaises (HTTPError ):
173207 client .content_metadata (content_key )
174208
209+ expected_endpoint = f'{ client .content_metadata_endpoint } { content_key } '
175210 mock_oauth_client .return_value .get .assert_called_with (
176- f'http://enterprise-catalog.example.com/api/v1/content-metadata/ { content_key } ' ,
211+ expected_endpoint ,
177212 )
178213
179214
@@ -200,11 +235,7 @@ def setUp(self):
200235 )
201236 @ddt .unpack
202237 def test_secured_algolia_api_key_endpoint (self , enterprise_customer_uuid ):
203- expected_url = (
204- f'http://enterprise-catalog.example.com/api/v1'
205- f'/enterprise-customer/{ enterprise_customer_uuid } /secured-algolia-api-key/'
206- )
207- request = self .factory .get (expected_url )
238+ request = self .factory .get ('http://test.example.com' )
208239 request .headers = {
209240 "Authorization" : 'test-auth' ,
210241 self .request_id_key : 'test-request-id'
@@ -223,16 +254,16 @@ def test_secured_algolia_api_key_endpoint(self, enterprise_customer_uuid):
223254 secured_algolia_api_key_url = client .secured_algolia_api_key_endpoint (
224255 enterprise_customer_uuid = enterprise_customer_uuid
225256 )
257+ expected_url = (
258+ f'{ client .api_base_url } '
259+ f'enterprise-customer/{ enterprise_customer_uuid } /secured-algolia-api-key/'
260+ )
226261 self .assertEqual (secured_algolia_api_key_url , expected_url )
227262
228263 @mock .patch ('requests.Session.send' )
229264 @mock .patch ('crum.get_current_request' )
230265 def test_secured_algolia_api_key (self , mock_crum_get_current_request , mock_send ):
231- expected_url = (
232- f'http://enterprise-catalog.example.com/api/v1'
233- f'/enterprise-customer/{ self .mock_enterprise_customer_uuid } /secured-algolia-api-key/'
234- )
235- request = self .factory .get (expected_url )
266+ request = self .factory .get ('http://test.example.com' )
236267 request .headers = {
237268 "Authorization" : 'test-auth' ,
238269 self .request_id_key : 'test-request-id'
@@ -264,6 +295,10 @@ def test_secured_algolia_api_key(self, mock_crum_get_current_request, mock_send)
264295 prepared_request = mock_send .call_args [0 ][0 ]
265296
266297 # Assert base request URL/method is correct
298+ expected_url = (
299+ f'{ client .api_base_url } '
300+ f'enterprise-customer/{ self .mock_enterprise_customer_uuid } /secured-algolia-api-key/'
301+ )
267302 parsed_url = urlparse (prepared_request .url )
268303 self .assertEqual (f"{ parsed_url .scheme } ://{ parsed_url .netloc } { parsed_url .path } " , expected_url )
269304 self .assertEqual (prepared_request .method , 'GET' )
@@ -274,3 +309,41 @@ def test_secured_algolia_api_key(self, mock_crum_get_current_request, mock_send)
274309
275310 # Assert the response is as expected
276311 self .assertEqual (result , expected_result )
312+
313+ @mock .patch ('requests.Session.send' )
314+ @mock .patch ('crum.get_current_request' )
315+ def test_secured_algolia_api_key_with_catalog_scope (self , mock_crum_get_current_request , mock_send ):
316+ request = self .factory .get ('http://test.example.com' )
317+ request .headers = {
318+ "Authorization" : 'test-auth' ,
319+ self .request_id_key : 'test-request-id'
320+ }
321+ request .user = self .user
322+
323+ mock_crum_get_current_request .return_value = request
324+ mock_response = mock .Mock ()
325+ mock_response .status_code = 200
326+ mock_response .json .return_value = {
327+ 'algolia' : {
328+ 'secured_api_key' : 'key' ,
329+ 'valid_until' : _days_from_now (1 , DATE_FORMAT_ISO_8601 ),
330+ },
331+ 'catalog_uuids_to_catalog_query_uuids' : {},
332+ }
333+ mock_send .return_value = mock_response
334+
335+ client = EnterpriseCatalogUserV1ApiClient (request )
336+ client .get_secured_algolia_api_key (
337+ enterprise_customer_uuid = self .mock_enterprise_customer_uuid ,
338+ catalog_uuids = ['cat-a' , 'cat-b' ],
339+ )
340+ prepared_request = mock_send .call_args [0 ][0 ]
341+ parsed_url = urlparse (prepared_request .url )
342+
343+ expected_url = (
344+ f'{ client .api_base_url } '
345+ f'enterprise-customer/{ self .mock_enterprise_customer_uuid } /secured-algolia-api-key/'
346+ )
347+ self .assertEqual (f"{ parsed_url .scheme } ://{ parsed_url .netloc } { parsed_url .path } " , expected_url )
348+ self .assertIn ('catalog_uuids=cat-a' , parsed_url .query )
349+ self .assertIn ('catalog_uuids=cat-b' , parsed_url .query )
0 commit comments