source: node_modules/pg-protocol/dist/outbound-serializer.test.js

main
Last change on this file was 62b2964, checked in by Klimentina Efremova <klimentina08642@…>, 2 weeks ago

Project Handcraft Marketplace

  • Property mode set to 100644
File size: 14.2 KB
Line 
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6const assert_1 = __importDefault(require("assert"));
7const serializer_1 = require("./serializer");
8const buffer_list_1 = __importDefault(require("./testing/buffer-list"));
9describe('serializer', () => {
10 it('builds startup message', function () {
11 const actual = serializer_1.serialize.startup({
12 user: 'brian',
13 database: 'bang',
14 });
15 assert_1.default.deepEqual(actual, new buffer_list_1.default()
16 .addInt16(3)
17 .addInt16(0)
18 .addCString('user')
19 .addCString('brian')
20 .addCString('database')
21 .addCString('bang')
22 .addCString('client_encoding')
23 .addCString('UTF8')
24 .addCString('')
25 .join(true));
26 });
27 it('builds password message', function () {
28 const actual = serializer_1.serialize.password('!');
29 assert_1.default.deepEqual(actual, new buffer_list_1.default().addCString('!').join(true, 'p'));
30 });
31 it('builds request ssl message', function () {
32 const actual = serializer_1.serialize.requestSsl();
33 const expected = new buffer_list_1.default().addInt32(80877103).join(true);
34 assert_1.default.deepEqual(actual, expected);
35 });
36 it('builds SASLInitialResponseMessage message', function () {
37 const actual = serializer_1.serialize.sendSASLInitialResponseMessage('mech', 'data');
38 assert_1.default.deepEqual(actual, new buffer_list_1.default().addCString('mech').addInt32(4).addString('data').join(true, 'p'));
39 });
40 it('builds SCRAMClientFinalMessage message', function () {
41 const actual = serializer_1.serialize.sendSCRAMClientFinalMessage('data');
42 assert_1.default.deepEqual(actual, new buffer_list_1.default().addString('data').join(true, 'p'));
43 });
44 it('builds query message', function () {
45 const txt = 'select * from boom';
46 const actual = serializer_1.serialize.query(txt);
47 assert_1.default.deepEqual(actual, new buffer_list_1.default().addCString(txt).join(true, 'Q'));
48 });
49 describe('parse message', () => {
50 it('builds parse message', function () {
51 const actual = serializer_1.serialize.parse({ text: '!' });
52 const expected = new buffer_list_1.default().addCString('').addCString('!').addInt16(0).join(true, 'P');
53 assert_1.default.deepEqual(actual, expected);
54 });
55 it('builds parse message with named query', function () {
56 const actual = serializer_1.serialize.parse({
57 name: 'boom',
58 text: 'select * from boom',
59 types: [],
60 });
61 const expected = new buffer_list_1.default().addCString('boom').addCString('select * from boom').addInt16(0).join(true, 'P');
62 assert_1.default.deepEqual(actual, expected);
63 });
64 it('with multiple parameters', function () {
65 const actual = serializer_1.serialize.parse({
66 name: 'force',
67 text: 'select * from bang where name = $1',
68 types: [1, 2, 3, 4],
69 });
70 const expected = new buffer_list_1.default()
71 .addCString('force')
72 .addCString('select * from bang where name = $1')
73 .addInt16(4)
74 .addInt32(1)
75 .addInt32(2)
76 .addInt32(3)
77 .addInt32(4)
78 .join(true, 'P');
79 assert_1.default.deepEqual(actual, expected);
80 });
81 });
82 describe('bind messages', function () {
83 it('with no values', function () {
84 const actual = serializer_1.serialize.bind();
85 const expectedBuffer = new buffer_list_1.default()
86 .addCString('')
87 .addCString('')
88 .addInt16(0)
89 .addInt16(0)
90 .addInt16(1)
91 .addInt16(0)
92 .join(true, 'B');
93 assert_1.default.deepEqual(actual, expectedBuffer);
94 });
95 it('with named statement, portal, and values', function () {
96 const actual = serializer_1.serialize.bind({
97 portal: 'bang',
98 statement: 'woo',
99 values: ['1', 'hi', null, 'zing'],
100 });
101 const expectedBuffer = new buffer_list_1.default()
102 .addCString('bang') // portal name
103 .addCString('woo') // statement name
104 .addInt16(4)
105 .addInt16(0)
106 .addInt16(0)
107 .addInt16(0)
108 .addInt16(0)
109 .addInt16(4)
110 .addInt32(1)
111 .add(Buffer.from('1'))
112 .addInt32(2)
113 .add(Buffer.from('hi'))
114 .addInt32(-1)
115 .addInt32(4)
116 .add(Buffer.from('zing'))
117 .addInt16(1)
118 .addInt16(0)
119 .join(true, 'B');
120 assert_1.default.deepEqual(actual, expectedBuffer);
121 });
122 it('encodes a multi-byte string param with its UTF-8 byte length, not char length', function () {
123 // Guards the single-pass addInt32PrefixedString write path: the Int32
124 // length prefix must be the UTF-8 byte count, not String.length. 'héllo中🎉'
125 // is 7 code points / 8 UTF-16 code units but 13 UTF-8 bytes.
126 const value = 'héllo中🎉';
127 const bytes = Buffer.from(value, 'utf8');
128 assert_1.default.notEqual(bytes.length, value.length); // sanity: the divergence we're testing
129 const actual = serializer_1.serialize.bind({ values: [value] });
130 const expectedBuffer = new buffer_list_1.default()
131 .addCString('') // portal
132 .addCString('') // statement
133 .addInt16(1) // param format code count
134 .addInt16(0) // format code for the one value (text)
135 .addInt16(1) // value count
136 .addInt32(bytes.length) // 13 — the UTF-8 byte length, NOT value.length (8)
137 .add(bytes)
138 .addInt16(1) // result format code count
139 .addInt16(0) // result format (text)
140 .join(true, 'B');
141 assert_1.default.deepEqual(actual, expectedBuffer);
142 });
143 });
144 it('with custom valueMapper', function () {
145 const actual = serializer_1.serialize.bind({
146 portal: 'bang',
147 statement: 'woo',
148 values: ['1', 'hi', null, 'zing'],
149 valueMapper: () => null,
150 });
151 const expectedBuffer = new buffer_list_1.default()
152 .addCString('bang') // portal name
153 .addCString('woo') // statement name
154 .addInt16(4)
155 .addInt16(0)
156 .addInt16(0)
157 .addInt16(0)
158 .addInt16(0)
159 .addInt16(4)
160 .addInt32(-1)
161 .addInt32(-1)
162 .addInt32(-1)
163 .addInt32(-1)
164 .addInt16(1)
165 .addInt16(0)
166 .join(true, 'B');
167 assert_1.default.deepEqual(actual, expectedBuffer);
168 });
169 it('with named statement, portal, and buffer value', function () {
170 const actual = serializer_1.serialize.bind({
171 portal: 'bang',
172 statement: 'woo',
173 values: ['1', 'hi', null, Buffer.from('zing', 'utf8')],
174 });
175 const expectedBuffer = new buffer_list_1.default()
176 .addCString('bang') // portal name
177 .addCString('woo') // statement name
178 .addInt16(4) // value count
179 .addInt16(0) // string
180 .addInt16(0) // string
181 .addInt16(0) // string
182 .addInt16(1) // binary
183 .addInt16(4)
184 .addInt32(1)
185 .add(Buffer.from('1'))
186 .addInt32(2)
187 .add(Buffer.from('hi'))
188 .addInt32(-1)
189 .addInt32(4)
190 .add(Buffer.from('zing', 'utf-8'))
191 .addInt16(1)
192 .addInt16(0)
193 .join(true, 'B');
194 assert_1.default.deepEqual(actual, expectedBuffer);
195 });
196 describe('builds execute message', function () {
197 it('for unamed portal with no row limit', function () {
198 const actual = serializer_1.serialize.execute();
199 const expectedBuffer = new buffer_list_1.default().addCString('').addInt32(0).join(true, 'E');
200 assert_1.default.deepEqual(actual, expectedBuffer);
201 });
202 it('for named portal with row limit', function () {
203 const actual = serializer_1.serialize.execute({
204 portal: 'my favorite portal',
205 rows: 100,
206 });
207 const expectedBuffer = new buffer_list_1.default().addCString('my favorite portal').addInt32(100).join(true, 'E');
208 assert_1.default.deepEqual(actual, expectedBuffer);
209 });
210 });
211 it('builds flush command', function () {
212 const actual = serializer_1.serialize.flush();
213 const expected = new buffer_list_1.default().join(true, 'H');
214 assert_1.default.deepEqual(actual, expected);
215 });
216 it('builds sync command', function () {
217 const actual = serializer_1.serialize.sync();
218 const expected = new buffer_list_1.default().join(true, 'S');
219 assert_1.default.deepEqual(actual, expected);
220 });
221 it('builds end command', function () {
222 const actual = serializer_1.serialize.end();
223 const expected = Buffer.from([0x58, 0, 0, 0, 4]);
224 assert_1.default.deepEqual(actual, expected);
225 });
226 describe('builds describe command', function () {
227 it('describe statement', function () {
228 const actual = serializer_1.serialize.describe({ type: 'S', name: 'bang' });
229 const expected = new buffer_list_1.default().addChar('S').addCString('bang').join(true, 'D');
230 assert_1.default.deepEqual(actual, expected);
231 });
232 it('describe unnamed portal', function () {
233 const actual = serializer_1.serialize.describe({ type: 'P' });
234 const expected = new buffer_list_1.default().addChar('P').addCString('').join(true, 'D');
235 assert_1.default.deepEqual(actual, expected);
236 });
237 });
238 describe('builds close command', function () {
239 it('describe statement', function () {
240 const actual = serializer_1.serialize.close({ type: 'S', name: 'bang' });
241 const expected = new buffer_list_1.default().addChar('S').addCString('bang').join(true, 'C');
242 assert_1.default.deepEqual(actual, expected);
243 });
244 it('describe unnamed portal', function () {
245 const actual = serializer_1.serialize.close({ type: 'P' });
246 const expected = new buffer_list_1.default().addChar('P').addCString('').join(true, 'C');
247 assert_1.default.deepEqual(actual, expected);
248 });
249 });
250 describe('copy messages', function () {
251 it('builds copyFromChunk', () => {
252 const actual = serializer_1.serialize.copyData(Buffer.from([1, 2, 3]));
253 const expected = new buffer_list_1.default().add(Buffer.from([1, 2, 3])).join(true, 'd');
254 assert_1.default.deepEqual(actual, expected);
255 });
256 it('builds copy fail', () => {
257 const actual = serializer_1.serialize.copyFail('err!');
258 const expected = new buffer_list_1.default().addCString('err!').join(true, 'f');
259 assert_1.default.deepEqual(actual, expected);
260 });
261 it('builds copy done', () => {
262 const actual = serializer_1.serialize.copyDone();
263 const expected = new buffer_list_1.default().join(true, 'c');
264 assert_1.default.deepEqual(actual, expected);
265 });
266 });
267 it('builds cancel message', () => {
268 const actual = serializer_1.serialize.cancel(3, 4);
269 const expected = new buffer_list_1.default().addInt16(1234).addInt16(5678).addInt32(3).addInt32(4).join(true);
270 assert_1.default.deepEqual(actual, expected);
271 });
272 describe('bind error recovery', () => {
273 const throwingMapper = () => {
274 throw new Error('valueMapper error');
275 };
276 it('produces correct bind output after a valueMapper exception', () => {
277 assert_1.default.throws(() => {
278 serializer_1.serialize.bind({
279 values: ['fail'],
280 valueMapper: throwingMapper,
281 });
282 }, /valueMapper error/);
283 const actual = serializer_1.serialize.bind({
284 portal: 'bang',
285 statement: 'woo',
286 values: ['1', 'hi', null, 'zing'],
287 });
288 const expectedBuffer = new buffer_list_1.default()
289 .addCString('bang')
290 .addCString('woo')
291 .addInt16(4)
292 .addInt16(0)
293 .addInt16(0)
294 .addInt16(0)
295 .addInt16(0)
296 .addInt16(4)
297 .addInt32(1)
298 .add(Buffer.from('1'))
299 .addInt32(2)
300 .add(Buffer.from('hi'))
301 .addInt32(-1)
302 .addInt32(4)
303 .add(Buffer.from('zing'))
304 .addInt16(1)
305 .addInt16(0)
306 .join(true, 'B');
307 assert_1.default.deepEqual(actual, expectedBuffer);
308 });
309 it('produces correct output from other serializer methods after a failed bind', () => {
310 assert_1.default.throws(() => {
311 serializer_1.serialize.bind({
312 values: ['fail'],
313 valueMapper: throwingMapper,
314 });
315 }, /valueMapper error/);
316 const parseActual = serializer_1.serialize.parse({ text: '!' });
317 const parseExpected = new buffer_list_1.default().addCString('').addCString('!').addInt16(0).join(true, 'P');
318 assert_1.default.deepEqual(parseActual, parseExpected);
319 const queryActual = serializer_1.serialize.query('select 1');
320 const queryExpected = new buffer_list_1.default().addCString('select 1').join(true, 'Q');
321 assert_1.default.deepEqual(queryActual, queryExpected);
322 });
323 });
324});
325//# sourceMappingURL=outbound-serializer.test.js.map
Note: See TracBrowser for help on using the repository browser.