Skip to content

Commit 1ff204e

Browse files
committed
Migrated included tests to pytest style
1 parent 2cbae19 commit 1ff204e

File tree

7 files changed

+237
-83
lines changed

7 files changed

+237
-83
lines changed

Diff for: example/tests/integration/test_includes.py

-65
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(

Diff for: tests/conftest.py

+35
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()

Diff for: tests/models.py

+3-3
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
)

Diff for: tests/serializers.py

+27-9
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):

Diff for: tests/test_utils.py

+1-1
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)