Skip to content

Commit bca880e

Browse files
committed
🐛[#449] support objecttypes API with pagination
1 parent 9de79f1 commit bca880e

File tree

4 files changed

+270
-0
lines changed

4 files changed

+270
-0
lines changed

Diff for: src/objects/token/admin.py

+3
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ def get_data_field_choices(self):
5252
except requests.JSONDecodeError:
5353
continue
5454

55+
if "results" in response_data:
56+
response_data = response_data["results"]
57+
5558
# use only first level of properties
5659
data_fields[object_type.id] = {
5760
version["version"]: {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
interactions:
2+
- request:
3+
body: null
4+
headers:
5+
Accept:
6+
- '*/*'
7+
Accept-Encoding:
8+
- gzip, deflate
9+
Connection:
10+
- keep-alive
11+
User-Agent:
12+
- python-requests/2.32.3
13+
method: GET
14+
uri: http://127.0.0.1:8008/api/v1/objecttypes
15+
response:
16+
body:
17+
string: '[{"url":"http://127.0.0.1:8008/api/v1/objecttypes/71a2452a-66c3-4030-b5ec-a06035102e9e","uuid":"71a2452a-66c3-4030-b5ec-a06035102e9e","name":"Garry","namePlural":"Garrys","description":"","dataClassification":"open","maintainerOrganization":"","maintainerDepartment":"","contactPerson":"","contactEmail":"","source":"","updateFrequency":"unknown","providerOrganization":"","documentationUrl":"","labels":{},"createdAt":"2024-09-24","modifiedAt":"2024-09-24","allowGeometry":true,"versions":["http://127.0.0.1:8008/api/v1/objecttypes/71a2452a-66c3-4030-b5ec-a06035102e9e/versions/1"]}]'
18+
headers:
19+
Allow:
20+
- GET, POST, HEAD, OPTIONS
21+
Content-Length:
22+
- '584'
23+
Content-Type:
24+
- application/json
25+
Cross-Origin-Opener-Policy:
26+
- same-origin
27+
Date:
28+
- Tue, 24 Sep 2024 14:49:45 GMT
29+
Referrer-Policy:
30+
- same-origin
31+
Server:
32+
- WSGIServer/0.2 CPython/3.11.10
33+
Server-Timing:
34+
- TimerPanel_utime;dur=66.08599999999998;desc="User CPU time", TimerPanel_stime;dur=41.489;desc="System
35+
CPU time", TimerPanel_total;dur=107.57499999999999;desc="Total CPU time",
36+
TimerPanel_total_time;dur=109.82951400001184;desc="Elapsed time", SQLPanel_sql_time;dur=2.634805998241063;desc="SQL
37+
3 queries", CachePanel_total_time;dur=0;desc="Cache 0 Calls"
38+
Vary:
39+
- origin, Cookie
40+
X-Content-Type-Options:
41+
- nosniff
42+
X-Frame-Options:
43+
- DENY
44+
djdt-store-id:
45+
- 011b401c548140e393c17931b9eed7e2
46+
status:
47+
code: 200
48+
message: OK
49+
- request:
50+
body: null
51+
headers:
52+
Accept:
53+
- '*/*'
54+
Accept-Encoding:
55+
- gzip, deflate
56+
Connection:
57+
- keep-alive
58+
User-Agent:
59+
- python-requests/2.32.3
60+
method: GET
61+
uri: http://127.0.0.1:8008/api/v1/objecttypes/71a2452a-66c3-4030-b5ec-a06035102e9e/versions
62+
response:
63+
body:
64+
string: '[{"url":"http://127.0.0.1:8008/api/v1/objecttypes/71a2452a-66c3-4030-b5ec-a06035102e9e/versions/1","version":1,"objectType":"http://127.0.0.1:8008/api/v1/objecttypes/71a2452a-66c3-4030-b5ec-a06035102e9e","status":"draft","jsonSchema":{"string":"value"},"createdAt":"2024-09-24","modifiedAt":"2024-09-24","publishedAt":null}]'
65+
headers:
66+
Allow:
67+
- GET, POST, HEAD, OPTIONS
68+
Content-Length:
69+
- '324'
70+
Content-Type:
71+
- application/json
72+
Cross-Origin-Opener-Policy:
73+
- same-origin
74+
Date:
75+
- Tue, 24 Sep 2024 14:49:45 GMT
76+
Referrer-Policy:
77+
- same-origin
78+
Server:
79+
- WSGIServer/0.2 CPython/3.11.10
80+
Server-Timing:
81+
- TimerPanel_utime;dur=26.51400000000004;desc="User CPU time", TimerPanel_stime;dur=8.871000000000018;desc="System
82+
CPU time", TimerPanel_total;dur=35.385000000000055;desc="Total CPU time",
83+
TimerPanel_total_time;dur=29.870047997974325;desc="Elapsed time", SQLPanel_sql_time;dur=3.140712000458734;desc="SQL
84+
3 queries", CachePanel_total_time;dur=0;desc="Cache 0 Calls"
85+
Vary:
86+
- origin, Cookie
87+
X-Content-Type-Options:
88+
- nosniff
89+
X-Frame-Options:
90+
- DENY
91+
djdt-store-id:
92+
- 58b76bf29d284ba694ccdabb76919aa7
93+
status:
94+
code: 200
95+
message: OK
96+
version: 1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
interactions:
2+
- request:
3+
body: null
4+
headers:
5+
Accept:
6+
- '*/*'
7+
Accept-Encoding:
8+
- gzip, deflate
9+
Connection:
10+
- keep-alive
11+
User-Agent:
12+
- python-requests/2.32.3
13+
method: GET
14+
uri: http://127.0.0.1:8008/api/v2/objecttypes
15+
response:
16+
body:
17+
string: '{"count":1,"next":null,"previous":null,"results":[{"url":"http://127.0.0.1:8008/api/v2/objecttypes/71a2452a-66c3-4030-b5ec-a06035102e9e","uuid":"71a2452a-66c3-4030-b5ec-a06035102e9e","name":"Garry","namePlural":"Garrys","description":"","dataClassification":"open","maintainerOrganization":"","maintainerDepartment":"","contactPerson":"","contactEmail":"","source":"","updateFrequency":"unknown","providerOrganization":"","documentationUrl":"","labels":{},"createdAt":"2024-09-24","modifiedAt":"2024-09-24","allowGeometry":true,"versions":["http://127.0.0.1:8008/api/v2/objecttypes/71a2452a-66c3-4030-b5ec-a06035102e9e/versions/1"]}]}'
18+
headers:
19+
Allow:
20+
- GET, POST, HEAD, OPTIONS
21+
Content-Length:
22+
- '634'
23+
Content-Type:
24+
- application/json
25+
Cross-Origin-Opener-Policy:
26+
- same-origin
27+
Date:
28+
- Tue, 24 Sep 2024 14:49:45 GMT
29+
Referrer-Policy:
30+
- same-origin
31+
Server:
32+
- WSGIServer/0.2 CPython/3.11.10
33+
Server-Timing:
34+
- TimerPanel_utime;dur=17.129999999999868;desc="User CPU time", TimerPanel_stime;dur=2.0120000000000138;desc="System
35+
CPU time", TimerPanel_total;dur=19.141999999999882;desc="Total CPU time",
36+
TimerPanel_total_time;dur=21.54170200083172;desc="Elapsed time", SQLPanel_sql_time;dur=2.798614998027915;desc="SQL
37+
4 queries", CachePanel_total_time;dur=0;desc="Cache 0 Calls"
38+
Vary:
39+
- origin, Cookie
40+
X-Content-Type-Options:
41+
- nosniff
42+
X-Frame-Options:
43+
- DENY
44+
djdt-store-id:
45+
- a591b4b56a884263835fbf632b782baf
46+
status:
47+
code: 200
48+
message: OK
49+
- request:
50+
body: null
51+
headers:
52+
Accept:
53+
- '*/*'
54+
Accept-Encoding:
55+
- gzip, deflate
56+
Connection:
57+
- keep-alive
58+
User-Agent:
59+
- python-requests/2.32.3
60+
method: GET
61+
uri: http://127.0.0.1:8008/api/v2/objecttypes/71a2452a-66c3-4030-b5ec-a06035102e9e/versions
62+
response:
63+
body:
64+
string: '{"count":1,"next":null,"previous":null,"results":[{"url":"http://127.0.0.1:8008/api/v2/objecttypes/71a2452a-66c3-4030-b5ec-a06035102e9e/versions/1","version":1,"objectType":"http://127.0.0.1:8008/api/v2/objecttypes/71a2452a-66c3-4030-b5ec-a06035102e9e","status":"draft","jsonSchema":{"string":"value"},"createdAt":"2024-09-24","modifiedAt":"2024-09-24","publishedAt":null}]}'
65+
headers:
66+
Allow:
67+
- GET, POST, HEAD, OPTIONS
68+
Content-Length:
69+
- '374'
70+
Content-Type:
71+
- application/json
72+
Cross-Origin-Opener-Policy:
73+
- same-origin
74+
Date:
75+
- Tue, 24 Sep 2024 14:49:45 GMT
76+
Referrer-Policy:
77+
- same-origin
78+
Server:
79+
- WSGIServer/0.2 CPython/3.11.10
80+
Server-Timing:
81+
- TimerPanel_utime;dur=17.527999999999988;desc="User CPU time", TimerPanel_stime;dur=0.8290000000000242;desc="System
82+
CPU time", TimerPanel_total;dur=18.357000000000014;desc="Total CPU time",
83+
TimerPanel_total_time;dur=20.605010002327617;desc="Elapsed time", SQLPanel_sql_time;dur=2.700799006561283;desc="SQL
84+
4 queries", CachePanel_total_time;dur=0;desc="Cache 0 Calls"
85+
Vary:
86+
- origin, Cookie
87+
X-Content-Type-Options:
88+
- nosniff
89+
X-Frame-Options:
90+
- DENY
91+
djdt-store-id:
92+
- fa6e9a070865404f8c02c2ad60df23b2
93+
status:
94+
code: 200
95+
message: OK
96+
version: 1

Diff for: src/objects/token/tests/test_admin.py

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
from django.test import TestCase, tag
2+
from django.urls import reverse
3+
4+
from vcr.unittest import VCRMixin
5+
from zgw_consumers.constants import AuthTypes
6+
from zgw_consumers.test.factories import ServiceFactory
7+
8+
from objects.accounts.tests.factories import UserFactory
9+
from objects.core.tests.factories import ObjectTypeFactory
10+
11+
12+
class PermissionAdminTests(VCRMixin, TestCase):
13+
14+
object_types_api = "http://127.0.0.1:8008/api/{version}/"
15+
16+
def setUp(self):
17+
super().setUp()
18+
19+
self.user = UserFactory(superuser=True)
20+
self.client.force_login(self.user)
21+
self.url = reverse("admin:token_permission_add")
22+
23+
def _get_vcr(self, **kwargs):
24+
vcr = super()._get_vcr(**kwargs)
25+
vcr.filter_headers = ["authorization"]
26+
return vcr
27+
28+
@tag("#449")
29+
def test_with_object_types_api_v1(self):
30+
"""
31+
Regression test for #449.
32+
Test if Permission admin can still handle objecttypes API V1
33+
"""
34+
35+
v1_service = ServiceFactory(
36+
api_root=self.object_types_api.format(version="v1"),
37+
auth_type=AuthTypes.api_key,
38+
header_key="Authorization",
39+
header_value="Token 5cebbb33ffa725b6ed5e9e98300061218ba98d71",
40+
)
41+
ObjectTypeFactory(
42+
service=v1_service, uuid="71a2452a-66c3-4030-b5ec-a06035102e9e"
43+
)
44+
45+
response = self.client.get(self.url)
46+
self.assertEqual(response.status_code, 200)
47+
48+
self.assertEqual(
49+
self.cassette.requests[1].uri,
50+
"http://127.0.0.1:8008/api/v1/objecttypes/71a2452a-66c3-4030-b5ec-a06035102e9e/versions",
51+
)
52+
53+
@tag("#449")
54+
def test_with_object_types_api_v2(self):
55+
"""
56+
Regression test for #449.
57+
Test if Permission admin can handle objecttypes API V2 which added pagination
58+
"""
59+
v2_service = ServiceFactory(
60+
api_root=self.object_types_api.format(version="v2"),
61+
auth_type=AuthTypes.api_key,
62+
header_key="Authorization",
63+
header_value="Token 5cebbb33ffa725b6ed5e9e98300061218ba98d71",
64+
)
65+
ObjectTypeFactory(
66+
service=v2_service, uuid="71a2452a-66c3-4030-b5ec-a06035102e9e"
67+
)
68+
69+
response = self.client.get(self.url)
70+
self.assertEqual(response.status_code, 200)
71+
72+
self.assertEqual(
73+
self.cassette.requests[1].uri,
74+
"http://127.0.0.1:8008/api/v2/objecttypes/71a2452a-66c3-4030-b5ec-a06035102e9e/versions",
75+
)

0 commit comments

Comments
 (0)