diff options
author | Alberto Contreras <alberto.contreras@canonical.com> | 2022-09-19 15:30:54 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-19 08:30:54 -0500 |
commit | 9aa4ec6982541f5425c860010fa87134e58469e6 (patch) | |
tree | 40d0f3b04053a47f4f546fa8311eecfbacff2b2f /tests/unittests/sources/test_scaleway.py | |
parent | 4b12fe22d0e6adf92797fec929f58c54a7d3a620 (diff) | |
download | cloud-init-git-9aa4ec6982541f5425c860010fa87134e58469e6.tar.gz |
tests: Drop httpretty in favor of responses (#1720)
Diffstat (limited to 'tests/unittests/sources/test_scaleway.py')
-rw-r--r-- | tests/unittests/sources/test_scaleway.py | 102 |
1 files changed, 61 insertions, 41 deletions
diff --git a/tests/unittests/sources/test_scaleway.py b/tests/unittests/sources/test_scaleway.py index c877a66c..f9b470cb 100644 --- a/tests/unittests/sources/test_scaleway.py +++ b/tests/unittests/sources/test_scaleway.py @@ -1,13 +1,14 @@ # This file is part of cloud-init. See LICENSE file for license information. import json +from urllib.parse import SplitResult, urlsplit -import httpretty import requests +import responses from cloudinit import helpers, settings, sources from cloudinit.sources import DataSourceScaleway -from tests.unittests.helpers import CiTestCase, HttprettyTestCase, mock +from tests.unittests.helpers import CiTestCase, ResponsesTestCase, mock class DataResponses: @@ -20,23 +21,23 @@ class DataResponses: FAKE_USER_DATA = '#!/bin/bash\necho "user-data"' @staticmethod - def rate_limited(method, uri, headers): - return 429, headers, "" + def rate_limited(request): + return 429, request.headers, "" @staticmethod - def api_error(method, uri, headers): - return 500, headers, "" + def api_error(request): + return 500, request.headers, "" @classmethod - def get_ok(cls, method, uri, headers): - return 200, headers, cls.FAKE_USER_DATA + def get_ok(cls, request): + return 200, request.headers, cls.FAKE_USER_DATA @staticmethod - def empty(method, uri, headers): + def empty(request): """ No user data for this server. """ - return 404, headers, "" + return 404, request.headers, "" class MetadataResponses: @@ -63,8 +64,8 @@ class MetadataResponses: } @classmethod - def get_ok(cls, method, uri, headers): - return 200, headers, json.dumps(cls.FAKE_METADATA) + def get_ok(cls, response): + return 200, response.headers, json.dumps(cls.FAKE_METADATA) class TestOnScaleway(CiTestCase): @@ -163,13 +164,26 @@ def get_source_address_adapter(*args, **kwargs): to bind on ports below 1024. This function removes the bind on a privileged address, since anyway the - HTTP call is mocked by httpretty. + HTTP call is mocked by responses. """ kwargs.pop("source_address") return requests.adapters.HTTPAdapter(*args, **kwargs) -class TestDataSourceScaleway(HttprettyTestCase): +def _fix_mocking_url(url: str) -> str: + # Workaround https://github.com/getsentry/responses/pull/166 + # This function can be removed when Bionic is EOL + split_result = urlsplit(url) + return SplitResult( + scheme=split_result.scheme, + netloc=split_result.netloc, + path=split_result.path, + query="", # ignore + fragment=split_result.fragment, + ).geturl() + + +class TestDataSourceScaleway(ResponsesTestCase): def setUp(self): tmp = self.tmp_dir() distro = mock.MagicMock() @@ -179,9 +193,9 @@ class TestDataSourceScaleway(HttprettyTestCase): ) super(TestDataSourceScaleway, self).setUp() - self.metadata_url = DataSourceScaleway.BUILTIN_DS_CONFIG[ - "metadata_url" - ] + self.metadata_url = _fix_mocking_url( + DataSourceScaleway.BUILTIN_DS_CONFIG["metadata_url"] + ) self.userdata_url = DataSourceScaleway.BUILTIN_DS_CONFIG[ "userdata_url" ] @@ -214,14 +228,14 @@ class TestDataSourceScaleway(HttprettyTestCase): m_get_cmdline.return_value = "scaleway" # Make user data API return a valid response - httpretty.register_uri( - httpretty.GET, self.metadata_url, body=MetadataResponses.get_ok + self.responses.add_callback( + responses.GET, self.metadata_url, callback=MetadataResponses.get_ok ) - httpretty.register_uri( - httpretty.GET, self.userdata_url, body=DataResponses.get_ok + self.responses.add_callback( + responses.GET, self.userdata_url, callback=DataResponses.get_ok ) - httpretty.register_uri( - httpretty.GET, self.vendordata_url, body=DataResponses.get_ok + self.responses.add_callback( + responses.GET, self.vendordata_url, callback=DataResponses.get_ok ) self.datasource.get_data() @@ -345,14 +359,15 @@ class TestDataSourceScaleway(HttprettyTestCase): # Make user and vendor data APIs return HTTP/404, which means there is # no user / vendor data for the server. - httpretty.register_uri( - httpretty.GET, self.metadata_url, body=MetadataResponses.get_ok + + self.responses.add_callback( + responses.GET, self.metadata_url, callback=MetadataResponses.get_ok ) - httpretty.register_uri( - httpretty.GET, self.userdata_url, body=DataResponses.empty + self.responses.add_callback( + responses.GET, self.userdata_url, callback=DataResponses.empty ) - httpretty.register_uri( - httpretty.GET, self.vendordata_url, body=DataResponses.empty + self.responses.add_callback( + responses.GET, self.vendordata_url, callback=DataResponses.empty ) self.datasource.get_data() self.assertIsNone(self.datasource.get_userdata_raw()) @@ -373,21 +388,26 @@ class TestDataSourceScaleway(HttprettyTestCase): """ m_get_cmdline.return_value = "scaleway" - httpretty.register_uri( - httpretty.GET, self.metadata_url, body=MetadataResponses.get_ok + self.responses.add_callback( + responses.GET, self.metadata_url, callback=MetadataResponses.get_ok ) - httpretty.register_uri( - httpretty.GET, self.vendordata_url, body=DataResponses.empty + self.responses.add_callback( + responses.GET, self.vendordata_url, callback=DataResponses.empty ) - httpretty.register_uri( - httpretty.GET, - self.userdata_url, - responses=[ - httpretty.Response(body=DataResponses.rate_limited), - httpretty.Response(body=DataResponses.rate_limited), - httpretty.Response(body=DataResponses.get_ok), - ], + # Workaround https://github.com/getsentry/responses/pull/171 + # This mocking can be unrolled when Bionic is EOL + call_count = 0 + + def _callback(request): + nonlocal call_count + call_count += 1 + if call_count <= 2: + return DataResponses.rate_limited(request) + return DataResponses.get_ok(request) + + self.responses.add_callback( + responses.GET, self.userdata_url, callback=_callback ) self.datasource.get_data() self.assertEqual( |