w-orm-lmdb 1.0.19 → 1.0.21

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.
@@ -0,0 +1,108 @@
1
+ import assert from 'assert'
2
+ import _ from 'lodash-es'
3
+ import w from 'wsemi'
4
+ import WOrm from '../src/WOrmLmdb.mjs'
5
+
6
+
7
+ describe('closed', function() {
8
+ let vans = {}
9
+ let vget = {}
10
+
11
+ before(async function() {
12
+
13
+ w.fsDeleteFolder('./_db_closed')
14
+
15
+ let wo = WOrm({ url: './_db_closed', db: 'worm', cl: 'users' })
16
+ await wo.insert({ id: 'k1', name: 'peter' })
17
+ await wo.close()
18
+
19
+ //evs, close後之操作屬整批性錯誤, 依T10.3須發出error事件
20
+ let evs = []
21
+ wo.on('error', function(mode, data, err) {
22
+ evs.push({ mode, isStr: _.isString(err) })
23
+ })
24
+
25
+ //run, close後各函數皆須立即reject(而非空轉約200秒), 且訊息明示closed而不與[查無資料]同形
26
+ let run = async (fn) => {
27
+ let t0 = Date.now()
28
+ let r = await fn()
29
+ .then(function(msg) {
30
+ return { type: 'resolve', msg }
31
+ })
32
+ .catch(function(err) {
33
+ return { type: 'reject', closed: String(err).indexOf('closed') >= 0 }
34
+ })
35
+ r.fast = (Date.now() - t0) < 2000
36
+ return r
37
+ }
38
+
39
+ vget[1] = await run(() => wo.select())
40
+ vget[2] = await run(() => wo.selectByPk('k1'))
41
+ vget[3] = await run(() => wo.insert({ id: 'k2' }))
42
+ vget[4] = await run(() => wo.insert({ id: 'k2' }, { returnList: true }))
43
+ vget[5] = await run(() => wo.insertBulk({ id: 'k3' }))
44
+ vget[6] = await run(() => wo.save({ id: 'k1', name: 'mary' }))
45
+ vget[7] = await run(() => wo.del({ id: 'k1' }))
46
+ vget[8] = await run(() => wo.delAll())
47
+ vget[9] = _.map(evs, 'mode')
48
+ vget[10] = _.uniq(_.map(evs, 'isStr'))
49
+
50
+ })
51
+
52
+ let rj = { type: 'reject', closed: true, fast: true }
53
+
54
+ vans[1] = rj
55
+ it(`should get ${JSON.stringify(vans[1])} for select after close`, async function() {
56
+ assert.strict.deepStrictEqual(vget[1], vans[1])
57
+ })
58
+
59
+ //不可回null, 否則[已關閉]與[查無資料]同形而fail-open
60
+ vans[2] = rj
61
+ it(`should get ${JSON.stringify(vans[2])} for selectByPk after close`, async function() {
62
+ assert.strict.deepStrictEqual(vget[2], vans[2])
63
+ })
64
+
65
+ vans[3] = rj
66
+ it(`should get ${JSON.stringify(vans[3])} for insert after close`, async function() {
67
+ assert.strict.deepStrictEqual(vget[3], vans[3])
68
+ })
69
+
70
+ vans[4] = rj
71
+ it(`should get ${JSON.stringify(vans[4])} for insert(returnList) after close`, async function() {
72
+ assert.strict.deepStrictEqual(vget[4], vans[4])
73
+ })
74
+
75
+ //守門須在進入childTransaction之前, 否則已關閉env上之非同步回調會拋出未捕捉例外使行程崩潰
76
+ vans[5] = rj
77
+ it(`should get ${JSON.stringify(vans[5])} for insertBulk after close`, async function() {
78
+ assert.strict.deepStrictEqual(vget[5], vans[5])
79
+ })
80
+
81
+ //屬整批性錯誤而reject, 不可降為逐筆ok:0之resolve
82
+ vans[6] = rj
83
+ it(`should get ${JSON.stringify(vans[6])} for save after close`, async function() {
84
+ assert.strict.deepStrictEqual(vget[6], vans[6])
85
+ })
86
+
87
+ //不可回[{n:0,nDeleted:0,ok:1}]之正常未命中結果
88
+ vans[7] = rj
89
+ it(`should get ${JSON.stringify(vans[7])} for del after close`, async function() {
90
+ assert.strict.deepStrictEqual(vget[7], vans[7])
91
+ })
92
+
93
+ vans[8] = rj
94
+ it(`should get ${JSON.stringify(vans[8])} for delAll after close`, async function() {
95
+ assert.strict.deepStrictEqual(vget[8], vans[8])
96
+ })
97
+
98
+ vans[9] = ['select', 'selectByPk', 'insert', 'insert', 'insertBulk', 'save', 'del', 'delAll']
99
+ it(`should get ${JSON.stringify(vans[9])} for error events after close`, async function() {
100
+ assert.strict.deepStrictEqual(vget[9], vans[9])
101
+ })
102
+
103
+ vans[10] = [true]
104
+ it(`should get ${JSON.stringify(vans[10])} for err of error events being string`, async function() {
105
+ assert.strict.deepStrictEqual(vget[10], vans[10])
106
+ })
107
+
108
+ })
@@ -0,0 +1,195 @@
1
+ import assert from 'assert'
2
+ import _ from 'lodash-es'
3
+ import w from 'wsemi'
4
+ import WOrm from '../src/WOrmLmdb.mjs'
5
+
6
+
7
+ describe('returnList', function() {
8
+ let rt = null
9
+ let vans = {}
10
+ let vget = {}
11
+
12
+ before(async function() {
13
+
14
+ w.fsDeleteFolder('./_db_returnlist')
15
+
16
+ let url = './_db_returnlist'
17
+
18
+ let wo = WOrm({ url, db: 'worm', cl: 'users' })
19
+
20
+ //輸入無效, 開啟returnList時回傳空陣列(對齊save與del之T5)
21
+ vget[1] = await wo.insert(null, { returnList: true })
22
+
23
+ //全新3筆, 逐筆恆為已插入
24
+ rt = null
25
+ // vans[2] = [{ n: 1, nInserted: 1, ok: 1 }, ...]
26
+ await wo.insert([{ id: 'a' }, { id: 'b' }, { id: 'c' }], { returnList: true })
27
+ .then(function(msg) {
28
+ // console.log('insert(returnList) then', msg)
29
+ // insert(returnList) then [
30
+ // { n: 1, nInserted: 1, ok: 1 },
31
+ // { n: 1, nInserted: 1, ok: 1 },
32
+ // { n: 1, nInserted: 1, ok: 1 }
33
+ // ]
34
+ rt = msg
35
+ })
36
+ .catch(function(msg) {
37
+ rt = 'reject: ' + msg.toString()
38
+ })
39
+ vget[2] = rt
40
+
41
+ //混入既有主鍵, 逐筆結果須與輸入對位
42
+ rt = null
43
+ await wo.insert([{ id: 'd' }, { id: 'a' }, { id: 'e' }], { returnList: true })
44
+ .then(function(msg) {
45
+ rt = msg
46
+ })
47
+ .catch(function(msg) {
48
+ rt = 'reject: ' + msg.toString()
49
+ })
50
+ vget[3] = rt
51
+
52
+ //同批重複主鍵, 僅首筆nInserted為1
53
+ rt = null
54
+ await wo.insert([{ id: 'f' }, { id: 'f' }], { returnList: true })
55
+ .then(function(msg) {
56
+ rt = msg
57
+ })
58
+ .catch(function(msg) {
59
+ rt = 'reject: ' + msg.toString()
60
+ })
61
+ vget[4] = rt
62
+
63
+ //不變式: filter計數等於聚合模式之nInserted(同一情境於另一資料表以聚合模式對照)
64
+ let woAgg = WOrm({ url, db: 'worm', cl: 'agg' })
65
+ await woAgg.insert([{ id: 'a' }, { id: 'b' }, { id: 'c' }])
66
+ let rAgg = await woAgg.insert([{ id: 'd' }, { id: 'a' }, { id: 'e' }])
67
+ vget[5] = {
68
+ fromList: _.size(_.filter(vget[3], function(v) {
69
+ return v.nInserted === 1
70
+ })),
71
+ fromAgg: rAgg.nInserted,
72
+ }
73
+ await woAgg.close()
74
+
75
+ //單一物件輸入, 回傳長度1之陣列
76
+ rt = null
77
+ await wo.insert({ id: 'g' }, { returnList: true })
78
+ .then(function(msg) {
79
+ rt = msg
80
+ })
81
+ .catch(function(msg) {
82
+ rt = 'reject: ' + msg.toString()
83
+ })
84
+ vget[6] = rt
85
+
86
+ //逐筆元素之鍵集合恰為n,nInserted,ok
87
+ vget[7] = _.uniq(_.map(vget[3], function(v) {
88
+ return _.keys(v).sort().join(',')
89
+ }))
90
+
91
+ //預設(未給option)仍回傳聚合物件, 鍵集合不變
92
+ rt = null
93
+ await wo.insert({ id: 'h' })
94
+ .then(function(msg) {
95
+ rt = msg
96
+ })
97
+ .catch(function(msg) {
98
+ rt = 'reject: ' + msg.toString()
99
+ })
100
+ vget[8] = rt
101
+
102
+ //change事件之res即本次實際回傳值(陣列)
103
+ let evs = []
104
+ wo.on('change', function(mode, data, res) {
105
+ evs.push({ mode, isArr: _.isArray(res), len: _.size(res) })
106
+ })
107
+ await wo.insert([{ id: 'i1' }, { id: 'i2' }], { returnList: true })
108
+ vget[9] = evs
109
+
110
+ await wo.close()
111
+
112
+ //autoGenPk為false而未帶有效主鍵, 不受returnList影響仍整批reject
113
+ let woNo = WOrm({ url, db: 'worm', cl: 'nogen', autoGenPk: false })
114
+ rt = null
115
+ await woNo.insert([{ id: 'x1' }, { zz: 1 }], { returnList: true })
116
+ .then(function(msg) {
117
+ rt = 'resolve: ' + JSON.stringify(msg)
118
+ })
119
+ .catch(function() {
120
+ rt = 'reject'
121
+ })
122
+ vget[10] = rt
123
+ vget[11] = _.size(await woNo.select())
124
+ await woNo.close()
125
+
126
+ })
127
+
128
+ vans[1] = []
129
+ it(`should get ${JSON.stringify(vans[1])} for insert(returnList) with invalid input`, async function() {
130
+ assert.strict.deepStrictEqual(vget[1], vans[1])
131
+ })
132
+
133
+ vans[2] = [
134
+ { n: 1, nInserted: 1, ok: 1 },
135
+ { n: 1, nInserted: 1, ok: 1 },
136
+ { n: 1, nInserted: 1, ok: 1 },
137
+ ]
138
+ it(`should get ${JSON.stringify(vans[2])} for insert(returnList) with all new`, async function() {
139
+ assert.strict.deepStrictEqual(vget[2], vans[2])
140
+ })
141
+
142
+ //對位: 第2筆為既有主鍵故nInserted為0, 其餘為1
143
+ vans[3] = [
144
+ { n: 1, nInserted: 1, ok: 1 },
145
+ { n: 1, nInserted: 0, ok: 1 },
146
+ { n: 1, nInserted: 1, ok: 1 },
147
+ ]
148
+ it(`should get ${JSON.stringify(vans[3])} for insert(returnList) with existed id at position 2`, async function() {
149
+ assert.strict.deepStrictEqual(vget[3], vans[3])
150
+ })
151
+
152
+ vans[4] = [
153
+ { n: 1, nInserted: 1, ok: 1 },
154
+ { n: 1, nInserted: 0, ok: 1 },
155
+ ]
156
+ it(`should get ${JSON.stringify(vans[4])} for insert(returnList) with duplicated id in same batch`, async function() {
157
+ assert.strict.deepStrictEqual(vget[4], vans[4])
158
+ })
159
+
160
+ vans[5] = { fromList: 2, fromAgg: 2 }
161
+ it(`should get ${JSON.stringify(vans[5])} for filter count equal to aggregate nInserted`, async function() {
162
+ assert.strict.deepStrictEqual(vget[5], vans[5])
163
+ })
164
+
165
+ vans[6] = [{ n: 1, nInserted: 1, ok: 1 }]
166
+ it(`should get ${JSON.stringify(vans[6])} for insert(returnList) by single object`, async function() {
167
+ assert.strict.deepStrictEqual(vget[6], vans[6])
168
+ })
169
+
170
+ vans[7] = ['n,nInserted,ok']
171
+ it(`should get ${JSON.stringify(vans[7])} for keys of each item`, async function() {
172
+ assert.strict.deepStrictEqual(vget[7], vans[7])
173
+ })
174
+
175
+ vans[8] = { n: 1, nInserted: 1, ok: 1 }
176
+ it(`should get ${JSON.stringify(vans[8])} for insert without option keeping aggregate shape`, async function() {
177
+ assert.strict.deepStrictEqual(vget[8], vans[8])
178
+ })
179
+
180
+ vans[9] = [{ mode: 'insert', isArr: true, len: 2 }]
181
+ it(`should get ${JSON.stringify(vans[9])} for change event res being the returned array`, async function() {
182
+ assert.strict.deepStrictEqual(vget[9], vans[9])
183
+ })
184
+
185
+ vans[10] = 'reject'
186
+ it(`should get ${JSON.stringify(vans[10])} for insert(returnList) without id by autoGenPk=false`, async function() {
187
+ assert.strict.deepStrictEqual(vget[10], vans[10])
188
+ })
189
+
190
+ vans[11] = 0
191
+ it(`should get ${JSON.stringify(vans[11])} for no writing when autoGenPk=false rejected`, async function() {
192
+ assert.strict.deepStrictEqual(vget[11], vans[11])
193
+ })
194
+
195
+ })
@@ -7,7 +7,7 @@ let fdTar = './dist'
7
7
 
8
8
 
9
9
  rollupFiles({
10
- fns: getFiles(fdSrc),
10
+ fns: 'WOrmLmdb.mjs',
11
11
  fdSrc,
12
12
  fdTar,
13
13
  nameDistType: 'kebabCase',