prisma-mock 0.11.1 → 0.11.2

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/lib/delegate.js CHANGED
@@ -10,6 +10,7 @@ const errors_1 = require("./errors");
10
10
  const fieldHelpers_1 = require("./utils/fieldHelpers");
11
11
  const queryMatching_1 = __importDefault(require("./utils/queryMatching"));
12
12
  const shallowCompare_1 = require("./utils/shallowCompare");
13
+ const getWhereOnIds_1 = __importDefault(require("./utils/getWhereOnIds"));
13
14
  /**
14
15
  * Creates a delegate function that handles Prisma-like operations for a specific model
15
16
  * This is the main factory function that generates model-specific CRUD operations
@@ -600,6 +601,7 @@ indexes) => {
600
601
  */
601
602
  const updateMany = (args) => {
602
603
  let nbUpdated = 0;
604
+ const wheres = [];
603
605
  const newItems = ref.data[prop].map((e) => {
604
606
  if (matchFnc(args.where)(e)) {
605
607
  let data = nestedUpdate(args, false, e);
@@ -609,6 +611,7 @@ indexes) => {
609
611
  ...data,
610
612
  };
611
613
  indexes.updateItem(prop, newItem, e);
614
+ wheres.push((0, getWhereOnIds_1.default)(model, newItem));
612
615
  return newItem;
613
616
  }
614
617
  return e;
@@ -618,7 +621,12 @@ indexes) => {
618
621
  [prop]: newItems,
619
622
  };
620
623
  ref.data = (0, fieldHelpers_1.removeMultiFieldIds)(model, ref.data);
621
- return { data: ref.data, nbUpdated };
624
+ const data = findMany({
625
+ where: {
626
+ OR: wheres
627
+ }, include: args.include
628
+ });
629
+ return { data, nbUpdated };
622
630
  };
623
631
  /**
624
632
  * Creates a new record with the given data
@@ -636,23 +644,7 @@ indexes) => {
636
644
  };
637
645
  ref.data = (0, fieldHelpers_1.removeMultiFieldIds)(model, ref.data);
638
646
  // Create where clause from unique identifier fields for index update
639
- let where = {};
640
- const fields = model.primaryKey?.fields;
641
- if (!fields || fields.length === 0) {
642
- for (const field of model.fields) {
643
- if (field.isId) {
644
- where[field.name] = d[field.name];
645
- }
646
- }
647
- }
648
- else if (fields.length > 1) {
649
- for (const field of fields) {
650
- where[field] = d[field];
651
- }
652
- where = {
653
- [fields.join("_")]: where
654
- };
655
- }
647
+ let where = (0, getWhereOnIds_1.default)(model, d);
656
648
  const item = findOne({ where, ...args });
657
649
  indexes.updateItem(prop, item, null);
658
650
  return item;
@@ -1078,6 +1070,10 @@ indexes) => {
1078
1070
  const createdItems = createMany(args);
1079
1071
  return { count: createdItems.length };
1080
1072
  },
1073
+ createManyAndReturn: (args) => {
1074
+ const createdItems = createMany(args);
1075
+ return createdItems;
1076
+ },
1081
1077
  delete: (args) => {
1082
1078
  const item = findOne(args);
1083
1079
  if (!item) {
@@ -1098,6 +1094,10 @@ indexes) => {
1098
1094
  const { nbUpdated } = updateMany(args);
1099
1095
  return { count: nbUpdated };
1100
1096
  },
1097
+ updateManyAndReturn: (args) => {
1098
+ const { data, nbUpdated } = updateMany(args);
1099
+ return data;
1100
+ },
1101
1101
  /**
1102
1102
  * Upsert operation: update if exists, create if not
1103
1103
  */
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function getWhereOnIds(model, item) {
4
+ let where = {};
5
+ const fields = model.primaryKey?.fields;
6
+ if (!fields || fields.length === 0) {
7
+ for (const field of model.fields) {
8
+ if (field.isId) {
9
+ where[field.name] = item[field.name];
10
+ }
11
+ }
12
+ }
13
+ else if (fields.length > 1) {
14
+ for (const field of fields) {
15
+ where[field] = item[field];
16
+ }
17
+ where = {
18
+ [fields.join("_")]: where
19
+ };
20
+ }
21
+ return where;
22
+ }
23
+ exports.default = getWhereOnIds;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prisma-mock",
3
- "version": "0.11.1",
3
+ "version": "0.11.2",
4
4
  "description": "Mock prisma for unit testing database",
