w-orm-lowdb 1.0.12 → 1.0.14

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,188 @@
1
+ import assert from 'assert'
2
+ import _ from 'lodash-es'
3
+ import w from 'wsemi'
4
+ import WOrm from '../src/WOrmLowdb.mjs'
5
+
6
+
7
+ describe('insertBulk', function() {
8
+ let rt = null
9
+ let vans = {}
10
+ let vget = {}
11
+
12
+ before(async function() {
13
+
14
+ w.fsDeleteFile('./db_insertbulk.json')
15
+
16
+ let wo = WOrm({ url: './db_insertbulk.json', db: 'worm', cl: 'users' })
17
+
18
+ //輸入無效, 回傳空結果而非錯誤, 且鍵集合與insert完全相同
19
+ vget[1] = await wo.insertBulk(null)
20
+
21
+ //正常插入, nInserted須恆等於n
22
+ rt = null
23
+ await wo.insertBulk([{ id: 'a' }, { id: 'b' }, { id: 'c' }])
24
+ .then(function(msg) {
25
+ rt = msg
26
+ })
27
+ .catch(function(msg) {
28
+ rt = 'reject: ' + msg.toString()
29
+ })
30
+ vget[2] = rt
31
+ vget[3] = _.map(_.sortBy(await wo.select(), 'id'), 'id')
32
+
33
+ //單一物件亦須回傳單一物件而非陣列
34
+ vget[4] = await wo.insertBulk({ id: 'd' })
35
+
36
+ //含既有主鍵須整批reject, 且不得寫入任何一筆
37
+ let n1 = _.size(await wo.select())
38
+ rt = null
39
+ await wo.insertBulk([{ id: 'e' }, { id: 'a' }, { id: 'f' }])
40
+ .then(function(msg) {
41
+ rt = 'resolve: ' + JSON.stringify(msg)
42
+ })
43
+ .catch(function() {
44
+ rt = 'reject'
45
+ })
46
+ vget[5] = rt
47
+ let n2 = _.size(await wo.select())
48
+ vget[6] = n2 - n1
49
+ vget[7] = [await wo.selectByPk('e'), await wo.selectByPk('f')]
50
+
51
+ //同批含重複主鍵須整批reject, 且不得寫入任何一筆
52
+ rt = null
53
+ await wo.insertBulk([{ id: 'g' }, { id: 'h' }, { id: 'g' }])
54
+ .then(function(msg) {
55
+ rt = 'resolve: ' + JSON.stringify(msg)
56
+ })
57
+ .catch(function() {
58
+ rt = 'reject'
59
+ })
60
+ vget[8] = rt
61
+ vget[9] = _.size(await wo.select()) - n2
62
+ vget[10] = [await wo.selectByPk('g'), await wo.selectByPk('h')]
63
+
64
+ //大批次末筆衝突亦不得留下部份寫入
65
+ let n3 = _.size(await wo.select())
66
+ let dt = _.map(_.range(200), function(v) {
67
+ return { id: `bulk-${v}` }
68
+ })
69
+ dt.push({ id: 'a' })
70
+ rt = null
71
+ await wo.insertBulk(dt)
72
+ .then(function(msg) {
73
+ rt = 'resolve: ' + JSON.stringify(msg)
74
+ })
75
+ .catch(function() {
76
+ rt = 'reject'
77
+ })
78
+ vget[11] = rt
79
+ vget[12] = _.size(await wo.select()) - n3
80
+
81
+ //衝突後既有數據不得被改動
82
+ vget[13] = await wo.selectByPk('a')
83
+
84
+ //無衝突之大批次須全數寫入
85
+ vget[14] = await wo.insertBulk(_.map(_.range(200), function(v) {
86
+ return { id: `ok-${v}`, v }
87
+ }))
88
+ vget[15] = _.size(await wo.select()) - n3
89
+
90
+ //autoGenPk為true時未帶主鍵者由套件補值
91
+ let r = await wo.insertBulk([{ name: 'auto1' }, { name: 'auto2' }])
92
+ vget[16] = r
93
+ vget[17] = _.size(_.filter(await wo.select(), function(v) {
94
+ return _.startsWith(v.name, 'auto')
95
+ }))
96
+
97
+ })
98
+
99
+ after(async function() {
100
+ w.fsDeleteFile('./db_insertbulk.json')
101
+ })
102
+
103
+ vans[1] = { n: 0, nInserted: 0, ok: 1 }
104
+ it(`should get ${JSON.stringify(vans[1])} for insertBulk(null)`, async function() {
105
+ assert.strict.deepStrictEqual(vget[1], vans[1])
106
+ })
107
+
108
+ vans[2] = { n: 3, nInserted: 3, ok: 1 }
109
+ it(`should get ${JSON.stringify(vans[2])} for insertBulk 3 rows`, async function() {
110
+ assert.strict.deepStrictEqual(vget[2], vans[2])
111
+ })
112
+
113
+ vans[3] = ['a', 'b', 'c']
114
+ it(`should get ${JSON.stringify(vans[3])} for all ids after insertBulk`, async function() {
115
+ assert.strict.deepStrictEqual(vget[3], vans[3])
116
+ })
117
+
118
+ vans[4] = { n: 1, nInserted: 1, ok: 1 }
119
+ it(`should get ${JSON.stringify(vans[4])} for insertBulk single object`, async function() {
120
+ assert.strict.deepStrictEqual(vget[4], vans[4])
121
+ })
122
+
123
+ vans[5] = 'reject'
124
+ it(`should get ${JSON.stringify(vans[5])} for insertBulk with existed pk`, async function() {
125
+ assert.strict.deepStrictEqual(vget[5], vans[5])
126
+ })
127
+
128
+ vans[6] = 0
129
+ it(`should get ${JSON.stringify(vans[6])} for increment of rows after conflict`, async function() {
130
+ assert.strict.deepStrictEqual(vget[6], vans[6])
131
+ })
132
+
133
+ vans[7] = [null, null]
134
+ it(`should get ${JSON.stringify(vans[7])} for rows before and after the conflicted one`, async function() {
135
+ assert.strict.deepStrictEqual(vget[7], vans[7])
136
+ })
137
+
138
+ vans[8] = 'reject'
139
+ it(`should get ${JSON.stringify(vans[8])} for insertBulk with duplicated pk in same batch`, async function() {
140
+ assert.strict.deepStrictEqual(vget[8], vans[8])
141
+ })
142
+
143
+ vans[9] = 0
144
+ it(`should get ${JSON.stringify(vans[9])} for increment of rows after duplicated pk`, async function() {
145
+ assert.strict.deepStrictEqual(vget[9], vans[9])
146
+ })
147
+
148
+ vans[10] = [null, null]
149
+ it(`should get ${JSON.stringify(vans[10])} for rows of duplicated batch`, async function() {
150
+ assert.strict.deepStrictEqual(vget[10], vans[10])
151
+ })
152
+
153
+ vans[11] = 'reject'
154
+ it(`should get ${JSON.stringify(vans[11])} for insertBulk 201 rows with conflict at last`, async function() {
155
+ assert.strict.deepStrictEqual(vget[11], vans[11])
156
+ })
157
+
158
+ vans[12] = 0
159
+ it(`should get ${JSON.stringify(vans[12])} for increment of rows after large batch conflict`, async function() {
160
+ assert.strict.deepStrictEqual(vget[12], vans[12])
161
+ })
162
+
163
+ vans[13] = { id: 'a' }
164
+ it(`should get ${JSON.stringify(vans[13])} for existed row after conflict`, async function() {
165
+ assert.strict.deepStrictEqual(vget[13], vans[13])
166
+ })
167
+
168
+ vans[14] = { n: 200, nInserted: 200, ok: 1 }
169
+ it(`should get ${JSON.stringify(vans[14])} for insertBulk 200 rows without conflict`, async function() {
170
+ assert.strict.deepStrictEqual(vget[14], vans[14])
171
+ })
172
+
173
+ vans[15] = 200
174
+ it(`should get ${JSON.stringify(vans[15])} for increment of rows after large batch success`, async function() {
175
+ assert.strict.deepStrictEqual(vget[15], vans[15])
176
+ })
177
+
178
+ vans[16] = { n: 2, nInserted: 2, ok: 1 }
179
+ it(`should get ${JSON.stringify(vans[16])} for insertBulk without pk when autoGenPk=true`, async function() {
180
+ assert.strict.deepStrictEqual(vget[16], vans[16])
181
+ })
182
+
183
+ vans[17] = 2
184
+ it(`should get ${JSON.stringify(vans[17])} for count of auto generated pk rows`, async function() {
185
+ assert.strict.deepStrictEqual(vget[17], vans[17])
186
+ })
187
+
188
+ })
@@ -0,0 +1,159 @@
1
+ import assert from 'assert'
2
+ import _ from 'lodash-es'
3
+ import w from 'wsemi'
4
+ import WOrm from '../src/WOrmLowdb.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.fsDeleteFile('./db_returnlist.json')
15
+
16
+ let wo = WOrm({ url: './db_returnlist.json', db: 'worm', cl: 'users' })
17
+
18
+ //既有數據
19
+ await wo.insert([{ id: 'a' }, { id: 'b' }])
20
+
21
+ //returnList未給時為聚合物件, 形狀由呼叫點靜態決定
22
+ vget[1] = await wo.insert([{ id: 'a' }, { id: 'c' }])
23
+
24
+ //returnList為false時同上
25
+ vget[2] = await wo.insert([{ id: 'a' }, { id: 'd' }], { returnList: false })
26
+
27
+ //returnList為true時回傳與輸入等長保序之逐筆陣列, 且對位正確
28
+ let dt = [{ id: 'a' }, { id: 'e' }, { id: 'b' }, { id: 'f' }]
29
+ vget[3] = await wo.insert(dt, { returnList: true })
30
+ vget[4] = _.size(vget[3]) === _.size(dt)
31
+
32
+ //逐筆元素之鍵集合恰為{n, nInserted, ok}
33
+ vget[5] = _.uniq(_.map(vget[3], function(v) {
34
+ return _.keys(v).sort().join(',')
35
+ }))
36
+
37
+ //逐筆之n恆為1, ok恆為1
38
+ vget[6] = _.uniq(_.map(vget[3], 'n'))
39
+ vget[7] = _.uniq(_.map(vget[3], 'ok'))
40
+
41
+ //同批含重複主鍵時僅首筆之nInserted為1
42
+ vget[8] = _.map(await wo.insert([{ id: 'g' }, { id: 'g' }, { id: 'g' }], { returnList: true }), 'nInserted')
43
+
44
+ //filter計數等於聚合模式之nInserted
45
+ await wo.delAll()
46
+ await wo.insert([{ id: 'x1' }, { id: 'x2' }])
47
+ let dtc = [{ id: 'x1' }, { id: 'x3' }, { id: 'x2' }, { id: 'x4' }, { id: 'x3' }]
48
+ let rl = await wo.insert(dtc, { returnList: true })
49
+ await wo.delAll()
50
+ await wo.insert([{ id: 'x1' }, { id: 'x2' }])
51
+ let ra = await wo.insert(dtc)
52
+ vget[9] = [
53
+ _.size(_.filter(rl, function(v) {
54
+ return v.nInserted === 1
55
+ })),
56
+ ra.nInserted,
57
+ ]
58
+
59
+ //輸入無效時回傳空陣列
60
+ vget[10] = await wo.insert(null, { returnList: true })
61
+ vget[11] = await wo.insert([], { returnList: true })
62
+
63
+ //change事件之res即本次實際回傳值
64
+ let evs = []
65
+ wo.on('change', function(mode, data, res) {
66
+ evs.push({ mode, res })
67
+ })
68
+ let rr = await wo.insert([{ id: 'y1' }, { id: 'y2' }], { returnList: true })
69
+ vget[12] = _.isEqual(_.get(evs, '0.res'), rr)
70
+
71
+ //autoGenPk為false且未帶主鍵時仍為整批reject, 不因本選項降為逐筆
72
+ let wof = WOrm({ url: './db_returnlist.json', db: 'worm', cl: 'nopk', autoGenPk: false })
73
+ rt = null
74
+ await wof.insert([{ id: 'z1' }, { name: 'no-id' }], { returnList: true })
75
+ .then(function(msg) {
76
+ rt = 'resolve: ' + JSON.stringify(msg)
77
+ })
78
+ .catch(function() {
79
+ rt = 'reject'
80
+ })
81
+ vget[13] = rt
82
+
83
+ })
84
+
85
+ after(async function() {
86
+ w.fsDeleteFile('./db_returnlist.json')
87
+ })
88
+
89
+ vans[1] = { n: 2, nInserted: 1, ok: 1 }
90
+ it(`should get ${JSON.stringify(vans[1])} for insert without returnList`, async function() {
91
+ assert.strict.deepStrictEqual(vget[1], vans[1])
92
+ })
93
+
94
+ vans[2] = { n: 2, nInserted: 1, ok: 1 }
95
+ it(`should get ${JSON.stringify(vans[2])} for insert with returnList=false`, async function() {
96
+ assert.strict.deepStrictEqual(vget[2], vans[2])
97
+ })
98
+
99
+ vans[3] = [
100
+ { n: 1, nInserted: 0, ok: 1 },
101
+ { n: 1, nInserted: 1, ok: 1 },
102
+ { n: 1, nInserted: 0, ok: 1 },
103
+ { n: 1, nInserted: 1, ok: 1 },
104
+ ]
105
+ it(`should get ${JSON.stringify(vans[3])} for insert with returnList=true`, async function() {
106
+ assert.strict.deepStrictEqual(vget[3], vans[3])
107
+ })
108
+
109
+ vans[4] = true
110
+ it(`should get ${JSON.stringify(vans[4])} for length of returnList equal to input`, async function() {
111
+ assert.strict.deepStrictEqual(vget[4], vans[4])
112
+ })
113
+
114
+ vans[5] = ['n,nInserted,ok']
115
+ it(`should get ${JSON.stringify(vans[5])} for keys of each item`, async function() {
116
+ assert.strict.deepStrictEqual(vget[5], vans[5])
117
+ })
118
+
119
+ vans[6] = [1]
120
+ it(`should get ${JSON.stringify(vans[6])} for n of each item`, async function() {
121
+ assert.strict.deepStrictEqual(vget[6], vans[6])
122
+ })
123
+
124
+ vans[7] = [1]
125
+ it(`should get ${JSON.stringify(vans[7])} for ok of each item`, async function() {
126
+ assert.strict.deepStrictEqual(vget[7], vans[7])
127
+ })
128
+
129
+ vans[8] = [1, 0, 0]
130
+ it(`should get ${JSON.stringify(vans[8])} for nInserted of duplicated pk in same batch`, async function() {
131
+ assert.strict.deepStrictEqual(vget[8], vans[8])
132
+ })
133
+
134
+ vans[9] = [2, 2]
135
+ it(`should get ${JSON.stringify(vans[9])} for filtered count and aggregated nInserted`, async function() {
136
+ assert.strict.deepStrictEqual(vget[9], vans[9])
137
+ })
138
+
139
+ vans[10] = []
140
+ it(`should get ${JSON.stringify(vans[10])} for insert(null) with returnList=true`, async function() {
141
+ assert.strict.deepStrictEqual(vget[10], vans[10])
142
+ })
143
+
144
+ vans[11] = []
145
+ it(`should get ${JSON.stringify(vans[11])} for insert([]) with returnList=true`, async function() {
146
+ assert.strict.deepStrictEqual(vget[11], vans[11])
147
+ })
148
+
149
+ vans[12] = true
150
+ it(`should get ${JSON.stringify(vans[12])} for res of change event equal to returned value`, async function() {
151
+ assert.strict.deepStrictEqual(vget[12], vans[12])
152
+ })
153
+
154
+ vans[13] = 'reject'
155
+ it(`should get ${JSON.stringify(vans[13])} for insert with returnList=true and autoGenPk=false without pk`, async function() {
156
+ assert.strict.deepStrictEqual(vget[13], vans[13])
157
+ })
158
+
159
+ })
@@ -0,0 +1,199 @@
1
+ import assert from 'assert'
2
+ import _ from 'lodash-es'
3
+ import w from 'wsemi'
4
+ import WOrm from '../src/WOrmLowdb.mjs'
5
+
6
+
7
+ describe('save', function() {
8
+ let vans = {}
9
+ let vget = {}
10
+
11
+ before(async function() {
12
+
13
+ w.fsDeleteFile('./db_save.json')
14
+
15
+ let wo = WOrm({ url: './db_save.json', db: 'worm', cl: 'users' })
16
+
17
+ //輸入無效, 回傳空陣列
18
+ vget[1] = await wo.save(null)
19
+ vget[2] = await wo.save([])
20
+
21
+ //既有數據
22
+ await wo.insert([
23
+ { id: 'a', name: 'peter', value: 123, ext: { x: 1, y: 2 } },
24
+ { id: 'b', name: 'rosemary', value: 456 },
25
+ ])
26
+
27
+ //主鍵存在, 合併後內容有變更
28
+ vget[3] = await wo.save({ id: 'a', name: 'peter(modify)' })
29
+ vget[4] = await wo.selectByPk('a')
30
+
31
+ //主鍵存在, 合併後內容與現值相同而未寫入(整筆相同)
32
+ vget[5] = await wo.save({ id: 'a', name: 'peter(modify)', value: 123, ext: { x: 1, y: 2 } })
33
+
34
+ //主鍵存在, 只給部份欄位且值皆與現值相同, 合併結果等於現值故nModified為0
35
+ vget[6] = await wo.save({ id: 'a', value: 123 })
36
+
37
+ //主鍵存在, 只給部份欄位且值不同, 未給之欄位須保留
38
+ vget[7] = await wo.save({ id: 'a', value: 999 })
39
+ vget[8] = await wo.selectByPk('a')
40
+
41
+ //深層合併: 巢狀物件僅給部份鍵時, 其餘鍵須保留
42
+ vget[9] = await wo.save({ id: 'a', ext: { x: 9 } })
43
+ vget[10] = await wo.selectByPk('a')
44
+
45
+ //深層合併後與現值相同者, nModified為0
46
+ vget[11] = await wo.save({ id: 'a', ext: { y: 2 } })
47
+
48
+ //主鍵不存在, autoInsert預設為true則插入
49
+ vget[12] = await wo.save({ id: 'c', name: 'kettle' })
50
+ vget[13] = await wo.selectByPk('c')
51
+
52
+ //主鍵不存在, autoInsert為false則不插入且n為0
53
+ vget[14] = await wo.save({ id: 'd', name: 'nobody' }, { autoInsert: false })
54
+ vget[15] = await wo.selectByPk('d')
55
+
56
+ //單一物件亦回傳長度為1之陣列
57
+ vget[16] = _.isArray(vget[12]) && _.size(vget[12]) === 1
58
+
59
+ //逐筆結果之鍵集合恆為{n, nInserted, nModified, ok}
60
+ let rs = await wo.save([
61
+ { id: 'a', value: 1000 }, //更新
62
+ { id: 'b', value: 456 }, //內容相同
63
+ { id: 'e', value: 1 }, //插入
64
+ ])
65
+ vget[17] = rs
66
+ vget[18] = _.uniq(_.map(rs, function(v) {
67
+ return _.keys(v).sort().join(',')
68
+ }))
69
+
70
+ //與輸入等長保序
71
+ vget[19] = _.size(rs)
72
+
73
+ //autoGenPk為true時未帶主鍵者由套件補值後插入
74
+ let ra = await wo.save({ name: 'auto' })
75
+ vget[20] = ra
76
+ vget[21] = _.size(_.filter(await wo.select(), function(v) {
77
+ return v.name === 'auto'
78
+ }))
79
+
80
+ //註: save之逐筆失敗路徑(ok為0)於本套件不可達, 因逐筆處理皆為記憶體內之比對與合併而不拋錯,
81
+ //讀檔與寫檔之失敗影響全部筆數而屬整批性錯誤, 依規格以reject回報而不降為逐筆
82
+ //[單筆失敗不中斷整批]之可達情形見unit-del之未帶有效主鍵
83
+
84
+ })
85
+
86
+ after(async function() {
87
+ w.fsDeleteFile('./db_save.json')
88
+ })
89
+
90
+ vans[1] = []
91
+ it(`should get ${JSON.stringify(vans[1])} for save(null)`, async function() {
92
+ assert.strict.deepStrictEqual(vget[1], vans[1])
93
+ })
94
+
95
+ vans[2] = []
96
+ it(`should get ${JSON.stringify(vans[2])} for save([])`, async function() {
97
+ assert.strict.deepStrictEqual(vget[2], vans[2])
98
+ })
99
+
100
+ vans[3] = [{ n: 1, nInserted: 0, nModified: 1, ok: 1 }]
101
+ it(`should get ${JSON.stringify(vans[3])} for save with modified content`, async function() {
102
+ assert.strict.deepStrictEqual(vget[3], vans[3])
103
+ })
104
+
105
+ vans[4] = { id: 'a', name: 'peter(modify)', value: 123, ext: { x: 1, y: 2 } }
106
+ it(`should get ${JSON.stringify(vans[4])} for row after save`, async function() {
107
+ assert.strict.deepStrictEqual(vget[4], vans[4])
108
+ })
109
+
110
+ vans[5] = [{ n: 1, nInserted: 0, nModified: 0, ok: 1 }]
111
+ it(`should get ${JSON.stringify(vans[5])} for save with same content`, async function() {
112
+ assert.strict.deepStrictEqual(vget[5], vans[5])
113
+ })
114
+
115
+ vans[6] = [{ n: 1, nInserted: 0, nModified: 0, ok: 1 }]
116
+ it(`should get ${JSON.stringify(vans[6])} for save with partial fields and same values`, async function() {
117
+ assert.strict.deepStrictEqual(vget[6], vans[6])
118
+ })
119
+
120
+ vans[7] = [{ n: 1, nInserted: 0, nModified: 1, ok: 1 }]
121
+ it(`should get ${JSON.stringify(vans[7])} for save with partial fields and different values`, async function() {
122
+ assert.strict.deepStrictEqual(vget[7], vans[7])
123
+ })
124
+
125
+ vans[8] = { id: 'a', name: 'peter(modify)', value: 999, ext: { x: 1, y: 2 } }
126
+ it(`should get ${JSON.stringify(vans[8])} for row keeping fields which not given`, async function() {
127
+ assert.strict.deepStrictEqual(vget[8], vans[8])
128
+ })
129
+
130
+ vans[9] = [{ n: 1, nInserted: 0, nModified: 1, ok: 1 }]
131
+ it(`should get ${JSON.stringify(vans[9])} for save with partial keys of nested object`, async function() {
132
+ assert.strict.deepStrictEqual(vget[9], vans[9])
133
+ })
134
+
135
+ vans[10] = { id: 'a', name: 'peter(modify)', value: 999, ext: { x: 9, y: 2 } }
136
+ it(`should get ${JSON.stringify(vans[10])} for row after deep merge`, async function() {
137
+ assert.strict.deepStrictEqual(vget[10], vans[10])
138
+ })
139
+
140
+ vans[11] = [{ n: 1, nInserted: 0, nModified: 0, ok: 1 }]
141
+ it(`should get ${JSON.stringify(vans[11])} for save with nested object and same values`, async function() {
142
+ assert.strict.deepStrictEqual(vget[11], vans[11])
143
+ })
144
+
145
+ vans[12] = [{ n: 1, nInserted: 1, nModified: 0, ok: 1 }]
146
+ it(`should get ${JSON.stringify(vans[12])} for save with autoInsert=true and pk not existed`, async function() {
147
+ assert.strict.deepStrictEqual(vget[12], vans[12])
148
+ })
149
+
150
+ vans[13] = { id: 'c', name: 'kettle' }
151
+ it(`should get ${JSON.stringify(vans[13])} for row inserted by save`, async function() {
152
+ assert.strict.deepStrictEqual(vget[13], vans[13])
153
+ })
154
+
155
+ vans[14] = [{ n: 0, nInserted: 0, nModified: 0, ok: 1 }]
156
+ it(`should get ${JSON.stringify(vans[14])} for save with autoInsert=false and pk not existed`, async function() {
157
+ assert.strict.deepStrictEqual(vget[14], vans[14])
158
+ })
159
+
160
+ vans[15] = null
161
+ it(`should get ${JSON.stringify(vans[15])} for row not inserted by save with autoInsert=false`, async function() {
162
+ assert.strict.deepStrictEqual(vget[15], vans[15])
163
+ })
164
+
165
+ vans[16] = true
166
+ it(`should get ${JSON.stringify(vans[16])} for save single object returning array with length 1`, async function() {
167
+ assert.strict.deepStrictEqual(vget[16], vans[16])
168
+ })
169
+
170
+ vans[17] = [
171
+ { n: 1, nInserted: 0, nModified: 1, ok: 1 },
172
+ { n: 1, nInserted: 0, nModified: 0, ok: 1 },
173
+ { n: 1, nInserted: 1, nModified: 0, ok: 1 },
174
+ ]
175
+ it(`should get ${JSON.stringify(vans[17])} for save with mixed cases`, async function() {
176
+ assert.strict.deepStrictEqual(vget[17], vans[17])
177
+ })
178
+
179
+ vans[18] = ['n,nInserted,nModified,ok']
180
+ it(`should get ${JSON.stringify(vans[18])} for keys of each item`, async function() {
181
+ assert.strict.deepStrictEqual(vget[18], vans[18])
182
+ })
183
+
184
+ vans[19] = 3
185
+ it(`should get ${JSON.stringify(vans[19])} for length of result equal to input`, async function() {
186
+ assert.strict.deepStrictEqual(vget[19], vans[19])
187
+ })
188
+
189
+ vans[20] = [{ n: 1, nInserted: 1, nModified: 0, ok: 1 }]
190
+ it(`should get ${JSON.stringify(vans[20])} for save without pk when autoGenPk=true`, async function() {
191
+ assert.strict.deepStrictEqual(vget[20], vans[20])
192
+ })
193
+
194
+ vans[21] = 1
195
+ it(`should get ${JSON.stringify(vans[21])} for count of auto generated pk row`, async function() {
196
+ assert.strict.deepStrictEqual(vget[21], vans[21])
197
+ })
198
+
199
+ })
@@ -0,0 +1,121 @@
1
+ import assert from 'assert'
2
+ import _ from 'lodash-es'
3
+ import w from 'wsemi'
4
+ import WOrm from '../src/WOrmLowdb.mjs'
5
+
6
+
7
+ describe('selectByPk', function() {
8
+ let vans = {}
9
+ let vget = {}
10
+
11
+ before(async function() {
12
+
13
+ w.fsDeleteFile('./db_selectbypk.json')
14
+
15
+ let wo = WOrm({ url: './db_selectbypk.json', db: 'worm', cl: 'users' })
16
+
17
+ await wo.insert([
18
+ { id: 'id-peter', name: 'peter', value: 123 },
19
+ { id: 'id-rosemary', name: 'rosemary', value: 123.456 },
20
+ ])
21
+
22
+ //主鍵命中, 回傳該筆數據物件
23
+ vget[1] = await wo.selectByPk('id-peter')
24
+
25
+ //主鍵命中者之內容須與select({主鍵})[0]相同
26
+ let vs = await wo.select({ id: 'id-peter' })
27
+ vget[2] = _.isEqual(vget[1], _.get(vs, 0))
28
+
29
+ //主鍵未命中, 回傳null而非undefined或空陣列
30
+ vget[3] = await wo.selectByPk('id-not-existed')
31
+
32
+ //主鍵值無效(未給), 回傳null且不reject
33
+ let rt = null
34
+ await wo.selectByPk()
35
+ .then(function(msg) {
36
+ rt = msg
37
+ })
38
+ .catch(function(msg) {
39
+ rt = 'reject: ' + msg.toString()
40
+ })
41
+ vget[4] = rt
42
+
43
+ //主鍵值無效(型別不符), 回傳null且不reject
44
+ rt = null
45
+ await wo.selectByPk(123)
46
+ .then(function(msg) {
47
+ rt = msg
48
+ })
49
+ .catch(function(msg) {
50
+ rt = 'reject: ' + msg.toString()
51
+ })
52
+ vget[5] = rt
53
+
54
+ //命中之判定基準須與insert一致: selectByPk回傳物件者, insert須視為已存在而不插入
55
+ let ri = await wo.insert({ id: 'id-peter', name: 'other' })
56
+ vget[6] = ri
57
+
58
+ //命中之判定基準須與del一致
59
+ let rd = await wo.del({ id: 'id-rosemary' })
60
+ vget[7] = rd
61
+ vget[8] = await wo.selectByPk('id-rosemary')
62
+
63
+ //讀取函數不得有副作用, 連續呼叫selectByPk後全表筆數不變
64
+ let n1 = _.size(await wo.select())
65
+ await wo.selectByPk('id-not-existed')
66
+ await wo.selectByPk('id-peter')
67
+ let n2 = _.size(await wo.select())
68
+ vget[9] = [n1, n2]
69
+
70
+ })
71
+
72
+ after(async function() {
73
+ w.fsDeleteFile('./db_selectbypk.json')
74
+ })
75
+
76
+ vans[1] = { id: 'id-peter', name: 'peter', value: 123 }
77
+ it(`should get ${JSON.stringify(vans[1])} for selectByPk with matched pk`, async function() {
78
+ assert.strict.deepStrictEqual(vget[1], vans[1])
79
+ })
80
+
81
+ vans[2] = true
82
+ it(`should get ${JSON.stringify(vans[2])} for selectByPk equal to select({pk})[0]`, async function() {
83
+ assert.strict.deepStrictEqual(vget[2], vans[2])
84
+ })
85
+
86
+ vans[3] = null
87
+ it(`should get ${JSON.stringify(vans[3])} for selectByPk with unmatched pk`, async function() {
88
+ assert.strict.deepStrictEqual(vget[3], vans[3])
89
+ })
90
+
91
+ vans[4] = null
92
+ it(`should get ${JSON.stringify(vans[4])} for selectByPk without pk`, async function() {
93
+ assert.strict.deepStrictEqual(vget[4], vans[4])
94
+ })
95
+
96
+ vans[5] = null
97
+ it(`should get ${JSON.stringify(vans[5])} for selectByPk with invalid pk type`, async function() {
98
+ assert.strict.deepStrictEqual(vget[5], vans[5])
99
+ })
100
+
101
+ vans[6] = { n: 1, nInserted: 0, ok: 1 }
102
+ it(`should get ${JSON.stringify(vans[6])} for insert with pk which selectByPk matched`, async function() {
103
+ assert.strict.deepStrictEqual(vget[6], vans[6])
104
+ })
105
+
106
+ vans[7] = [{ n: 1, nDeleted: 1, ok: 1 }]
107
+ it(`should get ${JSON.stringify(vans[7])} for del with pk which selectByPk matched`, async function() {
108
+ assert.strict.deepStrictEqual(vget[7], vans[7])
109
+ })
110
+
111
+ vans[8] = null
112
+ it(`should get ${JSON.stringify(vans[8])} for selectByPk after del`, async function() {
113
+ assert.strict.deepStrictEqual(vget[8], vans[8])
114
+ })
115
+
116
+ vans[9] = [1, 1]
117
+ it(`should get ${JSON.stringify(vans[9])} for size of table before and after selectByPk`, async function() {
118
+ assert.strict.deepStrictEqual(vget[9], vans[9])
119
+ })
120
+
121
+ })
@@ -7,17 +7,17 @@ let fdTar = './dist'
7
7
 
8
8
 
9
9
  rollupFiles({
10
- fns: getFiles(fdSrc),
10
+ fns: 'WOrmLowdb.mjs',
11
11
  fdSrc,
12
12
  fdTar,
13
13
  nameDistType: 'kebabCase',
14
14
  globals: {
15
- 'events': 'events',
15
+ 'path': 'path',
16
16
  'lowdb': 'lowdb',
17
17
  'mingo': 'mingo',
18
18
  },
19
19
  external: [
20
- 'events',
20
+ 'path',
21
21
  'lowdb',
22
22
  'mingo',
23
23
  ],