-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest.ts
149 lines (130 loc) · 3.98 KB
/
test.ts
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import "reflect-metadata";
import { afterEach, beforeEach, test } from "node:test";
import { DataSource, createConnection } from "typeorm";
import { TypeORMOptimisticLockTest } from "./test.entity";
import { typeormOptimisticLockSave } from "./index";
import assert from "assert";
let connection: DataSource;
beforeEach(async () => {
connection = await createConnection({
entities: ["test.entity.ts"],
type: "postgres",
database: "postgres",
username: "postgres",
password: "postgres",
synchronize: true,
});
await connection.getRepository(TypeORMOptimisticLockTest).clear();
});
afterEach(async () => {
await connection.destroy();
});
test("basic insert works", async () => {
await typeormOptimisticLockSave({
repository: connection.getRepository(TypeORMOptimisticLockTest),
conflictError: new Error("test"),
forInsert: { id: 1, text: "foo bar", version: 1 },
});
const entity = await connection
.getRepository(TypeORMOptimisticLockTest)
.findOneBy({ id: 1 });
assert.ok(entity);
assert.strictEqual(entity.text, "foo bar");
assert.strictEqual(entity.version, 1);
});
test("fails with conflict on insert", async () => {
await connection.getRepository(TypeORMOptimisticLockTest).save({
id: 1,
text: "foo bar",
version: 1,
});
const conflictError = new Error("test");
await assert.rejects(
() =>
typeormOptimisticLockSave({
repository: connection.getRepository(TypeORMOptimisticLockTest),
conflictError,
forInsert: { id: 1, text: "foo bar", version: 1 },
}),
conflictError
);
});
test("basic update works", async () => {
await connection.getRepository(TypeORMOptimisticLockTest).save({
id: 1,
text: "foo bar",
version: 1,
});
await typeormOptimisticLockSave({
repository: connection.getRepository(TypeORMOptimisticLockTest),
conflictError: new Error("test"),
forUpdate: { id: 1, text: "test", version: 2 },
whereUpdate: { id: 1, version: 1 },
});
const entity = await connection
.getRepository(TypeORMOptimisticLockTest)
.findOneBy({ id: 1 });
assert.ok(entity);
assert.strictEqual(entity.text, "test");
assert.strictEqual(entity.version, 2);
});
test("fails with conflict on update", async () => {
await connection.getRepository(TypeORMOptimisticLockTest).save({
id: 1,
text: "another update",
version: 2,
});
const conflictError = new Error("test");
await assert.rejects(
() =>
typeormOptimisticLockSave({
repository: connection.getRepository(TypeORMOptimisticLockTest),
conflictError,
forUpdate: { id: 1, text: "test", version: 2 },
whereUpdate: { id: 1, version: 1 },
}),
conflictError
);
});
test("any persistance option should be provided", async () => {
const error = new Error(
"For updating 'forUpdate', 'whereUpdate' options should be provided, for inserting 'forInsert' accordingly"
);
await assert.rejects(
() =>
typeormOptimisticLockSave({
repository: connection.getRepository(TypeORMOptimisticLockTest),
conflictError: error,
}),
error
);
});
test("version: 1 required for inserting", async () => {
const error = new Error(
"forInsert.version: 1 should be passed for inserting"
);
await assert.rejects(
() =>
typeormOptimisticLockSave({
repository: connection.getRepository(TypeORMOptimisticLockTest),
conflictError: error,
forInsert: { id: 1, text: "foo bar", version: -1 },
}),
error
);
});
test("for updating versions should be differ by 1", async () => {
const error = new Error(
"For updating whereUpdate.version: n and forUpdate.version: n + 1 should be provided"
);
await assert.rejects(
() =>
typeormOptimisticLockSave({
repository: connection.getRepository(TypeORMOptimisticLockTest),
conflictError: error,
forUpdate: { id: 1, text: "test", version: 3 },
whereUpdate: { id: 1, version: 1 },
}),
error
);
});