Skip to content

Commit a659c3c

Browse files
authored
Merge pull request #5056 from akolson/fix-no-scheme-supplied
Fixes missing scheme error when hitting recommendations API
2 parents aad86b9 + 290c78e commit a659c3c

File tree

2 files changed

+84
-1
lines changed

2 files changed

+84
-1
lines changed

contentcuration/contentcuration/tests/utils/test_recommendations.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from contentcuration.utils.recommendations import EmbedTopicsRequest
1818
from contentcuration.utils.recommendations import Recommendations
1919
from contentcuration.utils.recommendations import RecommendationsAdapter
20+
from contentcuration.utils.recommendations import RecommendationsBackendFactory
2021
from contentcuration.utils.recommendations import RecommendationsResponse
2122

2223

@@ -391,3 +392,70 @@ def test_extract_content_no_files(self):
391392
"files": [],
392393
}
393394
self.extract_content_test_helper(mock_node, [], expected_result)
395+
396+
397+
class RecommendationsBackendFactoryTestCases(TestCase):
398+
399+
def setUp(self):
400+
self.factory = RecommendationsBackendFactory()
401+
402+
def test_ensure_url_has_scheme_with_no_scheme(self):
403+
url = "example.com"
404+
result = self.factory._ensure_url_has_scheme(url)
405+
self.assertEqual(result, "http://example.com")
406+
407+
def test_ensure_url_has_scheme_with_http(self):
408+
url = "http://example.com"
409+
result = self.factory._ensure_url_has_scheme(url)
410+
self.assertEqual(result, url)
411+
412+
def test_ensure_url_has_scheme_with_https(self):
413+
url = "https://example.com"
414+
result = self.factory._ensure_url_has_scheme(url)
415+
self.assertEqual(result, url)
416+
417+
def test_ensure_url_has_scheme_with_empty_url(self):
418+
url = ""
419+
result = self.factory._ensure_url_has_scheme(url)
420+
self.assertEqual(result, url)
421+
422+
def test_ensure_url_has_scheme_with_none(self):
423+
url = None
424+
result = self.factory._ensure_url_has_scheme(url)
425+
self.assertEqual(result, url)
426+
427+
@patch('contentcuration.utils.recommendations.settings')
428+
def test_create_backend_with_url_no_scheme(self, mock_settings):
429+
mock_settings.CURRICULUM_AUTOMATION_API_URL = "api.example.com"
430+
backend = self.factory.create_backend()
431+
432+
self.assertIsInstance(backend, Recommendations)
433+
self.assertEqual(backend.base_url, "http://api.example.com")
434+
self.assertEqual(backend.connect_endpoint, "/connect")
435+
436+
@patch('contentcuration.utils.recommendations.settings')
437+
def test_create_backend_with_url_with_scheme(self, mock_settings):
438+
mock_settings.CURRICULUM_AUTOMATION_API_URL = "https://api.example.com"
439+
backend = self.factory.create_backend()
440+
441+
self.assertIsInstance(backend, Recommendations)
442+
self.assertEqual(backend.base_url, "https://api.example.com")
443+
self.assertEqual(backend.connect_endpoint, "/connect")
444+
445+
@patch('contentcuration.utils.recommendations.settings')
446+
def test_create_backend_with_empty_url(self, mock_settings):
447+
mock_settings.CURRICULUM_AUTOMATION_API_URL = ""
448+
backend = self.factory.create_backend()
449+
450+
self.assertIsInstance(backend, Recommendations)
451+
self.assertEqual(backend.base_url, "")
452+
self.assertEqual(backend.connect_endpoint, "/connect")
453+
454+
@patch('contentcuration.utils.recommendations.settings')
455+
def test_create_backend_with_no_url(self, mock_settings):
456+
mock_settings.CURRICULUM_AUTOMATION_API_URL = None
457+
backend = self.factory.create_backend()
458+
459+
self.assertIsInstance(backend, Recommendations)
460+
self.assertEqual(backend.base_url, None)
461+
self.assertEqual(backend.connect_endpoint, "/connect")

contentcuration/contentcuration/utils/recommendations.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from typing import Dict
77
from typing import List
88
from typing import Union
9+
from urllib.parse import urlparse
910

1011
from automation.models import RecommendationsCache
1112
from automation.utils.appnexus import errors
@@ -72,9 +73,23 @@ def __init__(self, **kwargs):
7273

7374

7475
class RecommendationsBackendFactory(BackendFactory):
76+
77+
def _ensure_url_has_scheme(self, url):
78+
"""
79+
Checks whether the URL has a scheme. Default to http:// if no scheme exists.
80+
81+
:param url: The URL to check
82+
:return: A URL with a scheme
83+
"""
84+
if url:
85+
parsed_url = urlparse(url)
86+
if not parsed_url.scheme:
87+
url = "http://" + url
88+
return url
89+
7590
def create_backend(self) -> Backend:
7691
backend = Recommendations()
77-
backend.base_url = settings.CURRICULUM_AUTOMATION_API_URL
92+
backend.base_url = self._ensure_url_has_scheme(settings.CURRICULUM_AUTOMATION_API_URL)
7893
backend.connect_endpoint = "/connect"
7994
return backend
8095

0 commit comments

Comments
 (0)