5
5
  "main": "lib/index.js",
6
6
  "repository": {
@@ -13,28 +13,35 @@
13
13
  "lib/"
14
14
  ],
15
15
  "devDependencies": {
16
- "@prisma/client": "5.13.0",
16
+ "@changesets/cli": "^2.29.5",
17
+ "@prisma/client": "6.11.1",
17
18
  "@types/jest": "^27.0.2",
18
19
  "cross-spawn": "^7.0.3",
19
20
  "env-cmd": "^10.1.0",
20
21
  "jest": "^27.3.1",
21
- "prisma": "5.13.0",
22
+ "prisma": "6.11.1",
22
23
  "ts-jest": "^27.0.7",
23
24
  "typescript": "^4.4.4",
24
25
  "uuid": "^9.0.0"
25
26
  },
26
27
  "scripts": {
27
28
  "preversion": "jest && tsc",
29
+ "lint": "tsc --noEmit",
28
30
  "build": "tsc",
29
31
  "test": "jest",
30
32
  "generate": "prisma generate",
33
+ "release": "yarn build && changeset publish && git push --follow-tags",
31
34
  "watch": "tsc --watch",
32
- "test:postgres": "env-cmd -e postgres jest --maxWorkers=1"
35
+ "test:postgres": "env-cmd -e postgres jest --maxWorkers=1",
36
+ "changeset": "changeset",
37
+ "changeset:add": "changeset add",
38
+ "changeset:validate:ci": "changeset status --since=origin/main --verbose"
33
39
  },
34
40
  "peerDependencies": {
35
41
  "@prisma/client": "^3.5.0 || ^4.7.0 || ^5.0.0 || ^6.0.0"
36
42
  },
37
43
  "dependencies": {
38
44
  "jest-mock-extended": "^3.0.6"
39
- }
45
+ },
46
+ "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
40
47
  }
