Skip to content
This repository was archived by the owner on Nov 19, 2023. It is now read-only.

Commit 947ca00

Browse files
author
Darragh Duffy
committed
example of failing test on related_field
1 parent 1929ad3 commit 947ca00

File tree

6 files changed

+86
-65
lines changed

6 files changed

+86
-65
lines changed

poetry.lock

Lines changed: 25 additions & 64 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,12 @@ prance = "*"
5757
pyYAML = "*"
5858
drf-spectacular = { version = "*", optional = true }
5959
drf-yasg = { version = "*", optional = true }
60+
djangorestframework-jsonapi = { version = "4.2.*", optional = true }
6061

6162
[tool.poetry.extras]
6263
drf-yasg = ["drf-yasg"]
6364
drf-spectacular = ["drf-spectacular"]
65+
djangorestframework-jsonapi = ["djangorestframework-jsonapi"]
6466

6567
[tool.poetry.dev-dependencies]
6668
coverage = { extras = ["toml"], version = "^6" }

test_project/api/views/teams.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from rest_framework_json_api.views import RelationshipView
2+
from rest_framework.views import Response
3+
4+
class TeamMembersRelationshipView(RelationshipView):
5+
def post(self, request, *args, **kwargs):
6+
return Response({}, 200)

test_project/urls.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from django.conf.urls.i18n import i18n_patterns
2-
from django.urls import include, path
2+
from django.urls import include, path, re_path
33
from drf_yasg import openapi
44
from drf_yasg.views import get_schema_view
55
from rest_framework import permissions, routers
@@ -13,6 +13,7 @@
1313
from test_project.api.views.names import EmptyNameViewSet, NamesRetrieveView, NameViewSet
1414
from test_project.api.views.products import Products
1515
from test_project.api.views.snake_cased_response import SnakeCasedResponse
16+
from test_project.api.views.teams import TeamMembersRelationshipView
1617
from test_project.api.views.trucks import BadTrucks, GoodTrucks
1718
from test_project.api.views.vehicles import Vehicles
1819

@@ -34,6 +35,11 @@
3435
path("api/<str:version>/snake-case/", SnakeCasedResponse.as_view()),
3536
# ^trailing slash is here on purpose
3637
path("api/<str:version>/router_generated/", include(router.urls)),
38+
re_path(
39+
r"api/(?P<version>v\d+)/team/(?P<pk>\d+)/relationships/(?P<related_field>[-\w]+)",
40+
TeamMembersRelationshipView.as_view(),
41+
name="team-members-relation",
42+
),
3743
]
3844

3945
internationalised_urlpatterns = i18n_patterns(

tests/schemas/manual_reference_schema.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,3 +263,17 @@ paths:
263263
responses:
264264
'200':
265265
description: ''
266+
/api/v1/teams/{pk}/relationships/members:
267+
post:
268+
operationId: addTeamMembers
269+
description: ''
270+
parameters:
271+
- in: path
272+
name: pk
273+
schema:
274+
type: integer
275+
description: A unique value identifying this team.
276+
required: true
277+
responses:
278+
'200':
279+
description: ''

tests/test_django_framework.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from openapi_tester import SchemaTester
2+
from django.urls import reverse
3+
from rest_framework.test import APITestCase
4+
from rest_framework.response import Response
5+
from tests.utils import TEST_ROOT
6+
7+
schema_tester = SchemaTester(schema_file_path=str(TEST_ROOT) + "/schemas/manual_reference_schema.yaml")
8+
9+
class BaseAPITestCase(APITestCase):
10+
"""Base test class for api views including schema validation"""
11+
12+
@staticmethod
13+
def assertResponse(response: Response, **kwargs) -> None:
14+
"""helper to run validate_response and pass kwargs to it"""
15+
schema_tester.validate_response(response=response, **kwargs)
16+
17+
# @override_settings(USE_X_FORWARDED_HOST=True)
18+
class TeamsAPITests(BaseAPITestCase):
19+
def test_schema_using_assert_response(self):
20+
response = self.client.post(
21+
reverse(
22+
"team-members-relation",
23+
kwargs={
24+
"version": "v1",
25+
"pk": 1,
26+
"related_field": "members",
27+
},
28+
),
29+
content_type="application/vnd.api+json",
30+
)
31+
self.assertEqual(response.status_code, 200)
32+
self.assertResponse(response)

0 commit comments

Comments
 (0)