Skip to content

Commit 518545b

Browse files
committed
Add new tests
1 parent 809550c commit 518545b

File tree

2 files changed

+455
-0
lines changed

2 files changed

+455
-0
lines changed
Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,229 @@
1+
from http import HTTPStatus
2+
3+
from django.test import (
4+
TestCase,
5+
override_settings,
6+
)
7+
from rest_framework.test import APITestCase
8+
9+
from addon_service.common.credentials_formats import CredentialsFormats
10+
from addon_service.common.enum_serializers import EnumNameMultipleChoiceField
11+
from addon_service.tests import _factories
12+
from addon_service.tests._helpers import MockOSF
13+
from addon_toolkit.interfaces.link import SupportedResourceTypes
14+
15+
16+
@override_settings(CELERY_TASK_ALWAYS_EAGER=True, CELERY_TASK_EAGER_PROPAGATES=True)
17+
class TestResourceTypesSorting(APITestCase):
18+
19+
@classmethod
20+
def setUpTestData(cls):
21+
cls._user = _factories.UserReferenceFactory()
22+
cls._external_service = _factories.ExternalLinkServiceFactory(
23+
supported_resource_types=SupportedResourceTypes.Dataset
24+
| SupportedResourceTypes.Book
25+
| SupportedResourceTypes.Software,
26+
credentials_format=CredentialsFormats.PERSONAL_ACCESS_TOKEN,
27+
)
28+
29+
def setUp(self):
30+
super().setUp()
31+
self.client.cookies["osf"] = self._user.user_uri
32+
self._mock_osf = MockOSF()
33+
self._mock_osf.configure_assumed_caller(self._user.user_uri)
34+
self.enterContext(self._mock_osf.mocking())
35+
36+
def test_external_service_resource_types_sorted_alphabetically(self):
37+
response = self.client.get(
38+
f"/v1/external-link-services/{self._external_service.id}/"
39+
)
40+
41+
self.assertEqual(response.status_code, HTTPStatus.OK)
42+
43+
resource_types = response.data.get("supported_resource_types", [])
44+
45+
expected_order = ["Book", "Dataset", "Software"]
46+
self.assertEqual(resource_types, expected_order)
47+
48+
def test_enum_field_returns_sorted_choices(self):
49+
expected_names = sorted([rt.name for rt in SupportedResourceTypes])
50+
51+
actual_names = expected_names
52+
53+
self.assertEqual(actual_names, expected_names)
54+
55+
56+
@override_settings(CELERY_TASK_ALWAYS_EAGER=True, CELERY_TASK_EAGER_PROPAGATES=True)
57+
class TestResourceTypeValidation(TestCase):
58+
59+
def test_valid_resource_types(self):
60+
valid_types = [
61+
SupportedResourceTypes.Book,
62+
SupportedResourceTypes.Dataset,
63+
SupportedResourceTypes.Software,
64+
SupportedResourceTypes.Journal,
65+
SupportedResourceTypes.OutputManagementPlan,
66+
SupportedResourceTypes.Other,
67+
]
68+
69+
for resource_type in valid_types:
70+
with self.subTest(resource_type=resource_type):
71+
addon = _factories.ConfiguredLinkAddonFactory()
72+
addon.resource_type = resource_type
73+
74+
addon.full_clean()
75+
self.assertEqual(addon.resource_type, resource_type)
76+
77+
def test_resource_type_enum_values(self):
78+
self.assertEqual(SupportedResourceTypes.Dataset.name, "Dataset")
79+
self.assertEqual(SupportedResourceTypes.Book.name, "Book")
80+
self.assertEqual(SupportedResourceTypes.Software.name, "Software")
81+
self.assertEqual(SupportedResourceTypes.Journal.name, "Journal")
82+
self.assertEqual(
83+
SupportedResourceTypes.OutputManagementPlan.name, "OutputManagementPlan"
84+
)
85+
self.assertEqual(SupportedResourceTypes.Other.name, "Other")
86+
87+
def test_resource_type_integer_conversion(self):
88+
addon = _factories.ConfiguredLinkAddonFactory()
89+
90+
addon.resource_type = SupportedResourceTypes.Dataset
91+
addon.save()
92+
93+
addon.refresh_from_db()
94+
self.assertEqual(addon.int_resource_type, SupportedResourceTypes.Dataset.value)
95+
self.assertEqual(addon.resource_type, SupportedResourceTypes.Dataset)
96+
97+
98+
@override_settings(CELERY_TASK_ALWAYS_EAGER=True, CELERY_TASK_EAGER_PROPAGATES=True)
99+
class TestResourceTypeSerializerField(TestCase):
100+
101+
def test_enum_field_serialization(self):
102+
field = EnumNameMultipleChoiceField(enum_cls=SupportedResourceTypes)
103+
104+
result = field.to_representation(SupportedResourceTypes.Dataset)
105+
self.assertEqual(result, ["Dataset"])
106+
107+
combined_value = SupportedResourceTypes.Dataset | SupportedResourceTypes.Book
108+
result = field.to_representation(combined_value)
109+
self.assertEqual(set(result), {"Dataset", "Book"})
110+
111+
def test_enum_field_deserialization(self):
112+
field = EnumNameMultipleChoiceField(enum_cls=SupportedResourceTypes)
113+
114+
result = field.to_internal_value(["Dataset"])
115+
self.assertEqual(result, SupportedResourceTypes.Dataset)
116+
117+
result = field.to_internal_value(["Dataset", "Book"])
118+
expected = SupportedResourceTypes.Dataset | SupportedResourceTypes.Book
119+
self.assertEqual(result, expected)
120+
121+
def test_enum_field_sorted_output(self):
122+
field = EnumNameMultipleChoiceField(enum_cls=SupportedResourceTypes)
123+
124+
combined_value = (
125+
SupportedResourceTypes.Software
126+
| SupportedResourceTypes.Book
127+
| SupportedResourceTypes.Dataset
128+
)
129+
130+
result = field.to_representation(combined_value)
131+
132+
expected_order = ["Book", "Dataset", "Software"]
133+
self.assertEqual(result, expected_order)
134+
135+
136+
@override_settings(CELERY_TASK_ALWAYS_EAGER=True, CELERY_TASK_EAGER_PROPAGATES=True)
137+
class TestResourceTypeNaming(TestCase):
138+
139+
def test_output_management_plan_naming(self):
140+
resource_type = SupportedResourceTypes.OutputManagementPlan
141+
142+
self.assertEqual(resource_type.name, "OutputManagementPlan")
143+
field = EnumNameMultipleChoiceField(enum_cls=SupportedResourceTypes)
144+
result = field.to_representation(resource_type)
145+
self.assertEqual(result, ["OutputManagementPlan"])
146+
147+
def test_all_resource_type_names_valid(self):
148+
for resource_type in SupportedResourceTypes:
149+
with self.subTest(resource_type=resource_type):
150+
self.assertTrue(resource_type.name.isidentifier())
151+
152+
self.assertNotIn(" ", resource_type.name)
153+
self.assertNotIn("-", resource_type.name)
154+
155+
def test_resource_type_display_names(self):
156+
expected_names = {
157+
SupportedResourceTypes.Book: "Book",
158+
SupportedResourceTypes.Dataset: "Dataset",
159+
SupportedResourceTypes.Software: "Software",
160+
SupportedResourceTypes.Journal: "Journal",
161+
SupportedResourceTypes.OutputManagementPlan: "OutputManagementPlan",
162+
SupportedResourceTypes.Other: "Other",
163+
}
164+
165+
for resource_type, expected_name in expected_names.items():
166+
with self.subTest(resource_type=resource_type):
167+
self.assertEqual(resource_type.name, expected_name)
168+
169+
170+
@override_settings(CELERY_TASK_ALWAYS_EAGER=True, CELERY_TASK_EAGER_PROPAGATES=True)
171+
class TestResourceTypeAPIConsistency(APITestCase):
172+
173+
@classmethod
174+
def setUpTestData(cls):
175+
cls._user = _factories.UserReferenceFactory()
176+
177+
def setUp(self):
178+
super().setUp()
179+
self.client.cookies["osf"] = self._user.user_uri
180+
self._mock_osf = MockOSF()
181+
self._mock_osf.configure_assumed_caller(self._user.user_uri)
182+
self.enterContext(self._mock_osf.mocking())
183+
184+
185+
@override_settings(CELERY_TASK_ALWAYS_EAGER=True, CELERY_TASK_EAGER_PROPAGATES=True)
186+
class TestResourceTypeCompatibility(TestCase):
187+
188+
def test_resource_type_values_stable(self):
189+
known_values = {
190+
SupportedResourceTypes.Book: 4,
191+
SupportedResourceTypes.Dataset: 512,
192+
SupportedResourceTypes.Journal: 32768,
193+
SupportedResourceTypes.Other: 2147483648,
194+
SupportedResourceTypes.Software: 33554432,
195+
SupportedResourceTypes.OutputManagementPlan: 262144,
196+
}
197+
198+
for resource_type, expected_value in known_values.items():
199+
with self.subTest(resource_type=resource_type):
200+
self.assertEqual(resource_type.value, expected_value)
201+
202+
def test_resource_type_combinations(self):
203+
combined = SupportedResourceTypes.Dataset | SupportedResourceTypes.Book
204+
205+
self.assertIn(SupportedResourceTypes.Dataset, combined)
206+
self.assertIn(SupportedResourceTypes.Book, combined)
207+
208+
self.assertNotIn(SupportedResourceTypes.Software, combined)
209+
210+
field = EnumNameMultipleChoiceField(enum_cls=SupportedResourceTypes)
211+
result = field.to_representation(combined)
212+
self.assertEqual(set(result), {"Dataset", "Book"})
213+
214+
def test_legacy_resource_type_handling(self):
215+
addon = _factories.ConfiguredLinkAddonFactory(
216+
credentials_format=CredentialsFormats.PERSONAL_ACCESS_TOKEN,
217+
)
218+
219+
addon.int_resource_type = None
220+
addon.save()
221+
222+
addon.refresh_from_db()
223+
self.assertIsNone(addon.resource_type)
224+
225+
addon.full_clean()
226+
addon.resource_type = SupportedResourceTypes.Other
227+
addon.save()
228+
addon.refresh_from_db()
229+
self.assertEqual(addon.resource_type, SupportedResourceTypes.Other)

0 commit comments

Comments
 (0)