From e5aa66b1af2d49f159c4daefc598f96744ee988d Mon Sep 17 00:00:00 2001 From: Zhixiong Chi Date: Thu, 29 Feb 2024 12:31:58 -0800 Subject: [PATCH] [PATCH] Drop ptests fixtures and recorde_modes The usage of fixture in test_fixtures has been deprecated. See https://docs.pytest.org/en/stable/explanation/fixtures.html and https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly for more information about fixtures. Meanwhile the test_record_modes relies on httpbin.org which has been sold and re-sold several times, and it adds X-Amzn-Trace-Id header that can possibly diff for each request. It leads to ptest failure, so drop it now until we find the solution. Upstream-Status: Inappropriate [OE-Specific] Signed-off-by: Zhixiong Chi Signed-off-by: Khem Raj --- tests/integration/test_fixtures.py | 60 ----------- tests/integration/test_record_modes.py | 141 ------------------------- tests/unit/test_fixtures.py | 94 ----------------- 3 files changed, 295 deletions(-) delete mode 100644 tests/integration/test_fixtures.py delete mode 100644 tests/integration/test_record_modes.py delete mode 100644 tests/unit/test_fixtures.py diff --git a/tests/integration/test_fixtures.py b/tests/integration/test_fixtures.py deleted file mode 100644 index fc3d1e7..0000000 --- a/tests/integration/test_fixtures.py +++ /dev/null @@ -1,60 +0,0 @@ -import os.path - -import pytest - - -@pytest.mark.usefixtures('betamax_session') -class TestPyTestFixtures: - @pytest.fixture(autouse=True) - def setup(self, request): - """After test hook to assert everything.""" - def finalizer(): - test_dir = os.path.abspath('.') - cassette_name = ('tests.integration.test_fixtures.' # Module name - 'TestPyTestFixtures.' # Class name - 'test_pytest_fixture' # Test function name - '.json') - file_name = os.path.join(test_dir, 'tests', 'cassettes', - cassette_name) - assert os.path.exists(file_name) is True - - request.addfinalizer(finalizer) - - def test_pytest_fixture(self, betamax_session): - """Exercise the fixture itself.""" - resp = betamax_session.get('https://httpbin.org/get') - assert resp.ok - - -@pytest.mark.usefixtures('betamax_parametrized_session') -class TestPyTestParametrizedFixtures: - @pytest.fixture(autouse=True) - def setup(self, request): - """After test hook to assert everything.""" - def finalizer(): - test_dir = os.path.abspath('.') - cassette_name = ('tests.integration.test_fixtures.' # Module name - 'TestPyTestParametrizedFixtures.' # Class name - 'test_pytest_fixture' # Test function name - '[https---httpbin.org-get]' # Parameter - '.json') - file_name = os.path.join(test_dir, 'tests', 'cassettes', - cassette_name) - assert os.path.exists(file_name) is True - - request.addfinalizer(finalizer) - - @pytest.mark.parametrize('url', ('https://httpbin.org/get',)) - def test_pytest_fixture(self, betamax_parametrized_session, url): - """Exercise the fixture itself.""" - resp = betamax_parametrized_session.get(url) - assert resp.ok - - -@pytest.mark.parametrize('problematic_arg', [r'aaa\bbb', 'ccc:ddd', 'eee*fff']) -def test_pytest_parametrize_with_filesystem_problematic_chars( - betamax_parametrized_session, problematic_arg): - """ - Exercice parametrized args containing characters which might cause - problems when getting translated into file names. """ - assert True diff --git a/tests/integration/test_record_modes.py b/tests/integration/test_record_modes.py deleted file mode 100644 index 988b851..0000000 --- a/tests/integration/test_record_modes.py +++ /dev/null @@ -1,141 +0,0 @@ -import re - -from betamax import Betamax, BetamaxError - -from tests.integration.helper import IntegrationHelper - - -class TestRecordOnce(IntegrationHelper): - def test_records_new_interaction(self): - s = self.session - with Betamax(s).use_cassette('test_record_once') as betamax: - self.cassette_path = betamax.current_cassette.cassette_path - assert betamax.current_cassette.is_empty() is True - r = s.get('http://httpbin.org/get') - assert r.status_code == 200 - assert betamax.current_cassette.is_empty() is True - assert betamax.current_cassette.interactions != [] - - def test_replays_response_from_cassette(self): - s = self.session - with Betamax(s).use_cassette('test_replays_response') as betamax: - self.cassette_path = betamax.current_cassette.cassette_path - assert betamax.current_cassette.is_empty() is True - r0 = s.get('http://httpbin.org/get') - assert r0.status_code == 200 - assert betamax.current_cassette.interactions != [] - assert len(betamax.current_cassette.interactions) == 1 - r1 = s.get('http://httpbin.org/get') - assert len(betamax.current_cassette.interactions) == 2 - assert r1.status_code == 200 - r0_headers = r0.headers.copy() - r0_headers.pop('Date') - r0_headers.pop('Age', None) - r0_headers.pop('X-Processed-Time', None) - r1_headers = r1.headers.copy() - r1_headers.pop('Date') - r1_headers.pop('Age', None) - r1_headers.pop('X-Processed-Time', None) - # NOTE(sigmavirus24): This fails if the second request is - # technically a second later. Ignoring the Date headers allows - # this test to succeed. - # NOTE(hroncok): httpbin.org added X-Processed-Time header that - # can possibly differ (and often does) - r0_content = r0.content.decode(encoding='utf-8', errors='strict') - r1_content = r1.content.decode(encoding='utf-8', errors='strict') - r0_content = re.sub('"X-Amzn-Trace-Id": "[^"]+"', '"X-Amzn-Trace-Id": ""', r0_content) - r1_content = re.sub('"X-Amzn-Trace-Id": "[^"]+"', '"X-Amzn-Trace-Id": ""', r1_content) - # NOTE(jhatler): httpbin.org added "X-Amzn-Trace-Id" to their - # response, which is a unique ID that will differ between requests. - # We remove it from the response body before comparing. - assert r0_headers == r1_headers - assert r0_content == r1_content - - -class TestRecordNone(IntegrationHelper): - def test_raises_exception_when_no_interactions_present(self): - s = self.session - with Betamax(s) as betamax: - betamax.use_cassette('test', record='none') - self.cassette_created = False - assert betamax.current_cassette is not None - self.assertRaises(BetamaxError, s.get, 'http://httpbin.org/get') - - def test_record_none_does_not_create_cassettes(self): - s = self.session - with Betamax(s) as betamax: - self.assertRaises(ValueError, betamax.use_cassette, - 'test_record_none', record='none') - self.cassette_created = False - - -class TestRecordNewEpisodes(IntegrationHelper): - def setUp(self): - super(TestRecordNewEpisodes, self).setUp() - with Betamax(self.session).use_cassette('test_record_new'): - self.session.get('http://httpbin.org/get') - self.session.get('http://httpbin.org/redirect/2') - - def test_records_new_events_with_existing_cassette(self): - s = self.session - opts = {'record': 'new_episodes'} - with Betamax(s).use_cassette('test_record_new', **opts) as betamax: - cassette = betamax.current_cassette - self.cassette_path = cassette.cassette_path - assert cassette.interactions != [] - assert len(cassette.interactions) == 4 - assert cassette.is_empty() is False - s.get('https://httpbin.org/get') - assert len(cassette.interactions) == 5 - - with Betamax(s).use_cassette('test_record_new') as betamax: - cassette = betamax.current_cassette - assert len(cassette.interactions) == 5 - r = s.get('https://httpbin.org/get') - assert r.status_code == 200 - - -class TestRecordNewEpisodesCreatesCassettes(IntegrationHelper): - def test_creates_new_cassettes(self): - recorder = Betamax(self.session) - opts = {'record': 'new_episodes'} - cassette_name = 'test_record_new_makes_new_cassettes' - with recorder.use_cassette(cassette_name, **opts) as betamax: - self.cassette_path = betamax.current_cassette.cassette_path - self.session.get('https://httpbin.org/get') - - -class TestRecordAll(IntegrationHelper): - def setUp(self): - super(TestRecordAll, self).setUp() - with Betamax(self.session).use_cassette('test_record_all'): - self.session.get('http://httpbin.org/get') - self.session.get('http://httpbin.org/redirect/2') - self.session.get('http://httpbin.org/get') - - def test_records_new_interactions(self): - s = self.session - opts = {'record': 'all'} - with Betamax(s).use_cassette('test_record_all', **opts) as betamax: - cassette = betamax.current_cassette - self.cassette_path = cassette.cassette_path - assert cassette.interactions != [] - assert len(cassette.interactions) == 5 - assert cassette.is_empty() is False - s.post('http://httpbin.org/post', data={'foo': 'bar'}) - assert len(cassette.interactions) == 6 - - with Betamax(s).use_cassette('test_record_all') as betamax: - assert len(betamax.current_cassette.interactions) == 6 - - def test_replaces_old_interactions(self): - s = self.session - opts = {'record': 'all'} - with Betamax(s).use_cassette('test_record_all', **opts) as betamax: - cassette = betamax.current_cassette - self.cassette_path = cassette.cassette_path - assert cassette.interactions != [] - assert len(cassette.interactions) == 5 - assert cassette.is_empty() is False - s.get('http://httpbin.org/get') - assert len(cassette.interactions) == 5 diff --git a/tests/unit/test_fixtures.py b/tests/unit/test_fixtures.py deleted file mode 100644 index 41f33eb..0000000 --- a/tests/unit/test_fixtures.py +++ /dev/null @@ -1,94 +0,0 @@ -try: - import unittest.mock as mock -except ImportError: - import mock - -import pytest -import unittest - -import requests - -import betamax -from betamax.fixtures import pytest as pytest_fixture -from betamax.fixtures import unittest as unittest_fixture - - -class TestPyTestFixture(unittest.TestCase): - def setUp(self): - self.mocked_betamax = mock.MagicMock() - self.patched_betamax = mock.patch.object( - betamax.recorder, 'Betamax', return_value=self.mocked_betamax) - self.patched_betamax.start() - - def tearDown(self): - self.patched_betamax.stop() - - def test_adds_stop_as_a_finalizer(self): - # Mock a pytest request object - request = mock.MagicMock() - request.cls = request.module = None - request.node.name = request.function.__name__ = 'test' - - pytest_fixture._betamax_recorder(request) - assert request.addfinalizer.called is True - request.addfinalizer.assert_called_once_with(self.mocked_betamax.stop) - - def test_auto_starts_the_recorder(self): - # Mock a pytest request object - request = mock.MagicMock() - request.cls = request.module = None - request.node.name = request.function.__name__ = 'test' - - pytest_fixture._betamax_recorder(request) - self.mocked_betamax.start.assert_called_once_with() - - -class FakeBetamaxTestCase(unittest_fixture.BetamaxTestCase): - def test_fake(self): - pass - - -class TestUnittestFixture(unittest.TestCase): - def setUp(self): - self.mocked_betamax = mock.MagicMock() - self.patched_betamax = mock.patch.object( - betamax.recorder, 'Betamax', return_value=self.mocked_betamax) - self.betamax = self.patched_betamax.start() - self.fixture = FakeBetamaxTestCase(methodName='test_fake') - - def tearDown(self): - self.patched_betamax.stop() - - def test_setUp(self): - self.fixture.setUp() - - self.mocked_betamax.use_cassette.assert_called_once_with( - 'FakeBetamaxTestCase.test_fake' - ) - self.mocked_betamax.start.assert_called_once_with() - - def test_setUp_rejects_arbitrary_session_classes(self): - self.fixture.SESSION_CLASS = object - - with pytest.raises(AssertionError): - self.fixture.setUp() - - def test_setUp_accepts_session_subclasses(self): - class TestSession(requests.Session): - pass - - self.fixture.SESSION_CLASS = TestSession - - self.fixture.setUp() - - assert self.betamax.called is True - call_kwargs = self.betamax.call_args[-1] - assert isinstance(call_kwargs['session'], TestSession) - - def test_tearDown_calls_stop(self): - recorder = mock.Mock() - self.fixture.recorder = recorder - - self.fixture.tearDown() - - recorder.stop.assert_called_once_with() -- 2.44.0