From 6841b30a77c3e8f7d7895d21983dac54cfc15678 Mon Sep 17 00:00:00 2001 From: Jon Date: Mon, 5 May 2025 19:32:57 +0930 Subject: [PATCH] test: Support variables that were defined as properties. ref: #741 --- app/api/tests/unit/test_unit_api_fields.py | 101 +++++++++--------- app/conftest.py | 4 + .../centurion_erp/development/testing.md | 47 ++++++++ 3 files changed, 104 insertions(+), 48 deletions(-) diff --git a/app/api/tests/unit/test_unit_api_fields.py b/app/api/tests/unit/test_unit_api_fields.py index 33adff44..82249c16 100644 --- a/app/api/tests/unit/test_unit_api_fields.py +++ b/app/api/tests/unit/test_unit_api_fields.py @@ -14,57 +14,60 @@ from app.tests.common import DoesNotExist class APIFieldsTestCases: - - api_fields_common = { - 'id': { - 'expected': int - }, - 'display_name': { - 'expected': str - }, - '_urls': { - 'expected': dict - }, - '_urls._self': { - 'expected': str - }, - '_urls.notes': { - 'expected': str - }, - } - api_fields_model = { - 'model_notes': { - 'expected': str - }, - 'created': { - 'expected': str - }, - 'modified': { - 'expected': str - }, - } + @property + def parameterized_test_data(self) -> dict: - api_fields_tenancy = { - 'organization': { - 'expected': dict - }, - 'organization.id': { - 'expected': int - }, - 'organization.display_name': { - 'expected': str - }, - 'organization.url': { - 'expected': Hyperlink - }, - } + api_fields_common = { + 'id': { + 'expected': int + }, + 'display_name': { + 'expected': str + }, + '_urls': { + 'expected': dict + }, + '_urls._self': { + 'expected': str + }, + '_urls.notes': { + 'expected': str + }, + } - parameterized_test_data = { - **api_fields_common, - **api_fields_tenancy, - **api_fields_model, - } + api_fields_model = { + 'model_notes': { + 'expected': str + }, + 'created': { + 'expected': str + }, + 'modified': { + 'expected': str + }, + } + + api_fields_tenancy = { + 'organization': { + 'expected': dict + }, + 'organization.id': { + 'expected': int + }, + 'organization.display_name': { + 'expected': str + }, + 'organization.url': { + 'expected': Hyperlink + }, + } + + return { + **api_fields_common.copy(), + **api_fields_tenancy.copy(), + **api_fields_model.copy(), + } url_view_kwargs = {} @@ -229,3 +232,5 @@ class APIFieldsInheritedCases( ): model = None + + parameterized_test_data = {} \ No newline at end of file diff --git a/app/conftest.py b/app/conftest.py index c954354f..219a4ef3 100644 --- a/app/conftest.py +++ b/app/conftest.py @@ -94,6 +94,10 @@ def pytest_generate_tests(metafunc): base_values = getattr(base, 'parameterized_' + parameterized_key, None) + if isinstance(base_values, property): + + base_values = getattr(base(), 'parameterized_' + parameterized_key, None) + if not isinstance(base_values, dict): continue diff --git a/docs/projects/centurion_erp/development/testing.md b/docs/projects/centurion_erp/development/testing.md index 8b32e361..101fea45 100644 --- a/docs/projects/centurion_erp/development/testing.md +++ b/docs/projects/centurion_erp/development/testing.md @@ -85,6 +85,53 @@ Test Cases are to test one object and one object **only**. If the object to be t !!! tip If you inherit from an `InheritedCases` Class and there is a `class_setup` fixture, don't forget to import this into your test suite. This ensures it's available for use when running tests +!!! tip + If you find that a base classes variables are being mutated by other test classes, setup the variable within the base class as a property that contains the defaults as a variable within the function and returns the data as if the property was defined as a variable + + + Don't do this as `my_variable` will be mutated by other test classes that inherit the base class. + + ``` py + + class MyTestClassBase: + + my_variable = 'a' + + + + class MyTestClass( + MyTestClassBase + ): + + my_variable = 'b' + + ``` + + Instead, do this. now `MyTestClass` wont override variable `my_variable` which means when another test class inherits from `MyTestClassBase`, variable `my_variable` will always return the desired default value. + + ``` py + + class MyTestClassBase: + + @property + def my_variable(self): + + default = 'a' + + return default.copy() + + + + class MyTestClass( + MyTestClassBase + ): + + my_variable = 'b' + + ``` + + + ### Fixtures