@@ -1,4 +0,0 @@
1
- import { Prisma } from "@prisma/client";
2
- import { PrismaMockData } from "..";
3
- export default function autoincrement<P>(prop: string, field: Prisma.DMMF.Field, data?: PrismaMockData<P>): Number | BigInt;
4
- export declare function reset(): void;
@@ -1,3 +0,0 @@
1
- declare const Cuid: () => string;
2
- export declare function ResetCuid(): void;
3
- export default Cuid;
@@ -1,4 +0,0 @@
1
- import { Prisma } from "@prisma/client";
2
- import { PrismaMockData } from "..";
3
- export default function HandleDefault<P>(prop: string, field: Prisma.DMMF.Field, data: PrismaMockData<P>): any;
4
- export declare function ResetDefaults(): void;
@@ -1,2 +0,0 @@
1
- declare const Now: () => Date;
2
- export default Now;
@@ -1,3 +0,0 @@
1
- declare const Uuid: () => string;
2
- export declare function ResetUuid(): void;
3
- export default Uuid;
package/lib/index.d.ts DELETED
@@ -1,20 +0,0 @@
1
- import { Prisma } from "@prisma/client";
2
- type UnwrapPromise<P extends any> = P extends Promise<infer R> ? R : P;
3
- type PrismaDelegate = {
4
- findUnique: (...args: Array<any>) => Promise<any>;
5
- };
6
- type IsTable<S> = S extends `\$${infer fnc}` ? never : S;
7
- type IsString<S extends any> = S extends string ? S : never;
8
- type PrismaList<P extends {
9
- [key: string]: any;
10
- }, K extends string> = P[K] extends PrismaDelegate ? Array<Partial<UnwrapPromise<ReturnType<P[K]["findUnique"]>>>> : never;
11
- export type PrismaMockData<P> = Partial<{
12
- [key in IsTable<Uncapitalize<IsString<keyof P>>>]: PrismaList<P, key>;
13
- }>;
14
- export type MockPrismaOptions = {
15
- caseInsensitive?: boolean;
16
- };
17
- declare const createPrismaMock: <P>(data?: Partial<{ [key in IsTable<Uncapitalize<IsString<keyof P>>>]: PrismaList<P, key>; }>, datamodel?: Prisma.DMMF.Datamodel, client?: { [K in keyof P]: P[K] extends (...args: infer A) => infer B ? import("jest-mock-extended").CalledWithMock<B, A> & (P[K] extends infer T extends (...args: infer A) => infer B ? { [K_1 in keyof T]: P[K][K_1] extends (...args: infer A_1) => infer B_1 ? import("jest-mock-extended").CalledWithMock<B_1, A_1> & (P[K][K_1] extends infer T_1 extends (...args: infer A_1) => infer B_1 ? { [K_2 in keyof T_1]: P[K][K_1][K_2] extends (...args: infer A_2) => infer B_2 ? import("jest-mock-extended").CalledWithMock<B_2, A_2> & (P[K][K_1][K_2] extends infer T_2 extends (...args: infer A_2) => infer B_2 ? { [K_3 in keyof T_2]: P[K][K_1][K_2][K_3] extends (...args: infer A_3) => infer B_3 ? import("jest-mock-extended").CalledWithMock<B_3, A_3> & (P[K][K_1][K_2][K_3] extends infer T_3 extends (...args: infer A_3) => infer B_3 ? { [K_4 in keyof T_3]: P[K][K_1][K_2][K_3][K_4] extends (...args: infer A_4) => infer B_4 ? import("jest-mock-extended").CalledWithMock<B_4, A_4> & (P[K][K_1][K_2][K_3][K_4] extends infer T_4 extends (...args: infer A_4) => infer B_4 ? { [K_5 in keyof T_4]: P[K][K_1][K_2][K_3][K_4][K_5] extends (...args: infer A_5) => infer B_5 ? import("jest-mock-extended").CalledWithMock<B_5, A_5> & (P[K][K_1][K_2][K_3][K_4][K_5] extends infer T_5 extends (...args: infer A_5) => infer B_5 ? { [K_6 in keyof T_5]: P[K][K_1][K_2][K_3][K_4][K_5][K_6] extends (...args: infer A_6) => infer B_6 ? import("jest-mock-extended").CalledWithMock<B_6, A_6> & (P[K][K_1][K_2][K_3][K_4][K_5][K_6] extends infer T_6 extends (...args: infer A_6) => infer B_6 ? { [K_7 in keyof T_6]: P[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7] extends (...args: infer A_7) => infer B_7 ? import("jest-mock-extended").CalledWithMock<B_7, A_7> & (P[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7] extends infer T_7 extends (...args: infer A_7) => infer B_7 ? { [K_8 in keyof T_7]: P[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8] extends (...args: infer A_8) => infer B_8 ? import("jest-mock-extended").CalledWithMock<B_8, A_8> & (P[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8] extends infer T_8 extends (...args: infer A_8) => infer B_8 ? { [K_9 in keyof T_8]: P[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9] extends (...args: infer A_9) => infer B_9 ? import("jest-mock-extended").CalledWithMock<B_9, A_9> & (P[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9] extends infer T_9 extends (...args: infer A_9) => infer B_9 ? { [K_10 in keyof T_9]: P[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9][K_10] extends (...args: infer A_10) => infer B_10 ? any : import("jest-mock-extended").DeepMockProxy<P[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9][K_10]>; } : never) & P[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9] : import("jest-mock-extended").DeepMockProxy<P[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9]>; } : never) & P[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8] : import("jest-mock-extended").DeepMockProxy<P[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8]>; } : never) & P[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7] : import("jest-mock-extended").DeepMockProxy<P[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7]>; } : never) & P[K][K_1][K_2][K_3][K_4][K_5][K_6] : import("jest-mock-extended").DeepMockProxy<P[K][K_1][K_2][K_3][K_4][K_5][K_6]>; } : never) & P[K][K_1][K_2][K_3][K_4][K_5] : import("jest-mock-extended").DeepMockProxy<P[K][K_1][K_2][K_3][K_4][K_5]>; } : never) & P[K][K_1][K_2][K_3][K_4] : import("jest-mock-extended").DeepMockProxy<P[K][K_1][K_2][K_3][K_4]>; } : never) & P[K][K_1][K_2][K_3] : import("jest-mock-extended").DeepMockProxy<P[K][K_1][K_2][K_3]>; } : never) & P[K][K_1][K_2] : import("jest-mock-extended").DeepMockProxy<P[K][K_1][K_2]>; } : never) & P[K][K_1] : import("jest-mock-extended").DeepMockProxy<P[K][K_1]>; } : never) & P[K] : import("jest-mock-extended").DeepMockProxy<P[K]>; } & P, options?: MockPrismaOptions) => P & {
18
- $getInternalState: () => Required<Partial<{ [key in IsTable<Uncapitalize<IsString<keyof P>>>]: PrismaList<P, key>; }>>;
19
- };
20
- export default createPrismaMock;
package/lib/indexes.d.ts DELETED
@@ -1,7 +0,0 @@
1
- import { Prisma } from "@prisma/client";
2
- export default function createIndexes(): {
3
- addIndexFieldIfNeeded: (tableName: string, field: Prisma.DMMF.Field) => void;
4
- getIndexedItems: (tableName: string, where: any) => any;
5
- updateItem: (tableName: string, item: any, oldItem: any | null) => void;
6
- deleteItemByField: (tableName: string, field: Prisma.DMMF.Field, item: any) => void;
7
- };
@@ -1 +0,0 @@
1
- export {};
@@ -1,193 +0,0 @@
1
- "use strict";
2
- // @ts-nocheck
3
- var __importDefault = (this && this.__importDefault) || function (mod) {
4
- return (mod && mod.__esModule) ? mod : { "default": mod };
5
- };
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- const indexes_1 = __importDefault(require("./indexes"));
8
- test("createIndexes", () => {
9
- const indexes = (0, indexes_1.default)();
10
- indexes.addIndexFieldIfNeeded("User", {
11
- name: "id",
12
- isId: true
13
- });
14
- indexes.addIndexFieldIfNeeded("User", {
15
- name: "account",
16
- relationFromFields: ["accountId"]
17
- });
18
- indexes.updateItem("User", {
19
- id: 1,
20
- name: "Alice",
21
- accountId: 1
22
- });
23
- const items1 = indexes.getIndexedItems("User", {
24
- accountId: 1
25
- });
26
- expect(items1).toMatchInlineSnapshot(`
27
- Array [
28
- Object {
29
- "accountId": 1,
30
- "id": 1,
31
- "name": "Alice",
32
- },
33
- ]
34
- `);
35
- indexes.updateItem("User", {
36
- id: 1,
37
- name: "Alice 2",
38
- accountId: 1
39
- });
40
- const items2 = indexes.getIndexedItems("User", {
41
- accountId: 1
42
- });
43
- expect(items2).toMatchInlineSnapshot(`
44
- Array [
45
- Object {
46
- "accountId": 1,
47
- "id": 1,
48
- "name": "Alice 2",
49
- },
50
- ]
51
- `);
52
- });
53
- test("Index should be removed when set to null", () => {
54
- const indexes = (0, indexes_1.default)();
55
- indexes.addIndexFieldIfNeeded("User", {
56
- name: "id",
57
- isId: true
58
- });
59
- indexes.addIndexFieldIfNeeded("User", {
60
- name: "account",
61
- relationFromFields: ["accountId"]
62
- });
63
- indexes.updateItem("User", {
64
- id: 1,
65
- name: "Alice",
66
- accountId: 1
67
- });
68
- indexes.updateItem("User", {
69
- id: 2,
70
- name: "Piet",
71
- accountId: 1
72
- });
73
- const items1 = indexes.getIndexedItems("User", {
74
- accountId: 1
75
- });
76
- expect(items1).toMatchInlineSnapshot(`
77
- Array [
78
- Object {
79
- "accountId": 1,
80
- "id": 1,
81
- "name": "Alice",
82
- },
83
- Object {
84
- "accountId": 1,
85
- "id": 2,
86
- "name": "Piet",
87
- },
88
- ]
89
- `);
90
- indexes.updateItem("User", {
91
- id: 1,
92
- name: "Alice",
93
- accountId: null
94
- }, {
95
- id: 1,
96
- name: "Alice",
97
- accountId: 1,
98
- });
99
- const items2 = indexes.getIndexedItems("User", {
100
- accountId: 1
101
- });
102
- expect(items2).toMatchInlineSnapshot(`
103
- Array [
104
- Object {
105
- "accountId": 1,
106
- "id": 2,
107
- "name": "Piet",
108
- },
109
- ]
110
- `);
111
- });
112
- test("Should add multiple items", () => {
113
- const indexes = (0, indexes_1.default)();
114
- indexes.addIndexFieldIfNeeded("User", {
115
- name: "id",
116
- isId: true
117
- });
118
- indexes.addIndexFieldIfNeeded("User", {
119
- name: "account",
120
- relationFromFields: ["accountId"]
121
- });
122
- indexes.updateItem("User", {
123
- id: 1,
124
- name: "Alice",
125
- accountId: 1
126
- });
127
- indexes.updateItem("User", {
128
- id: 2,
129
- name: "Alice 2",
130
- accountId: 1
131
- });
132
- indexes.updateItem("User", {
133
- id: 3,
134
- name: "Alice 3",
135
- accountId: 1
136
- });
137
- const items = indexes.getIndexedItems("User", {
138
- accountId: 1
139
- });
140
- expect(items).toMatchInlineSnapshot(`
141
- Array [
142
- Object {
143
- "accountId": 1,
144
- "id": 1,
145
- "name": "Alice",
146
- },
147
- Object {
148
- "accountId": 1,
149
- "id": 2,
150
- "name": "Alice 2",
151
- },
152
- Object {
153
- "accountId": 1,
154
- "id": 3,
155
- "name": "Alice 3",
156
- },
157
- ]
158
- `);
159
- });
160
- test("Should not make multiple items when has mulitple primary keys", () => {
161
- const indexes = (0, indexes_1.default)();
162
- indexes.addIndexFieldIfNeeded("UserAnswers", {
163
- name: "answerId",
164
- isId: false
165
- }, true);
166
- indexes.addIndexFieldIfNeeded("UserAnswers", {
167
- name: "userId",
168
- isId: false
169
- }, true);
170
- indexes.updateItem("UserAnswers", {
171
- userId: 1,
172
- name: "Alice",
173
- accountId: 1
174
- });
175
- indexes.updateItem("UserAnswers", {
176
- userId: 1,
177
- name: "Alice 2",
178
- accountId: 1
179
- });
180
- const items = indexes.getIndexedItems("UserAnswers", {
181
- accountId: 1,
182
- userId: 1,
183
- });
184
- expect(items).toMatchInlineSnapshot(`
185
- Array [
186
- Object {
187
- "accountId": 1,
188
- "name": "Alice 2",
189
- "userId": 1,
190
- },
191
- ]
192
- `);
193
- });
@@ -1 +0,0 @@
1
- export declare function deepCopy<T>(source: T): T;
@@ -1 +0,0 @@
1
- export declare function deepEqual(a: any, b: any): boolean;
@@ -1 +0,0 @@
1
- export default function getNestedValue(keys: string[], values: any): any;
@@ -1 +0,0 @@
1
- export default function pad(s: string, size: number): string;
@@ -1,5 +0,0 @@
1
- export declare const shallowCompare: (a: {
2
- [key: string]: any;
3
- }, b: {
4
- [key: string]: any;
5
- }) => boolean;