@casekit/orm2 0.0.0-20250331181319 → 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/build/builders/buildCount.d.ts +2 -1
  2. package/build/builders/buildCount.js +5 -8
  3. package/build/builders/buildCount.test.js +5 -5
  4. package/build/builders/buildCreate.d.ts +2 -1
  5. package/build/builders/buildCreate.js +6 -3
  6. package/build/builders/buildCreate.test.js +4 -4
  7. package/build/builders/buildDelete.d.ts +2 -1
  8. package/build/builders/buildDelete.js +2 -2
  9. package/build/builders/buildDelete.test.js +8 -8
  10. package/build/builders/buildFind.d.ts +2 -1
  11. package/build/builders/buildFind.js +5 -8
  12. package/build/builders/buildFind.test.js +4 -4
  13. package/build/builders/buildUpdate.d.ts +2 -1
  14. package/build/builders/buildUpdate.js +6 -3
  15. package/build/builders/buildUpdate.test.js +8 -8
  16. package/build/builders/buildWhere.d.ts +2 -1
  17. package/build/builders/buildWhere.js +30 -8
  18. package/build/builders/buildWhere.test.js +39 -24
  19. package/build/connection.d.ts +2 -2
  20. package/build/index.d.ts +1 -1
  21. package/build/index.js +1 -1
  22. package/build/orm.count.d.ts +2 -10
  23. package/build/orm.count.js +2 -11
  24. package/build/orm.createMany.d.ts +2 -1
  25. package/build/orm.createMany.js +2 -2
  26. package/build/orm.createOne.d.ts +2 -1
  27. package/build/orm.createOne.js +2 -2
  28. package/build/orm.d.ts +2 -2
  29. package/build/orm.deleteMany.d.ts +2 -1
  30. package/build/orm.deleteMany.js +2 -2
  31. package/build/orm.deleteOne.d.ts +2 -1
  32. package/build/orm.deleteOne.js +2 -2
  33. package/build/orm.findMany.d.ts +2 -1
  34. package/build/orm.findMany.js +3 -3
  35. package/build/orm.findOne.d.ts +2 -1
  36. package/build/orm.findOne.js +11 -19
  37. package/build/orm.js +13 -13
  38. package/build/orm.restrict.d.ts +2 -1
  39. package/build/orm.restrict.js +2 -2
  40. package/build/orm.updateMany.d.ts +2 -1
  41. package/build/orm.updateMany.js +3 -3
  42. package/build/orm.updateOne.d.ts +2 -1
  43. package/build/orm.updateOne.js +2 -2
  44. package/build/tests/orm.findMany.includeManyToOne.test.js +21 -5
  45. package/build/tests/orm.findOne.includeManyToMany.test.js +270 -0
  46. package/build/tests/orm.findOne.includeManyToOne.test.js +280 -0
  47. package/build/tests/orm.findOne.includeOneToMany.test.js +454 -0
  48. package/build/tests/orm.findOne.select.test.js +205 -0
  49. package/build/tests/orm.findOne.where.test.js +471 -0
  50. package/build/tests/orm.middleware.findOne.test.d.ts +1 -0
  51. package/build/tests/orm.middleware.set.test.d.ts +1 -0
  52. package/build/tests/orm.middleware.set.test.js +100 -0
  53. package/build/tests/orm.middleware.updateMany.test.d.ts +1 -0
  54. package/build/tests/orm.middleware.updateOne.test.d.ts +1 -0
  55. package/build/tests/orm.middleware.values.test.d.ts +1 -0
  56. package/build/tests/orm.middleware.values.test.js +126 -0
  57. package/build/tests/orm.middleware.where.test.d.ts +1 -0
  58. package/build/tests/orm.middleware.where.test.js +1054 -0
  59. package/build/tests/util/db.d.ts +52 -70
  60. package/build/types/CreateOneResult.d.ts +6 -2
  61. package/build/types/CreateOneResult.test-d.js +3 -0
  62. package/build/types/Middleware.d.ts +14 -0
  63. package/build/types/Middleware.js +37 -1
  64. package/build/types/WhereClause.d.ts +8 -8
  65. package/build/util/applySetMiddleware.d.ts +5 -0
  66. package/build/util/applySetMiddleware.js +7 -0
  67. package/build/util/applyValuesMiddleware.d.ts +5 -0
  68. package/build/util/applyValuesMiddleware.js +7 -0
  69. package/build/util/applyWhereMiddleware.d.ts +5 -0
  70. package/build/util/applyWhereMiddleware.js +7 -0
  71. package/build/util/applyWhereMiddleware.test.d.ts +1 -0
  72. package/build/util/applyWhereMiddleware.test.js +88 -0
  73. package/build/util/resultSchema.d.ts +6 -6
  74. package/package.json +23 -24
  75. /package/build/tests/{orm.count.middleware.test.d.ts → orm.findOne.includeManyToMany.test.d.ts} +0 -0
  76. /package/build/tests/{orm.createMany.middleware.test.d.ts → orm.findOne.includeManyToOne.test.d.ts} +0 -0
  77. /package/build/tests/{orm.createOne.middleware.test.d.ts → orm.findOne.includeOneToMany.test.d.ts} +0 -0
  78. /package/build/tests/{orm.deleteMany.middleware.test.d.ts → orm.findOne.select.test.d.ts} +0 -0
  79. /package/build/tests/{orm.deleteOne.middleware.test.d.ts → orm.findOne.where.test.d.ts} +0 -0
  80. /package/build/tests/{orm.findMany.middleware.test.d.ts → orm.middleware.count.test.d.ts} +0 -0
  81. /package/build/tests/{orm.count.middleware.test.js → orm.middleware.count.test.js} +0 -0
  82. /package/build/tests/{orm.findOne.middleware.test.d.ts → orm.middleware.createMany.test.d.ts} +0 -0
  83. /package/build/tests/{orm.createMany.middleware.test.js → orm.middleware.createMany.test.js} +0 -0
  84. /package/build/tests/{orm.updateMany.middleware.test.d.ts → orm.middleware.createOne.test.d.ts} +0 -0
  85. /package/build/tests/{orm.createOne.middleware.test.js → orm.middleware.createOne.test.js} +0 -0
  86. /package/build/tests/{orm.updateOne.middleware.test.d.ts → orm.middleware.deleteMany.test.d.ts} +0 -0
  87. /package/build/tests/{orm.deleteMany.middleware.test.js → orm.middleware.deleteMany.test.js} +0 -0
  88. /package/build/{types/BaseFindParams.d.ts → tests/orm.middleware.deleteOne.test.d.ts} +0 -0
  89. /package/build/tests/{orm.deleteOne.middleware.test.js → orm.middleware.deleteOne.test.js} +0 -0
  90. /package/build/{types/BaseFindParams.js → tests/orm.middleware.findMany.test.d.ts} +0 -0
  91. /package/build/tests/{orm.findMany.middleware.test.js → orm.middleware.findMany.test.js} +0 -0
  92. /package/build/tests/{orm.findOne.middleware.test.js → orm.middleware.findOne.test.js} +0 -0
  93. /package/build/tests/{orm.updateMany.middleware.test.js → orm.middleware.updateMany.test.js} +0 -0
  94. /package/build/tests/{orm.updateOne.middleware.test.js → orm.middleware.updateOne.test.js} +0 -0
