Skip to content

Convert HyperlinkedRelatedField tests to pytest style #889

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
195 changes: 0 additions & 195 deletions example/tests/test_relations.py

This file was deleted.

12 changes: 11 additions & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import pytest

from tests.models import ForeignKeyTarget, ManyToManySource, ManyToManyTarget
from tests.models import (
BasicModel,
ForeignKeyTarget,
ManyToManySource,
ManyToManyTarget,
)


@pytest.fixture(autouse=True)
Expand All @@ -23,6 +28,11 @@ def use_rest_framework_json_api_defaults(settings):
settings.JSON_API_PLURALIZE_TYPES = False


@pytest.fixture
def model(db):
return BasicModel.objects.create(text="Model")


@pytest.fixture
def foreign_key_target(db):
return ForeignKeyTarget.objects.create(name="Target")
Expand Down
134 changes: 98 additions & 36 deletions tests/test_relations.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
import pytest
from django.conf.urls import re_path
from rest_framework import status
from rest_framework.fields import SkipField
from rest_framework.routers import SimpleRouter
from rest_framework.serializers import Serializer

from rest_framework_json_api.exceptions import Conflict
from rest_framework_json_api.relations import HyperlinkedRelatedField
from rest_framework_json_api.relations import (
HyperlinkedRelatedField,
SerializerMethodHyperlinkedRelatedField,
)
from rest_framework_json_api.utils import format_link_segment
from rest_framework_json_api.views import ModelViewSet, RelationshipView
from tests.models import BasicModel
from tests.serializers import (
Expand All @@ -14,41 +20,6 @@
)


@pytest.mark.urls(__name__)
@pytest.mark.parametrize(
"format_related_links,expected_url_segment",
[
(None, "relatedField_name"),
("dasherize", "related-field-name"),
("camelize", "relatedFieldName"),
("capitalize", "RelatedFieldName"),
("underscore", "related_field_name"),
],
)
def test_relationship_urls_respect_format_related_links_setting(
settings, format_related_links, expected_url_segment
):
settings.JSON_API_FORMAT_RELATED_LINKS = format_related_links

model = BasicModel(text="Some text")

field = HyperlinkedRelatedField(
self_link_view_name="basic-model-relationships",
related_link_view_name="basic-model-related",
read_only=True,
)
field.field_name = "relatedField_name"

expected = {
"self": f"/basic_models/{model.pk}/relationships/{expected_url_segment}/",
"related": f"/basic_models/{model.pk}/{expected_url_segment}/",
}

actual = field.get_links(model)

assert expected == actual


@pytest.mark.django_db
class TestResourceRelatedField:
@pytest.mark.parametrize(
Expand Down Expand Up @@ -201,6 +172,97 @@ def test_invalid_resource_id_object(self, resource_identifier, error):
assert serializer.errors == {"target": [error]}


class TestHyperlinkedRelatedField:
@pytest.fixture
def instance(self):
# dummy instance
return object()

@pytest.fixture
def serializer(self):
class HyperlinkedRelatedFieldSerializer(Serializer):
single = HyperlinkedRelatedField(
self_link_view_name="basic-model-relationships",
related_link_view_name="basic-model-related",
read_only=True,
)
many = HyperlinkedRelatedField(
self_link_view_name="basic-model-relationships",
related_link_view_name="basic-model-related",
read_only=True,
many=True,
)
single_serializer_method = SerializerMethodHyperlinkedRelatedField(
self_link_view_name="basic-model-relationships",
related_link_view_name="basic-model-related",
read_only=True,
)
many_serializer_method = SerializerMethodHyperlinkedRelatedField(
self_link_view_name="basic-model-relationships",
related_link_view_name="basic-model-related",
read_only=True,
many=True,
)

def get_single_serializer_method(self, obj): # pragma: no cover
raise NotImplementedError

def get_many_serializer_method(self, obj): # pragma: no cover
raise NotImplementedError

return HyperlinkedRelatedFieldSerializer()

@pytest.fixture(
params=["single", "many", "single_serializer_method", "many_serializer_method"]
)
def field(self, serializer, request):
field = serializer.fields[request.param]
field.field_name = request.param
return field

def test_get_attribute(self, model, field):
with pytest.raises(SkipField):
field.get_attribute(model)

def test_to_representation(self, model, field):
with pytest.raises(NotImplementedError):
field.to_representation(model)

@pytest.mark.urls(__name__)
@pytest.mark.parametrize(
"format_related_links",
[
None,
"dasherize",
"camelize",
"capitalize",
"underscore",
],
)
def test_get_links(
self,
format_related_links,
field,
settings,
model,
):
settings.JSON_API_FORMAT_RELATED_LINKS = format_related_links

link_segment = format_link_segment(field.field_name)

expected = {
"self": f"/basic_models/{model.pk}/relationships/{link_segment}/",
"related": f"/basic_models/{model.pk}/{link_segment}/",
}

if hasattr(field, "child_relation"):
# many case
field = field.child_relation

actual = field.get_links(model)
assert expected == actual


# Routing setup


Expand Down