Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f34fb42

Browse files
authored
Migrated some included tests to pytest style (#1218)
Migrated included tests to pytest style
1 parent 2cbae19 commit f34fb42

File tree

7 files changed

+237
-83
lines changed

7 files changed

+237
-83
lines changed

‎example/tests/integration/test_includes.py

Lines changed: 0 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -4,71 +4,6 @@
44
pytestmark = pytest.mark.django_db
55

66

7-
def test_included_data_on_list(multiple_entries, client):
8-
response = client.get(
9-
reverse("entry-list"), data={"include": "comments", "page[size]": 5}
10-
)
11-
included = response.json().get("included")
12-
13-
assert len(response.json()["data"]) == len(
14-
multiple_entries
15-
), "Incorrect entry count"
16-
assert [x.get("type") for x in included] == [
17-
"comments",
18-
"comments",
19-
], "List included types are incorrect"
20-
21-
comment_count = len(
22-
[resource for resource in included if resource["type"] == "comments"]
23-
)
24-
expected_comment_count = sum(entry.comments.count() for entry in multiple_entries)
25-
assert comment_count == expected_comment_count, "List comment count is incorrect"
26-
27-
28-
def test_included_data_on_list_with_one_to_one_relations(multiple_entries, client):
29-
response = client.get(
30-
reverse("entry-list"), data={"include": "authors.bio.metadata", "page[size]": 5}
31-
)
32-
included = response.json().get("included")
33-
34-
assert len(response.json()["data"]) == len(
35-
multiple_entries
36-
), "Incorrect entry count"
37-
expected_include_types = [
38-
"authorBioMetadata",
39-
"authorBioMetadata",
40-
"authorBios",
41-
"authorBios",
42-
"authors",
43-
"authors",
44-
]
45-
include_types = [x.get("type") for x in included]
46-
assert include_types == expected_include_types, "List included types are incorrect"
47-
48-
49-
def test_default_included_data_on_detail(single_entry, client):
50-
return test_included_data_on_detail(
51-
single_entry=single_entry, client=client, query=""
52-
)
53-
54-
55-
def test_included_data_on_detail(single_entry, client, query="?include=comments"):
56-
response = client.get(
57-
reverse("entry-detail", kwargs={"pk": single_entry.pk}) + query
58-
)
59-
included = response.json().get("included")
60-
61-
assert [x.get("type") for x in included] == [
62-
"comments"
63-
], "Detail included types are incorrect"
64-
65-
comment_count = len(
66-
[resource for resource in included if resource["type"] == "comments"]
67-
)
68-
expected_comment_count = single_entry.comments.count()
69-
assert comment_count == expected_comment_count, "Detail comment count is incorrect"
70-
71-
727
def test_dynamic_related_data_is_included(single_entry, entry_factory, client):
738
entry_factory()
749
response = client.get(

‎tests/conftest.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33

44
from tests.models import (
55
BasicModel,
6+
ForeignKeySource,
67
ForeignKeyTarget,
78
ManyToManySource,
89
ManyToManyTarget,
10+
NestedRelatedSource,
911
)
1012

1113

@@ -39,6 +41,11 @@ def foreign_key_target(db):
3941
return ForeignKeyTarget.objects.create(name="Target")
4042

4143

44+
@pytest.fixture
45+
def foreign_key_source(db, foreign_key_target):
46+
return ForeignKeySource.objects.create(name="Source", target=foreign_key_target)
47+
48+
4249
@pytest.fixture
4350
def many_to_many_source(db, many_to_many_targets):
4451
source = ManyToManySource.objects.create(name="Source")
@@ -54,6 +61,34 @@ def many_to_many_targets(db):
5461
]
5562

5663

64+
@pytest.fixture
65+
def many_to_many_sources(db, many_to_many_targets):
66+
source1 = ManyToManySource.objects.create(name="Source1")
67+
source2 = ManyToManySource.objects.create(name="Source2")
68+
69+
source1.targets.add(*many_to_many_targets)
70+
source2.targets.add(*many_to_many_targets)
71+
72+
return [source1, source2]
73+
74+
75+
@pytest.fixture
76+
def nested_related_source(
77+
db,
78+
foreign_key_source,
79+
foreign_key_target,
80+
many_to_many_targets,
81+
many_to_many_sources,
82+
):
83+
source = NestedRelatedSource.objects.create(
84+
fk_source=foreign_key_source, fk_target=foreign_key_target
85+
)
86+
source.m2m_targets.add(*many_to_many_targets)
87+
source.m2m_sources.add(*many_to_many_sources)
88+
89+
return source
90+
91+
5792
@pytest.fixture
5893
def client():
5994
return APIClient()

‎tests/models.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ class ForeignKeySource(DJAModel):
4242

4343

4444
class NestedRelatedSource(DJAModel):
45-
m2m_source = models.ManyToManyField(ManyToManySource, related_name="nested_source")
45+
m2m_sources = models.ManyToManyField(ManyToManySource, related_name="nested_source")
4646
fk_source = models.ForeignKey(
4747
ForeignKeySource, related_name="nested_source", on_delete=models.CASCADE
4848
)
49-
m2m_target = models.ManyToManyField(ManyToManySource, related_name="nested_target")
49+
m2m_targets = models.ManyToManyField(ManyToManyTarget, related_name="nested_target")
5050
fk_target = models.ForeignKey(
51-
ForeignKeySource, related_name="nested_target", on_delete=models.CASCADE
51+
ForeignKeyTarget, related_name="nested_target", on_delete=models.CASCADE
5252
)

‎tests/serializers.py

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
from rest_framework_json_api import serializers
2-
from rest_framework_json_api.relations import ResourceRelatedField
32
from tests.models import (
43
BasicModel,
54
ForeignKeySource,
65
ForeignKeyTarget,
76
ManyToManySource,
87
ManyToManyTarget,
8+
NestedRelatedSource,
99
)
1010

1111

@@ -15,33 +15,51 @@ class Meta:
1515
model = BasicModel
1616

1717

18+
class ForeignKeyTargetSerializer(serializers.ModelSerializer):
19+
class Meta:
20+
fields = ("name",)
21+
model = ForeignKeyTarget
22+
23+
1824
class ForeignKeySourceSerializer(serializers.ModelSerializer):
19-
target = ResourceRelatedField(queryset=ForeignKeyTarget.objects)
25+
included_serializers = {"target": ForeignKeyTargetSerializer}
2026

2127
class Meta:
2228
model = ForeignKeySource
2329
fields = ("target",)
2430

2531

32+
class ManyToManyTargetSerializer(serializers.ModelSerializer):
33+
class Meta:
34+
fields = ("name",)
35+
model = ManyToManyTarget
36+
37+
2638
class ManyToManySourceSerializer(serializers.ModelSerializer):
27-
targets = ResourceRelatedField(many=True, queryset=ManyToManyTarget.objects)
39+
included_serializers = {"targets": "tests.serializers.ManyToManyTargetSerializer"}
2840

2941
class Meta:
3042
model = ManyToManySource
3143
fields = ("targets",)
3244

3345

34-
class ManyToManyTargetSerializer(serializers.ModelSerializer):
46+
class ManyToManySourceReadOnlySerializer(serializers.ModelSerializer):
3547
class Meta:
36-
model = ManyToManyTarget
48+
model = ManyToManySource
49+
fields = ("targets",)
3750

3851

39-
class ManyToManySourceReadOnlySerializer(serializers.ModelSerializer):
40-
targets = ResourceRelatedField(many=True, read_only=True)
52+
class NestedRelatedSourceSerializer(serializers.ModelSerializer):
53+
included_serializers = {
54+
"m2m_sources": ManyToManySourceSerializer,
55+
"fk_source": ForeignKeySourceSerializer,
56+
"m2m_targets": ManyToManyTargetSerializer,
57+
"fk_target": ForeignKeyTargetSerializer,
58+
}
4159

4260
class Meta:
43-
model = ManyToManySource
44-
fields = ("targets",)
61+
model = NestedRelatedSource
62+
fields = ("m2m_sources", "fk_source", "m2m_targets", "fk_target")
4563

4664

4765
class CallableDefaultSerializer(serializers.Serializer):

‎tests/test_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ class Meta:
325325
{"many": True, "queryset": ManyToManyTarget.objects.all()},
326326
),
327327
(
328-
"m2m_target.sources.",
328+
"m2m_target.sources",
329329
"ManyToManySource",
330330
{"many": True, "queryset": ManyToManySource.objects.all()},
331331
),

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /