Skip to content

Commit 17e00b2

Browse files
committed
Add new tests
1 parent 809550c commit 17e00b2

File tree

2 files changed

+441
-0
lines changed

2 files changed

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

0 commit comments

Comments
 (0)