From 1d1e31333f6cee7e6eb71f7ed6b1b64c5cddcaa4 Mon Sep 17 00:00:00 2001 From: aliabbasrizvi Date: Fri, 26 Jun 2020 15:12:48 -0700 Subject: [PATCH 1/4] chore(test): Making tests go faster --- tests/test_config_manager.py | 4 ++-- tests/test_event_processor.py | 31 ++++++++++++++++--------------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/tests/test_config_manager.py b/tests/test_config_manager.py index 9bae47d0..a46ae34e 100644 --- a/tests/test_config_manager.py +++ b/tests/test_config_manager.py @@ -211,11 +211,11 @@ def test_get_config(self): def test_get_config_blocks(self): """ Test that get_config blocks until blocking timeout is hit. """ start_time = time.time() - project_config_manager = config_manager.PollingConfigManager(sdk_key='sdk_key', blocking_timeout=5) + project_config_manager = config_manager.PollingConfigManager(sdk_key='sdk_key', blocking_timeout=1) # Assert get_config should block until blocking timeout. project_config_manager.get_config() end_time = time.time() - self.assertEqual(5, round(end_time - start_time)) + self.assertEqual(1, round(end_time - start_time)) @mock.patch('requests.get') diff --git a/tests/test_event_processor.py b/tests/test_event_processor.py index 0ea0d17f..1d924670 100644 --- a/tests/test_event_processor.py +++ b/tests/test_event_processor.py @@ -26,7 +26,7 @@ from optimizely.event.user_event_factory import UserEventFactory from optimizely.event_dispatcher import EventDispatcher as default_event_dispatcher from optimizely.helpers import enums -from optimizely.logger import SimpleLogger +from optimizely.logger import NoOpLogger from . import base @@ -114,15 +114,16 @@ class BatchEventProcessorTest(base.BaseTest): DEFAULT_QUEUE_CAPACITY = 1000 MAX_BATCH_SIZE = 10 - MAX_DURATION_SEC = 1 - MAX_TIMEOUT_INTERVAL_SEC = 5 + MAX_DURATION_SEC = 0.2 + MAX_TIMEOUT_INTERVAL_SEC = 0.1 + TEST_TIMEOUT = 0.3 def setUp(self, *args, **kwargs): base.BaseTest.setUp(self, 'config_dict_with_multiple_experiments') self.test_user_id = 'test_user' self.event_name = 'test_event' self.event_queue = queue.Queue(maxsize=self.DEFAULT_QUEUE_CAPACITY) - self.optimizely.logger = SimpleLogger() + self.optimizely.logger = NoOpLogger() self.notification_center = self.optimizely.notification_center def tearDown(self): @@ -154,7 +155,7 @@ def test_drain_on_stop(self): self.event_processor.process(user_event) event_dispatcher.expect_conversion(self.event_name, self.test_user_id) - time.sleep(5) + time.sleep(self.TEST_TIMEOUT) self.assertStrictTrue(event_dispatcher.compare_events()) self.assertEqual(0, self.event_processor.event_queue.qsize()) @@ -169,7 +170,7 @@ def test_flush_on_max_timeout(self): self.event_processor.process(user_event) event_dispatcher.expect_conversion(self.event_name, self.test_user_id) - time.sleep(3) + time.sleep(self.TEST_TIMEOUT) self.assertStrictTrue(event_dispatcher.compare_events()) self.assertEqual(0, self.event_processor.event_queue.qsize()) @@ -177,7 +178,7 @@ def test_flush_on_max_timeout(self): def test_flush_once_max_timeout(self): event_dispatcher = TestEventDispatcher() - self.optimizely.logger = SimpleLogger(enums.LogLevels.DEBUG) + self.optimizely.logger = NoOpLogger() with mock.patch.object(self.optimizely, 'logger') as mock_config_logging: self._set_event_processor(event_dispatcher, mock_config_logging) @@ -186,7 +187,7 @@ def test_flush_once_max_timeout(self): self.event_processor.process(user_event) event_dispatcher.expect_conversion(self.event_name, self.test_user_id) - time.sleep(1.75) + time.sleep(self.TEST_TIMEOUT) self.assertStrictTrue(event_dispatcher.compare_events()) self.assertEqual(0, self.event_processor.event_queue.qsize()) @@ -195,7 +196,7 @@ def test_flush_once_max_timeout(self): mock_config_logging.debug.assert_any_call('Flushing batch size 1') mock_config_logging.debug.assert_any_call('Flush interval deadline. Flushed batch.') self.assertTrue(mock_config_logging.debug.call_count == 3) - self.optimizely.logger = SimpleLogger() + self.optimizely.logger = NoOpLogger() def test_flush_max_batch_size(self): event_dispatcher = TestEventDispatcher() @@ -208,7 +209,7 @@ def test_flush_max_batch_size(self): self.event_processor.process(user_event) event_dispatcher.expect_conversion(self.event_name, self.test_user_id) - time.sleep(1) + time.sleep(self.TEST_TIMEOUT) self.assertStrictTrue(event_dispatcher.compare_events()) self.assertEqual(0, self.event_processor.event_queue.qsize()) @@ -228,7 +229,7 @@ def test_flush(self): self.event_processor.flush() event_dispatcher.expect_conversion(self.event_name, self.test_user_id) - time.sleep(3) + time.sleep(self.TEST_TIMEOUT) self.assertStrictTrue(event_dispatcher.compare_events()) self.assertEqual(0, self.event_processor.event_queue.qsize()) @@ -253,7 +254,7 @@ def test_flush_on_mismatch_revision(self): self.event_processor.process(user_event_2) event_dispatcher.expect_conversion(self.event_name, self.test_user_id) - time.sleep(3) + time.sleep(self.TEST_TIMEOUT) self.assertStrictTrue(event_dispatcher.compare_events()) self.assertEqual(0, self.event_processor.event_queue.qsize()) @@ -278,7 +279,7 @@ def test_flush_on_mismatch_project_id(self): self.event_processor.process(user_event_2) event_dispatcher.expect_conversion(self.event_name, self.test_user_id) - time.sleep(3) + time.sleep(self.TEST_TIMEOUT) self.assertStrictTrue(event_dispatcher.compare_events()) self.assertEqual(0, self.event_processor.event_queue.qsize()) @@ -293,7 +294,7 @@ def test_stop_and_start(self): self.event_processor.process(user_event) event_dispatcher.expect_conversion(self.event_name, self.test_user_id) - time.sleep(3) + time.sleep(self.TEST_TIMEOUT) self.assertStrictTrue(event_dispatcher.compare_events()) self.event_processor.stop() @@ -509,7 +510,7 @@ def setUp(self, *args, **kwargs): base.BaseTest.setUp(self, 'config_dict_with_multiple_experiments') self.test_user_id = 'test_user' self.event_name = 'test_event' - self.optimizely.logger = SimpleLogger() + self.optimizely.logger = NoOpLogger() self.notification_center = self.optimizely.notification_center self.event_dispatcher = TestForwardingEventDispatcher(is_updated=False) From f9e6736dc9c641d886c74e9103fbd914f1063b9d Mon Sep 17 00:00:00 2001 From: aliabbasrizvi Date: Fri, 26 Jun 2020 15:59:09 -0700 Subject: [PATCH 2/4] fixing test --- optimizely/config_manager.py | 8 +++++--- tests/test_config_manager.py | 8 +++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/optimizely/config_manager.py b/optimizely/config_manager.py index 128976c1..f10d5cb5 100644 --- a/optimizely/config_manager.py +++ b/optimizely/config_manager.py @@ -402,9 +402,11 @@ def _set_access_token(self, access_token): def fetch_datafile(self): """ Fetch authenticated datafile and set ProjectConfig. """ - request_headers = {} - request_headers[enums.HTTPHeaders.AUTHORIZATION] = \ - enums.ConfigManager.AUTHORIZATION_HEADER_DATA_TEMPLATE.format(access_token=self.access_token) + request_headers = { + enums.HTTPHeaders.AUTHORIZATION: enums.ConfigManager.AUTHORIZATION_HEADER_DATA_TEMPLATE.format( + access_token=self.access_token + ) + } if self.last_modified: request_headers[enums.HTTPHeaders.IF_MODIFIED_SINCE] = self.last_modified diff --git a/tests/test_config_manager.py b/tests/test_config_manager.py index a46ae34e..73ce8309 100644 --- a/tests/test_config_manager.py +++ b/tests/test_config_manager.py @@ -429,13 +429,18 @@ def test_fetch_datafile(self, _): project_config_manager = config_manager.AuthDatafilePollingConfigManager( access_token=access_token, sdk_key=sdk_key) expected_datafile_url = enums.ConfigManager.AUTHENTICATED_DATAFILE_URL_TEMPLATE.format(sdk_key=sdk_key) + test_headers = {'Last-Modified': 'New Time'} test_datafile = json.dumps(self.config_dict_with_features) test_response = requests.Response() test_response.status_code = 200 + test_response.headers = test_headers test_response._content = test_datafile # Call fetch_datafile and assert that request was sent with correct authorization header - with mock.patch('requests.get', return_value=test_response) as mock_request: + with mock.patch('requests.get', + return_value=test_response) as mock_request, mock.patch( + 'optimizely.config_manager.AuthDatafilePollingConfigManager._run' + ): project_config_manager.fetch_datafile() mock_request.assert_called_once_with( @@ -444,4 +449,5 @@ def test_fetch_datafile(self, _): timeout=enums.ConfigManager.REQUEST_TIMEOUT, ) + self.assertEqual(test_headers['Last-Modified'], project_config_manager.last_modified) self.assertIsInstance(project_config_manager.get_config(), project_config.ProjectConfig) From 8ee4b55c7ec9f8d8d96a0f80c6b837415ba15486 Mon Sep 17 00:00:00 2001 From: aliabbasrizvi Date: Fri, 26 Jun 2020 16:07:24 -0700 Subject: [PATCH 3/4] fixing test --- tests/test_config_manager.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_config_manager.py b/tests/test_config_manager.py index 73ce8309..622ac37a 100644 --- a/tests/test_config_manager.py +++ b/tests/test_config_manager.py @@ -449,5 +449,4 @@ def test_fetch_datafile(self, _): timeout=enums.ConfigManager.REQUEST_TIMEOUT, ) - self.assertEqual(test_headers['Last-Modified'], project_config_manager.last_modified) self.assertIsInstance(project_config_manager.get_config(), project_config.ProjectConfig) From 25d6ccd55c556de3503ce71c64f56fd048c0630f Mon Sep 17 00:00:00 2001 From: aliabbasrizvi Date: Fri, 26 Jun 2020 16:28:06 -0700 Subject: [PATCH 4/4] fixing test --- tests/test_config_manager.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_config_manager.py b/tests/test_config_manager.py index 622ac37a..1de23302 100644 --- a/tests/test_config_manager.py +++ b/tests/test_config_manager.py @@ -425,7 +425,9 @@ def test_fetch_datafile(self, _): """ Test that fetch_datafile sets authorization header in request header and sets config based on response. """ access_token = 'some_token' sdk_key = 'some_key' - with mock.patch('optimizely.config_manager.AuthDatafilePollingConfigManager.fetch_datafile'): + with mock.patch('optimizely.config_manager.AuthDatafilePollingConfigManager.fetch_datafile'), mock.patch( + 'optimizely.config_manager.AuthDatafilePollingConfigManager._run' + ): project_config_manager = config_manager.AuthDatafilePollingConfigManager( access_token=access_token, sdk_key=sdk_key) expected_datafile_url = enums.ConfigManager.AUTHENTICATED_DATAFILE_URL_TEMPLATE.format(sdk_key=sdk_key) @@ -438,9 +440,7 @@ def test_fetch_datafile(self, _): # Call fetch_datafile and assert that request was sent with correct authorization header with mock.patch('requests.get', - return_value=test_response) as mock_request, mock.patch( - 'optimizely.config_manager.AuthDatafilePollingConfigManager._run' - ): + return_value=test_response) as mock_request: project_config_manager.fetch_datafile() mock_request.assert_called_once_with(