From 96e43f90e7e184aaad18751fb06a9d3d8869206b Mon Sep 17 00:00:00 2001 From: Gonzalo Molpeceres Barrientos Date: Wed, 19 Jul 2023 14:57:14 +0200 Subject: [PATCH] feat: implement FOREST_DISABLE_AUTO_SCHEMA_UPDATE and test for it --- django_forest/tests/utils/test_schema.py | 17 +++++++++++++---- django_forest/utils/schema/__init__.py | 6 ++++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/django_forest/tests/utils/test_schema.py b/django_forest/tests/utils/test_schema.py index 8e6e3351..b3fde070 100644 --- a/django_forest/tests/utils/test_schema.py +++ b/django_forest/tests/utils/test_schema.py @@ -163,7 +163,7 @@ def tearDown(self): @pytest.mark.usefixtures('reset_config_dir_import') def test_handle_schema_file_no_file(self): with self.assertLogs() as cm: - self.assertRaises(Exception, Schema.handle_schema_file()) + Schema.handle_schema_file() self.assertIsNone(Schema.schema_data) self.assertEqual(cm.output, [ 'ERROR:django_forest.utils.schema:The .forestadmin-schema.json file does not exist.', @@ -180,13 +180,22 @@ def test_handle_schema_file_production(self): @pytest.mark.usefixtures('invalid_forestadmin_schema') def test_handle_schema_file_invalid_json_production(self): with self.assertLogs() as cm: - self.assertRaises(Exception, Schema.handle_schema_file()) + Schema.handle_schema_file() self.assertIsNone(Schema.schema_data) self.assertEqual(cm.output, [ 'ERROR:django_forest.utils.schema:The content of .forestadmin-schema.json file is not a correct JSON.', 'ERROR:django_forest.utils.schema:The schema cannot be synchronized with Forest Admin servers.' ]) + @pytest.mark.usefixtures('reset_config_dir_import') + @override_settings(FOREST={'FOREST_DISABLE_AUTO_SCHEMA_UPDATE': True}, DEBUG=True) + def test_handle_schema_file_debug_disable_update(self): + Schema.handle_schema_file() + self.assertIsNotNone(Schema.schema_data) + with self.assertRaises(FileNotFoundError) as cm: + open(file_path, 'r') + + @pytest.mark.usefixtures('reset_config_dir_import') @override_settings(DEBUG=True) def test_handle_schema_file_debug(self): @@ -216,7 +225,7 @@ def test_send_apimap_disable_apply(self, mocked_get_serialized_schema): @override_settings(FOREST={'FOREST_DISABLE_AUTO_SCHEMA_APPLY': 'foo'}) def test_send_apimap_server_error(self): - self.assertRaises(Exception, Schema.send_apimap()) + Exception, Schema.send_apimap() @override_settings(DEBUG=True) @mock.patch('requests.post', return_value=mocked_requests({'key1': 'value1'}, 200)) @@ -267,7 +276,7 @@ def test_send_apimap_warning(self, mocked_requests_post): def test_send_apimap_zero(self, mocked_requests_post): Schema.schema_data = test_question_schema_data with self.assertLogs() as cm: - self.assertRaises(Exception, Schema.send_apimap()) + Schema.send_apimap() self.assertEqual(cm.records[0].message, 'Cannot send the apimap to Forest. Are you online?') self.assertEqual(cm.records[0].levelname, 'WARNING') diff --git a/django_forest/utils/schema/__init__.py b/django_forest/utils/schema/__init__.py index 7727befa..926a8b0d 100644 --- a/django_forest/utils/schema/__init__.py +++ b/django_forest/utils/schema/__init__.py @@ -161,8 +161,10 @@ def handle_schema_file(cls): for index, collection in enumerate(cls.schema_data['collections']): cls.schema_data['collections'][index] = cls.get_serialized_collection(collection) - with open(file_path, 'w') as f: - f.write(json.dumps(cls.schema_data, indent=2)) + disable_auto_schema_update = get_forest_setting('FOREST_DISABLE_AUTO_SCHEMA_UPDATE', False) + if not disable_auto_schema_update: + with open(file_path, 'w') as f: + f.write(json.dumps(cls.schema_data, indent=2)) else: cls.handle_schema_file_production(file_path)