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.
- {generalmanager-0.0.0 → generalmanager-0.1.1}/GeneralManager.egg-info/PKG-INFO +1 -1
- {generalmanager-0.0.0 → generalmanager-0.1.1}/PKG-INFO +1 -1
- {generalmanager-0.0.0 → generalmanager-0.1.1}/pyproject.toml +30 -5
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/api/graphql.py +0 -3
- generalmanager-0.1.1/tests/test_graph_ql.py +215 -0
- generalmanager-0.0.0/tests/test_graph_ql.py +0 -358
- {generalmanager-0.0.0 → generalmanager-0.1.1}/GeneralManager.egg-info/SOURCES.txt +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/GeneralManager.egg-info/dependency_links.txt +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/GeneralManager.egg-info/requires.txt +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/GeneralManager.egg-info/top_level.txt +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/LICENSE +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/README.md +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/setup.cfg +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/__init__.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/api/mutation.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/api/property.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/apps.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/auxiliary/__init__.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/auxiliary/argsToKwargs.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/auxiliary/filterParser.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/auxiliary/noneToZero.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/cache/cacheDecorator.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/cache/cacheTracker.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/cache/dependencyIndex.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/cache/pathMapping.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/cache/signals.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/factory/__init__.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/factory/factories.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/factory/lazy_methods.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/interface/__init__.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/interface/baseInterface.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/interface/calculationInterface.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/interface/databaseInterface.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/manager/__init__.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/manager/generalManager.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/manager/groupManager.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/manager/input.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/manager/meta.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/measurement/__init__.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/measurement/measurement.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/measurement/measurementField.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/permission/__init__.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/permission/basePermission.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/permission/fileBasedPermission.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/permission/managerBasedPermission.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/permission/permissionChecks.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/permission/permissionDataManager.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/rule/__init__.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/rule/handler.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/rule/rule.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/tests/test_argsToKwargs.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/tests/test_basePermission.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/tests/test_managerBasedPermission.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/tests/test_measurement.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/tests/test_measurement_field.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/tests/test_rules.py +0 -0
- {generalmanager-0.0.0 → generalmanager-0.1.1}/tests/test_settings.py +0 -0
@@ -1,14 +1,18 @@
|
|
1
1
|
[build-system]
|
2
|
-
requires = [
|
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.
|
10
|
+
version = "0.1.1"
|
8
11
|
description = "Kurzbeschreibung deines Pakets"
|
9
12
|
readme = "README.md"
|
10
|
-
|
11
|
-
|
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 = [
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/interface/baseInterface.py
RENAMED
File without changes
|
{generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/interface/calculationInterface.py
RENAMED
File without changes
|
{generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/interface/databaseInterface.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/measurement/measurement.py
RENAMED
File without changes
|
{generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/measurement/measurementField.py
RENAMED
File without changes
|
File without changes
|
{generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/permission/basePermission.py
RENAMED
File without changes
|
{generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/permission/fileBasedPermission.py
RENAMED
File without changes
|
File without changes
|
{generalmanager-0.0.0 → generalmanager-0.1.1}/src/general_manager/permission/permissionChecks.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|