Skip to content

Commit 8b7f4bb

Browse files
committed
test(resources): add testcase for resource queries
1 parent 959a621 commit 8b7f4bb

13 files changed

Lines changed: 282 additions & 87 deletions

File tree

apps/resources/admin.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,18 @@
11
# Register your models here.
2+
from django.contrib import admin
3+
4+
from apps.resources.models import CaseStudy, ContactRequest
5+
6+
7+
@admin.register(ContactRequest)
8+
class ContactRequestAdmin(admin.ModelAdmin[ContactRequest]):
9+
list_display = ("name", "email", "national_society", "created_at")
10+
search_fields = ("name", "email")
11+
12+
13+
@admin.register(CaseStudy)
14+
class CaseStudyAdmin(admin.ModelAdmin[CaseStudy]):
15+
list_display = ("title",)
16+
search_fields = ("title",)
17+
list_select_related = ("tool",)
18+
autocomplete_fields = ("tool",)

apps/resources/factories.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from factory.django import DjangoModelFactory
2+
3+
from apps.resources.models import CaseStudy, ContactRequest
4+
5+
6+
class ContactRequestFactory(DjangoModelFactory[ContactRequest]):
7+
class Meta: # type: ignore[misc]
8+
model = ContactRequest
9+
10+
11+
class CaseStudyFactory(DjangoModelFactory[CaseStudy]):
12+
class Meta: # type: ignore[misc]
13+
model = CaseStudy

apps/resources/graphql/inputs.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import strawberry
22
import strawberry_django
3+
34
from apps.resources.models import ContactRequest
45

6+
57
@strawberry_django.input(ContactRequest)
68
class ContactRequestInput:
79
name: strawberry.auto
8-
email:strawberry.auto
10+
email: strawberry.auto
911
national_society: strawberry.auto
1012
content: strawberry.auto
Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
import strawberry
22
import strawberry_django
3+
from strawberry_django.permissions import IsAuthenticated
4+
35
from apps.resources.graphql.inputs import ContactRequestInput
6+
from apps.resources.graphql.types import ContactRequestType
47
from apps.resources.serializers import ContactRequestSerializer
5-
from strawberry_django.permissions import IsAuthenticated
68
from main.graphql.context import Info
79
from utils.graphql.mutations import ModelMutation
8-
from apps.resources.graphql.types import ContactRequestType
910
from utils.graphql.types import MutationResponseType
1011

12+
1113
@strawberry.type
1214
class Mutation:
13-
1415
@strawberry_django.mutation(extensions=[IsAuthenticated()])
15-
async def create_contact_request(self, info: Info, data:ContactRequestInput) -> MutationResponseType[ContactRequestType]:
16+
async def create_contact_request(
17+
self,
18+
info: Info,
19+
data: ContactRequestInput,
20+
) -> MutationResponseType[ContactRequestType]:
1621
return await ModelMutation(ContactRequestSerializer).handle_create_mutation(data, info, None)

apps/resources/graphql/orders.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
import strawberry
22
import strawberry_django
33

4-
from apps.resources.models import CaseStudy, ContactRequest
4+
from apps.resources.models import CaseStudy
55

66

7-
@strawberry_django.ordering.order(CaseStudy)
7+
@strawberry_django.order_type(CaseStudy)
88
class CaseStudyOrder:
99
id: strawberry.auto
10-
11-
12-
@strawberry_django.ordering.order(ContactRequest)
13-
class ContactRequestOrder:
14-
id: strawberry.auto

apps/resources/graphql/queries.py

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,17 @@
11
import strawberry
22
import strawberry_django
3-
from django.db.models import QuerySet
43
from strawberry_django.pagination import OffsetPaginated
54

6-
from apps.resources.models import CaseStudy, ContactRequest
7-
8-
from .filters import CaseStudyFilter, ContactRequestFilter
9-
from .orders import CaseStudyOrder, ContactRequestOrder
10-
from .types import CaseStudyType, ContactRequestType
5+
from .filters import CaseStudyFilter
6+
from .orders import CaseStudyOrder
7+
from .types import CaseStudyType
118

129

