rqlite-js 2.6.0 → 3.0.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.
Files changed (98) hide show
  1. package/README.md +207 -29
  2. package/dist/index.cjs +904 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.cts +329 -0
  5. package/dist/index.d.ts +329 -0
  6. package/dist/index.js +865 -0
  7. package/dist/index.js.map +1 -0
  8. package/docs/MIGRATION-v2-to-v3.md +71 -0
  9. package/package.json +56 -35
  10. package/src/api/backup/index.ts +69 -0
  11. package/src/api/backup-formats.ts +8 -0
  12. package/src/api/client/index.ts +97 -0
  13. package/src/api/consistency-levels.ts +10 -0
  14. package/src/api/data/index.ts +87 -0
  15. package/src/api/paths.ts +13 -0
  16. package/src/api/query-params.ts +15 -0
  17. package/src/api/results/data-result-error.ts +41 -0
  18. package/src/api/results/data-result.ts +91 -0
  19. package/src/api/results/data-results.ts +91 -0
  20. package/src/api/results/index.ts +7 -0
  21. package/src/api/results/result-fields.ts +14 -0
  22. package/src/api/status/index.ts +53 -0
  23. package/src/http-request/auth-keys.ts +14 -0
  24. package/src/http-request/content-types.ts +4 -0
  25. package/src/http-request/errors.ts +17 -0
  26. package/src/http-request/http-headers.ts +19 -0
  27. package/src/http-request/http-methods.ts +12 -0
  28. package/src/http-request/index.ts +676 -0
  29. package/src/http-request/retryable.ts +41 -0
  30. package/src/index.ts +38 -0
  31. package/lib/api/backup/index.js +0 -72
  32. package/lib/api/backup/index.js.map +0 -1
  33. package/lib/api/backup/test.unit.js +0 -45
  34. package/lib/api/backup/test.unit.js.map +0 -1
  35. package/lib/api/backup-formats.js +0 -16
  36. package/lib/api/backup-formats.js.map +0 -1
  37. package/lib/api/client/index.js +0 -105
  38. package/lib/api/client/index.js.map +0 -1
  39. package/lib/api/client/test.unit.js +0 -53
  40. package/lib/api/client/test.unit.js.map +0 -1
  41. package/lib/api/consistency-levels.js +0 -30
  42. package/lib/api/consistency-levels.js.map +0 -1
  43. package/lib/api/data/index.js +0 -108
  44. package/lib/api/data/index.js.map +0 -1
  45. package/lib/api/data/test.unit.js +0 -98
  46. package/lib/api/data/test.unit.js.map +0 -1
  47. package/lib/api/paths.js +0 -33
  48. package/lib/api/paths.js.map +0 -1
  49. package/lib/api/query-params.js +0 -43
  50. package/lib/api/query-params.js.map +0 -1
  51. package/lib/api/results/data-result-error.js +0 -62
  52. package/lib/api/results/data-result-error.js.map +0 -1
  53. package/lib/api/results/data-result.js +0 -141
  54. package/lib/api/results/data-result.js.map +0 -1
  55. package/lib/api/results/data-results.js +0 -142
  56. package/lib/api/results/data-results.js.map +0 -1
  57. package/lib/api/results/index.js +0 -8
  58. package/lib/api/results/index.js.map +0 -1
  59. package/lib/api/results/result-fields.js +0 -47
  60. package/lib/api/results/result-fields.js.map +0 -1
  61. package/lib/api/results/test.unit.js +0 -238
  62. package/lib/api/results/test.unit.js.map +0 -1
  63. package/lib/api/status/index.js +0 -67
  64. package/lib/api/status/index.js.map +0 -1
  65. package/lib/api/status/test.unit.js +0 -57
  66. package/lib/api/status/test.unit.js.map +0 -1
  67. package/lib/http-request/auth-keys.js +0 -15
  68. package/lib/http-request/auth-keys.js.map +0 -1
  69. package/lib/http-request/content-types.js +0 -5
  70. package/lib/http-request/content-types.js.map +0 -1
  71. package/lib/http-request/errors.js +0 -17
  72. package/lib/http-request/errors.js.map +0 -1
  73. package/lib/http-request/http-headers.js +0 -20
  74. package/lib/http-request/http-headers.js.map +0 -1
  75. package/lib/http-request/http-methods.js +0 -40
  76. package/lib/http-request/http-methods.js.map +0 -1
  77. package/lib/http-request/index.js +0 -764
  78. package/lib/http-request/index.js.map +0 -1
  79. package/lib/http-request/retryable.js +0 -42
  80. package/lib/http-request/retryable.js.map +0 -1
  81. package/lib/http-request/test.unit.js +0 -560
  82. package/lib/http-request/test.unit.js.map +0 -1
  83. package/lib/index.js +0 -39
  84. package/lib/index.js.map +0 -1
  85. package/lib/test/api-data-execute-nock.js +0 -142
  86. package/lib/test/api-data-execute-nock.js.map +0 -1
  87. package/lib/test/api-data-query-nock.js +0 -210
  88. package/lib/test/api-data-query-nock.js.map +0 -1
  89. package/lib/test/backups/backup-nock.js +0 -29
  90. package/lib/test/backups/backup-nock.js.map +0 -1
  91. package/lib/test/backups/restore-nock.js +0 -30
  92. package/lib/test/backups/restore-nock.js.map +0 -1
  93. package/lib/test/env.js +0 -15
  94. package/lib/test/env.js.map +0 -1
  95. package/lib/test/unit/index.unit.js +0 -27
  96. package/lib/test/unit/index.unit.js.map +0 -1
  97. package/lib/test.integration.js +0 -238
  98. package/lib/test.integration.js.map +0 -1
