@proteinjs/db-driver-knex 1.13.9 → 1.14.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.
- package/CHANGELOG.md +17 -0
- package/README.md +10 -0
- package/dist/generated/index.js +1 -1
- package/dist/generated/index.js.map +1 -1
- package/dist/generated/test/index.js +1 -1
- package/dist/generated/test/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/src/KnexDriver.d.ts +66 -0
- package/dist/src/KnexDriver.d.ts.map +1 -1
- package/dist/src/KnexDriver.js +181 -1
- package/dist/src/KnexDriver.js.map +1 -1
- package/dist/src/KnexLogValues.d.ts +38 -0
- package/dist/src/KnexLogValues.d.ts.map +1 -0
- package/dist/src/KnexLogValues.js +47 -0
- package/dist/src/KnexLogValues.js.map +1 -0
- package/dist/test/LogValuesSwitch.test.d.ts +2 -0
- package/dist/test/LogValuesSwitch.test.d.ts.map +1 -0
- package/dist/test/LogValuesSwitch.test.js +255 -0
- package/dist/test/LogValuesSwitch.test.js.map +1 -0
- package/dist/test/StatementLogNeverThrows.test.d.ts +2 -0
- package/dist/test/StatementLogNeverThrows.test.d.ts.map +1 -0
- package/dist/test/StatementLogNeverThrows.test.js +541 -0
- package/dist/test/StatementLogNeverThrows.test.js.map +1 -0
- package/dist/test/StatementParamLogging.test.d.ts +2 -0
- package/dist/test/StatementParamLogging.test.d.ts.map +1 -0
- package/dist/test/StatementParamLogging.test.js +403 -0
- package/dist/test/StatementParamLogging.test.js.map +1 -0
- package/dist/test/util/printedLine.d.ts +20 -0
- package/dist/test/util/printedLine.d.ts.map +1 -0
- package/dist/test/util/printedLine.js +48 -0
- package/dist/test/util/printedLine.js.map +1 -0
- package/generated/index.ts +1 -1
- package/generated/test/index.ts +1 -1
- package/index.ts +1 -0
- package/package.json +4 -4
- package/src/KnexDriver.ts +191 -2
- package/src/KnexLogValues.ts +42 -0
- package/test/LogValuesSwitch.test.ts +201 -0
- package/test/StatementLogNeverThrows.test.ts +466 -0
- package/test/StatementParamLogging.test.ts +313 -0
- package/test/util/printedLine.ts +43 -0
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
50
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
51
|
+
};
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
var knex_1 = __importDefault(require("knex"));
|
|
54
|
+
var util_1 = require("util");
|
|
55
|
+
var db_driver_knex_1 = require("@proteinjs/db-driver-knex");
|
|
56
|
+
var logger_1 = require("@proteinjs/logger");
|
|
57
|
+
var printedLine_1 = require("./util/printedLine");
|
|
58
|
+
/**
|
|
59
|
+
* Writing a log line can NEVER change what the driver throws. The failure line is written on the
|
|
60
|
+
* way to `throw error`, so anything that goes wrong while building or writing it would replace the
|
|
61
|
+
* vendor's error with its own — a caller that matches on the vendor's code would stop matching, and
|
|
62
|
+
* the failure line itself would be lost.
|
|
63
|
+
*
|
|
64
|
+
* Two layers hold that, and this suite holds both:
|
|
65
|
+
*
|
|
66
|
+
* - the helpers that build the line (`describeParams`, `causeSummary`) are TOTAL: whatever they
|
|
67
|
+
* are handed — positional bindings, a bindings dictionary, nothing, null, a scalar, a Map, a
|
|
68
|
+
* value whose accessor or `toJSON` throws, a proxy that refuses everything — they return a
|
|
69
|
+
* description and never a value;
|
|
70
|
+
* - the line is written through ONE guarded door (`writeStatementLine`): if building or writing it
|
|
71
|
+
* throws anyway — a log writer that is down, a serializer meeting a value it cannot print — the
|
|
72
|
+
* failure is reported as one FIXED line that carries nothing of the statement, and the driver
|
|
73
|
+
* goes on to throw exactly what it was going to throw.
|
|
74
|
+
*
|
|
75
|
+
* No server is needed: the REAL query layer and dialect run over a stub connection that rejects
|
|
76
|
+
* the way the client library does. The stub server's message quotes no bound value (what the
|
|
77
|
+
* SERVER echoes is not this suite's subject; see StatementParamLogging.test.ts's header).
|
|
78
|
+
*/
|
|
79
|
+
// A fixture value shaped like row content (not a real credential).
|
|
80
|
+
var CANARY = 'rst_5d41402abc4b2a76b9719d911017c592';
|
|
81
|
+
/** What a throwing accessor throws: one object, so a test can tell it from anything else. */
|
|
82
|
+
var ACCESSOR_ERROR = new Error('accessor refused');
|
|
83
|
+
var throwingEntry = function (target, name) {
|
|
84
|
+
return Object.defineProperty(target, name, {
|
|
85
|
+
enumerable: true,
|
|
86
|
+
get: function () {
|
|
87
|
+
throw ACCESSOR_ERROR;
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
var refusesEverything = function (target) {
|
|
92
|
+
return new Proxy(target, {
|
|
93
|
+
get: function () {
|
|
94
|
+
throw ACCESSOR_ERROR;
|
|
95
|
+
},
|
|
96
|
+
has: function () {
|
|
97
|
+
throw ACCESSOR_ERROR;
|
|
98
|
+
},
|
|
99
|
+
ownKeys: function () {
|
|
100
|
+
throw ACCESSOR_ERROR;
|
|
101
|
+
},
|
|
102
|
+
getPrototypeOf: function () {
|
|
103
|
+
throw ACCESSOR_ERROR;
|
|
104
|
+
},
|
|
105
|
+
getOwnPropertyDescriptor: function () {
|
|
106
|
+
throw ACCESSOR_ERROR;
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
var revoked = function (target) {
|
|
111
|
+
var _a = Proxy.revocable(target, {}), proxy = _a.proxy, revoke = _a.revoke;
|
|
112
|
+
revoke();
|
|
113
|
+
return proxy;
|
|
114
|
+
};
|
|
115
|
+
/** An array that answers every read — its `length` included — with the value itself. */
|
|
116
|
+
var lyingArray = function () { return new Proxy([CANARY], { get: function () { return CANARY; } }); };
|
|
117
|
+
var Credentials = /** @class */ (function () {
|
|
118
|
+
function Credentials() {
|
|
119
|
+
this.token = CANARY;
|
|
120
|
+
}
|
|
121
|
+
return Credentials;
|
|
122
|
+
}());
|
|
123
|
+
/** Every shape the driver can be handed as a statement's bindings, and the description each one gets. */
|
|
124
|
+
var BINDINGS = [
|
|
125
|
+
['positional bindings', function () { return [CANARY, 3]; }, [{ type: 'string', length: CANARY.length }, { type: 'number' }]],
|
|
126
|
+
[
|
|
127
|
+
'a bindings dictionary',
|
|
128
|
+
function () { return ({ token: CANARY, n: 3 }); },
|
|
129
|
+
{ token: { type: 'string', length: 36 }, n: { type: 'number' } },
|
|
130
|
+
],
|
|
131
|
+
[
|
|
132
|
+
'a dictionary with no prototype',
|
|
133
|
+
function () { return Object.assign(Object.create(null), { token: CANARY }); },
|
|
134
|
+
{ token: { type: 'string', length: CANARY.length } },
|
|
135
|
+
],
|
|
136
|
+
['nothing', function () { return undefined; }, undefined],
|
|
137
|
+
['null — the query layer binds it as one parameter', function () { return null; }, [{ type: 'null', null: true }]],
|
|
138
|
+
['a scalar string — one parameter', function () { return CANARY; }, [{ type: 'string', length: CANARY.length }]],
|
|
139
|
+
['an empty string', function () { return ''; }, [{ type: 'string', length: 0 }]],
|
|
140
|
+
['zero', function () { return 0; }, [{ type: 'number' }]],
|
|
141
|
+
['false', function () { return false; }, [{ type: 'boolean' }]],
|
|
142
|
+
['a bigint', function () { return BigInt(CANARY.length); }, [{ type: 'bigint' }]],
|
|
143
|
+
['a symbol', function () { return Symbol(CANARY); }, [{ type: 'symbol' }]],
|
|
144
|
+
['a function', function () { return function () { return CANARY; }; }, [{ type: 'function' }]],
|
|
145
|
+
['a Map — not a dictionary: one parameter', function () { return new Map([['token', CANARY]]); }, [{ type: 'object' }]],
|
|
146
|
+
['a Set', function () { return new Set([CANARY]); }, [{ type: 'object' }]],
|
|
147
|
+
['a class instance — not a dictionary: one parameter', function () { return new Credentials(); }, [{ type: 'object' }]],
|
|
148
|
+
['a Date', function () { return new Date(0); }, [{ type: 'date' }]],
|
|
149
|
+
['bytes', function () { return Buffer.from(CANARY); }, [{ type: 'bytes', length: Buffer.from(CANARY).length }]],
|
|
150
|
+
[
|
|
151
|
+
'a dictionary with an entry whose accessor throws',
|
|
152
|
+
function () { return throwingEntry({ id: CANARY }, 'token'); },
|
|
153
|
+
{ id: { type: 'string', length: CANARY.length }, token: { type: 'unreadable' } },
|
|
154
|
+
],
|
|
155
|
+
[
|
|
156
|
+
'positional bindings with a position whose accessor throws',
|
|
157
|
+
function () { return throwingEntry([CANARY, undefined], 1); },
|
|
158
|
+
[{ type: 'string', length: CANARY.length }, { type: 'unreadable' }],
|
|
159
|
+
],
|
|
160
|
+
[
|
|
161
|
+
'a value whose toJSON throws',
|
|
162
|
+
function () { return [
|
|
163
|
+
{
|
|
164
|
+
token: CANARY,
|
|
165
|
+
toJSON: function () {
|
|
166
|
+
throw ACCESSOR_ERROR;
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
]; },
|
|
170
|
+
[{ type: 'object' }],
|
|
171
|
+
],
|
|
172
|
+
[
|
|
173
|
+
'a positional value that refuses every read',
|
|
174
|
+
function () { return [refusesEverything({ token: CANARY })]; },
|
|
175
|
+
[{ type: 'unreadable' }],
|
|
176
|
+
],
|
|
177
|
+
['an array that answers every read with the value', function () { return [lyingArray()]; }, [{ type: 'array' }]],
|
|
178
|
+
['bindings that refuse every read', function () { return refusesEverything({ token: CANARY }); }, 'unreadable'],
|
|
179
|
+
['revoked bindings', function () { return revoked([CANARY]); }, 'unreadable'],
|
|
180
|
+
[
|
|
181
|
+
'a sparse array',
|
|
182
|
+
function () { return new Array(2); },
|
|
183
|
+
[
|
|
184
|
+
{ type: 'null', null: true },
|
|
185
|
+
{ type: 'null', null: true },
|
|
186
|
+
],
|
|
187
|
+
],
|
|
188
|
+
];
|
|
189
|
+
describe('describeParams is total: any bindings, a description, never a value', function () {
|
|
190
|
+
var internals = new db_driver_knex_1.KnexDriver({
|
|
191
|
+
host: 'localhost',
|
|
192
|
+
user: 'root',
|
|
193
|
+
password: '',
|
|
194
|
+
dbName: 'test',
|
|
195
|
+
});
|
|
196
|
+
test.each(BINDINGS)('%s', function (_shape, bindings, expected) {
|
|
197
|
+
var _a;
|
|
198
|
+
var described;
|
|
199
|
+
expect(function () {
|
|
200
|
+
described = internals.describeParams(bindings());
|
|
201
|
+
}).not.toThrow();
|
|
202
|
+
expect(described).toEqual(expected);
|
|
203
|
+
expect((0, util_1.inspect)(described, { depth: 10, showHidden: true })).not.toContain(CANARY);
|
|
204
|
+
expect((_a = JSON.stringify(described)) !== null && _a !== void 0 ? _a : '').not.toContain(CANARY);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
describe('causeSummary is total: anything thrown, a summary of codes, never the rewritten message', function () {
|
|
208
|
+
var internals = new db_driver_knex_1.KnexDriver({
|
|
209
|
+
host: 'localhost',
|
|
210
|
+
user: 'root',
|
|
211
|
+
password: '',
|
|
212
|
+
dbName: 'test',
|
|
213
|
+
});
|
|
214
|
+
var vendorFacts = {
|
|
215
|
+
code: 'ER_NO_SUCH_TABLE',
|
|
216
|
+
errno: 1146,
|
|
217
|
+
sqlState: '42S02',
|
|
218
|
+
sqlMessage: "Table 't' doesn't exist",
|
|
219
|
+
};
|
|
220
|
+
var THROWN = [
|
|
221
|
+
[
|
|
222
|
+
'a vendor error whose message and sql carry the bindings',
|
|
223
|
+
function () { return Object.assign(new Error("insert ... '".concat(CANARY, "'")), vendorFacts, { sql: "insert ... '".concat(CANARY, "'") }); },
|
|
224
|
+
__assign({ name: 'Error' }, vendorFacts),
|
|
225
|
+
],
|
|
226
|
+
['nothing', function () { return undefined; }, {}],
|
|
227
|
+
['null', function () { return null; }, {}],
|
|
228
|
+
['a thrown string', function () { return CANARY; }, {}],
|
|
229
|
+
['a thrown number', function () { return 1146; }, {}],
|
|
230
|
+
['facts of the wrong kind', function () { return ({ name: 5, code: 1146, errno: '1146', sqlState: null, sqlMessage: {} }); }, {}],
|
|
231
|
+
[
|
|
232
|
+
'an error with a fact whose accessor throws',
|
|
233
|
+
function () { return throwingEntry(Object.assign(new Error(CANARY), vendorFacts), 'code'); },
|
|
234
|
+
{ name: 'Error', errno: 1146, sqlState: '42S02', sqlMessage: vendorFacts.sqlMessage },
|
|
235
|
+
],
|
|
236
|
+
['an error that refuses every read', function () { return refusesEverything(new Error(CANARY)); }, {}],
|
|
237
|
+
['a revoked error', function () { return revoked(new Error(CANARY)); }, {}],
|
|
238
|
+
];
|
|
239
|
+
test.each(THROWN)('%s', function (_shape, thrown, expected) {
|
|
240
|
+
var summary;
|
|
241
|
+
expect(function () {
|
|
242
|
+
summary = internals.causeSummary(thrown());
|
|
243
|
+
}).not.toThrow();
|
|
244
|
+
expect(summary).toEqual(expected);
|
|
245
|
+
expect((0, util_1.inspect)(summary, { depth: 10, showHidden: true })).not.toContain(CANARY);
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
/** The errors the stub connection rejected with, as they left the client library's callback. */
|
|
249
|
+
var rejected = [];
|
|
250
|
+
/** A connection that rejects every statement like a missing table — a server message that quotes no binding. */
|
|
251
|
+
var rejectingConnection = function () {
|
|
252
|
+
var mysql = require('mysql');
|
|
253
|
+
return {
|
|
254
|
+
state: 'authenticated',
|
|
255
|
+
on: function () { return undefined; },
|
|
256
|
+
removeAllListeners: function () { return undefined; },
|
|
257
|
+
connect: function (done) { return done(); },
|
|
258
|
+
end: function (done) { return done(); },
|
|
259
|
+
query: function (options, bindings, done) {
|
|
260
|
+
if (/^\s*(BEGIN|COMMIT|ROLLBACK)/i.test(options.sql)) {
|
|
261
|
+
done(null, []);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
var sqlMessage = "Table 'test.credential' doesn't exist";
|
|
265
|
+
var error = Object.assign(new Error("ER_NO_SUCH_TABLE: ".concat(sqlMessage)), {
|
|
266
|
+
code: 'ER_NO_SUCH_TABLE',
|
|
267
|
+
errno: 1146,
|
|
268
|
+
sqlState: '42S02',
|
|
269
|
+
sqlMessage: sqlMessage,
|
|
270
|
+
sql: mysql.format(options.sql, bindings),
|
|
271
|
+
});
|
|
272
|
+
rejected.push(error);
|
|
273
|
+
done(error);
|
|
274
|
+
},
|
|
275
|
+
};
|
|
276
|
+
};
|
|
277
|
+
var settle = function (run) {
|
|
278
|
+
return Promise.resolve()
|
|
279
|
+
.then(run)
|
|
280
|
+
.then(function () { return 'resolved'; })
|
|
281
|
+
.catch(function (error) { return error; });
|
|
282
|
+
};
|
|
283
|
+
describe('writing the failure line never changes what the driver throws', function () {
|
|
284
|
+
var driver = new db_driver_knex_1.KnexDriver({ host: 'localhost', user: 'root', password: '', dbName: 'test' });
|
|
285
|
+
var internals = driver;
|
|
286
|
+
var statics = db_driver_knex_1.KnexDriver;
|
|
287
|
+
var ENV = ['DEVELOPMENT', 'DB_LOG_PARAM_VALUES'];
|
|
288
|
+
var envBefore = {};
|
|
289
|
+
var written = [];
|
|
290
|
+
var instance;
|
|
291
|
+
var previousInstance;
|
|
292
|
+
/** A logger whose writer records every line it is handed and then throws for the ones `refuses` names. */
|
|
293
|
+
var loggerThatThrows = function (refuses) {
|
|
294
|
+
return new logger_1.Logger({
|
|
295
|
+
name: 'KnexDriver',
|
|
296
|
+
logLevel: 'debug',
|
|
297
|
+
logWriter: {
|
|
298
|
+
write: function (log) {
|
|
299
|
+
written.push(log);
|
|
300
|
+
if (refuses(log)) {
|
|
301
|
+
throw new Error('the log writer is down');
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
});
|
|
306
|
+
};
|
|
307
|
+
beforeAll(function () {
|
|
308
|
+
instance = (0, knex_1.default)({ client: 'mysql', connection: { host: 'localhost', user: 'root', password: '' } });
|
|
309
|
+
instance.client.driver = { createConnection: rejectingConnection };
|
|
310
|
+
previousInstance = statics.KNEX;
|
|
311
|
+
statics.KNEX = instance;
|
|
312
|
+
});
|
|
313
|
+
afterAll(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
314
|
+
return __generator(this, function (_a) {
|
|
315
|
+
switch (_a.label) {
|
|
316
|
+
case 0:
|
|
317
|
+
statics.KNEX = previousInstance;
|
|
318
|
+
return [4 /*yield*/, instance.destroy()];
|
|
319
|
+
case 1:
|
|
320
|
+
_a.sent();
|
|
321
|
+
return [2 /*return*/];
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
}); });
|
|
325
|
+
beforeEach(function () {
|
|
326
|
+
written = [];
|
|
327
|
+
rejected.length = 0;
|
|
328
|
+
internals.logger = loggerThatThrows(function () { return false; });
|
|
329
|
+
for (var _i = 0, ENV_1 = ENV; _i < ENV_1.length; _i++) {
|
|
330
|
+
var name_1 = ENV_1[_i];
|
|
331
|
+
envBefore[name_1] = process.env[name_1];
|
|
332
|
+
delete process.env[name_1];
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
afterEach(function () {
|
|
336
|
+
for (var _i = 0, ENV_2 = ENV; _i < ENV_2.length; _i++) {
|
|
337
|
+
var name_2 = ENV_2[_i];
|
|
338
|
+
if (envBefore[name_2] === undefined) {
|
|
339
|
+
delete process.env[name_2];
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
process.env[name_2] = envBefore[name_2];
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
var INSERT = 'INSERT INTO `credential` (`id`, `token`) VALUES (?, ?)';
|
|
347
|
+
var insertStatement = function () { return ({ sql: INSERT, params: ['c0ffee00-0000-4000-8000-000000000001', CANARY] }); };
|
|
348
|
+
/** Everything a caller can read off a caught error. */
|
|
349
|
+
var facts = function (error) {
|
|
350
|
+
var _a;
|
|
351
|
+
return ({
|
|
352
|
+
class: (_a = error === null || error === void 0 ? void 0 : error.constructor) === null || _a === void 0 ? void 0 : _a.name,
|
|
353
|
+
message: error === null || error === void 0 ? void 0 : error.message,
|
|
354
|
+
own: Object.getOwnPropertyNames(Object(error))
|
|
355
|
+
.sort()
|
|
356
|
+
.map(function (name) { return [name, name === 'stack' ? '(stack)' : error[name]]; }),
|
|
357
|
+
});
|
|
358
|
+
};
|
|
359
|
+
test('the premise: with a working writer the statement fails with the vendor`s error and writes its one line', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
360
|
+
var outcome;
|
|
361
|
+
return __generator(this, function (_a) {
|
|
362
|
+
switch (_a.label) {
|
|
363
|
+
case 0: return [4 /*yield*/, settle(function () { return driver.runDml(insertStatement); })];
|
|
364
|
+
case 1:
|
|
365
|
+
outcome = _a.sent();
|
|
366
|
+
expect(rejected).toHaveLength(1);
|
|
367
|
+
expect(outcome).toBe(rejected[0]);
|
|
368
|
+
expect(written.map(function (log) { return log.message; })).toEqual(['Failed when executing sql']);
|
|
369
|
+
return [2 /*return*/];
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
}); });
|
|
373
|
+
test('a writer that throws on the failure line: the throw is still the vendor`s error itself, and the lost line is reported as one fixed line', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
374
|
+
var outcome, fixed;
|
|
375
|
+
return __generator(this, function (_a) {
|
|
376
|
+
switch (_a.label) {
|
|
377
|
+
case 0:
|
|
378
|
+
internals.logger = loggerThatThrows(function (log) { return log.message === 'Failed when executing sql'; });
|
|
379
|
+
return [4 /*yield*/, settle(function () { return driver.runDml(insertStatement); })];
|
|
380
|
+
case 1:
|
|
381
|
+
outcome = _a.sent();
|
|
382
|
+
expect(rejected).toHaveLength(1);
|
|
383
|
+
expect(outcome).toBe(rejected[0]);
|
|
384
|
+
expect(outcome.code).toBe('ER_NO_SUCH_TABLE');
|
|
385
|
+
expect(written.map(function (log) { return log.message; })).toEqual([
|
|
386
|
+
'Failed when executing sql',
|
|
387
|
+
'Failed to write a statement log line',
|
|
388
|
+
]);
|
|
389
|
+
fixed = written[1];
|
|
390
|
+
expect(fixed.logLevel).toBe('error');
|
|
391
|
+
expect(fixed.obj).toBeUndefined();
|
|
392
|
+
expect(fixed.error).toBeUndefined();
|
|
393
|
+
expect((0, printedLine_1.lineOf)(fixed)).not.toContain(CANARY);
|
|
394
|
+
return [2 /*return*/];
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
}); });
|
|
398
|
+
test('a writer that throws on EVERY line: the throw is still the vendor`s error itself', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
399
|
+
var outcome;
|
|
400
|
+
return __generator(this, function (_a) {
|
|
401
|
+
switch (_a.label) {
|
|
402
|
+
case 0:
|
|
403
|
+
internals.logger = loggerThatThrows(function () { return true; });
|
|
404
|
+
return [4 /*yield*/, settle(function () { return driver.runDml(insertStatement); })];
|
|
405
|
+
case 1:
|
|
406
|
+
outcome = _a.sent();
|
|
407
|
+
expect(rejected).toHaveLength(1);
|
|
408
|
+
expect(outcome).toBe(rejected[0]);
|
|
409
|
+
expect(written.map(function (log) { return log.message; })).toEqual([
|
|
410
|
+
'Failed when executing sql',
|
|
411
|
+
'Failed to write a statement log line',
|
|
412
|
+
]);
|
|
413
|
+
return [2 /*return*/];
|
|
414
|
+
}
|
|
415
|
+
});
|
|
416
|
+
}); });
|
|
417
|
+
test('a writer that throws, inside a transaction: the transaction rejects with the vendor`s error itself', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
418
|
+
var outcome;
|
|
419
|
+
return __generator(this, function (_a) {
|
|
420
|
+
switch (_a.label) {
|
|
421
|
+
case 0:
|
|
422
|
+
internals.logger = loggerThatThrows(function () { return true; });
|
|
423
|
+
return [4 /*yield*/, settle(function () {
|
|
424
|
+
return driver.runTransaction(function (transaction) { return driver.runDml(insertStatement, transaction); });
|
|
425
|
+
})];
|
|
426
|
+
case 1:
|
|
427
|
+
outcome = _a.sent();
|
|
428
|
+
expect(rejected).toHaveLength(1);
|
|
429
|
+
expect(outcome).toBe(rejected[0]);
|
|
430
|
+
return [2 /*return*/];
|
|
431
|
+
}
|
|
432
|
+
});
|
|
433
|
+
}); });
|
|
434
|
+
test('the values switch open and a writer that cannot serialize a bound value: the throw is still the vendor`s error itself', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
435
|
+
var outcome;
|
|
436
|
+
return __generator(this, function (_a) {
|
|
437
|
+
switch (_a.label) {
|
|
438
|
+
case 0:
|
|
439
|
+
Object.assign(process.env, { DEVELOPMENT: 'true', DB_LOG_PARAM_VALUES: '1' });
|
|
440
|
+
// A structured writer: it serializes what it is handed, and a bigint cannot be serialized.
|
|
441
|
+
internals.logger = new logger_1.Logger({
|
|
442
|
+
name: 'KnexDriver',
|
|
443
|
+
logLevel: 'debug',
|
|
444
|
+
logWriter: {
|
|
445
|
+
write: function (log) {
|
|
446
|
+
written.push({ logLevel: log.logLevel, message: log.message });
|
|
447
|
+
JSON.stringify(log.obj);
|
|
448
|
+
},
|
|
449
|
+
},
|
|
450
|
+
});
|
|
451
|
+
return [4 /*yield*/, settle(function () { return driver.runDml(function () { return ({ sql: INSERT, params: [BigInt(7), CANARY] }); }); })];
|
|
452
|
+
case 1:
|
|
453
|
+
outcome = _a.sent();
|
|
454
|
+
expect(rejected).toHaveLength(1);
|
|
455
|
+
expect(outcome).toBe(rejected[0]);
|
|
456
|
+
expect(written.map(function (log) { return log.message; })).toEqual([
|
|
457
|
+
'Failed when executing sql',
|
|
458
|
+
'Failed to write a statement log line',
|
|
459
|
+
]);
|
|
460
|
+
return [2 /*return*/];
|
|
461
|
+
}
|
|
462
|
+
});
|
|
463
|
+
}); });
|
|
464
|
+
/** Bindings of every shape, at the door: what the driver throws is what a bare query-layer call throws. */
|
|
465
|
+
var DOORS = [
|
|
466
|
+
['positional bindings', 'SELECT 1 FROM `credential` WHERE `id` = ? AND `token` = ?', function () { return [1, CANARY]; }],
|
|
467
|
+
[
|
|
468
|
+
'a bindings dictionary',
|
|
469
|
+
'SELECT 1 FROM `credential` WHERE `id` = :id AND `token` = :token',
|
|
470
|
+
function () { return ({ id: 1, token: CANARY }); },
|
|
471
|
+
],
|
|
472
|
+
[
|
|
473
|
+
'a dictionary with no prototype',
|
|
474
|
+
'SELECT 1 FROM `credential` WHERE `token` = :token',
|
|
475
|
+
function () { return Object.assign(Object.create(null), { token: CANARY }); },
|
|
476
|
+
],
|
|
477
|
+
['nothing', 'SELECT 1 FROM `credential`', function () { return undefined; }],
|
|
478
|
+
['null', 'SELECT 1 FROM `credential` WHERE `token` = ?', function () { return null; }],
|
|
479
|
+
['a scalar string', 'SELECT 1 FROM `credential` WHERE `token` = ?', function () { return CANARY; }],
|
|
480
|
+
['zero', 'SELECT 1 FROM `credential` WHERE `n` = ?', function () { return 0; }],
|
|
481
|
+
['a Map', 'SELECT 1 FROM `credential` WHERE `token` = ?', function () { return new Map([['token', CANARY]]); }],
|
|
482
|
+
['a Date', 'SELECT 1 FROM `credential` WHERE `at` = ?', function () { return new Date(0); }],
|
|
483
|
+
['bytes', 'SELECT 1 FROM `credential` WHERE `token` = ?', function () { return Buffer.from(CANARY); }],
|
|
484
|
+
[
|
|
485
|
+
'fewer bindings than placeholders — the query layer refuses the statement itself',
|
|
486
|
+
'SELECT 1 FROM `credential` WHERE `id` = ? AND `token` = ?',
|
|
487
|
+
function () { return [CANARY]; },
|
|
488
|
+
],
|
|
489
|
+
[
|
|
490
|
+
'a dictionary with an entry whose accessor throws',
|
|
491
|
+
'SELECT 1 FROM `credential` WHERE `id` = :id AND `token` = :token',
|
|
492
|
+
function () { return throwingEntry({ id: 1 }, 'token'); },
|
|
493
|
+
],
|
|
494
|
+
[
|
|
495
|
+
'a value whose toJSON throws',
|
|
496
|
+
'SELECT 1 FROM `credential` WHERE `token` = ?',
|
|
497
|
+
function () { return [
|
|
498
|
+
{
|
|
499
|
+
token: CANARY,
|
|
500
|
+
toJSON: function () {
|
|
501
|
+
throw ACCESSOR_ERROR;
|
|
502
|
+
},
|
|
503
|
+
},
|
|
504
|
+
]; },
|
|
505
|
+
],
|
|
506
|
+
['revoked bindings', 'SELECT 1 FROM `credential` WHERE `token` = ?', function () { return revoked([CANARY]); }],
|
|
507
|
+
];
|
|
508
|
+
test.each(DOORS)('at the door — %s: the throw reads as a bare query-layer call`s, and the line carries no value', function (_shape, sql, bindings) { return __awaiter(void 0, void 0, void 0, function () {
|
|
509
|
+
var bare, bareRejections, bareThrewTheVendorError, outcome;
|
|
510
|
+
return __generator(this, function (_a) {
|
|
511
|
+
switch (_a.label) {
|
|
512
|
+
case 0: return [4 /*yield*/, settle(function () { return instance.raw(sql, bindings()); })];
|
|
513
|
+
case 1:
|
|
514
|
+
bare = _a.sent();
|
|
515
|
+
// The premise: a bare query-layer call with these bindings fails.
|
|
516
|
+
expect(bare).not.toBe('resolved');
|
|
517
|
+
bareRejections = rejected.length;
|
|
518
|
+
bareThrewTheVendorError = bare === rejected[0];
|
|
519
|
+
rejected.length = 0;
|
|
520
|
+
return [4 /*yield*/, settle(function () { return driver.runQuery(function () { return ({ sql: sql, params: bindings() }); }); })];
|
|
521
|
+
case 2:
|
|
522
|
+
outcome = _a.sent();
|
|
523
|
+
expect(facts(outcome)).toEqual(facts(bare));
|
|
524
|
+
expect(rejected).toHaveLength(bareRejections);
|
|
525
|
+
// The very object, wherever the test can name it: the one the client library rejected with
|
|
526
|
+
// (when that is what a bare call throws), or the one a throwing accessor throws.
|
|
527
|
+
if (bareThrewTheVendorError) {
|
|
528
|
+
expect(outcome).toBe(rejected[0]);
|
|
529
|
+
}
|
|
530
|
+
if (bare === ACCESSOR_ERROR) {
|
|
531
|
+
expect(outcome).toBe(ACCESSOR_ERROR);
|
|
532
|
+
}
|
|
533
|
+
expect(written.map(function (log) { return log.message; })).toEqual(['Failed when executing sql']);
|
|
534
|
+
expect(written[0].obj.sql).toBe(sql);
|
|
535
|
+
expect((0, printedLine_1.lineOf)(written[0])).not.toContain(CANARY);
|
|
536
|
+
return [2 /*return*/];
|
|
537
|
+
}
|
|
538
|
+
});
|
|
539
|
+
}); });
|
|
540
|
+
});
|
|
541
|
+
//# sourceMappingURL=StatementLogNeverThrows.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatementLogNeverThrows.test.js","sourceRoot":"","sources":["../../test/StatementLogNeverThrows.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatementParamLogging.test.d.ts","sourceRoot":"","sources":["../../test/StatementParamLogging.test.ts"],"names":[],"mappings":""}
|