GeneralManager 0.0.0__tar.gz → 0.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. {generalmanager-0.0.0 → generalmanager-0.1.1}/GeneralManager.egg-info/PKG-INFO +1 -1
  2. {generalmanager-0.0.0 → generalmanager-0.1.1}/PKG-INFO +1 -1
  3. {generalmanager-0.0.0 → generalmanager-0.1.1}/pyproject.toml +30 -5
  4. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/api/graphql.py +0 -3
  5. generalmanager-0.1.1/tests/test_graph_ql.py +215 -0
  6. generalmanager-0.0.0/tests/test_graph_ql.py +0 -358
  7. {generalmanager-0.0.0 → generalmanager-0.1.1}/GeneralManager.egg-info/SOURCES.txt +0 -0
  8. {generalmanager-0.0.0 → generalmanager-0.1.1}/GeneralManager.egg-info/dependency_links.txt +0 -0
  9. {generalmanager-0.0.0 → generalmanager-0.1.1}/GeneralManager.egg-info/requires.txt +0 -0
  10. {generalmanager-0.0.0 → generalmanager-0.1.1}/GeneralManager.egg-info/top_level.txt +0 -0
  11. {generalmanager-0.0.0 → generalmanager-0.1.1}/LICENSE +0 -0
  12. {generalmanager-0.0.0 → generalmanager-0.1.1}/README.md +0 -0
  13. {generalmanager-0.0.0 → generalmanager-0.1.1}/setup.cfg +0 -0
  14. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/__init__.py +0 -0
  15. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/api/mutation.py +0 -0
  16. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/api/property.py +0 -0
  17. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/apps.py +0 -0
  18. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/auxiliary/__init__.py +0 -0
  19. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/auxiliary/argsToKwargs.py +0 -0
  20. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/auxiliary/filterParser.py +0 -0
  21. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/auxiliary/noneToZero.py +0 -0
  22. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/cache/cacheDecorator.py +0 -0
  23. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/cache/cacheTracker.py +0 -0
  24. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/cache/dependencyIndex.py +0 -0
  25. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/cache/pathMapping.py +0 -0
  26. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/cache/signals.py +0 -0
  27. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/factory/__init__.py +0 -0
  28. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/factory/factories.py +0 -0
  29. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/factory/lazy_methods.py +0 -0
  30. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/interface/__init__.py +0 -0
  31. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/interface/baseInterface.py +0 -0
  32. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/interface/calculationInterface.py +0 -0
  33. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/interface/databaseInterface.py +0 -0
  34. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/manager/__init__.py +0 -0
  35. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/manager/generalManager.py +0 -0
  36. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/manager/groupManager.py +0 -0
  37. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/manager/input.py +0 -0
  38. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/manager/meta.py +0 -0
  39. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/measurement/__init__.py +0 -0
  40. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/measurement/measurement.py +0 -0
  41. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/measurement/measurementField.py +0 -0
  42. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/permission/__init__.py +0 -0
  43. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/permission/basePermission.py +0 -0
  44. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/permission/fileBasedPermission.py +0 -0
  45. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/permission/managerBasedPermission.py +0 -0
  46. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/permission/permissionChecks.py +0 -0
  47. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/permission/permissionDataManager.py +0 -0
  48. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/rule/__init__.py +0 -0
  49. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/rule/handler.py +0 -0
  50. {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/rule/rule.py +0 -0
  51. {generalmanager-0.0.0 → generalmanager-0.1.1}/tests/test_argsToKwargs.py +0 -0
  52. {generalmanager-0.0.0 → generalmanager-0.1.1}/tests/test_basePermission.py +0 -0
  53. {generalmanager-0.0.0 → generalmanager-0.1.1}/tests/test_managerBasedPermission.py +0 -0
  54. {generalmanager-0.0.0 → generalmanager-0.1.1}/tests/test_measurement.py +0 -0
  55. {generalmanager-0.0.0 → generalmanager-0.1.1}/tests/test_measurement_field.py +0 -0
  56. {generalmanager-0.0.0 → generalmanager-0.1.1}/tests/test_rules.py +0 -0
  57. {generalmanager-0.0.0 → generalmanager-0.1.1}/tests/test_settings.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.0.0
3
+ Version: 0.1.1
4
4
  Summary: Kurzbeschreibung deines Pakets
5
5
  Author-email: Tim Kleindick <tkleindick@yahoo.de>
6
6
  License: Non-Commercial MIT License
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.0.0
3
+ Version: 0.1.1
4
4
  Summary: Kurzbeschreibung deines Pakets
5
5
  Author-email: Tim Kleindick <tkleindick@yahoo.de>
6
6
  License: Non-Commercial MIT License
@@ -1,14 +1,18 @@
1
1
  [build-system]
2
- requires = ["setuptools>=42", "wheel"]
2
+ requires = [
3
+ "setuptools>=42",
4
+ "wheel",
5
+ ]
3
6
  build-backend = "setuptools.build_meta"
4
7
 
5
8
  [project]
6
9
  name = "GeneralManager"
7
- version = "0.0.0"
10
+ version = "0.1.1"
8
11
  description = "Kurzbeschreibung deines Pakets"
9
12
  readme = "README.md"
10
- license = { file = "LICENSE" }
11
- authors = [{ name="Tim Kleindick", email="tkleindick@yahoo.de" }]
13
+ authors = [
14
+ { name = "Tim Kleindick", email = "tkleindick@yahoo.de" },
15
+ ]
12
16
  requires-python = ">=3.12"
13
17
  dependencies = [
14
18
  "asgiref>=3.8.1",
@@ -39,5 +43,26 @@ dependencies = [
39
43
  "tzdata>=2025.2",
40
44
  ]
41
45
 
46
+ [project.license]
47
+ file = "LICENSE"
48
+
42
49
  [tool.setuptools.packages.find]
43
- where = ["src", "general_manager"]
50
+ where = [
51
+ "src",
52
+ "general_manager",
53
+ ]
54
+
55
+ [tool.semantic_release]
56
+ allow_zero_version = true
57
+ major_on_zero = false
58
+
59
+ # Wo die Version upgedated wird
60
+ version_toml = ["pyproject.toml:project.version"]
61
+
62
+ # Auf welchem Branch Releases laufen sollen
63
+ branch = "main"
64
+
65
+ # Build- und Upload-Schritte (wie gehabt)
66
+ build_command = "python -m build"
67
+ upload_to_PyPI = true
68
+ upload_to_release = true
@@ -19,9 +19,6 @@ if TYPE_CHECKING:
19
19
  class MeasurementType(graphene.ObjectType): # type: ignore
20
20
  value = graphene.Float()
21
21
  unit = graphene.String()
22
- required = graphene.Boolean()
23
- editable = graphene.Boolean()
24
- default_value = graphene.String()
25
22
 
26
23
 
27
24
  def getReadPermissionFilter(
@@ -0,0 +1,215 @@
1
+ import json
2
+ from decimal import Decimal
3
+ from datetime import date, datetime
4
+ import graphene
5
+ from django.test import TestCase
6
+ from unittest.mock import MagicMock, patch
7
+ from django.contrib.auth.models import AnonymousUser
8
+
9
+ from general_manager.api.graphql import (
10
+ MeasurementType,
11
+ GraphQL,
12
+ )
13
+ from general_manager.measurement.measurement import Measurement, ureg
14
+ from general_manager.manager.generalManager import GeneralManager, GeneralManagerMeta
15
+ from general_manager.api.property import GraphQLProperty
16
+ from general_manager.interface.baseInterface import InterfaceBase
17
+
18
+
19
+ class GraphQLPropertyTests(TestCase):
20
+ def test_graphql_property_initialization(self):
21
+ def mock_getter():
22
+ return "test"
23
+
24
+ prop = GraphQLProperty(mock_getter)
25
+ self.assertTrue(prop.is_graphql_resolver)
26
+ self.assertIsNone(prop.graphql_type_hint)
27
+
28
+ def test_graphql_property_with_type_hint(self):
29
+ def mock_getter() -> str:
30
+ return "test"
31
+
32
+ prop = GraphQLProperty(mock_getter)
33
+ self.assertEqual(prop.graphql_type_hint, str)
34
+
35
+
36
+ class MeasurementTypeTests(TestCase):
37
+ def test_measurement_type_fields(self):
38
+ for field in ["value", "unit"]:
39
+ self.assertTrue(hasattr(MeasurementType, field))
40
+
41
+
42
+ class GraphQLTests(TestCase):
43
+ def setUp(self):
44
+ self.general_manager_class = MagicMock(spec=GeneralManagerMeta)
45
+ self.general_manager_class.__name__ = "TestManager"
46
+ self.info = MagicMock()
47
+ self.info.context.user = AnonymousUser()
48
+
49
+ @patch("general_manager.interface.baseInterface.InterfaceBase")
50
+ def test_create_graphql_interface_no_interface(self, mock_interface):
51
+ self.general_manager_class.Interface = None
52
+ result = GraphQL.createGraphqlInterface(self.general_manager_class)
53
+ self.assertIsNone(result)
54
+
55
+ @patch("general_manager.interface.baseInterface.InterfaceBase")
56
+ def test_create_graphql_interface_with_interface(self, mock_interface):
57
+ mock_interface.getAttributeTypes.return_value = {"test_field": {"type": str}}
58
+ self.general_manager_class.Interface = mock_interface
59
+ with patch("general_manager.api.graphql.issubclass", return_value=True):
60
+ GraphQL.createGraphqlInterface(self.general_manager_class)
61
+ self.assertIn("TestManager", GraphQL.graphql_type_registry)
62
+
63
+ def test_map_field_to_graphene(self):
64
+ # Base types
65
+ self.assertIsInstance(
66
+ GraphQL._mapFieldToGrapheneRead(str, "name"), graphene.String
67
+ )
68
+ self.assertIsInstance(GraphQL._mapFieldToGrapheneRead(int, "age"), graphene.Int)
69
+ self.assertIsInstance(
70
+ GraphQL._mapFieldToGrapheneRead(float, "value"), graphene.Float
71
+ )
72
+ self.assertIsInstance(
73
+ GraphQL._mapFieldToGrapheneRead(Decimal, "decimal"), graphene.Float
74
+ )
75
+ self.assertIsInstance(
76
+ GraphQL._mapFieldToGrapheneRead(bool, "active"), graphene.Boolean
77
+ )
78
+ self.assertIsInstance(
79
+ GraphQL._mapFieldToGrapheneRead(date, "birth_date"), graphene.Date
80
+ )
81
+ field = GraphQL._mapFieldToGrapheneRead(Measurement, "measurement")
82
+ self.assertIsInstance(field, graphene.Field)
83
+
84
+ def test_create_resolver_normal_case(self):
85
+ mock_instance = MagicMock()
86
+ mock_instance.some_field = "expected_value"
87
+ resolver = GraphQL._createResolver("some_field", str)
88
+ self.assertEqual(resolver(mock_instance, self.info), "expected_value")
89
+
90
+ def test_create_resolver_measurement_case(self):
91
+ mock_instance = MagicMock()
92
+ mock_measurement = Measurement(100, "cm")
93
+ mock_instance.measurement_field = mock_measurement
94
+
95
+ resolver = GraphQL._createResolver("measurement_field", Measurement)
96
+ result = resolver(mock_instance, self.info, target_unit="cm")
97
+ self.assertEqual(result, {"value": Decimal(100), "unit": ureg("cm")})
98
+
99
+ def test_create_resolver_list_case(self):
100
+ mock_instance = MagicMock()
101
+ mock_queryset = MagicMock()
102
+ mock_filtered = MagicMock()
103
+ mock_queryset.filter.return_value = mock_filtered
104
+ mock_filtered.exclude.return_value = mock_filtered
105
+ # Assign the queryset directly
106
+ mock_instance.abc_list = mock_queryset
107
+
108
+ resolver = GraphQL._createResolver("abc_list", GeneralManager)
109
+ with patch("json.loads", side_effect=json.loads):
110
+ result = resolver(
111
+ mock_instance,
112
+ self.info,
113
+ filter=json.dumps({"field": "value"}),
114
+ exclude=json.dumps({"other_field": "value"}),
115
+ )
116
+ mock_queryset.filter.assert_called_with(field="value")
117
+ mock_filtered.exclude.assert_called_with(other_field="value")
118
+
119
+ @patch("general_manager.interface.baseInterface.InterfaceBase")
120
+ def test_create_graphql_interface_graphql_property(self, mock_interface):
121
+ class TestManager:
122
+ class Interface(InterfaceBase):
123
+ input_fields = {}
124
+
125
+ @staticmethod
126
+ def getAttributeTypes(): # type: ignore
127
+ return {"test_field": {"type": str}}
128
+
129
+ @classmethod
130
+ def all(cls):
131
+ return []
132
+
133
+ mock_interface.getAttributeTypes.return_value = {"test_field": {"type": str}}
134
+ with patch("general_manager.api.graphql.issubclass", return_value=True):
135
+ setattr(TestManager, "test_prop", GraphQLProperty(lambda: 42))
136
+ GraphQL.createGraphqlInterface(TestManager) # type: ignore
137
+ self.assertIn("TestManager", GraphQL.graphql_type_registry)
138
+
139
+ def test_list_resolver_with_invalid_filter_exclude(self):
140
+ mock_instance = MagicMock()
141
+ mock_qs = MagicMock()
142
+ mock_instance.abc_list = mock_qs
143
+ resolver = GraphQL._createResolver("abc_list", GeneralManager)
144
+ with patch("json.loads", side_effect=ValueError):
145
+ result = resolver(mock_instance, self.info, filter="bad", exclude="bad")
146
+ self.assertEqual(result, mock_qs)
147
+
148
+ def test_create_filter_options_measurement_fields(self):
149
+ class DummyManager:
150
+ __name__ = "DummyManager"
151
+
152
+ class Interface(InterfaceBase):
153
+ input_fields = {}
154
+
155
+ @staticmethod
156
+ def getAttributeTypes(): # type: ignore
157
+ return {
158
+ "num_field": {"type": int},
159
+ "str_field": {"type": str},
160
+ "measurement_field": {"type": Measurement},
161
+ "gm_field": {"type": GeneralManager},
162
+ }
163
+
164
+ GraphQL.graphql_filter_type_registry.clear()
165
+ filter_cls = GraphQL._createFilterOptions("dummy", DummyManager) # type: ignore
166
+ fields = filter_cls._meta.fields
167
+ self.assertNotIn("gm_field", fields)
168
+ for key in [
169
+ "num_field",
170
+ *[f"num_field__{opt}" for opt in ["exact", "gt", "gte", "lt", "lte"]],
171
+ ]:
172
+ self.assertIn(key, fields)
173
+ for key in [
174
+ "str_field",
175
+ *[
176
+ f"str_field__{opt}"
177
+ for opt in [
178
+ "exact",
179
+ "icontains",
180
+ "contains",
181
+ "in",
182
+ "startswith",
183
+ "endswith",
184
+ ]
185
+ ],
186
+ ]:
187
+ self.assertIn(key, fields)
188
+ for key in (
189
+ ["measurement_field_value", "measurement_field_unit"]
190
+ + [
191
+ f"measurement_field_value__{opt}"
192
+ for opt in ["exact", "gt", "gte", "lt", "lte"]
193
+ ]
194
+ + [
195
+ f"measurement_field_unit__{opt}"
196
+ for opt in ["exact", "gt", "gte", "lt", "lte"]
197
+ ]
198
+ ):
199
+ self.assertIn(key, fields)
200
+
201
+ def test_create_filter_options_registry_cache(self):
202
+ class DummyManager2:
203
+ __name__ = "DummyManager2"
204
+
205
+ class Interface(InterfaceBase):
206
+ input_fields = {}
207
+
208
+ @staticmethod
209
+ def getAttributeTypes(): # type: ignore
210
+ return {"num_field": {"type": int}}
211
+
212
+ GraphQL.graphql_filter_type_registry.clear()
213
+ first = GraphQL._createFilterOptions("dummy2", DummyManager2) # type: ignore
214
+ second = GraphQL._createFilterOptions("dummy2", DummyManager2) # type: ignore
215
+ self.assertIs(first, second)
@@ -1,358 +0,0 @@
1
- # from django.test import TestCase
2
- # from unittest.mock import MagicMock, patch
3
- # import json
4
- # from decimal import Decimal
5
- # from datetime import date, datetime
6
- # import graphene
7
- # from general_manager.manager.generalManager import (
8
- # GeneralManager,
9
- # GeneralManagerMeta,
10
- # )
11
- # from general_manager.measurement.measurement import Measurement, ureg
12
- # from django.contrib.auth.models import AnonymousUser
13
-
14
- # from general_manager.api.graphql import (
15
- # MeasurementType,
16
- # GraphQL,
17
- # Measurement,
18
- # )
19
-
20
- # from general_manager.api.property import GraphQLProperty
21
-
22
-
23
- # class GraphQLPropertyTests(TestCase):
24
- # def test_graphql_property_initialization(self):
25
- # def mock_getter():
26
- # """Mock getter method."""
27
- # return "test"
28
-
29
- # prop = GraphQLProperty(mock_getter)
30
- # self.assertTrue(prop.is_graphql_resolver)
31
- # self.assertEqual(prop.graphql_type_hint, None)
32
-
33
- # def test_graphql_property_with_type_hint(self):
34
- # def mock_getter() -> str:
35
- # return "test"
36
-
37
- # prop = GraphQLProperty(mock_getter)
38
- # self.assertEqual(prop.graphql_type_hint, str)
39
-
40
-
41
- # class MeasurementTypeTests(TestCase):
42
- # def test_measurement_type_fields(self):
43
- # self.assertTrue(hasattr(MeasurementType, "value"))
44
- # self.assertTrue(hasattr(MeasurementType, "unit"))
45
-
46
-
47
- # class GraphQLTests(TestCase):
48
- # def setUp(self):
49
- # # Setup mock general manager class
50
- # self.general_manager_class = MagicMock(spec=GeneralManagerMeta)
51
- # self.general_manager_class.__name__ = "TestManager"
52
- # self.info = MagicMock()
53
- # self.info.context.user = AnonymousUser()
54
-
55
- # @patch("interface.baseInterface.InterfaceBase")
56
- # def test_create_graphql_interface_no_interface(self, mock_interface):
57
- # # Test case where no Interface is present
58
- # self.general_manager_class.Interface = None
59
- # with patch("general_manager.api.graphql.issubclass", return_value=True):
60
- # result = GraphQL._createGraphQlInterface(self.general_manager_class)
61
- # self.assertIsNone(result)
62
-
63
- # @patch("interface.baseInterface.InterfaceBase")
64
- # def test_create_graphql_interface_with_interface(self, mock_interface):
65
- # # Test with an interface and checking registry population
66
- # mock_interface.getAttributeTypes.return_value = {
67
- # "test_field": str,
68
- # "int_field": int,
69
- # }
70
- # self.general_manager_class.Interface = mock_interface
71
- # with patch("general_manager.api.graphql.issubclass", return_value=True):
72
- # GraphQL._createGraphQlInterface(self.general_manager_class)
73
- # self.assertIn("TestManager", GraphQL.graphql_type_registry)
74
-
75
- # def test_map_field_to_graphene(self):
76
- # # Test type mappings
77
- # self.assertIsInstance(
78
- # GraphQL._GraphQL__map_field_to_graphene(str, "name"), # type: ignore
79
- # graphene.String,
80
- # )
81
- # self.assertIsInstance(
82
- # GraphQL._GraphQL__map_field_to_graphene(int, "age"), # type: ignore
83
- # graphene.Int,
84
- # )
85
- # self.assertIsInstance(
86
- # GraphQL._GraphQL__map_field_to_graphene(float, "value"), # type: ignore
87
- # graphene.Float,
88
- # )
89
- # self.assertIsInstance(
90
- # GraphQL._GraphQL__map_field_to_graphene(Decimal, "decimal"), # type: ignore
91
- # graphene.Float,
92
- # )
93
- # self.assertIsInstance(
94
- # GraphQL._GraphQL__map_field_to_graphene(bool, "active"), # type: ignore
95
- # graphene.Boolean,
96
- # )
97
- # self.assertIsInstance(
98
- # GraphQL._GraphQL__map_field_to_graphene(date, "birth_date"), # type: ignore
99
- # graphene.Date,
100
- # )
101
- # self.assertIsInstance(
102
- # GraphQL._GraphQL__map_field_to_graphene(Measurement, "measurement"), # type: ignore
103
- # graphene.Field,
104
- # )
105
-
106
- # def test_create_resolver_normal_case(self):
107
- # # Test resolver for a normal field type
108
- # mock_instance = MagicMock()
109
- # mock_instance.some_field = "expected_value"
110
-
111
- # resolver = GraphQL._GraphQL__create_resolver("some_field", str) # type: ignore
112
- # self.assertEqual(resolver(mock_instance, self.info), "expected_value")
113
-
114
- # def test_create_resolver_measurement_case(self):
115
- # # Test resolver for Measurement field type with unit conversion
116
- # mock_instance = MagicMock()
117
- # mock_measurement = Measurement(100, "cm")
118
- # mock_instance.measurement_field = mock_measurement
119
-
120
- # resolver = GraphQL._GraphQL__create_resolver("measurement_field", Measurement) # type: ignore
121
- # result = resolver(mock_instance, self.info, target_unit="cm")
122
- # self.assertEqual(result, {"value": Decimal(100), "unit": ureg("cm")})
123
-
124
- # def test_create_resolver_list_case(self):
125
- # # Test resolver for a list field type with filtering
126
- # mock_instance = MagicMock()
127
- # mock_queryset = MagicMock()
128
- # mock_filtered_queryset = MagicMock() # Return value of filter()
129
- # mock_queryset.filter.return_value = mock_filtered_queryset
130
- # mock_filtered_queryset.exclude.return_value = (
131
- # mock_filtered_queryset # Chaining exclude on filtered queryset
132
- # )
133
-
134
- # mock_instance.abc_list.all.return_value = (
135
- # mock_queryset # Return initial queryset from .all()
136
- # )
137
-
138
- # resolver = GraphQL._GraphQL__create_resolver("abc_list", GeneralManager) # type: ignore
139
-
140
- # with patch("json.loads", side_effect=json.loads): # Ensure correct JSON parsing
141
- # result = resolver(
142
- # mock_instance,
143
- # None,
144
- # filter=json.dumps({"field": "value"}),
145
- # exclude=json.dumps({"other_field": "value"}),
146
- # )
147
-
148
- # # Assert that filter and exclude are called on correct queryset
149
- # mock_queryset.filter.assert_called_with(field="value")
150
- # mock_filtered_queryset.exclude.assert_called_with(other_field="value")
151
-
152
- # def test_add_queries_to_schema(self):
153
- # # Test if queries are added to the schema properly
154
- # class TestGeneralManager:
155
- # class Interface:
156
- # input_fields = {}
157
-
158
- # @staticmethod
159
- # def getAttributeTypes():
160
- # return {"test_field": str}
161
-
162
- # @classmethod
163
- # def all(cls):
164
- # return []
165
-
166
- # graphene_type = MagicMock()
167
- # with patch("general_manager.api.graphql.issubclass", return_value=True):
168
- # GraphQL._GraphQL__add_queries_to_schema(graphene_type, TestGeneralManager) # type: ignore
169
-
170
- # self.assertIn("testgeneralmanager_list", GraphQL._query_fields)
171
- # self.assertIn("resolve_testgeneralmanager_list", GraphQL._query_fields)
172
- # self.assertIn("testgeneralmanager", GraphQL._query_fields)
173
- # self.assertIn("resolve_testgeneralmanager", GraphQL._query_fields)
174
-
175
- # @patch("interface.baseInterface.InterfaceBase")
176
- # def test_create_graphql_interface_graphql_property(self, mock_interface):
177
- # # Dummy-Interface definieren
178
- # class TestGeneralManager:
179
- # class Interface:
180
- # input_fields = {}
181
-
182
- # @staticmethod
183
- # def getAttributeTypes():
184
- # return {"test_field": str}
185
-
186
- # @classmethod
187
- # def all(cls):
188
- # return []
189
-
190
- # with patch("general_manager.api.graphql.issubclass", return_value=True):
191
- # # Konfiguriere das Mock für InterfaceBase
192
- # mock_interface.getAttributeTypes.return_value = {"test_field": str}
193
- # self.general_manager_class.Interface = mock_interface
194
-
195
- # # Füge ein GraphQLProperty-Attribut hinzu
196
- # def graphql_property_func() -> int:
197
- # return 42
198
-
199
- # setattr(
200
- # TestGeneralManager,
201
- # "test_prop",
202
- # GraphQLProperty(graphql_property_func),
203
- # )
204
-
205
- # # Aufruf der zu testenden Methode
206
- # GraphQL._createGraphQlInterface(self.general_manager_class)
207
-
208
- # # Prüfe, ob der erwartete GraphQL-Typ registriert wurde
209
- # self.assertIn("TestManager", GraphQL.graphql_type_registry)
210
-
211
- # def test_map_field_to_graphene_general_manager(self):
212
- # class TestGeneralManager:
213
- # class Interface:
214
- # input_fields = {}
215
-
216
- # @staticmethod
217
- # def getAttributeTypes():
218
- # return {"test_field": str}
219
-
220
- # @classmethod
221
- # def all(cls):
222
- # return []
223
-
224
- # @property
225
- # def test_list(self):
226
- # return ["item1", "item2"]
227
-
228
- # def custom_side_effect(cls, base):
229
- # # Beispiel: Wenn nach einer bestimmten Basisklasse gefragt wird, gib True zurück
230
- # if base == GeneralManager:
231
- # return True
232
- # return False
233
-
234
- # # Test field mapping for a GeneralManager type with list suffix
235
- # with patch(
236
- # "api.graphql.issubclass",
237
- # side_effect=custom_side_effect,
238
- # ):
239
- # self.assertIsInstance(
240
- # GraphQL._GraphQL__map_field_to_graphene(TestGeneralManager, "test_list"), # type: ignore
241
- # graphene.List,
242
- # )
243
-
244
- # def test_list_resolver_with_invalid_filter_exclude(self):
245
- # # Test handling of invalid JSON in filter/exclude parameters
246
- # mock_instance = MagicMock()
247
- # mock_queryset = MagicMock()
248
- # mock_instance.abc_list.all.return_value = mock_queryset
249
-
250
- # resolver = GraphQL._GraphQL__create_resolver("abc_list", GeneralManager) # type: ignore
251
-
252
- # # Modify resolver to handle ValueError
253
- # with patch("json.loads", side_effect=ValueError):
254
- # try:
255
- # result = resolver(
256
- # mock_instance, None, filter="invalid", exclude="invalid"
257
- # )
258
- # self.assertEqual(result, mock_queryset)
259
- # except ValueError:
260
- # self.fail("Resolver should handle invalid JSON gracefully.")
261
-
262
- # def test_resolve_list_with_no_filter_exclude(self):
263
- # # Test list resolver without filter/exclude
264
- # class TestGeneralManager:
265
- # class Interface:
266
- # input_fields = {}
267
-
268
- # @staticmethod
269
- # def getAttributeTypes():
270
- # return {"test_field": str}
271
-
272
- # @classmethod
273
- # def all(cls):
274
- # return ["item1", "item2"]
275
-
276
- # graphene_type = MagicMock()
277
- # with patch("general_manager.api.graphql.issubclass", return_value=True):
278
- # GraphQL._GraphQL__add_queries_to_schema(graphene_type, TestGeneralManager) # type: ignore
279
-
280
- # resolve_list_func = GraphQL._query_fields["resolve_testgeneralmanager_list"]
281
- # result = resolve_list_func(self, None)
282
- # self.assertEqual(result, ["item1", "item2"])
283
-
284
- # def test_create_filter_options_measurement_fields(self):
285
- # # Dummy-Manager definieren, dessen Interface verschiedene Feldtypen zurückgibt
286
- # class DummyManager:
287
- # __name__ = "DummyManager"
288
-
289
- # class Interface:
290
- # input_fields = {}
291
-
292
- # @staticmethod
293
- # def getAttributeTypes():
294
- # from general_manager.measurement.measurement import Measurement
295
- # from general_manager.manager.generalManager import (
296
- # GeneralManager,
297
- # )
298
-
299
- # return {
300
- # "num_field": int,
301
- # "str_field": str,
302
- # "measurement_field": Measurement,
303
- # "gm_field": GeneralManager, # sollte übersprungen werden
304
- # }
305
-
306
- # # Sicherstellen, dass das Filter-Registry-Cache leer ist
307
- # GraphQL.graphql_filter_type_registry = {}
308
- # # Aufruf der neuen Funktion
309
- # filter_class = GraphQL._createFilterOptions("dummy", DummyManager) # type: ignore
310
- # # Zugriff auf die Felder der erzeugten InputObjectType
311
- # fields = filter_class._meta.fields
312
-
313
- # # Überprüfen, dass gm_field übersprungen wird
314
- # self.assertNotIn("gm_field", fields)
315
-
316
- # # Teste num_field: Es sollte das Basisfeld sowie die number_options-Felder geben.
317
- # self.assertIn("num_field", fields)
318
- # for option in ["exact", "gt", "gte", "lt", "lte"]:
319
- # self.assertIn(f"num_field__{option}", fields)
320
-
321
- # # Teste str_field: Basisfeld plus string_options-Felder.
322
- # self.assertIn("str_field", fields)
323
- # for option in [
324
- # "exact",
325
- # "icontains",
326
- # "contains",
327
- # "in",
328
- # "startswith",
329
- # "endswith",
330
- # ]:
331
- # self.assertIn(f"str_field__{option}", fields)
332
-
333
- # # Teste measurement_field: Es sollten eigene Felder für den Wert und die Einheit
334
- # # sowie entsprechende number_options-Felder existieren.
335
- # self.assertIn("measurement_field_value", fields)
336
- # self.assertIn("measurement_field_unit", fields)
337
- # for option in ["exact", "gt", "gte", "lt", "lte"]:
338
- # self.assertIn(f"measurement_field_value__{option}", fields)
339
- # self.assertIn(f"measurement_field_unit__{option}", fields)
340
-
341
- # def test_create_filter_options_registry_cache(self):
342
- # # Überprüfe, dass _createFilterOptions den Filtertyp cached.
343
- # class DummyManager:
344
- # __name__ = "DummyManager"
345
-
346
- # class Interface:
347
- # input_fields = {}
348
-
349
- # @staticmethod
350
- # def getAttributeTypes():
351
- # return {"num_field": int}
352
-
353
- # # Leere das Registry
354
- # GraphQL.graphql_filter_type_registry = {}
355
- # filter_class_first = GraphQL._createFilterOptions("dummy", DummyManager) # type: ignore
356
- # filter_class_second = GraphQL._createFilterOptions("dummy", DummyManager) # type: ignore
357
- # # Beide Aufrufe sollten denselben Typ zurückgeben
358
- # self.assertEqual(filter_class_first, filter_class_second)
File without changes
File without changes
File without changes