Skip to content

Commit be18c30

Browse files
committed
Handle port default for CA API-- port 8000
1 parent c3ad53f commit be18c30

2 files changed

Lines changed: 51 additions & 27 deletions

File tree

contentcuration/contentcuration/tests/utils/test_recommendations.py

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ def assert_backend_call(
122122
connect_value,
123123
make_request_value,
124124
method,
125-
*args
125+
*args,
126126
):
127127
mock_response_exists.return_value = response_exists_value
128128
self.adapter.backend.connect.return_value = connect_value
@@ -518,29 +518,34 @@ class RecommendationsBackendFactoryTestCases(TestCase):
518518
def setUp(self):
519519
self.factory = RecommendationsBackendFactory()
520520

521-
def test_ensure_url_has_scheme_with_no_scheme(self):
522-
url = "example.com"
523-
result = self.factory._ensure_url_has_scheme(url)
524-
self.assertEqual(result, "http://example.com")
521+
def test_prepare_url_with_no_scheme(self):
522+
url = "example.com:8080"
523+
result = self.factory._prepare_url(url)
524+
self.assertEqual(result, f"http://{url}")
525525

526-
def test_ensure_url_has_scheme_with_http(self):
526+
def test_prepare_url_with_no_port(self):
527527
url = "http://example.com"
528-
result = self.factory._ensure_url_has_scheme(url)
528+
result = self.factory._prepare_url(url)
529+
self.assertEqual(result, f"{url}:8000")
530+
531+
def test_prepare_url_with_http(self):
532+
url = "http://example.com:8080"
533+
result = self.factory._prepare_url(url)
529534
self.assertEqual(result, url)
530535

531-
def test_ensure_url_has_scheme_with_https(self):
532-
url = "https://example.com"
533-
result = self.factory._ensure_url_has_scheme(url)
536+
def test_prepare_url_with_https(self):
537+
url = "https://example.com:443"
538+
result = self.factory._prepare_url(url)
534539
self.assertEqual(result, url)
535540

536-
def test_ensure_url_has_scheme_with_empty_url(self):
541+
def test_prepare_url_with_empty_url(self):
537542
url = ""
538-
result = self.factory._ensure_url_has_scheme(url)
543+
result = self.factory._prepare_url(url)
539544
self.assertEqual(result, url)
540545

541-
def test_ensure_url_has_scheme_with_none(self):
546+
def test_prepare_url_with_none(self):
542547
url = None
543-
result = self.factory._ensure_url_has_scheme(url)
548+
result = self.factory._prepare_url(url)
544549
self.assertEqual(result, url)
545550

546551
@patch("contentcuration.utils.recommendations.settings")
@@ -549,7 +554,7 @@ def test_create_backend_with_url_no_scheme(self, mock_settings):
549554
backend = self.factory.create_backend()
550555

551556
self.assertIsInstance(backend, Recommendations)
552-
self.assertEqual(backend.base_url, "http://api.example.com")
557+
self.assertEqual(backend.base_url, "http://api.example.com:8000")
553558
self.assertEqual(backend.connect_endpoint, "/connect")
554559

555560
@patch("contentcuration.utils.recommendations.settings")
@@ -558,7 +563,7 @@ def test_create_backend_with_url_with_scheme(self, mock_settings):
558563
backend = self.factory.create_backend()
559564

560565
self.assertIsInstance(backend, Recommendations)
561-
self.assertEqual(backend.base_url, "https://api.example.com")
566+
self.assertEqual(backend.base_url, "https://api.example.com:8000")
562567
self.assertEqual(backend.connect_endpoint, "/connect")
563568

564569
@patch("contentcuration.utils.recommendations.settings")

contentcuration/contentcuration/utils/recommendations.py

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from typing import List
88
from typing import Union
99
from urllib.parse import urlparse
10+
from urllib.parse import urlunparse
1011

1112
from automation.models import RecommendationsCache
1213
from automation.utils.appnexus import errors
@@ -73,24 +74,42 @@ def __init__(self, **kwargs):
7374

7475

7576
class RecommendationsBackendFactory(BackendFactory):
76-
def _ensure_url_has_scheme(self, url):
77+
def _prepare_url(self, url):
7778
"""
78-
Checks whether the URL has a scheme. Default to http:// if no scheme exists.
79+
Ensures the URL has a scheme and a port defined.
80+
It defaults to http:// and port 8000 otherwise
7981
8082
:param url: The URL to check
81-
:return: A URL with a scheme
83+
:return: A URL with a scheme and port
8284
"""
83-
if url:
84-
parsed_url = urlparse(url)
85-
if not parsed_url.scheme:
86-
url = "http://" + url
87-
return url
85+
if not url:
86+
return url
87+
88+
# avoid parsing URL until after adding scheme, because with and without a port defined,
89+
# urlparse will return an empty netloc, but flip-flop between paths and schemes
90+
if not url.startswith("http"):
91+
url = "http://" + url
92+
93+
parsed_url = urlparse(url)
94+
netloc = parsed_url.netloc
95+
96+
if not parsed_url.port:
97+
netloc = f"{netloc}:8000"
98+
99+
return urlunparse(
100+
(
101+
parsed_url.scheme,
102+
netloc,
103+
"",
104+
"",
105+
"",
106+
"",
107+
)
108+
)
88109

89110
def create_backend(self) -> Backend:
90111
backend = Recommendations()
91-
backend.base_url = self._ensure_url_has_scheme(
92-
settings.CURRICULUM_AUTOMATION_API_URL
93-
)
112+
backend.base_url = self._prepare_url(settings.CURRICULUM_AUTOMATION_API_URL)
94113
backend.connect_endpoint = "/connect"
95114
return backend
96115

0 commit comments

Comments
 (0)