1310
@strawberry.type
1411
class Query:
15-
@strawberry_django.offset_paginated(
16-
OffsetPaginated[CaseStudyType],
12+
case_studies: OffsetPaginated[CaseStudyType] = strawberry_django.offset_paginated(
1713
order=CaseStudyOrder,
1814
filters=CaseStudyFilter,
1915
)
20-
def caseStudies(
21-
self,
22-
) -> QuerySet[CaseStudy]:
23-
return CaseStudy.objects.all()
24-
25-
caseStudy: CaseStudyType = strawberry_django.field()
26-
27-
@strawberry_django.offset_paginated(
28-
OffsetPaginated[ContactRequestType],
29-
order=ContactRequestOrder,
30-
filters=ContactRequestFilter,
31-
)
32-
def contactRequests(
33-
self,
34-
) -> QuerySet[ContactRequest]:
35-
return ContactRequest.objects.all()
3616

37-
contactRequest: ContactRequestType = strawberry_django.field()
17+
case_study: CaseStudyType = strawberry_django.field()

apps/resources/graphql/types.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
11
import strawberry
22
import strawberry_django
33

4+
<<<<<<< HEAD
45
from apps.resources.models import (
56
CaseStudy,
67
ContactRequest,
78
)
9+
||||||| parent of e5fc916 (test(resources): add testcase for resource queries)
10+
from apps.resources.models import (
11+
ContactRequest,
12+
CaseStudy,
13+
)
14+
=======
15+
from apps.resources.models import CaseStudy, ContactRequest
16+
>>>>>>> e5fc916 (test(resources): add testcase for resource queries)
817
from utils.graphql.types import DjangoFileType
918

1019

apps/resources/serializers.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from rest_framework import serializers
2+
23
from apps.resources.models import ContactRequest
34

5+
46
class ContactRequestSerializer(serializers.ModelSerializer):
57
class Meta:
68
model = ContactRequest

apps/resources/tests/mutation_test.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import typing
2+
23
from apps.resources.models import ContactRequest
3-
from main.tests import TestCase
44
from apps.user.factories import UserFactory
5+
from main.tests import TestCase
6+
57

68
class TestContactRequestMutation(TestCase):
79
class Mutation:
@@ -31,28 +33,28 @@ class Mutation:
3133
}
3234
}
3335
"""
36+
3437
@typing.override
3538
@classmethod
3639
def setUpClass(cls):
3740
super().setUpClass()
3841
cls.user = UserFactory.create(email="test@gmail.com")
3942

40-
41-
def _create_contact_request_mutation(self, data: dict[str,str], **kwargs):
43+
def _create_contact_request_mutation(self, data: dict[str, str], **kwargs):
4244
return self.query_check(
4345
query=self.Mutation.CREATE_CONTACT_REQUEST,
4446
variables={
4547
"data": data,
46-
}
48+
},
4749
)
50+
4851
def test_create_contact_request(self):
4952
contact_request_data = {
50-
"name": "John",
51-
"email": "john@test.com",
52-
"nationalSociety": "Test National Society",
53-
"content": "This is test content",
54-
}
55-
53+
"name": "John",
54+
"email": "john@test.com",
55+
"nationalSociety": "Test National Society",
56+
"content": "This is test content",
57+
}
5658

5759
# Without authentication
5860
content = self._create_contact_request_mutation(contact_request_data)
@@ -76,9 +78,9 @@ def test_create_contact_request(self):
7678

7779
contact_request = ContactRequest.objects.get(pk=response_data["result"]["id"])
7880
assert response_data["result"] == {
79-
"id": self.gID(contact_request.pk),
80-
"name": contact_request.name,
81-
"email": contact_request.email,
82-
"content": contact_request.content,
83-
"nationalSociety": contact_request.national_society,
81+
"id": self.gID(contact_request.pk),
82+
"name": contact_request.name,
83+
"email": contact_request.email,
84+
"content": contact_request.content,
85+
"nationalSociety": contact_request.national_society,
8486
}

apps/resources/tests/query_test.py

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import typing
2+
3+
from apps.resources.factories import CaseStudyFactory
4+
from apps.tool_picker.factories import ToolFactory
5+
from apps.user.factories import UserFactory
6+
from main.tests import TestCase
7+
8+
9+
class TestResourceQueries(TestCase):
10+
class Query:
11+
CASE_STUDIES = """
12+
query CaseStudies($pagination: OffsetPaginationInput) {
13+
caseStudies(order: {id: ASC}, pagination: $pagination) {
14+
totalCount
15+
pageInfo {
16+
offset
17+
limit
18+
}
19+
results {
20+
id
21+
title
22+
content
23+
coverImage {
24+
name
25+
}
26+
}
27+
}
28+
}
29+
"""
30+
31+
CASE_STUDY = """
32+
query CaseStudy($id: ID!) {
33+
caseStudy(id: $id) {
34+
id
35+
title
36+
content
37+
coverImage {
38+
name
39+
}
40+
}
41+
}
42+
"""
43+
44+
@typing.override
45+
@classmethod
46+
def setUpClass(cls):
47+
super().setUpClass()
48+
cls.user = UserFactory.create()
49+
cls.tool = ToolFactory.create()
50+
cls.case_studies = CaseStudyFactory.create_batch(
51+
3,
52+
tool=cls.tool,
53+
created_by=cls.user,
54+
modified_by=cls.user,
55+
)
56+
57+
def test_case_studies(self):
58+
def _query():
59+
return self.query_check(
60+
self.Query.CASE_STUDIES,
61+
variables={
62+
"pagination": {
63+
"limit": 10,
64+
"offset": 0,
65+
},
66+
},
67+
)
68+
69+
content = _query()
70+
71+
assert content["data"]["caseStudies"] == {
72+
**self.g_pagination(
73+
offset=0,
74+
limit=10,
75+
total_count=len(self.case_studies),
76+
results=[
77+
dict(
78+
id=self.gID(case.pk),
79+
title=case.title,
80+
content=case.content,
81+
coverImage=({"name": case.cover_image.name} if case.cover_image else None),
82+
)
83+
for case in self.case_studies
84+
],
85+
),
86+
}, content
87+
88+
def test_case_study(self):
89+
case = self.case_studies[0]
90+
91+
content = self.query_check(
92+
self.Query.CASE_STUDY,
93+
variables={"id": self.gID(case.pk)},
94+
)
95+
96+
assert content["data"]["caseStudy"] == dict(
97+
id=self.gID(case.pk),
98+
title=case.title,
99+
content=case.content,
100+
coverImage=({"name": case.cover_image.name} if case.cover_image else None),
101+
), content

0 commit comments

Comments
 (0)