Coverage for databases/sync_tests/test_update.py: 100%
79 statements
« prev ^ index » next coverage.py v7.2.7, created at 2024-08-27 18:25 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2024-08-27 18:25 +0000
1import pytest
3import prisma
4from prisma import Prisma
5from lib.testing import async_fixture
6from prisma.models import User, Types, Unique2
8from ..utils import CURRENT_DATABASE
11@async_fixture(name='user_id')
12def user_id_fixture(client: Prisma) -> str:
13 user = client.user.create({'name': 'Robert'})
14 return user.id
17def test_update(client: Prisma) -> None:
18 """Standard usage"""
19 post = client.post.create(
20 {
21 'title': 'Hi from Create!',
22 'published': True,
23 'description': 'Prisma is a database toolkit that makes databases easy.',
24 'author': {
25 'create': {
26 'name': 'Bob',
27 },
28 },
29 }
30 )
31 assert post.author is None
32 assert post.title == 'Hi from Create!'
33 updated = client.post.update(
34 where={
35 'id': post.id,
36 },
37 data={
38 'title': 'Hi from Update!',
39 },
40 )
41 assert updated is not None
42 assert updated.title == 'Hi from Update!'
43 assert updated.updated_at != post.updated_at
44 assert updated.created_at == post.created_at
46 updated = client.post.update(
47 where={
48 'id': post.id,
49 },
50 include={
51 'author': True,
52 },
53 data={
54 'published': False,
55 'description': 'Updated desc.',
56 },
57 )
58 assert updated is not None
59 assert updated.published is False
60 assert updated.description == 'Updated desc.'
61 assert updated.author is not None
62 assert updated.author.name == 'Bob'
65@pytest.mark.parametrize('method', ['disconnect', 'delete'])
66def test_update_with_create_disconnect(client: Prisma, user_id: str, method: str) -> None:
67 """Removing a relational field"""
68 user = client.user.find_unique(where={'id': user_id}, include={'posts': True})
69 assert user is not None
70 assert user.posts is not None
71 assert len(user.posts) == 0
73 updated = client.user.update(
74 where={'id': user_id},
75 data={'posts': {'create': [{'title': 'My post', 'published': True}]}},
76 include={'posts': True},
77 )
78 assert updated is not None
79 assert updated.posts is not None
80 assert len(updated.posts) == 1
82 post_id = updated.posts[0].id
84 if method == 'disconnect':
85 updated = client.user.update(
86 where={'id': user_id},
87 data={
88 'posts': {
89 'disconnect': [
90 {'id': post_id},
91 ]
92 }
93 },
94 include={'posts': True},
95 )
96 else:
97 updated = client.user.update(
98 where={'id': user_id},
99 data={
100 'posts': {
101 'delete': [
102 {'id': post_id},
103 ],
104 }
105 },
106 include={'posts': True},
107 )
109 assert updated is not None
110 assert updated.posts is not None
111 assert len(updated.posts) == 0
114def test_atomic_update(client: Prisma) -> None:
115 """Atomically incrementing a value by 1"""
116 post = client.post.create({'title': 'My Post', 'published': False})
117 assert post.title == 'My Post'
118 assert post.views == 0
120 updated = client.post.update(where={'id': post.id}, data={'views': {'increment': 1}})
121 assert updated is not None
122 assert updated.views == 1
125def test_update_record_not_found(client: Prisma) -> None:
126 """Updating a non-existent record returns None"""
127 post = client.post.update(where={'id': 'wow'}, data={'title': 'Hi from Update!'})
128 assert post is None
131def test_setting_field_to_null(client: Prisma) -> None:
132 """Updating a field to None sets the database record to None"""
133 post = client.post.create(
134 data={
135 'title': 'Post',
136 'published': False,
137 'description': 'My description',
138 },
139 )
140 assert post.description == 'My description'
142 updated = client.post.update(
143 where={
144 'id': post.id,
145 },
146 data={'description': None},
147 )
148 assert updated is not None
149 assert updated.id == post.id
150 assert updated.description is None
153def test_setting_non_nullable_field_to_null(client: Prisma) -> None:
154 """Attempting to set a non-nullable field to null raises an error"""
155 post = client.post.create(
156 data={
157 'title': 'Post',
158 'published': False,
159 },
160 )
161 assert post.published is False
163 with pytest.raises(prisma.errors.MissingRequiredValueError) as exc:
164 client.post.update(
165 where={
166 'id': post.id,
167 },
168 data={'published': None}, # type: ignore
169 )
171 assert exc.match(r'published')
174@pytest.mark.prisma
175def test_update_id_field() -> None:
176 """Setting an ID field"""
177 user = User.prisma().create(
178 data={
179 'name': 'Robert',
180 },
181 )
182 updated = User.prisma().update(
183 where={
184 'id': user.id,
185 },
186 data={
187 'id': 'abcd123',
188 },
189 )
190 assert updated is not None
191 assert updated.id == 'abcd123'
194@pytest.mark.prisma
195@pytest.mark.skipif(
196 CURRENT_DATABASE == 'cockroachdb',
197 reason='https://github.com/prisma/prisma/issues/16612',
198)
199def test_update_id_field_atomic() -> None:
200 """Setting an ID field atomically"""
201 record = Types.prisma().create({})
202 updated = Types.prisma().update(
203 where={
204 'id': record.id,
205 },
206 data={
207 'id': {
208 'increment': 500,
209 },
210 },
211 )
212 assert updated is not None
213 assert updated.id == record.id + 500
216@pytest.mark.prisma
217def test_update_unique_field() -> None:
218 """Setting a unique field"""
219 record = Unique2.prisma().create(
220 data={
221 'name': 'Robert',
222 'surname': 'Craigie',
223 }
224 )
226 updated = Unique2.prisma().update(
227 where={
228 'surname': record.surname,
229 },
230 data={
231 'surname': 'George',
232 },
233 )
234 assert updated is not None
235 assert updated.name == record.name
236 assert updated.surname == 'George'