outbound-serializer.test.ts 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. import assert from 'assert'
  2. import { serialize } from './serializer'
  3. import BufferList from './testing/buffer-list'
  4. describe('serializer', () => {
  5. it('builds startup message', function () {
  6. const actual = serialize.startup({
  7. user: 'brian',
  8. database: 'bang',
  9. })
  10. assert.deepEqual(
  11. actual,
  12. new BufferList()
  13. .addInt16(3)
  14. .addInt16(0)
  15. .addCString('user')
  16. .addCString('brian')
  17. .addCString('database')
  18. .addCString('bang')
  19. .addCString('client_encoding')
  20. .addCString('UTF8')
  21. .addCString('')
  22. .join(true)
  23. )
  24. })
  25. it('builds password message', function () {
  26. const actual = serialize.password('!')
  27. assert.deepEqual(actual, new BufferList().addCString('!').join(true, 'p'))
  28. })
  29. it('builds request ssl message', function () {
  30. const actual = serialize.requestSsl()
  31. const expected = new BufferList().addInt32(80877103).join(true)
  32. assert.deepEqual(actual, expected)
  33. })
  34. it('builds SASLInitialResponseMessage message', function () {
  35. const actual = serialize.sendSASLInitialResponseMessage('mech', 'data')
  36. assert.deepEqual(actual, new BufferList().addCString('mech').addInt32(4).addString('data').join(true, 'p'))
  37. })
  38. it('builds SCRAMClientFinalMessage message', function () {
  39. const actual = serialize.sendSCRAMClientFinalMessage('data')
  40. assert.deepEqual(actual, new BufferList().addString('data').join(true, 'p'))
  41. })
  42. it('builds query message', function () {
  43. var txt = 'select * from boom'
  44. const actual = serialize.query(txt)
  45. assert.deepEqual(actual, new BufferList().addCString(txt).join(true, 'Q'))
  46. })
  47. describe('parse message', () => {
  48. it('builds parse message', function () {
  49. const actual = serialize.parse({ text: '!' })
  50. var expected = new BufferList().addCString('').addCString('!').addInt16(0).join(true, 'P')
  51. assert.deepEqual(actual, expected)
  52. })
  53. it('builds parse message with named query', function () {
  54. const actual = serialize.parse({
  55. name: 'boom',
  56. text: 'select * from boom',
  57. types: [],
  58. })
  59. var expected = new BufferList().addCString('boom').addCString('select * from boom').addInt16(0).join(true, 'P')
  60. assert.deepEqual(actual, expected)
  61. })
  62. it('with multiple parameters', function () {
  63. const actual = serialize.parse({
  64. name: 'force',
  65. text: 'select * from bang where name = $1',
  66. types: [1, 2, 3, 4],
  67. })
  68. var expected = new BufferList()
  69. .addCString('force')
  70. .addCString('select * from bang where name = $1')
  71. .addInt16(4)
  72. .addInt32(1)
  73. .addInt32(2)
  74. .addInt32(3)
  75. .addInt32(4)
  76. .join(true, 'P')
  77. assert.deepEqual(actual, expected)
  78. })
  79. })
  80. describe('bind messages', function () {
  81. it('with no values', function () {
  82. const actual = serialize.bind()
  83. var expectedBuffer = new BufferList()
  84. .addCString('')
  85. .addCString('')
  86. .addInt16(0)
  87. .addInt16(0)
  88. .addInt16(0)
  89. .join(true, 'B')
  90. assert.deepEqual(actual, expectedBuffer)
  91. })
  92. it('with named statement, portal, and values', function () {
  93. const actual = serialize.bind({
  94. portal: 'bang',
  95. statement: 'woo',
  96. values: ['1', 'hi', null, 'zing'],
  97. })
  98. var expectedBuffer = new BufferList()
  99. .addCString('bang') // portal name
  100. .addCString('woo') // statement name
  101. .addInt16(4)
  102. .addInt16(0)
  103. .addInt16(0)
  104. .addInt16(0)
  105. .addInt16(0)
  106. .addInt16(4)
  107. .addInt32(1)
  108. .add(Buffer.from('1'))
  109. .addInt32(2)
  110. .add(Buffer.from('hi'))
  111. .addInt32(-1)
  112. .addInt32(4)
  113. .add(Buffer.from('zing'))
  114. .addInt16(0)
  115. .join(true, 'B')
  116. assert.deepEqual(actual, expectedBuffer)
  117. })
  118. })
  119. it('with custom valueMapper', function () {
  120. const actual = serialize.bind({
  121. portal: 'bang',
  122. statement: 'woo',
  123. values: ['1', 'hi', null, 'zing'],
  124. valueMapper: () => null,
  125. })
  126. var expectedBuffer = new BufferList()
  127. .addCString('bang') // portal name
  128. .addCString('woo') // statement name
  129. .addInt16(4)
  130. .addInt16(0)
  131. .addInt16(0)
  132. .addInt16(0)
  133. .addInt16(0)
  134. .addInt16(4)
  135. .addInt32(-1)
  136. .addInt32(-1)
  137. .addInt32(-1)
  138. .addInt32(-1)
  139. .addInt16(0)
  140. .join(true, 'B')
  141. assert.deepEqual(actual, expectedBuffer)
  142. })
  143. it('with named statement, portal, and buffer value', function () {
  144. const actual = serialize.bind({
  145. portal: 'bang',
  146. statement: 'woo',
  147. values: ['1', 'hi', null, Buffer.from('zing', 'utf8')],
  148. })
  149. var expectedBuffer = new BufferList()
  150. .addCString('bang') // portal name
  151. .addCString('woo') // statement name
  152. .addInt16(4) // value count
  153. .addInt16(0) // string
  154. .addInt16(0) // string
  155. .addInt16(0) // string
  156. .addInt16(1) // binary
  157. .addInt16(4)
  158. .addInt32(1)
  159. .add(Buffer.from('1'))
  160. .addInt32(2)
  161. .add(Buffer.from('hi'))
  162. .addInt32(-1)
  163. .addInt32(4)
  164. .add(Buffer.from('zing', 'utf-8'))
  165. .addInt16(0)
  166. .join(true, 'B')
  167. assert.deepEqual(actual, expectedBuffer)
  168. })
  169. describe('builds execute message', function () {
  170. it('for unamed portal with no row limit', function () {
  171. const actual = serialize.execute()
  172. var expectedBuffer = new BufferList().addCString('').addInt32(0).join(true, 'E')
  173. assert.deepEqual(actual, expectedBuffer)
  174. })
  175. it('for named portal with row limit', function () {
  176. const actual = serialize.execute({
  177. portal: 'my favorite portal',
  178. rows: 100,
  179. })
  180. var expectedBuffer = new BufferList().addCString('my favorite portal').addInt32(100).join(true, 'E')
  181. assert.deepEqual(actual, expectedBuffer)
  182. })
  183. })
  184. it('builds flush command', function () {
  185. const actual = serialize.flush()
  186. var expected = new BufferList().join(true, 'H')
  187. assert.deepEqual(actual, expected)
  188. })
  189. it('builds sync command', function () {
  190. const actual = serialize.sync()
  191. var expected = new BufferList().join(true, 'S')
  192. assert.deepEqual(actual, expected)
  193. })
  194. it('builds end command', function () {
  195. const actual = serialize.end()
  196. var expected = Buffer.from([0x58, 0, 0, 0, 4])
  197. assert.deepEqual(actual, expected)
  198. })
  199. describe('builds describe command', function () {
  200. it('describe statement', function () {
  201. const actual = serialize.describe({ type: 'S', name: 'bang' })
  202. var expected = new BufferList().addChar('S').addCString('bang').join(true, 'D')
  203. assert.deepEqual(actual, expected)
  204. })
  205. it('describe unnamed portal', function () {
  206. const actual = serialize.describe({ type: 'P' })
  207. var expected = new BufferList().addChar('P').addCString('').join(true, 'D')
  208. assert.deepEqual(actual, expected)
  209. })
  210. })
  211. describe('builds close command', function () {
  212. it('describe statement', function () {
  213. const actual = serialize.close({ type: 'S', name: 'bang' })
  214. var expected = new BufferList().addChar('S').addCString('bang').join(true, 'C')
  215. assert.deepEqual(actual, expected)
  216. })
  217. it('describe unnamed portal', function () {
  218. const actual = serialize.close({ type: 'P' })
  219. var expected = new BufferList().addChar('P').addCString('').join(true, 'C')
  220. assert.deepEqual(actual, expected)
  221. })
  222. })
  223. describe('copy messages', function () {
  224. it('builds copyFromChunk', () => {
  225. const actual = serialize.copyData(Buffer.from([1, 2, 3]))
  226. const expected = new BufferList().add(Buffer.from([1, 2, 3])).join(true, 'd')
  227. assert.deepEqual(actual, expected)
  228. })
  229. it('builds copy fail', () => {
  230. const actual = serialize.copyFail('err!')
  231. const expected = new BufferList().addCString('err!').join(true, 'f')
  232. assert.deepEqual(actual, expected)
  233. })
  234. it('builds copy done', () => {
  235. const actual = serialize.copyDone()
  236. const expected = new BufferList().join(true, 'c')
  237. assert.deepEqual(actual, expected)
  238. })
  239. })
  240. it('builds cancel message', () => {
  241. const actual = serialize.cancel(3, 4)
  242. const expected = new BufferList().addInt16(1234).addInt16(5678).addInt32(3).addInt32(4).join(true)
  243. assert.deepEqual(actual, expected)
  244. })
  245. })