@@ -1,30 +0,0 @@
1
- "use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports, "__esModule", { value: true });exports.RESTORE_SUCCESS_RESPONSE = void 0;exports.restoreSuccess = restoreSuccess;var _nock = _interopRequireDefault(require("nock"));
2
- var _contentTypes = require("../../http-request/content-types");
3
- var _httpHeaders = require("../../http-request/http-headers");
4
-
5
- const RESTORE_SUCCESS_RESPONSE = exports.RESTORE_SUCCESS_RESPONSE = {
6
- results: [
7
- {
8
- last_insert_id: 2,
9
- rows_affected: 1
10
- }]
11
-
12
- };
13
-
14
- /**
15
- * Creates a nock that represents a successful call to data query endpoint.
16
- */
17
- function restoreSuccess(options) {
18
- const {
19
- url, path, auth, response = RESTORE_SUCCESS_RESPONSE, body
20
- } = options;
21
- const scope = (0, _nock.default)(url).
22
- matchHeader(_httpHeaders.HTTP_HEADER_ACCEPT, _contentTypes.CONTENT_TYPE_APPLICATION_JSON).
23
- matchHeader(_httpHeaders.HTTP_HEADER_CONTENT_TYPE, _contentTypes.CONTENT_TYPE_TEXT_PLAIN).
24
- post(path, body);
25
- if (auth) {
26
- scope.basicAuth(auth);
27
- }
28
- return scope.reply(200, response);
29
- }
30
- //# sourceMappingURL=restore-nock.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"restore-nock.js","names":["_nock","_interopRequireDefault","require","_contentTypes","_httpHeaders","RESTORE_SUCCESS_RESPONSE","exports","results","last_insert_id","rows_affected","restoreSuccess","options","url","path","auth","response","body","scope","nock","matchHeader","HTTP_HEADER_ACCEPT","CONTENT_TYPE_APPLICATION_JSON","HTTP_HEADER_CONTENT_TYPE","CONTENT_TYPE_TEXT_PLAIN","post","basicAuth","reply"],"sources":["../../../es6/test/backups/restore-nock.js"],"sourcesContent":["import nock from 'nock'\nimport { CONTENT_TYPE_APPLICATION_JSON, CONTENT_TYPE_TEXT_PLAIN } from '../../http-request/content-types'\nimport { HTTP_HEADER_ACCEPT, HTTP_HEADER_CONTENT_TYPE } from '../../http-request/http-headers'\n\nexport const RESTORE_SUCCESS_RESPONSE = {\n results: [\n {\n last_insert_id: 2,\n rows_affected: 1,\n },\n ],\n}\n\n/**\n * Creates a nock that represents a successful call to data query endpoint.\n */\nexport function restoreSuccess (options) {\n const {\n url, path, auth, response = RESTORE_SUCCESS_RESPONSE, body,\n } = options\n const scope = nock(url)\n .matchHeader(HTTP_HEADER_ACCEPT, CONTENT_TYPE_APPLICATION_JSON)\n .matchHeader(HTTP_HEADER_CONTENT_TYPE, CONTENT_TYPE_TEXT_PLAIN)\n .post(path, body)\n if (auth) {\n scope.basicAuth(auth)\n }\n return scope.reply(200, response)\n}\n"],"mappings":"kPAAA,IAAAA,KAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAF,OAAA;;AAEO,MAAMG,wBAAwB,GAAAC,OAAA,CAAAD,wBAAA,GAAG;EACtCE,OAAO,EAAE;EACP;IACEC,cAAc,EAAE,CAAC;IACjBC,aAAa,EAAE;EACjB,CAAC;;AAEL,CAAC;;AAED;AACA;AACA;AACO,SAASC,cAAcA,CAAEC,OAAO,EAAE;EACvC,MAAM;IACJC,GAAG,EAAEC,IAAI,EAAEC,IAAI,EAAEC,QAAQ,GAAGV,wBAAwB,EAAEW;EACxD,CAAC,GAAGL,OAAO;EACX,MAAMM,KAAK,GAAG,IAAAC,aAAI,EAACN,GAAG,CAAC;EACpBO,WAAW,CAACC,+BAAkB,EAAEC,2CAA6B,CAAC;EAC9DF,WAAW,CAACG,qCAAwB,EAAEC,qCAAuB,CAAC;EAC9DC,IAAI,CAACX,IAAI,EAAEG,IAAI,CAAC;EACnB,IAAIF,IAAI,EAAE;IACRG,KAAK,CAACQ,SAAS,CAACX,IAAI,CAAC;EACvB;EACA,OAAOG,KAAK,CAACS,KAAK,CAAC,GAAG,EAAEX,QAAQ,CAAC;AACnC","ignoreList":[]}
package/lib/test/env.js DELETED
@@ -1,15 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.ENV_RQLITE_HOSTS = exports.DEFAULT_RQLITE_HOST = void 0; /**
2
- * Integration test environment constants
3
- * @module test/env
4
- */
5
-
6
- /**
7
- * Environment variable name for RQLite host list
8
- */
9
- const ENV_RQLITE_HOSTS = exports.ENV_RQLITE_HOSTS = 'RQLITE_HOSTS';
10
-
11
- /**
12
- * Default RQLite host when ENV_RQLITE_HOSTS is unset
13
- */
14
- const DEFAULT_RQLITE_HOST = exports.DEFAULT_RQLITE_HOST = 'http://localhost:4001';
15
- //# sourceMappingURL=env.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"env.js","names":["ENV_RQLITE_HOSTS","exports","DEFAULT_RQLITE_HOST"],"sources":["../../es6/test/env.js"],"sourcesContent":["/**\n * Integration test environment constants\n * @module test/env\n */\n\n/**\n * Environment variable name for RQLite host list\n */\nexport const ENV_RQLITE_HOSTS = 'RQLITE_HOSTS'\n\n/**\n * Default RQLite host when ENV_RQLITE_HOSTS is unset\n */\nexport const DEFAULT_RQLITE_HOST = 'http://localhost:4001'\n"],"mappings":"4IAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO,MAAMA,gBAAgB,GAAAC,OAAA,CAAAD,gBAAA,GAAG,cAAc;;AAE9C;AACA;AACA;AACO,MAAME,mBAAmB,GAAAD,OAAA,CAAAC,mBAAA,GAAG,uBAAuB","ignoreList":[]}
@@ -1,27 +0,0 @@
1
- "use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
2
-
3
-
4
-
5
- var _nock = _interopRequireDefault(require("nock"));
6
- var _chai = _interopRequireDefault(require("chai"));
7
- var _chaiAsPromised = _interopRequireDefault(require("chai-as-promised")); /**
8
- * Bootstrap for unit tests
9
- * @module test/unit
10
- */ /**
11
- * Disable external network connections except to localhost before all tests
12
- */before(() => {
13
- _chai.default.use(_chaiAsPromised.default);
14
- _nock.default.disableNetConnect();
15
- _nock.default.enableNetConnect('127.0.0.1');
16
- });
17
-
18
- /**
19
- * Destory all nocks before each test
20
- */
21
- beforeEach(() => _nock.default.cleanAll());
22
-
23
- /**
24
- * Enable network connection after all tests
25
- */
26
- after(() => _nock.default.enableNetConnect());
27
- //# sourceMappingURL=index.unit.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.unit.js","names":["_nock","_interopRequireDefault","require","_chai","_chaiAsPromised","before","chai","use","chaiAsPromised","nock","disableNetConnect","enableNetConnect","beforeEach","cleanAll","after"],"sources":["../../../es6/test/unit/index.unit.js"],"sourcesContent":["/**\n * Bootstrap for unit tests\n * @module test/unit\n */\nimport nock from 'nock'\nimport chai from 'chai'\nimport chaiAsPromised from 'chai-as-promised'\n\n/**\n * Disable external network connections except to localhost before all tests\n */\nbefore(() => {\n chai.use(chaiAsPromised)\n nock.disableNetConnect()\n nock.enableNetConnect('127.0.0.1')\n})\n\n/**\n * Destory all nocks before each test\n */\nbeforeEach(() => nock.cleanAll())\n\n/**\n * Enable network connection after all tests\n */\nafter(() => nock.enableNetConnect())\n"],"mappings":";;;;AAIA,IAAAA,KAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,KAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,eAAA,GAAAH,sBAAA,CAAAC,OAAA,sBAA6C,CAN7C;AACA;AACA;AACA,GAHA,CAQA;AACA;AACA,GACAG,MAAM,CAAC,MAAM;EACXC,aAAI,CAACC,GAAG,CAACC,uBAAc,CAAC;EACxBC,aAAI,CAACC,iBAAiB,CAAC,CAAC;EACxBD,aAAI,CAACE,gBAAgB,CAAC,WAAW,CAAC;AACpC,CAAC,CAAC;;AAEF;AACA;AACA;AACAC,UAAU,CAAC,MAAMH,aAAI,CAACI,QAAQ,CAAC,CAAC,CAAC;;AAEjC;AACA;AACA;AACAC,KAAK,CAAC,MAAML,aAAI,CAACE,gBAAgB,CAAC,CAAC,CAAC","ignoreList":[]}
@@ -1,238 +0,0 @@
1
- "use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");var _chai = require("chai");
2
- var _http = _interopRequireDefault(require("http"));
3
- var _https = _interopRequireDefault(require("https"));
4
- var _retryAsPromised = _interopRequireDefault(require("retry-as-promised"));
5
- var _data = require("./api/data");
6
- var _backup = require("./api/backup");
7
- var _status = require("./api/status");
8
- var _ = require(".");
9
- var _env = require("./test/env");
10
-
11
- /**
12
- * The RQLite host for integration tests, which can be changed
13
- * using the RQLITE_HOSTS environment variable or defaults to
14
- * http://localhost:4001
15
- * @type {String} The RQLite host address
16
- */
17
- const HOST = process.env[_env.ENV_RQLITE_HOSTS] || _env.DEFAULT_RQLITE_HOST;
18
-
19
- const httpAgent = new _http.default.Agent({ keepAlive: true });
20
- const httpsAgent = new _https.default.Agent({ keepAlive: true });
21
-
22
- describe('api status client', () => {
23
- const statusApiClient = new _.StatusApiClient(HOST, { httpAgent, httpsAgent });
24
- /**
25
- * Before beginning test check the status endpoint for a response from
26
- * RQLite server
27
- * @param {Number} backoffBase The amount of time to wait
28
- * @param {Number} max The maximum number of attempts before
29
- * throw the current error
30
- */
31
- async function checkRqliteServerReady(backoffBase = 500, max = 10) {
32
- return (0, _retryAsPromised.default)(async () => {
33
- const status = await statusApiClient.statusAllHosts();
34
- const ready = status.map((v) => v.response?.body?.store?.ready).every((v) => v === true);
35
- if (!ready) {
36
- throw new Error('All stores are not ready');
37
- }
38
- return status;
39
- }, {
40
- backoffBase,
41
- max
42
- });
43
- }
44
-
45
- before('check RQLite Server ready', () => checkRqliteServerReady());
46
- describe('should get status response', () => {
47
- it(`should call ${HOST}${_status.PATH_STATUS} and create table named foo`, async () => {
48
- const { body } = await statusApiClient.status();
49
- _chai.assert.isObject(body, 'response body is object');
50
- _chai.assert.property(body, 'build');
51
- _chai.assert.property(body, 'http');
52
- // assert.property(body, 'last_backup')
53
- _chai.assert.property(body, 'node');
54
- _chai.assert.property(body, 'runtime');
55
- _chai.assert.property(body, 'store');
56
- });
57
- });
58
- });
59
-
60
- describe('api data client', () => {
61
- const dataApiClient = new _.DataApiClient(HOST, { httpAgent, httpsAgent });
62
- // eslint-disable-next-line prefer-arrow-callback
63
- after('clean up data', async function cleanUpApiDataClientTests() {
64
- await dataApiClient.execute('DROP TABLE IF EXISTS foo');
65
- });
66
- describe('create table', () => {
67
- it(`should call ${HOST}${_data.PATH_EXECUTE} and create table named foo`, async () => {
68
- const sql = 'CREATE TABLE foo (id integer not null primary key, name text)';
69
- const dataResults = await dataApiClient.execute(sql);
70
- _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
71
- const results = dataResults.getResults();
72
- _chai.assert.lengthOf(results, 1);
73
- });
74
- });
75
- describe('insert one row', () => {
76
- it(`should call ${HOST}${_data.PATH_EXECUTE} and insert a record with the name fiona`, async () => {
77
- const sql = 'INSERT INTO foo(name) VALUES("fiona")';
78
- const dataResults = await dataApiClient.execute(sql);
79
- _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
80
- const dataResult = dataResults.get(0);
81
- _chai.assert.isDefined(dataResult, 'dataResult');
82
- _chai.assert.equal(dataResult.getRowsAffected(), 1, 'row_affected');
83
- _chai.assert.equal(dataResult.getLastInsertId(), 1, 'last_insert_id');
84
- });
85
- it(`should call ${HOST}${_data.PATH_QUERY} and select a record with the name fiona`, async () => {
86
- const sql = 'SELECT name FROM foo WHERE name="fiona"';
87
- const dataResults = await dataApiClient.query(sql);
88
- _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
89
- const dataResult = dataResults.get(0);
90
- _chai.assert.isDefined(dataResult, 'dataResult');
91
- _chai.assert.equal(dataResult.get('name'), 'fiona', 'name');
92
- });
93
- });
94
- describe('update one row', () => {
95
- it(`should call ${HOST}${_data.PATH_EXECUTE} and update the record with the name fiona to the name justin`, async () => {
96
- const sql = 'UPDATE foo SET name="justin" WHERE name="fiona"';
97
- const dataResults = await dataApiClient.execute(sql);
98
- _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
99
- const dataResult = dataResults.get(0);
100
- _chai.assert.isDefined(dataResult, 'dataResult');
101
- _chai.assert.equal(dataResult.getRowsAffected(), 1, 'row_affected');
102
- });
103
- it(`should call ${HOST}${_data.PATH_QUERY} and select a record with the name justin`, async () => {
104
- const sql = 'SELECT name FROM foo WHERE name="justin"';
105
- const dataResults = await dataApiClient.query(sql);
106
- _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
107
- const dataResult = dataResults.get(0);
108
- _chai.assert.isDefined(dataResult, 'dataResult');
109
- _chai.assert.equal(dataResult.get('name'), 'justin', 'name');
110
- });
111
- });
112
- describe('delete one row', () => {
113
- it(`should call ${HOST}${_data.PATH_EXECUTE} and delete a record with the name justin`, async () => {
114
- const sql = 'DELETE FROM foo WHERE name="justin"';
115
- const dataResults = await dataApiClient.execute(sql);
116
- _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
117
- const dataResult = dataResults.get(0);
118
- _chai.assert.isDefined(dataResult, 'dataResult');
119
- _chai.assert.equal(dataResult.getRowsAffected(), 1, 'row_affected');
120
- });
121
- it(`should call ${HOST}${_data.PATH_QUERY} and select a count of foo item that has a result of zero`, async () => {
122
- const sql = 'SELECT COUNT(id) AS idCount FROM foo';
123
- const dataResults = await dataApiClient.query(sql);
124
- _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
125
- const dataResult = dataResults.get(0);
126
- _chai.assert.isDefined(dataResult, 'dataResult');
127
- _chai.assert.equal(dataResult.get('idCount'), 0, 'idCount');
128
- });
129
- });
130
- describe('insert multiple rows', () => {
131
- const total = 100;
132
- const dataList = Array(total).fill(0);
133
- it(`should call ${HOST}${_data.PATH_EXECUTE} and insert a record with the name fiona and justin using a transaction`, async () => {
134
- const sql = dataList.map((_v, i) => `INSERT INTO foo(name) VALUES("justin-${i}")`);
135
- const dataResults = await dataApiClient.execute(sql, { atomic: true });
136
- _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
137
- dataList.forEach((_v, i) => {
138
- const dataResult = dataResults.get(i);
139
- _chai.assert.isDefined(dataResult, 'dataResult');
140
- _chai.assert.equal(dataResult.getRowsAffected(), 1, 'row_affected');
141
- _chai.assert.equal(dataResult.getLastInsertId(), i + 1, 'last_insert_id');
142
- });
143
- });
144
- it(`should call ${HOST}${_data.PATH_QUERY} and select a count of foo items that has a result of two`, async () => {
145
- const sql = 'SELECT COUNT(*) AS total FROM foo WHERE name like("justin-%")';
146
- const dataResults = await dataApiClient.query(sql);
147
- _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
148
- const dataResult = dataResults.get(0);
149
- _chai.assert.isDefined(dataResult, 'dataResult');
150
- _chai.assert.equal(dataResult.get('total'), total, 'total');
151
- });
152
- it(`should call ${HOST}${_data.PATH_QUERY} and select an array of records with the name fiona then justin`, async () => {
153
- const sql = dataList.map((_v, i) => `SELECT name FROM foo WHERE name="justin-${i}"`);
154
- const dataResults = await dataApiClient.query(sql);
155
- _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
156
- dataList.forEach((_v, i) => {
157
- _chai.assert.equal(dataResults.get(i).get('name'), `justin-${i}`, `item ${i} name`);
158
- });
159
- });
160
- });
161
- describe('drop the table', () => {
162
- it(`should call ${HOST}${_data.PATH_EXECUTE} and drop the table foo`, async () => {
163
- const sql = 'DROP TABLE foo';
164
- const dataResults = await dataApiClient.execute(sql);
165
- _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
166
- const dataResult = dataResults.get(0);
167
- _chai.assert.isDefined(dataResult, 'dataResult');
168
- _chai.assert.equal(dataResult.getRowsAffected(), 1, 'row_affected');
169
- });
170
- });
171
- });
172
-
173
- describe('api backups client', () => {
174
- const backupApiClient = new _.BackupApiClient(HOST, { httpAgent, httpsAgent });
175
- const dataApiClient = new _.DataApiClient(HOST, { httpAgent, httpsAgent });
176
- /**
177
- * Capture the stream data and resolve a promise with the parsed JSON
178
- * @returns {Stream} The stream
179
- */
180
- function handleRequestStreamAsPromise(request) {
181
- return new Promise((resolve, reject) => {
182
- let result = Buffer.alloc(0);
183
- request.
184
- on('data', (data) => {
185
- result = Buffer.concat([result, data]);
186
- }).
187
- on('end', () => resolve(result)).
188
- on('error', reject);
189
- });
190
- }
191
-
192
- // eslint-disable-next-line prefer-arrow-callback
193
- after('clean up backup data', async function cleanUpApiBackupTests() {
194
- await dataApiClient.execute('DROP TABLE IF EXISTS fooBackups');
195
- await dataApiClient.execute('DROP TABLE IF EXISTS fooRestore');
196
- });
197
- describe('backup database', () => {
198
- it(`should call ${HOST}${_backup.PATH_BACKUP} and get a SQL backup string`, async () => {
199
- const sql = 'CREATE TABLE fooBackups (id integer not null primary key, name text)';
200
- let dataResults = await dataApiClient.execute(sql);
201
- _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
202
- dataResults = await dataApiClient.execute([
203
- 'INSERT INTO fooBackups(name) VALUES("fiona")',
204
- 'INSERT INTO fooBackups(name) VALUES("justin")'],
205
- { atomic: true });
206
- _chai.assert.isUndefined(dataResults.getFirstError(), 'error');
207
- const request = await backupApiClient.backup();
208
- const stream = await handleRequestStreamAsPromise(request);
209
- _chai.assert.isString(stream.toString());
210
- });
211
- });
212
- describe('restore database', () => {
213
- it(`should call ${HOST}${_backup.PATH_LOAD} and send a SQLite backup stream`, async () => {
214
- /**
215
- * Individual SQL statements to create back up data
216
- */
217
- const BACKUP_SQL_STATEMENTS = [
218
- 'CREATE TABLE fooRestore (id integer not null primary key, name text)',
219
- 'INSERT INTO fooRestore(name) VALUES ("fiona")',
220
- 'INSERT INTO fooRestore(name) VALUES ("justin")'];
221
-
222
- const sql = Buffer.from(BACKUP_SQL_STATEMENTS.join(';'));
223
- const request = await backupApiClient.load(sql);
224
- const { results } = JSON.parse(await handleRequestStreamAsPromise(request));
225
- _chai.assert.nestedPropertyVal(results, '[0].rows_affected', 1, 'results of last SQL statment is 1 row');
226
- const dataResults = await dataApiClient.query('SELECT id, name FROM fooRestore WHERE name="fiona"', { level: 'strong' });
227
- const error = dataResults.getFirstError();
228
- if (error) {
229
- throw error;
230
- }
231
- const dataResult = dataResults.get(0);
232
- _chai.assert.isDefined(dataResult, 'dataResult');
233
- _chai.assert.deepEqual(dataResult.get('id'), 1, 'id');
234
- _chai.assert.deepEqual(dataResult.get('name'), 'fiona', 'name');
235
- });
236
- });
237
- });
238
- //# sourceMappingURL=test.integration.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test.integration.js","names":["_chai","require","_http","_interopRequireDefault","_https","_retryAsPromised","_data","_backup","_status","_","_env","HOST","process","env","ENV_RQLITE_HOSTS","DEFAULT_RQLITE_HOST","httpAgent","http","Agent","keepAlive","httpsAgent","https","describe","statusApiClient","StatusApiClient","checkRqliteServerReady","backoffBase","max","retryAsPromise","status","statusAllHosts","ready","map","v","response","body","store","every","Error","before","it","PATH_STATUS","assert","isObject","property","dataApiClient","DataApiClient","after","cleanUpApiDataClientTests","execute","PATH_EXECUTE","sql","dataResults","isUndefined","getFirstError","results","getResults","lengthOf","dataResult","get","isDefined","equal","getRowsAffected","getLastInsertId","PATH_QUERY","query","total","dataList","Array","fill","_v","i","atomic","forEach","backupApiClient","BackupApiClient","handleRequestStreamAsPromise","request","Promise","resolve","reject","result","Buffer","alloc","on","data","concat","cleanUpApiBackupTests","PATH_BACKUP","backup","stream","isString","toString","PATH_LOAD","BACKUP_SQL_STATEMENTS","from","join","load","JSON","parse","nestedPropertyVal","level","error","deepEqual"],"sources":["../es6/test.integration.js"],"sourcesContent":["import { assert } from 'chai'\nimport http from 'http'\nimport https from 'https'\nimport retryAsPromise from 'retry-as-promised'\nimport { PATH_EXECUTE, PATH_QUERY } from './api/data'\nimport { PATH_LOAD, PATH_BACKUP } from './api/backup'\nimport { PATH_STATUS } from './api/status'\nimport { DataApiClient, BackupApiClient, StatusApiClient } from '.'\nimport { DEFAULT_RQLITE_HOST, ENV_RQLITE_HOSTS } from './test/env'\n\n/**\n * The RQLite host for integration tests, which can be changed\n * using the RQLITE_HOSTS environment variable or defaults to\n * http://localhost:4001\n * @type {String} The RQLite host address\n */\nconst HOST = process.env[ENV_RQLITE_HOSTS] || DEFAULT_RQLITE_HOST\n\nconst httpAgent = new http.Agent({ keepAlive: true })\nconst httpsAgent = new https.Agent({ keepAlive: true })\n\ndescribe('api status client', () => {\n const statusApiClient = new StatusApiClient(HOST, { httpAgent, httpsAgent })\n /**\n * Before beginning test check the status endpoint for a response from\n * RQLite server\n * @param {Number} backoffBase The amount of time to wait\n * @param {Number} max The maximum number of attempts before\n * throw the current error\n */\n async function checkRqliteServerReady (backoffBase = 500, max = 10) {\n return retryAsPromise(async () => {\n const status = await statusApiClient.statusAllHosts()\n const ready = status.map((v) => v.response?.body?.store?.ready).every((v) => v === true)\n if (!ready) {\n throw new Error('All stores are not ready')\n }\n return status\n }, {\n backoffBase,\n max,\n })\n }\n\n before('check RQLite Server ready', () => checkRqliteServerReady())\n describe('should get status response', () => {\n it(`should call ${HOST}${PATH_STATUS} and create table named foo`, async () => {\n const { body } = await statusApiClient.status()\n assert.isObject(body, 'response body is object')\n assert.property(body, 'build')\n assert.property(body, 'http')\n // assert.property(body, 'last_backup')\n assert.property(body, 'node')\n assert.property(body, 'runtime')\n assert.property(body, 'store')\n })\n })\n})\n\ndescribe('api data client', () => {\n const dataApiClient = new DataApiClient(HOST, { httpAgent, httpsAgent })\n // eslint-disable-next-line prefer-arrow-callback\n after('clean up data', async function cleanUpApiDataClientTests () {\n await dataApiClient.execute('DROP TABLE IF EXISTS foo')\n })\n describe('create table', () => {\n it(`should call ${HOST}${PATH_EXECUTE} and create table named foo`, async () => {\n const sql = 'CREATE TABLE foo (id integer not null primary key, name text)'\n const dataResults = await dataApiClient.execute(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const results = dataResults.getResults()\n assert.lengthOf(results, 1)\n })\n })\n describe('insert one row', () => {\n it(`should call ${HOST}${PATH_EXECUTE} and insert a record with the name fiona`, async () => {\n const sql = 'INSERT INTO foo(name) VALUES(\"fiona\")'\n const dataResults = await dataApiClient.execute(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const dataResult = dataResults.get(0)\n assert.isDefined(dataResult, 'dataResult')\n assert.equal(dataResult.getRowsAffected(), 1, 'row_affected')\n assert.equal(dataResult.getLastInsertId(), 1, 'last_insert_id')\n })\n it(`should call ${HOST}${PATH_QUERY} and select a record with the name fiona`, async () => {\n const sql = 'SELECT name FROM foo WHERE name=\"fiona\"'\n const dataResults = await dataApiClient.query(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const dataResult = dataResults.get(0)\n assert.isDefined(dataResult, 'dataResult')\n assert.equal(dataResult.get('name'), 'fiona', 'name')\n })\n })\n describe('update one row', () => {\n it(`should call ${HOST}${PATH_EXECUTE} and update the record with the name fiona to the name justin`, async () => {\n const sql = 'UPDATE foo SET name=\"justin\" WHERE name=\"fiona\"'\n const dataResults = await dataApiClient.execute(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const dataResult = dataResults.get(0)\n assert.isDefined(dataResult, 'dataResult')\n assert.equal(dataResult.getRowsAffected(), 1, 'row_affected')\n })\n it(`should call ${HOST}${PATH_QUERY} and select a record with the name justin`, async () => {\n const sql = 'SELECT name FROM foo WHERE name=\"justin\"'\n const dataResults = await dataApiClient.query(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const dataResult = dataResults.get(0)\n assert.isDefined(dataResult, 'dataResult')\n assert.equal(dataResult.get('name'), 'justin', 'name')\n })\n })\n describe('delete one row', () => {\n it(`should call ${HOST}${PATH_EXECUTE} and delete a record with the name justin`, async () => {\n const sql = 'DELETE FROM foo WHERE name=\"justin\"'\n const dataResults = await dataApiClient.execute(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const dataResult = dataResults.get(0)\n assert.isDefined(dataResult, 'dataResult')\n assert.equal(dataResult.getRowsAffected(), 1, 'row_affected')\n })\n it(`should call ${HOST}${PATH_QUERY} and select a count of foo item that has a result of zero`, async () => {\n const sql = 'SELECT COUNT(id) AS idCount FROM foo'\n const dataResults = await dataApiClient.query(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const dataResult = dataResults.get(0)\n assert.isDefined(dataResult, 'dataResult')\n assert.equal(dataResult.get('idCount'), 0, 'idCount')\n })\n })\n describe('insert multiple rows', () => {\n const total = 100\n const dataList = Array(total).fill(0)\n it(`should call ${HOST}${PATH_EXECUTE} and insert a record with the name fiona and justin using a transaction`, async () => {\n const sql = dataList.map((_v, i) => `INSERT INTO foo(name) VALUES(\"justin-${i}\")`)\n const dataResults = await dataApiClient.execute(sql, { atomic: true })\n assert.isUndefined(dataResults.getFirstError(), 'error')\n dataList.forEach((_v, i) => {\n const dataResult = dataResults.get(i)\n assert.isDefined(dataResult, 'dataResult')\n assert.equal(dataResult.getRowsAffected(), 1, 'row_affected')\n assert.equal(dataResult.getLastInsertId(), i + 1, 'last_insert_id')\n })\n })\n it(`should call ${HOST}${PATH_QUERY} and select a count of foo items that has a result of two`, async () => {\n const sql = 'SELECT COUNT(*) AS total FROM foo WHERE name like(\"justin-%\")'\n const dataResults = await dataApiClient.query(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const dataResult = dataResults.get(0)\n assert.isDefined(dataResult, 'dataResult')\n assert.equal(dataResult.get('total'), total, 'total')\n })\n it(`should call ${HOST}${PATH_QUERY} and select an array of records with the name fiona then justin`, async () => {\n const sql = dataList.map((_v, i) => `SELECT name FROM foo WHERE name=\"justin-${i}\"`)\n const dataResults = await dataApiClient.query(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n dataList.forEach((_v, i) => {\n assert.equal(dataResults.get(i).get('name'), `justin-${i}`, `item ${i} name`)\n })\n })\n })\n describe('drop the table', () => {\n it(`should call ${HOST}${PATH_EXECUTE} and drop the table foo`, async () => {\n const sql = 'DROP TABLE foo'\n const dataResults = await dataApiClient.execute(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const dataResult = dataResults.get(0)\n assert.isDefined(dataResult, 'dataResult')\n assert.equal(dataResult.getRowsAffected(), 1, 'row_affected')\n })\n })\n})\n\ndescribe('api backups client', () => {\n const backupApiClient = new BackupApiClient(HOST, { httpAgent, httpsAgent })\n const dataApiClient = new DataApiClient(HOST, { httpAgent, httpsAgent })\n /**\n * Capture the stream data and resolve a promise with the parsed JSON\n * @returns {Stream} The stream\n */\n function handleRequestStreamAsPromise (request) {\n return new Promise((resolve, reject) => {\n let result = Buffer.alloc(0)\n request\n .on('data', (data) => {\n result = Buffer.concat([result, data])\n })\n .on('end', () => resolve(result))\n .on('error', reject)\n })\n }\n\n // eslint-disable-next-line prefer-arrow-callback\n after('clean up backup data', async function cleanUpApiBackupTests () {\n await dataApiClient.execute('DROP TABLE IF EXISTS fooBackups')\n await dataApiClient.execute('DROP TABLE IF EXISTS fooRestore')\n })\n describe('backup database', () => {\n it(`should call ${HOST}${PATH_BACKUP} and get a SQL backup string`, async () => {\n const sql = 'CREATE TABLE fooBackups (id integer not null primary key, name text)'\n let dataResults = await dataApiClient.execute(sql)\n assert.isUndefined(dataResults.getFirstError(), 'error')\n dataResults = await dataApiClient.execute([\n 'INSERT INTO fooBackups(name) VALUES(\"fiona\")',\n 'INSERT INTO fooBackups(name) VALUES(\"justin\")',\n ], { atomic: true })\n assert.isUndefined(dataResults.getFirstError(), 'error')\n const request = await backupApiClient.backup()\n const stream = await handleRequestStreamAsPromise(request)\n assert.isString(stream.toString())\n })\n })\n describe('restore database', () => {\n it(`should call ${HOST}${PATH_LOAD} and send a SQLite backup stream`, async () => {\n /**\n * Individual SQL statements to create back up data\n */\n const BACKUP_SQL_STATEMENTS = [\n 'CREATE TABLE fooRestore (id integer not null primary key, name text)',\n 'INSERT INTO fooRestore(name) VALUES (\"fiona\")',\n 'INSERT INTO fooRestore(name) VALUES (\"justin\")',\n ]\n const sql = Buffer.from(BACKUP_SQL_STATEMENTS.join(';'))\n const request = await backupApiClient.load(sql)\n const { results } = JSON.parse(await handleRequestStreamAsPromise(request))\n assert.nestedPropertyVal(results, '[0].rows_affected', 1, 'results of last SQL statment is 1 row')\n const dataResults = await dataApiClient.query('SELECT id, name FROM fooRestore WHERE name=\"fiona\"', { level: 'strong' })\n const error = dataResults.getFirstError()\n if (error) {\n throw error\n }\n const dataResult = dataResults.get(0)\n assert.isDefined(dataResult, 'dataResult')\n assert.deepEqual(dataResult.get('id'), 1, 'id')\n assert.deepEqual(dataResult.get('name'), 'fiona', 'name')\n })\n })\n})\n"],"mappings":"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","ignoreList":[]}