@@ -69,6 +69,7 @@ describe("findMany: N:1 relations", () => {
69
69
  values: [
70
70
  factory.post({
71
71
  id: 2,
72
+ title: "Post 2",
72
73
  authorId: 1,
73
74
  backgroundColorValue: "#ff0000",
74
75
  }),
@@ -79,17 +80,32 @@ describe("findMany: N:1 relations", () => {
79
80
  include: {
80
81
  author: {
81
82
  select: ["name"],
82
- },
83
- backgroundColor: {
84
- select: ["name"],
83
+ include: {
84
+ posts: {
85
+ select: ["id", "title"],
86
+ include: {
87
+ backgroundColor: {
88
+ select: ["name"],
89
+ },
90
+ },
91
+ },
92
+ },
85
93
  },
86
94
  },
87
95
  });
88
96
  expect(posts).toEqual([
89
97
  {
90
98
  id: 2,
91
- author: { name: "Author" },
92
- backgroundColor: { name: "Red" },
99
+ author: {
100
+ name: "Author",
101
+ posts: [
102
+ {
103
+ id: 2,
104
+ title: "Post 2",
105
+ backgroundColor: { name: "Red" },
106
+ },
107
+ ],
108
+ },
93
109
  },
94
110
  ]);
95
111
  }, { rollback: true });
@@ -0,0 +1,270 @@
1
+ import { afterAll, beforeAll, beforeEach, describe, expect, test, } from "vitest";
2
+ import { createTestDB } from "./util/db.js";
3
+ describe("findOne: include manyToMany", () => {
4
+ const { db, logger, factory } = createTestDB();
5
+ beforeEach(() => {
6
+ logger.clear();
7
+ });
8
+ beforeAll(async () => {
9
+ await db.connect();
10
+ });
11
+ afterAll(async () => {
12
+ await db.close();
13
+ });
14
+ test("can include manyToMany relations", async () => {
15
+ await db.transact(async (db) => {
16
+ await db.createMany("user", {
17
+ values: [
18
+ factory.user({ id: 1, name: "User 1" }),
19
+ factory.user({ id: 2, name: "User 2" }),
20
+ factory.user({ id: 3, name: "User 3" }),
21
+ ],
22
+ });
23
+ await db.createMany("friendship", {
24
+ values: [
25
+ factory.friendship({ userId: 1, friendId: 2 }),
26
+ factory.friendship({ userId: 1, friendId: 3 }),
27
+ factory.friendship({ userId: 2, friendId: 3 }),
28
+ ],
29
+ });
30
+ const user = await db.findOne("user", {
31
+ select: ["id", "name"],
32
+ where: { id: 1 },
33
+ include: {
34
+ friends: {
35
+ select: ["id", "name"],
36
+ orderBy: ["id"],
37
+ },
38
+ },
39
+ });
40
+ expect(user).toEqual({
41
+ id: 1,
42
+ name: "User 1",
43
+ friends: [
44
+ { id: 2, name: "User 2" },
45
+ { id: 3, name: "User 3" },
46
+ ],
47
+ });
48
+ }, { rollback: true });
49
+ });
50
+ test("can filter included manyToMany relations", async () => {
51
+ await db.transact(async (db) => {
52
+ await db.createMany("user", {
53
+ values: [
54
+ factory.user({ id: 1, role: "admin" }),
55
+ factory.user({ id: 2, role: "user" }),
56
+ factory.user({ id: 3, role: "admin" }),
57
+ ],
58
+ });
59
+ await db.createMany("friendship", {
60
+ values: [
61
+ factory.friendship({ userId: 1, friendId: 2 }),
62
+ factory.friendship({ userId: 1, friendId: 3 }),
63
+ factory.friendship({ userId: 2, friendId: 3 }),
64
+ ],
65
+ });
66
+ const user = await db.findOne("user", {
67
+ select: ["id"],
68
+ where: { id: 1 },
69
+ include: {
70
+ friends: {
71
+ select: ["id", "role"],
72
+ where: {
73
+ role: "admin",
74
+ },
75
+ orderBy: ["id"],
76
+ },
77
+ },
78
+ });
79
+ expect(user).toEqual({
80
+ id: 1,
81
+ friends: [{ id: 3, role: "admin" }],
82
+ });
83
+ }, { rollback: true });
84
+ });
85
+ test("can limit and offset included manyToMany relations", async () => {
86
+ await db.transact(async (db) => {
87
+ // Create users with ascending creation dates
88
+ await db.createMany("user", {
89
+ values: [
90
+ factory.user({
91
+ id: 1,
92
+ createdAt: new Date("2024-01-01"),
93
+ }),
94
+ factory.user({
95
+ id: 2,
96
+ createdAt: new Date("2024-01-02"),
97
+ }),
98
+ factory.user({
99
+ id: 3,
100
+ createdAt: new Date("2024-01-03"),
101
+ }),
102
+ factory.user({
103
+ id: 4,
104
+ createdAt: new Date("2024-01-04"),
105
+ }),
106
+ ],
107
+ });
108
+ // Create friendships
109
+ await db.createMany("friendship", {
110
+ values: [
111
+ factory.friendship({ userId: 1, friendId: 2 }),
112
+ factory.friendship({ userId: 1, friendId: 3 }),
113
+ factory.friendship({ userId: 1, friendId: 4 }),
114
+ ],
115
+ });
116
+ const user = await db.findOne("user", {
117
+ select: ["id"],
118
+ where: { id: 1 },
119
+ include: {
120
+ friends: {
121
+ select: ["id"],
122
+ orderBy: ["id"],
123
+ limit: 2,
124
+ offset: 1,
125
+ },
126
+ },
127
+ });
128
+ expect(user).toEqual({
129
+ id: 1,
130
+ friends: [{ id: 3 }, { id: 4 }],
131
+ });
132
+ }, { rollback: true });
133
+ });
134
+ test("can include nested relations through manyToMany", async () => {
135
+ await db.transact(async (db) => {
136
+ await db.createMany("user", {
137
+ values: [
138
+ factory.user({ id: 1, name: "User 1" }),
139
+ factory.user({ id: 2, name: "User 2" }),
140
+ ],
141
+ });
142
+ await db.createMany("friendship", {
143
+ values: [factory.friendship({ userId: 1, friendId: 2 })],
144
+ });
145
+ await db.createMany("post", {
146
+ values: [
147
+ factory.post({
148
+ id: 1,
149
+ authorId: 2,
150
+ title: "Post 1",
151
+ }),
152
+ factory.post({
153
+ id: 2,
154
+ authorId: 2,
155
+ title: "Post 2",
156
+ }),
157
+ ],
158
+ });
159
+ const user = await db.findOne("user", {
160
+ select: ["id", "name"],
161
+ where: { id: 1 },
162
+ include: {
163
+ friends: {
164
+ select: ["id", "name"],
165
+ include: {
166
+ posts: {
167
+ select: ["id", "title"],
168
+ orderBy: ["id"],
169
+ },
170
+ },
171
+ orderBy: ["id"],
172
+ },
173
+ },
174
+ });
175
+ expect(user).toEqual({
176
+ id: 1,
177
+ name: "User 1",
178
+ friends: [
179
+ {
180
+ id: 2,
181
+ name: "User 2",
182
+ posts: [
183
+ { id: 1, title: "Post 1" },
184
+ { id: 2, title: "Post 2" },
185
+ ],
186
+ },
187
+ ],
188
+ });
189
+ }, { rollback: true });
190
+ });
191
+ test("handles not found case appropriately", async () => {
192
+ await db.transact(async (db) => {
193
+ await db.createMany("user", {
194
+ values: [
195
+ factory.user({ id: 1, name: "User 1" }),
196
+ factory.user({ id: 2, name: "User 2" }),
197
+ ],
198
+ });
199
+ await db.createMany("friendship", {
200
+ values: [factory.friendship({ userId: 1, friendId: 2 })],
201
+ });
202
+ // Should throw when user doesn't exist
203
+ await expect(db.findOne("user", {
204
+ select: ["id"],
205
+ where: { id: 999 },
206
+ include: {
207
+ friends: {
208
+ select: ["id"],
209
+ },
210
+ },
211
+ })).rejects.toThrow();
212
+ }, { rollback: true });
213
+ });
214
+ test("can include manyToMany relations with complex ordering", async () => {
215
+ await db.transact(async (db) => {
216
+ await db.createMany("user", {
217
+ values: [
218
+ factory.user({
219
+ id: 1,
220
+ name: "User 1",
221
+ createdAt: new Date("2024-01-01"),
222
+ }),
223
+ factory.user({
224
+ id: 2,
225
+ name: "User 2",
226
+ createdAt: new Date("2024-01-03"),
227
+ }),
228
+ factory.user({
229
+ id: 3,
230
+ name: "User 3",
231
+ createdAt: new Date("2024-01-02"),
232
+ }),
233
+ ],
234
+ });
235
+ await db.createMany("friendship", {
236
+ values: [
237
+ factory.friendship({ userId: 1, friendId: 2 }),
238
+ factory.friendship({ userId: 1, friendId: 3 }),
239
+ ],
240
+ });
241
+ const user = await db.findOne("user", {
242
+ select: ["id", "name"],
243
+ where: { id: 1 },
244
+ include: {
245
+ friends: {
246
+ select: ["id", "name", "createdAt"],
247
+ orderBy: [["createdAt", "desc"]],
248
+ },
249
+ },
250
+ });
251
+ // Use toEqual with a complete object that specifies the exact expected order
252
+ expect(user).toEqual({
253
+ id: 1,
254
+ name: "User 1",
255
+ friends: [
256
+ {
257
+ id: 2,
258
+ name: "User 2",
259
+ createdAt: expect.any(Date),
260
+ },
261
+ {
262
+ id: 3,
263
+ name: "User 3",
264
+ createdAt: expect.any(Date),
265
+ },
266
+ ],
267
+ });
268
+ }, { rollback: true });
269
+ });
270
+ });
@@ -0,0 +1,280 @@
1
+ import { afterAll, beforeAll, beforeEach, describe, expect, test, } from "vitest";
2
+ import { $not } from "../operators.js";
3
+ import { createTestDB } from "./util/db.js";
4
+ describe("findOne: N:1 relations", () => {
5
+ const { db, logger, factory } = createTestDB();
6
+ beforeEach(() => {
7
+ logger.clear();
8
+ });
9
+ beforeAll(async () => {
10
+ await db.connect();
11
+ });
12
+ afterAll(async () => {
13
+ await db.close();
14
+ });
15
+ test("can select N:1 relations", async () => {
16
+ await db.transact(async (db) => {
17
+ await db.createMany("user", {
18
+ values: [
19
+ factory.user({ id: 1, name: "Author 1" }),
20
+ factory.user({ id: 2, name: "Author 2" }),
21
+ ],
22
+ });
23
+ await db.createMany("post", {
24
+ values: [
25
+ factory.post({
26
+ id: 3,
27
+ title: "Post 1",
28
+ authorId: 1,
29
+ }),
30
+ factory.post({
31
+ id: 4,
32
+ title: "Post 2",
33
+ authorId: 2,
34
+ }),
35
+ ],
36
+ });
37
+ const post = await db.findOne("post", {
38
+ select: ["id", "title"],
39
+ where: { id: 3 },
40
+ include: {
41
+ author: {
42
+ select: ["id", "name"],
43
+ },
44
+ },
45
+ });
46
+ expect(post).toEqual({
47
+ id: 3,
48
+ title: "Post 1",
49
+ author: { id: 1, name: "Author 1" },
50
+ });
51
+ }, { rollback: true });
52
+ });
53
+ test("can select nested N:1 relations", async () => {
54
+ await db.transact(async (db) => {
55
+ await db.createOne("color", {
56
+ values: factory.color({ hex: "#ff0000", name: "Red" }),
57
+ });
58
+ const user = await db.createOne("user", {
59
+ values: factory.user({ id: 1, name: "Author" }),
60
+ });
61
+ await db.createOne("post", {
62
+ values: factory.post({
63
+ id: 2,
64
+ title: "Post 2",
65
+ authorId: 1,
66
+ backgroundColorValue: "#ff0000",
67
+ }),
68
+ });
69
+ const post = await db.findOne("post", {
70
+ select: ["id"],
71
+ include: {
72
+ author: {
73
+ select: ["name"],
74
+ include: {
75
+ posts: {
76
+ select: ["id", "title"],
77
+ include: {
78
+ backgroundColor: {
79
+ select: ["name"],
80
+ },
81
+ },
82
+ },
83
+ },
84
+ },
85
+ },
86
+ });
87
+ expect(post).toEqual({
88
+ id: 2,
89
+ author: {
90
+ name: "Author",
91
+ posts: [
92
+ {
93
+ id: 2,
94
+ title: "Post 2",
95
+ backgroundColor: { name: "Red" },
96
+ },
97
+ ],
98
+ },
99
+ });
100
+ }, { rollback: true });
101
+ });
102
+ test("filters by N:1 relation where clause", async () => {
103
+ await db.transact(async (db) => {
104
+ await db.createMany("user", {
105
+ values: [
106
+ factory.user({
107
+ id: 1,
108
+ name: "Active",
109
+ deletedAt: null,
110
+ }),
111
+ factory.user({
112
+ id: 2,
113
+ name: "Deleted",
114
+ deletedAt: new Date(),
115
+ }),
116
+ ],
117
+ });
118
+ await db.createMany("post", {
119
+ values: [
120
+ factory.post({
121
+ id: 1,
122
+ authorId: 1,
123
+ }),
124
+ factory.post({
125
+ id: 2,
126
+ authorId: 2,
127
+ }),
128
+ ],
129
+ });
130
+ const post = await db.findOne("post", {
131
+ select: ["id"],
132
+ where: { id: 1 },
133
+ include: {
134
+ author: {
135
+ select: ["name"],
136
+ where: { deletedAt: null },
137
+ },
138
+ },
139
+ });
140
+ expect(post).toEqual({ id: 1, author: { name: "Active" } });
141
+ // Test that filtering works - this post's author doesn't match the where clause
142
+ await expect(async () => {
143
+ await db.findOne("post", {
144
+ select: ["id"],
145
+ where: { id: 2 },
146
+ include: {
147
+ author: {
148
+ select: ["name"],
149
+ where: { deletedAt: null },
150
+ },
151
+ },
152
+ });
153
+ }).rejects.toThrow();
154
+ }, { rollback: true });
155
+ });
156
+ test("enforces where clause even on optional N:1 relation", async () => {
157
+ await db.transact(async (db) => {
158
+ await db.createMany("color", {
159
+ values: [
160
+ factory.color({ hex: "#ff0000", name: "Red" }),
161
+ factory.color({ hex: "#0000ff", name: "Blue" }),
162
+ ],
163
+ });
164
+ await db.createOne("user", {
165
+ values: factory.user({ id: 1 }),
166
+ });
167
+ await db.createMany("post", {
168
+ values: [
169
+ factory.post({
170
+ id: 1,
171
+ authorId: 1,
172
+ backgroundColorValue: "#ff0000",
173
+ }),
174
+ factory.post({
175
+ id: 2,
176
+ authorId: 1,
177
+ }),
178
+ factory.post({
179
+ id: 3,
180
+ authorId: 1,
181
+ backgroundColorValue: "#0000ff",
182
+ }),
183
+ ],
184
+ });
185
+ const post = await db.findOne("post", {
186
+ select: ["id"],
187
+ where: { id: 3 },
188
+ include: {
189
+ backgroundColor: {
190
+ select: ["name"],
191
+ where: { name: "Blue" },
192
+ },
193
+ },
194
+ });
195
+ expect(post).toEqual({
196
+ id: 3,
197
+ backgroundColor: {
198
+ name: "Blue",
199
+ },
200
+ });
201
+ // Test that post without backgroundColor matching the filter will exclude the record
202
+ await expect(db.findOne("post", {
203
+ select: ["id"],
204
+ where: { id: 1 },
205
+ include: {
206
+ backgroundColor: {
207
+ select: ["name"],
208
+ where: { name: "Blue" },
209
+ },
210
+ },
211
+ })).rejects.toThrowError("Expected one row, but found none");
212
+ }, { rollback: true });
213
+ });
214
+ test("combines where clauses across multiple levels", async () => {
215
+ await db.transact(async (db) => {
216
+ await db.createMany("color", {
217
+ values: [
218
+ factory.color({ hex: "#ff0000", name: "Red" }),
219
+ factory.color({ hex: "#0000ff", name: "Blue" }),
220
+ ],
221
+ });
222
+ await db.createMany("user", {
223
+ values: [
224
+ factory.user({ id: 1, role: "admin" }),
225
+ factory.user({ id: 2, role: "user" }),
226
+ ],
227
+ });
228
+ await db.createMany("post", {
229
+ values: [
230
+ factory.post({
231
+ id: 1,
232
+ authorId: 1,
233
+ backgroundColorValue: "#ff0000",
234
+ publishedAt: new Date(),
235
+ }),
236
+ factory.post({
237
+ id: 2,
238
+ authorId: 1,
239
+ backgroundColorValue: "#ff0000",
240
+ publishedAt: null,
241
+ }),
242
+ factory.post({
243
+ id: 3,
244
+ authorId: 2,
245
+ backgroundColorValue: "#ff0000",
246
+ publishedAt: new Date(),
247
+ }),
248
+ factory.post({
249
+ id: 4,
250
+ authorId: 1,
251
+ backgroundColorValue: "#0000ff",
252
+ publishedAt: new Date(),
253
+ }),
254
+ ],
255
+ });
256
+ const post = await db.findOne("post", {
257
+ select: ["id"],
258
+ where: {
259
+ id: 1,
260
+ publishedAt: { [$not]: null },
261
+ },
262
+ include: {
263
+ author: {
264
+ select: ["id"],
265
+ where: { role: "admin" },
266
+ },
267
+ backgroundColor: {
268
+ select: ["name"],
269
+ where: { name: "Red" },
270
+ },
271
+ },
272
+ });
273
+ expect(post).toEqual({
274
+ id: 1,
275
+ author: { id: 1 },
276
+ backgroundColor: { name: "Red" },
277
+ });
278
+ }, { rollback: true });
279
+ });
280
+ });