@casekit/orm2 0.0.0-20250322230249
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.
- package/build/builders/buildCount.d.ts +23 -0
- package/build/builders/buildCount.js +63 -0
- package/build/builders/buildCount.test.d.ts +1 -0
- package/build/builders/buildCount.test.js +144 -0
- package/build/builders/buildCreate.d.ts +5 -0
- package/build/builders/buildCreate.js +28 -0
- package/build/builders/buildCreate.test.d.ts +1 -0
- package/build/builders/buildCreate.test.js +47 -0
- package/build/builders/buildDelete.d.ts +5 -0
- package/build/builders/buildDelete.js +28 -0
- package/build/builders/buildDelete.test.d.ts +1 -0
- package/build/builders/buildDelete.test.js +108 -0
- package/build/builders/buildFind.d.ts +8 -0
- package/build/builders/buildFind.js +185 -0
- package/build/builders/buildFind.test.d.ts +1 -0
- package/build/builders/buildFind.test.js +263 -0
- package/build/builders/buildUpdate.d.ts +5 -0
- package/build/builders/buildUpdate.js +34 -0
- package/build/builders/buildUpdate.test.d.ts +1 -0
- package/build/builders/buildUpdate.test.js +130 -0
- package/build/builders/buildWhere.d.ts +6 -0
- package/build/builders/buildWhere.js +63 -0
- package/build/builders/buildWhere.test.d.ts +1 -0
- package/build/builders/buildWhere.test.js +154 -0
- package/build/builders/types.d.ts +87 -0
- package/build/builders/types.js +1 -0
- package/build/connection.d.ts +31 -0
- package/build/connection.js +206 -0
- package/build/index.d.ts +10 -0
- package/build/index.js +5 -0
- package/build/operators.d.ts +59 -0
- package/build/operators.js +44 -0
- package/build/orm.count.d.ts +14 -0
- package/build/orm.count.js +22 -0
- package/build/orm.createMany.d.ts +5 -0
- package/build/orm.createMany.js +26 -0
- package/build/orm.createOne.d.ts +5 -0
- package/build/orm.createOne.js +34 -0
- package/build/orm.d.ts +81 -0
- package/build/orm.deleteMany.d.ts +5 -0
- package/build/orm.deleteMany.js +26 -0
- package/build/orm.deleteOne.d.ts +5 -0
- package/build/orm.deleteOne.js +32 -0
- package/build/orm.findMany.d.ts +8 -0
- package/build/orm.findMany.js +64 -0
- package/build/orm.findOne.d.ts +5 -0
- package/build/orm.findOne.js +20 -0
- package/build/orm.js +243 -0
- package/build/orm.restrict.d.ts +6 -0
- package/build/orm.restrict.js +52 -0
- package/build/orm.updateMany.d.ts +5 -0
- package/build/orm.updateMany.js +29 -0
- package/build/orm.updateOne.d.ts +5 -0
- package/build/orm.updateOne.js +35 -0
- package/build/sql/countToSql.d.ts +3 -0
- package/build/sql/countToSql.js +11 -0
- package/build/sql/countToSql.test.d.ts +1 -0
- package/build/sql/countToSql.test.js +218 -0
- package/build/sql/createToSql.d.ts +3 -0
- package/build/sql/createToSql.js +27 -0
- package/build/sql/createToSql.test.d.ts +1 -0
- package/build/sql/createToSql.test.js +186 -0
- package/build/sql/deleteToSql.d.ts +3 -0
- package/build/sql/deleteToSql.js +15 -0
- package/build/sql/deleteToSql.test.d.ts +1 -0
- package/build/sql/deleteToSql.test.js +93 -0
- package/build/sql/findToSql.d.ts +3 -0
- package/build/sql/findToSql.js +33 -0
- package/build/sql/findToSql.test.d.ts +1 -0
- package/build/sql/findToSql.test.js +409 -0
- package/build/sql/updateToSql.d.ts +3 -0
- package/build/sql/updateToSql.js +16 -0
- package/build/sql/updateToSql.test.d.ts +1 -0
- package/build/sql/updateToSql.test.js +165 -0
- package/build/sql/util.d.ts +11 -0
- package/build/sql/util.js +36 -0
- package/build/sql/util.test.d.ts +1 -0
- package/build/sql/util.test.js +163 -0
- package/build/tests/connection.test.d.ts +1 -0
- package/build/tests/connection.test.js +304 -0
- package/build/tests/datatypes.test.d.ts +1 -0
- package/build/tests/datatypes.test.js +239 -0
- package/build/tests/operators.test.d.ts +1 -0
- package/build/tests/operators.test.js +125 -0
- package/build/tests/orm.count.middleware.test.d.ts +1 -0
- package/build/tests/orm.count.middleware.test.js +132 -0
- package/build/tests/orm.count.test-d.d.ts +1 -0
- package/build/tests/orm.count.test-d.js +60 -0
- package/build/tests/orm.count.test.d.ts +1 -0
- package/build/tests/orm.count.test.js +151 -0
- package/build/tests/orm.createMany.middleware.test.d.ts +1 -0
- package/build/tests/orm.createMany.middleware.test.js +63 -0
- package/build/tests/orm.createMany.test-d.d.ts +1 -0
- package/build/tests/orm.createMany.test-d.js +131 -0
- package/build/tests/orm.createMany.test.d.ts +1 -0
- package/build/tests/orm.createMany.test.js +392 -0
- package/build/tests/orm.createOne.middleware.test.d.ts +1 -0
- package/build/tests/orm.createOne.middleware.test.js +54 -0
- package/build/tests/orm.createOne.test-d.d.ts +1 -0
- package/build/tests/orm.createOne.test-d.js +113 -0
- package/build/tests/orm.createOne.test.d.ts +1 -0
- package/build/tests/orm.createOne.test.js +268 -0
- package/build/tests/orm.deleteMany.middleware.test.d.ts +1 -0
- package/build/tests/orm.deleteMany.middleware.test.js +77 -0
- package/build/tests/orm.deleteMany.test-d.d.ts +1 -0
- package/build/tests/orm.deleteMany.test-d.js +179 -0
- package/build/tests/orm.deleteMany.test.d.ts +1 -0
- package/build/tests/orm.deleteMany.test.js +394 -0
- package/build/tests/orm.deleteOne.middleware.test.d.ts +1 -0
- package/build/tests/orm.deleteOne.middleware.test.js +61 -0
- package/build/tests/orm.deleteOne.test-d.d.ts +1 -0
- package/build/tests/orm.deleteOne.test-d.js +179 -0
- package/build/tests/orm.deleteOne.test.d.ts +1 -0
- package/build/tests/orm.deleteOne.test.js +360 -0
- package/build/tests/orm.findMany.includeManyToMany.test.d.ts +1 -0
- package/build/tests/orm.findMany.includeManyToMany.test.js +335 -0
- package/build/tests/orm.findMany.includeManyToOne.test.d.ts +1 -0
- package/build/tests/orm.findMany.includeManyToOne.test.js +286 -0
- package/build/tests/orm.findMany.includeOneToMany.test.d.ts +1 -0
- package/build/tests/orm.findMany.includeOneToMany.test.js +530 -0
- package/build/tests/orm.findMany.middleware.test.d.ts +1 -0
- package/build/tests/orm.findMany.middleware.test.js +66 -0
- package/build/tests/orm.findMany.offsetLimit.test.d.ts +1 -0
- package/build/tests/orm.findMany.offsetLimit.test.js +108 -0
- package/build/tests/orm.findMany.orderBy.test.d.ts +1 -0
- package/build/tests/orm.findMany.orderBy.test.js +304 -0
- package/build/tests/orm.findMany.select.test.d.ts +1 -0
- package/build/tests/orm.findMany.select.test.js +278 -0
- package/build/tests/orm.findMany.test-d.d.ts +1 -0
- package/build/tests/orm.findMany.test-d.js +374 -0
- package/build/tests/orm.findMany.where.test.d.ts +1 -0
- package/build/tests/orm.findMany.where.test.js +383 -0
- package/build/tests/orm.findOne.middleware.test.d.ts +1 -0
- package/build/tests/orm.findOne.middleware.test.js +57 -0
- package/build/tests/orm.findOne.test-d.d.ts +1 -0
- package/build/tests/orm.findOne.test-d.js +377 -0
- package/build/tests/orm.findOne.test.d.ts +1 -0
- package/build/tests/orm.findOne.test.js +247 -0
- package/build/tests/orm.restrict.test-d.d.ts +1 -0
- package/build/tests/orm.restrict.test-d.js +105 -0
- package/build/tests/orm.restrict.test.d.ts +1 -0
- package/build/tests/orm.restrict.test.js +259 -0
- package/build/tests/orm.transact.test.d.ts +1 -0
- package/build/tests/orm.transact.test.js +48 -0
- package/build/tests/orm.updateMany.middleware.test.d.ts +1 -0
- package/build/tests/orm.updateMany.middleware.test.js +72 -0
- package/build/tests/orm.updateMany.test.d.ts +1 -0
- package/build/tests/orm.updateMany.test.js +210 -0
- package/build/tests/orm.updateOne.middleware.test.d.ts +1 -0
- package/build/tests/orm.updateOne.middleware.test.js +62 -0
- package/build/tests/orm.updateOne.test.d.ts +1 -0
- package/build/tests/orm.updateOne.test.js +209 -0
- package/build/tests/util/db.d.ts +1571 -0
- package/build/tests/util/db.js +10 -0
- package/build/tests/util/logger.d.ts +19 -0
- package/build/tests/util/logger.js +40 -0
- package/build/types/BaseFindParams.d.ts +1 -0
- package/build/types/BaseFindParams.js +1 -0
- package/build/types/CountParams.d.ts +16 -0
- package/build/types/CountParams.js +1 -0
- package/build/types/CountParams.test-d.d.ts +1 -0
- package/build/types/CountParams.test-d.js +89 -0
- package/build/types/CreateManyParams.d.ts +11 -0
- package/build/types/CreateManyParams.js +1 -0
- package/build/types/CreateManyParams.test-d.d.ts +1 -0
- package/build/types/CreateManyParams.test-d.js +83 -0
- package/build/types/CreateManyResult.d.ts +5 -0
- package/build/types/CreateManyResult.js +1 -0
- package/build/types/CreateManyResult.test-d.d.ts +1 -0
- package/build/types/CreateManyResult.test-d.js +22 -0
- package/build/types/CreateOneParams.d.ts +11 -0
- package/build/types/CreateOneParams.js +1 -0
- package/build/types/CreateOneParams.test-d.d.ts +1 -0
- package/build/types/CreateOneParams.test-d.js +56 -0
- package/build/types/CreateOneResult.d.ts +5 -0
- package/build/types/CreateOneResult.js +1 -0
- package/build/types/CreateOneResult.test-d.d.ts +1 -0
- package/build/types/CreateOneResult.test-d.js +23 -0
- package/build/types/CreateValues.d.ts +6 -0
- package/build/types/CreateValues.js +1 -0
- package/build/types/CreateValues.test-d.d.ts +1 -0
- package/build/types/CreateValues.test-d.js +60 -0
- package/build/types/DeleteManyResult.d.ts +5 -0
- package/build/types/DeleteManyResult.js +1 -0
- package/build/types/DeleteManyResult.test-d.d.ts +1 -0
- package/build/types/DeleteManyResult.test-d.js +23 -0
- package/build/types/DeleteOneResult.d.ts +5 -0
- package/build/types/DeleteOneResult.js +1 -0
- package/build/types/DeleteOneResult.test-d.d.ts +1 -0
- package/build/types/DeleteOneResult.test-d.js +23 -0
- package/build/types/DeleteParams.d.ts +7 -0
- package/build/types/DeleteParams.js +1 -0
- package/build/types/DeleteParams.test-d.d.ts +1 -0
- package/build/types/DeleteParams.test-d.js +46 -0
- package/build/types/FindParams.d.ts +22 -0
- package/build/types/FindParams.js +1 -0
- package/build/types/FindParams.test-d.d.ts +1 -0
- package/build/types/FindParams.test-d.js +107 -0
- package/build/types/FindResult.d.ts +13 -0
- package/build/types/FindResult.js +1 -0
- package/build/types/FindResult.test-d.d.ts +1 -0
- package/build/types/FindResult.test-d.js +30 -0
- package/build/types/IncludeClause.d.ts +5 -0
- package/build/types/IncludeClause.js +1 -0
- package/build/types/IncludeClause.test-d.d.ts +1 -0
- package/build/types/IncludeClause.test-d.js +69 -0
- package/build/types/Middleware.d.ts +51 -0
- package/build/types/Middleware.js +37 -0
- package/build/types/OptionalValues.d.ts +4 -0
- package/build/types/OptionalValues.js +1 -0
- package/build/types/OptionalValues.test-d.d.ts +1 -0
- package/build/types/OptionalValues.test-d.js +12 -0
- package/build/types/OrderByClause.d.ts +9 -0
- package/build/types/OrderByClause.js +1 -0
- package/build/types/OrderByClause.test-d.d.ts +1 -0
- package/build/types/OrderByClause.test-d.js +44 -0
- package/build/types/RequiredValues.d.ts +4 -0
- package/build/types/RequiredValues.js +1 -0
- package/build/types/RequiredValues.test-d.d.ts +1 -0
- package/build/types/RequiredValues.test-d.js +22 -0
- package/build/types/RestrictModels.d.ts +23 -0
- package/build/types/RestrictModels.js +1 -0
- package/build/types/RestrictModels.test-d.d.ts +1 -0
- package/build/types/RestrictModels.test-d.js +44 -0
- package/build/types/ReturningClause.d.ts +3 -0
- package/build/types/ReturningClause.js +1 -0
- package/build/types/ReturningClause.test-d.d.ts +1 -0
- package/build/types/ReturningClause.test-d.js +15 -0
- package/build/types/SelectClause.d.ts +3 -0
- package/build/types/SelectClause.js +1 -0
- package/build/types/SelectClause.test-d.d.ts +1 -0
- package/build/types/SelectClause.test-d.js +15 -0
- package/build/types/UpdateManyResult.d.ts +5 -0
- package/build/types/UpdateManyResult.js +1 -0
- package/build/types/UpdateManyResult.test-d.d.ts +1 -0
- package/build/types/UpdateManyResult.test-d.js +15 -0
- package/build/types/UpdateOneResult.d.ts +5 -0
- package/build/types/UpdateOneResult.js +1 -0
- package/build/types/UpdateOneResult.test-d.d.ts +1 -0
- package/build/types/UpdateOneResult.test-d.js +15 -0
- package/build/types/UpdateParams.d.ts +9 -0
- package/build/types/UpdateParams.js +1 -0
- package/build/types/UpdateParams.test-d.d.ts +1 -0
- package/build/types/UpdateParams.test-d.js +29 -0
- package/build/types/UpdateValues.d.ts +6 -0
- package/build/types/UpdateValues.js +1 -0
- package/build/types/UpdateValues.test-d.d.ts +1 -0
- package/build/types/UpdateValues.test-d.js +33 -0
- package/build/types/WhereClause.d.ts +29 -0
- package/build/types/WhereClause.js +1 -0
- package/build/types/WhereClause.test-d.d.ts +1 -0
- package/build/types/WhereClause.test-d.js +137 -0
- package/build/util/getIncludedToManySubqueries.d.ts +12 -0
- package/build/util/getIncludedToManySubqueries.js +63 -0
- package/build/util/getIncludedToManySubqueries.test.d.ts +1 -0
- package/build/util/getIncludedToManySubqueries.test.js +121 -0
- package/build/util/getLateralJoinValues.d.ts +4 -0
- package/build/util/getLateralJoinValues.js +30 -0
- package/build/util/getLateralJoinValues.test.d.ts +1 -0
- package/build/util/getLateralJoinValues.test.js +99 -0
- package/build/util/hasClauses.d.ts +1 -0
- package/build/util/hasClauses.js +9 -0
- package/build/util/hasClauses.test.d.ts +1 -0
- package/build/util/hasClauses.test.js +15 -0
- package/build/util/makeTableAlias.d.ts +1 -0
- package/build/util/makeTableAlias.js +10 -0
- package/build/util/makeTableAlias.test.d.ts +1 -0
- package/build/util/makeTableAlias.test.js +18 -0
- package/build/util/resultSchema.d.ts +10 -0
- package/build/util/resultSchema.js +42 -0
- package/build/util/rowToObject.d.ts +8 -0
- package/build/util/rowToObject.js +10 -0
- package/build/util/rowToObject.test.d.ts +1 -0
- package/build/util/rowToObject.test.js +68 -0
- package/package.json +67 -0
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
import { afterAll, beforeAll, beforeEach, describe, expect, test, } from "vitest";
|
|
2
|
+
import { config } from "@casekit/orm2-fixtures";
|
|
3
|
+
import { orm } from "../orm.js";
|
|
4
|
+
import { mockLogger } from "./util/logger.js";
|
|
5
|
+
describe("createMany", () => {
|
|
6
|
+
const logger = mockLogger();
|
|
7
|
+
let db;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
logger.clear();
|
|
10
|
+
});
|
|
11
|
+
beforeAll(async () => {
|
|
12
|
+
db = orm({ ...config, logger });
|
|
13
|
+
await db.connect();
|
|
14
|
+
});
|
|
15
|
+
afterAll(async () => {
|
|
16
|
+
await db.close();
|
|
17
|
+
});
|
|
18
|
+
test("creates multiple records with full values and returns specified fields", async () => {
|
|
19
|
+
await db.transact(async (db) => {
|
|
20
|
+
const users = await db.createMany("user", {
|
|
21
|
+
values: [
|
|
22
|
+
{
|
|
23
|
+
id: 1,
|
|
24
|
+
name: "Test User 1",
|
|
25
|
+
email: "user1@example.com",
|
|
26
|
+
role: "user",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: 2,
|
|
30
|
+
name: "Test User 2",
|
|
31
|
+
email: "user2@example.com",
|
|
32
|
+
role: "admin",
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
returning: ["id", "name", "role"],
|
|
36
|
+
});
|
|
37
|
+
expect(users).toHaveLength(2);
|
|
38
|
+
expect(users[0]).toEqual({
|
|
39
|
+
id: 1,
|
|
40
|
+
name: "Test User 1",
|
|
41
|
+
role: "user",
|
|
42
|
+
});
|
|
43
|
+
expect(users[1]).toEqual({
|
|
44
|
+
id: 2,
|
|
45
|
+
name: "Test User 2",
|
|
46
|
+
role: "admin",
|
|
47
|
+
});
|
|
48
|
+
// Verify records were actually created
|
|
49
|
+
const foundUsers = await db.findMany("user", {
|
|
50
|
+
select: ["id", "name", "role"],
|
|
51
|
+
orderBy: ["name"],
|
|
52
|
+
});
|
|
53
|
+
expect(foundUsers).toEqual(users);
|
|
54
|
+
}, { rollback: true });
|
|
55
|
+
});
|
|
56
|
+
test("creates records with minimal values using defaults", async () => {
|
|
57
|
+
await db.transact(async (db) => {
|
|
58
|
+
const users = await db.createMany("user", {
|
|
59
|
+
values: [
|
|
60
|
+
{
|
|
61
|
+
id: 1,
|
|
62
|
+
name: "Test User 1",
|
|
63
|
+
email: "user1@example.com",
|
|
64
|
+
role: "user",
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
id: 2,
|
|
68
|
+
name: "Test User 2",
|
|
69
|
+
email: "user2@example.com",
|
|
70
|
+
role: "user",
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
returning: ["id", "name", "deletedAt"],
|
|
74
|
+
});
|
|
75
|
+
expect(users).toHaveLength(2);
|
|
76
|
+
users.forEach((user) => {
|
|
77
|
+
expect(user.deletedAt).toBeNull();
|
|
78
|
+
});
|
|
79
|
+
}, { rollback: true });
|
|
80
|
+
});
|
|
81
|
+
test("returns row count when no returning clause specified", async () => {
|
|
82
|
+
await db.transact(async (db) => {
|
|
83
|
+
const result = await db.createMany("user", {
|
|
84
|
+
values: [
|
|
85
|
+
{
|
|
86
|
+
id: 1,
|
|
87
|
+
name: "Test User 1",
|
|
88
|
+
email: "user1@example.com",
|
|
89
|
+
role: "user",
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
id: 2,
|
|
93
|
+
name: "Test User 2",
|
|
94
|
+
email: "user2@example.com",
|
|
95
|
+
role: "user",
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
});
|
|
99
|
+
expect(result).toBe(2);
|
|
100
|
+
// Verify records were created
|
|
101
|
+
const users = await db.findMany("user", {
|
|
102
|
+
select: ["id"],
|
|
103
|
+
});
|
|
104
|
+
expect(users).toHaveLength(2);
|
|
105
|
+
}, { rollback: true });
|
|
106
|
+
});
|
|
107
|
+
test("handles empty values array", async () => {
|
|
108
|
+
await db.transact(async (db) => {
|
|
109
|
+
const result = await db.createMany("user", {
|
|
110
|
+
values: [],
|
|
111
|
+
returning: ["id", "name"],
|
|
112
|
+
});
|
|
113
|
+
expect(result).toEqual([]);
|
|
114
|
+
}, { rollback: true });
|
|
115
|
+
});
|
|
116
|
+
test("throws error on constraint violation", async () => {
|
|
117
|
+
await db.transact(async (db) => {
|
|
118
|
+
const email = "same@example.com";
|
|
119
|
+
// Create first user
|
|
120
|
+
await db.createOne("user", {
|
|
121
|
+
values: {
|
|
122
|
+
id: 1,
|
|
123
|
+
name: "First User",
|
|
124
|
+
email,
|
|
125
|
+
role: "user",
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
// Try to create more users with same email and deletedAt as null (unique constraint)
|
|
129
|
+
await expect(db.createMany("user", {
|
|
130
|
+
values: [
|
|
131
|
+
{
|
|
132
|
+
id: 1,
|
|
133
|
+
name: "Second User",
|
|
134
|
+
email, // Duplicate email with same deletedAt (null)
|
|
135
|
+
role: "user",
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
})).rejects.toThrow(/duplicate key value/);
|
|
139
|
+
}, { rollback: true });
|
|
140
|
+
});
|
|
141
|
+
test("handles onConflict do nothing with returning clause", async () => {
|
|
142
|
+
await db.transact(async (db) => {
|
|
143
|
+
const email = "test@example.com";
|
|
144
|
+
// Create first user
|
|
145
|
+
const user1 = await db.createOne("user", {
|
|
146
|
+
values: {
|
|
147
|
+
id: 1,
|
|
148
|
+
name: "Original User",
|
|
149
|
+
email,
|
|
150
|
+
role: "user",
|
|
151
|
+
},
|
|
152
|
+
returning: ["id", "name"],
|
|
153
|
+
});
|
|
154
|
+
// Try to create users including one with same email
|
|
155
|
+
const users = await db.createMany("user", {
|
|
156
|
+
values: [
|
|
157
|
+
{
|
|
158
|
+
id: 1, // Same ID
|
|
159
|
+
name: "Duplicate User",
|
|
160
|
+
email,
|
|
161
|
+
role: "user",
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
id: 2,
|
|
165
|
+
name: "New User",
|
|
166
|
+
email: "new@example.com",
|
|
167
|
+
role: "user",
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
onConflict: { do: "nothing" },
|
|
171
|
+
returning: ["id", "name"],
|
|
172
|
+
});
|
|
173
|
+
// Should only return the non-conflicting user
|
|
174
|
+
expect(users).toHaveLength(1);
|
|
175
|
+
expect(users[0].name).toBe("New User");
|
|
176
|
+
// Original user should be unchanged
|
|
177
|
+
const originalUser = await db.findOne("user", {
|
|
178
|
+
select: ["id", "name"],
|
|
179
|
+
where: { id: user1.id },
|
|
180
|
+
});
|
|
181
|
+
expect(originalUser.name).toBe("Original User");
|
|
182
|
+
}, { rollback: true });
|
|
183
|
+
});
|
|
184
|
+
test("handles onConflict do nothing without returning clause", async () => {
|
|
185
|
+
await db.transact(async (db) => {
|
|
186
|
+
const email = "test@example.com";
|
|
187
|
+
// Create first user
|
|
188
|
+
await db.createOne("user", {
|
|
189
|
+
values: {
|
|
190
|
+
id: 1,
|
|
191
|
+
name: "Original User",
|
|
192
|
+
email,
|
|
193
|
+
role: "user",
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
// Try to create users including one with same email
|
|
197
|
+
const result = await db.createMany("user", {
|
|
198
|
+
values: [
|
|
199
|
+
{
|
|
200
|
+
id: 2,
|
|
201
|
+
name: "Duplicate User",
|
|
202
|
+
email,
|
|
203
|
+
role: "user",
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
id: 3,
|
|
207
|
+
name: "New User",
|
|
208
|
+
email: "new@example.com",
|
|
209
|
+
role: "user",
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
onConflict: { do: "nothing" },
|
|
213
|
+
});
|
|
214
|
+
// Should return count of only the inserted rows
|
|
215
|
+
expect(result).toBe(1);
|
|
216
|
+
}, { rollback: true });
|
|
217
|
+
});
|
|
218
|
+
test("handles enum fields in values", async () => {
|
|
219
|
+
await db.transact(async (db) => {
|
|
220
|
+
const users = await db.createMany("user", {
|
|
221
|
+
values: [
|
|
222
|
+
{
|
|
223
|
+
id: 1,
|
|
224
|
+
name: "Admin User",
|
|
225
|
+
email: "admin@example.com",
|
|
226
|
+
role: "admin",
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
id: 2,
|
|
230
|
+
name: "Regular User",
|
|
231
|
+
email: "user@example.com",
|
|
232
|
+
role: "user",
|
|
233
|
+
},
|
|
234
|
+
],
|
|
235
|
+
returning: ["id", "name", "role"],
|
|
236
|
+
});
|
|
237
|
+
expect(users).toEqual([
|
|
238
|
+
{
|
|
239
|
+
id: 1,
|
|
240
|
+
name: "Admin User",
|
|
241
|
+
role: "admin",
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
id: 2,
|
|
245
|
+
name: "Regular User",
|
|
246
|
+
role: "user",
|
|
247
|
+
},
|
|
248
|
+
]);
|
|
249
|
+
const foundUsers = await db.findMany("user", {
|
|
250
|
+
select: ["id", "name", "role"],
|
|
251
|
+
orderBy: ["id"],
|
|
252
|
+
});
|
|
253
|
+
expect(foundUsers).toEqual(users);
|
|
254
|
+
}, { rollback: true });
|
|
255
|
+
});
|
|
256
|
+
test("handles array and JSON fields in values", async () => {
|
|
257
|
+
await db.transact(async (db) => {
|
|
258
|
+
const user = await db.createOne("user", {
|
|
259
|
+
values: {
|
|
260
|
+
id: 1,
|
|
261
|
+
name: "Test User",
|
|
262
|
+
email: "test@example.com",
|
|
263
|
+
role: "user",
|
|
264
|
+
},
|
|
265
|
+
returning: ["id"],
|
|
266
|
+
});
|
|
267
|
+
const posts = await db.createMany("post", {
|
|
268
|
+
values: [
|
|
269
|
+
{
|
|
270
|
+
title: "First Post",
|
|
271
|
+
content: "First Content",
|
|
272
|
+
authorId: user.id,
|
|
273
|
+
tags: ["first", "test", "tags"],
|
|
274
|
+
metadata: {
|
|
275
|
+
foo: "a",
|
|
276
|
+
bar: [{ baz: "good", quux: true }],
|
|
277
|
+
},
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
title: "Second Post",
|
|
281
|
+
content: "Second Content",
|
|
282
|
+
authorId: user.id,
|
|
283
|
+
tags: ["second", "example", "array"],
|
|
284
|
+
metadata: {
|
|
285
|
+
foo: "b",
|
|
286
|
+
bar: [
|
|
287
|
+
{ baz: "bad", quux: false },
|
|
288
|
+
{ baz: "good", quux: true },
|
|
289
|
+
],
|
|
290
|
+
},
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
title: "Third Post",
|
|
294
|
+
content: "Third Content",
|
|
295
|
+
authorId: user.id,
|
|
296
|
+
tags: ["third"],
|
|
297
|
+
metadata: {
|
|
298
|
+
foo: "c",
|
|
299
|
+
bar: [{ baz: "indifferent", quux: true }],
|
|
300
|
+
},
|
|
301
|
+
},
|
|
302
|
+
],
|
|
303
|
+
returning: ["id", "title", "tags", "metadata"],
|
|
304
|
+
});
|
|
305
|
+
expect(posts).toHaveLength(3);
|
|
306
|
+
expect(posts[0]).toEqual({
|
|
307
|
+
id: expect.any(Number),
|
|
308
|
+
title: "First Post",
|
|
309
|
+
tags: ["first", "test", "tags"],
|
|
310
|
+
metadata: {
|
|
311
|
+
foo: "a",
|
|
312
|
+
bar: [{ baz: "good", quux: true }],
|
|
313
|
+
},
|
|
314
|
+
});
|
|
315
|
+
expect(posts[1]).toEqual({
|
|
316
|
+
id: expect.any(Number),
|
|
317
|
+
title: "Second Post",
|
|
318
|
+
tags: ["second", "example", "array"],
|
|
319
|
+
metadata: {
|
|
320
|
+
foo: "b",
|
|
321
|
+
bar: [
|
|
322
|
+
{ baz: "bad", quux: false },
|
|
323
|
+
{ baz: "good", quux: true },
|
|
324
|
+
],
|
|
325
|
+
},
|
|
326
|
+
});
|
|
327
|
+
expect(posts[2]).toEqual({
|
|
328
|
+
id: expect.any(Number),
|
|
329
|
+
title: "Third Post",
|
|
330
|
+
tags: ["third"],
|
|
331
|
+
metadata: {
|
|
332
|
+
foo: "c",
|
|
333
|
+
bar: [{ baz: "indifferent", quux: true }],
|
|
334
|
+
},
|
|
335
|
+
});
|
|
336
|
+
// Verify the array and JSON fields were stored correctly
|
|
337
|
+
const foundPosts = await db.findMany("post", {
|
|
338
|
+
select: ["id", "title", "tags", "metadata"],
|
|
339
|
+
orderBy: ["id"],
|
|
340
|
+
});
|
|
341
|
+
expect(foundPosts).toEqual(posts);
|
|
342
|
+
}, { rollback: true });
|
|
343
|
+
});
|
|
344
|
+
// TODO comment back in once relationships are implemented
|
|
345
|
+
test.skip("can create posts with relationship to user", async () => {
|
|
346
|
+
await db.transact(async (db) => {
|
|
347
|
+
// Create a user first
|
|
348
|
+
const user = await db.createOne("user", {
|
|
349
|
+
values: {
|
|
350
|
+
id: 1,
|
|
351
|
+
name: "Test User",
|
|
352
|
+
email: "test@example.com",
|
|
353
|
+
role: "user",
|
|
354
|
+
},
|
|
355
|
+
returning: ["id"],
|
|
356
|
+
});
|
|
357
|
+
// Create multiple posts for the user
|
|
358
|
+
const posts = await db.createMany("post", {
|
|
359
|
+
values: [
|
|
360
|
+
{
|
|
361
|
+
title: "First Post",
|
|
362
|
+
content: "Hello World 1",
|
|
363
|
+
authorId: user.id,
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
title: "Second Post",
|
|
367
|
+
content: "Hello World 2",
|
|
368
|
+
authorId: user.id,
|
|
369
|
+
},
|
|
370
|
+
],
|
|
371
|
+
returning: ["id", "title", "authorId"],
|
|
372
|
+
});
|
|
373
|
+
expect(posts).toHaveLength(2);
|
|
374
|
+
posts.forEach((post) => {
|
|
375
|
+
expect(post.authorId).toBe(user.id);
|
|
376
|
+
expect(post).toHaveProperty("title");
|
|
377
|
+
expect(post).toHaveProperty("id");
|
|
378
|
+
});
|
|
379
|
+
// Verify the relationship works
|
|
380
|
+
const userWithPosts = await db.findOne("user", {
|
|
381
|
+
select: ["id"],
|
|
382
|
+
include: {
|
|
383
|
+
posts: {
|
|
384
|
+
select: ["id", "title"],
|
|
385
|
+
},
|
|
386
|
+
},
|
|
387
|
+
where: { id: user.id },
|
|
388
|
+
});
|
|
389
|
+
expect(userWithPosts.posts).toHaveLength(2);
|
|
390
|
+
}, { rollback: true });
|
|
391
|
+
});
|
|
392
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { afterAll, beforeAll, beforeEach, describe, expect, test, vi, } from "vitest";
|
|
2
|
+
import { config } from "@casekit/orm2-fixtures";
|
|
3
|
+
import { orm } from "../orm.js";
|
|
4
|
+
import { mockLogger } from "./util/logger.js";
|
|
5
|
+
describe("orm.createOne: middleware", () => {
|
|
6
|
+
const logger = mockLogger();
|
|
7
|
+
let db;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
logger.clear();
|
|
10
|
+
});
|
|
11
|
+
beforeAll(async () => {
|
|
12
|
+
db = orm({ ...config, logger });
|
|
13
|
+
await db.connect();
|
|
14
|
+
});
|
|
15
|
+
afterAll(async () => {
|
|
16
|
+
await db.close();
|
|
17
|
+
});
|
|
18
|
+
describe("createOne middleware", () => {
|
|
19
|
+
test("it allows overriding the orm's createOne method", async () => {
|
|
20
|
+
await db.transact(async (db) => {
|
|
21
|
+
const stub = vi.fn();
|
|
22
|
+
const dbWithMiddleware = db.middleware([
|
|
23
|
+
{
|
|
24
|
+
createOne: (db, table, query) => {
|
|
25
|
+
stub("called stub in middleware 1");
|
|
26
|
+
return db.createOne(table, query);
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
createOne: (db, table, query) => {
|
|
31
|
+
stub("called stub in middleware 2");
|
|
32
|
+
return db.createOne(table, query);
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
]);
|
|
36
|
+
const result = await dbWithMiddleware.createOne("user", {
|
|
37
|
+
values: {
|
|
38
|
+
name: "Test User",
|
|
39
|
+
email: "test@example.com",
|
|
40
|
+
role: "user",
|
|
41
|
+
},
|
|
42
|
+
returning: ["id", "name"],
|
|
43
|
+
});
|
|
44
|
+
expect(result).toMatchObject({
|
|
45
|
+
name: "Test User",
|
|
46
|
+
});
|
|
47
|
+
expect(stub.mock.calls).toEqual([
|
|
48
|
+
["called stub in middleware 1"],
|
|
49
|
+
["called stub in middleware 2"],
|
|
50
|
+
]);
|
|
51
|
+
}, { rollback: true });
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { assertType, describe, expectTypeOf, test } from "vitest";
|
|
2
|
+
import { models } from "@casekit/orm2-fixtures";
|
|
3
|
+
import { orm } from "../orm.js";
|
|
4
|
+
const db = orm({ models });
|
|
5
|
+
describe("createOne types", () => {
|
|
6
|
+
test("values is required", () => {
|
|
7
|
+
assertType(db.createOne("post",
|
|
8
|
+
// @ts-expect-error - values is required
|
|
9
|
+
{}));
|
|
10
|
+
});
|
|
11
|
+
test("values must match model fields", () => {
|
|
12
|
+
assertType(db.createOne("post", {
|
|
13
|
+
values: {
|
|
14
|
+
// @ts-expect-error - wrong is not a column
|
|
15
|
+
wrong: "value",
|
|
16
|
+
},
|
|
17
|
+
}));
|
|
18
|
+
});
|
|
19
|
+
test("returning fields must exist on model", () => {
|
|
20
|
+
assertType(db.createOne("post", {
|
|
21
|
+
values: {
|
|
22
|
+
title: "test",
|
|
23
|
+
content: "content",
|
|
24
|
+
authorId: 123,
|
|
25
|
+
},
|
|
26
|
+
returning: [
|
|
27
|
+
// @ts-expect-error - wrong is not a column
|
|
28
|
+
"wrong",
|
|
29
|
+
],
|
|
30
|
+
}));
|
|
31
|
+
});
|
|
32
|
+
test("missing required fields", () => {
|
|
33
|
+
assertType(db.createOne("post", {
|
|
34
|
+
// @ts-expect-error - missing required fields
|
|
35
|
+
values: {
|
|
36
|
+
title: "test",
|
|
37
|
+
},
|
|
38
|
+
}));
|
|
39
|
+
});
|
|
40
|
+
test("valid create params with returning clause", async () => {
|
|
41
|
+
expectTypeOf(await db.createOne("post", {
|
|
42
|
+
values: {
|
|
43
|
+
title: "test",
|
|
44
|
+
content: "content",
|
|
45
|
+
authorId: 123,
|
|
46
|
+
},
|
|
47
|
+
returning: ["id", "title"],
|
|
48
|
+
onConflict: {
|
|
49
|
+
do: "nothing",
|
|
50
|
+
},
|
|
51
|
+
})).toEqualTypeOf();
|
|
52
|
+
});
|
|
53
|
+
test("valid create params without returning clause", async () => {
|
|
54
|
+
expectTypeOf(await db.createOne("user", {
|
|
55
|
+
values: {
|
|
56
|
+
name: "test",
|
|
57
|
+
email: "test@example.com",
|
|
58
|
+
role: "user",
|
|
59
|
+
},
|
|
60
|
+
onConflict: {
|
|
61
|
+
do: "nothing",
|
|
62
|
+
},
|
|
63
|
+
})).toEqualTypeOf();
|
|
64
|
+
});
|
|
65
|
+
test("works with enum fields", async () => {
|
|
66
|
+
expectTypeOf(await db.createOne("user", {
|
|
67
|
+
values: {
|
|
68
|
+
name: "test",
|
|
69
|
+
email: "test@example.com",
|
|
70
|
+
role: "user",
|
|
71
|
+
},
|
|
72
|
+
returning: ["id"],
|
|
73
|
+
})).toEqualTypeOf();
|
|
74
|
+
});
|
|
75
|
+
test("enum fields are returned as enum types", async () => {
|
|
76
|
+
expectTypeOf(await db.createOne("user", {
|
|
77
|
+
values: {
|
|
78
|
+
name: "test",
|
|
79
|
+
email: "test@example.com",
|
|
80
|
+
role: "user",
|
|
81
|
+
},
|
|
82
|
+
returning: ["id", "role", "deletedAt"],
|
|
83
|
+
})).toEqualTypeOf();
|
|
84
|
+
});
|
|
85
|
+
test("handles array fields", async () => {
|
|
86
|
+
expectTypeOf(await db.createOne("post", {
|
|
87
|
+
values: {
|
|
88
|
+
title: "test",
|
|
89
|
+
content: "test content",
|
|
90
|
+
authorId: 123,
|
|
91
|
+
tags: ["test", "example"],
|
|
92
|
+
},
|
|
93
|
+
returning: ["id", "tags"],
|
|
94
|
+
})).toEqualTypeOf();
|
|
95
|
+
});
|
|
96
|
+
test("handles json fields", async () => {
|
|
97
|
+
expectTypeOf(await db.createOne("post", {
|
|
98
|
+
values: {
|
|
99
|
+
title: "test",
|
|
100
|
+
content: "test content",
|
|
101
|
+
authorId: 123,
|
|
102
|
+
metadata: {
|
|
103
|
+
foo: "b",
|
|
104
|
+
bar: [
|
|
105
|
+
{ baz: "good", quux: true },
|
|
106
|
+
{ baz: "bad", quux: false },
|
|
107
|
+
],
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
returning: ["id", "metadata"],
|
|
111
|
+
})).toEqualTypeOf();
|
|
112
|
+
});
|
|
113
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|