File: test_relations.py

package info (click to toggle)
strawberry-graphql-django 0.78.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 2,624 kB
  • sloc: python: 31,895; makefile: 24; sh: 21
file content (134 lines) | stat: -rw-r--r-- 3,417 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
from typing import TYPE_CHECKING, Optional, cast

import strawberry
from django.db import models
from strawberry import auto
from strawberry.types import get_object_definition
from strawberry.types.base import (
    StrawberryList,
    StrawberryOptional,
)

import strawberry_django

if TYPE_CHECKING:
    from strawberry_django.fields.field import StrawberryDjangoField


class ParentModel(models.Model):
    name = models.CharField(max_length=50)


class OneToOneModel(models.Model):
    name = models.CharField(max_length=50)
    parent = models.OneToOneField(
        ParentModel,
        on_delete=models.SET_NULL,
        related_name="one_to_one",
        null=True,
        blank=True,
    )


class ChildModel(models.Model):
    name = models.CharField(max_length=50)
    parents = models.ManyToManyField(ParentModel, related_name="children")


@strawberry_django.type(ParentModel)
class Parent:
    id: auto
    name: auto
    children: list["Child"]
    one_to_one: Optional["OneToOne"]


@strawberry_django.type(OneToOneModel)
class OneToOne:
    id: auto
    name: auto
    parent: Optional["Parent"]


@strawberry_django.type(ChildModel)
class Child:
    id: auto
    name: auto
    parents: list[Parent]


def test_relation():
    assert [
        (f.name, f.type, cast("StrawberryDjangoField", f).is_list)
        for f in get_object_definition(Parent, strict=True).fields
    ] == [
        ("id", strawberry.ID, False),
        ("name", str, False),
        ("children", StrawberryList(Child), True),
        ("one_to_one", StrawberryOptional(OneToOne), False),
    ]


def test_reversed_relation():
    assert [
        (f.name, f.type, cast("StrawberryDjangoField", f).is_list)
        for f in get_object_definition(Child, strict=True).fields
    ] == [
        ("id", strawberry.ID, False),
        ("name", str, False),
        ("parents", StrawberryList(Parent), True),
    ]


def test_relation_query(transactional_db):
    @strawberry.type
    class Query:
        parent: Parent = strawberry_django.field()
        one_to_one: OneToOne = strawberry_django.field()

    schema = strawberry.Schema(query=Query)

    query = """\
    query Query ($pk: ID!) {
      parent (pk: $pk) {
        name
        oneToOne {
          name
        }
        children {
          id
          name
        }
      }
    }
    """

    parent = ParentModel.objects.create(name="Parent")
    result = schema.execute_sync(query, {"pk": parent.pk})
    assert result.errors is None
    assert result.data == {
        "parent": {"children": [], "name": "Parent", "oneToOne": None},
    }

    OneToOneModel.objects.create(name="OneToOne", parent=parent)
    result = schema.execute_sync(query, {"pk": parent.pk})
    assert result.errors is None
    assert result.data == {
        "parent": {"children": [], "name": "Parent", "oneToOne": {"name": "OneToOne"}},
    }

    child1 = ChildModel.objects.create(name="Child1")
    child2 = ChildModel.objects.create(name="Child2")
    ChildModel.objects.create(name="Child3")

    child1.parents.add(parent)
    child2.parents.add(parent)
    result = schema.execute_sync(query, {"pk": parent.pk})
    assert result.errors is None
    assert result.data == {
        "parent": {
            "children": [{"id": "1", "name": "Child1"}, {"id": "2", "name": "Child2"}],
            "name": "Parent",
            "oneToOne": {"name": "OneToOne"},
        },
    }