w-orm-reladb 1.0.47 → 1.0.49

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.
@@ -1,9 +1,7 @@
1
- import assert from 'assert'
2
1
  import net from 'net'
3
2
  import { execFile } from 'child_process'
4
3
  import { promisify } from 'util'
5
- import wo from '../src/WOrmReladb.mjs'
6
- import { genRs, genRsm, sortByName } from './api-fixtures.mjs'
4
+ import { defineSuites } from './api-suite.mjs'
7
5
 
8
6
 
9
7
  //測試自行創建docker容器供MSSQL服務, 測試結束即銷毀, 故僅需環境已安裝docker
@@ -92,12 +90,13 @@ let stopContainer = async () => {
92
90
  }
93
91
 
94
92
 
95
- let genOpt = () => {
93
+ let getOpt = (ex = {}) => {
96
94
  return {
97
95
  url: `mssql://username:password@localhost:${ctPort}`,
98
96
  db: 'worm',
99
97
  cl: 'users',
100
98
  fdModels: './models',
99
+ ...ex,
101
100
  }
102
101
  }
103
102
 
@@ -113,200 +112,4 @@ after(async function() {
113
112
  })
114
113
 
115
114
 
116
- describe('mssql crud', function() {
117
-
118
- let w = null
119
-
120
- before(async function() {
121
- w = wo(genOpt())
122
- await w.createStorage()
123
- await w.delAll().catch(() => {})
124
- })
125
-
126
- it('insert 3筆, 空id自動產生主鍵', async function() {
127
- let msg = await w.insert(genRs())
128
- assert.deepStrictEqual(msg, { n: 3, nInserted: 3, ok: 1 })
129
- })
130
-
131
- it('save({autoInsert:true}) 修改2筆並插入1筆', async function() {
132
- let msg = await w.save(genRsm(), { autoInsert: true })
133
- assert.deepStrictEqual(msg, [
134
- { n: 1, nModified: 1, ok: 1 },
135
- { n: 1, nModified: 1, ok: 1 },
136
- { n: 1, nInserted: 1, ok: 1 },
137
- ])
138
- })
139
-
140
- it('select() 查全部得4筆', async function() {
141
- let ss = sortByName(await w.select())
142
- assert.strictEqual(ss.length, 4)
143
- let [kettle, kettleM, peter, rosemary] = ss
144
- assert.ok(typeof kettle.id === 'string' && kettle.id.length > 0)
145
- assert.strictEqual(kettle.name, 'kettle')
146
- assert.strictEqual(kettle.value, 456)
147
- assert.ok(typeof kettleM.id === 'string' && kettleM.id.length > 0)
148
- assert.strictEqual(kettleM.name, 'kettle(modify)')
149
- assert.strictEqual(kettleM.value, null)
150
- assert.deepStrictEqual(peter, { id: 'id-peter', name: 'peter(modify)', value: 123 })
151
- assert.deepStrictEqual(rosemary, { id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 })
152
- })
153
-
154
- it('select({id}) 依主鍵查詢', async function() {
155
- let so = await w.select({ id: 'id-rosemary' })
156
- assert.deepStrictEqual(so, [{ id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 }])
157
- })
158
-
159
- it('select $and+$gt+$lt', async function() {
160
- let sp = await w.select({ '$and': [{ value: { '$gt': 123 } }, { value: { '$lt': 200 } }] })
161
- assert.deepStrictEqual(sp, [{ id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 }])
162
- })
163
-
164
- it('select $or+$gte+$lte', async function() {
165
- let sp = await w.select({ '$or': [{ value: { '$lte': -1 } }, { value: { '$gte': 200 } }] })
166
- assert.strictEqual(sp.length, 1)
167
- assert.strictEqual(sp[0].name, 'kettle')
168
- assert.strictEqual(sp[0].value, 456)
169
- })
170
-
171
- it('select 巢狀$or+$and+$ne+$in+$nin', async function() {
172
- let sp = sortByName(await w.select({ '$or': [{ '$and': [{ value: { '$ne': 123 } }, { value: { '$in': [123, 321, 123.456, 456] } }, { value: { '$nin': [456, 654] } }] }, { '$or': [{ value: { '$lte': -1 } }, { value: { '$gte': 400 } }] }] }))
173
- assert.strictEqual(sp.length, 2)
174
- assert.strictEqual(sp[0].name, 'kettle')
175
- assert.strictEqual(sp[0].value, 456)
176
- assert.deepStrictEqual(sp[1], { id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 })
177
- })
178
-
179
- it('select $regex不分大小寫', async function() {
180
- let sr = await w.select({ name: { $regex: 'PeT', $options: '$i' } })
181
- assert.deepStrictEqual(sr, [{ id: 'id-peter', name: 'peter(modify)', value: 123 }])
182
- })
183
-
184
- it('del 刪除3筆並保留kettle', async function() {
185
- let ss = await w.select()
186
- let d = ss.filter((v) => v.name !== 'kettle')
187
- let msg = await w.del(d)
188
- assert.deepStrictEqual(msg, [
189
- { n: 1, nDeleted: 1, ok: 1 },
190
- { n: 1, nDeleted: 1, ok: 1 },
191
- { n: 1, nDeleted: 1, ok: 1 },
192
- ])
193
- let left = await w.select()
194
- assert.strictEqual(left.length, 1)
195
- assert.strictEqual(left[0].name, 'kettle')
196
- })
197
-
198
- it('delAll 清空後select回傳空陣列', async function() {
199
- let msg = await w.delAll()
200
- assert.deepStrictEqual(msg, { n: 1, nDeleted: 1, ok: 1 })
201
- let ss = await w.select()
202
- assert.deepStrictEqual(ss, [])
203
- })
204
-
205
- })
206
-
207
-
208
- describe('mssql transaction commit', function() {
209
-
210
- let w = null
211
- let instance = null
212
-
213
- before(async function() {
214
- w = wo(genOpt())
215
- await w.createStorage()
216
- await w.delAll().catch(() => {})
217
- })
218
-
219
- after(async function() {
220
- if (instance) {
221
- await instance.close().catch(() => {})
222
- }
223
- })
224
-
225
- it('交易內insert+save+del, commit後數據持久化', async function() {
226
- instance = await w.init()
227
- let transaction = await w.genTransaction()
228
- let connState = { instance, transaction }
229
-
230
- let mi = await w.insert(genRs(), connState)
231
- assert.deepStrictEqual(mi, { n: 3, nInserted: 3, ok: 1 })
232
-
233
- let msv = await w.save(genRsm(), { ...connState, autoInsert: false })
234
- assert.deepStrictEqual(msv, [
235
- { n: 1, nModified: 1, ok: 1 },
236
- { n: 1, nModified: 1, ok: 1 },
237
- { n: 0, nModified: 0, ok: 1 },
238
- ])
239
-
240
- let md = await w.del({ id: 'id-rosemary' }, connState)
241
- assert.deepStrictEqual(md, [{ n: 1, nDeleted: 1, ok: 1 }])
242
-
243
- //交易內select可查到暫時有效的數據
244
- let ssIn = sortByName(await w.select(null, connState))
245
- assert.strictEqual(ssIn.length, 2)
246
- assert.strictEqual(ssIn[0].name, 'kettle')
247
- assert.strictEqual(ssIn[1].name, 'peter(modify)')
248
-
249
- await transaction.commit()
250
- await instance.close()
251
- instance = null
252
-
253
- let ssFinal = sortByName(await w.select())
254
- assert.strictEqual(ssFinal.length, 2)
255
- assert.strictEqual(ssFinal[0].name, 'kettle')
256
- assert.strictEqual(ssFinal[0].value, 456)
257
- assert.deepStrictEqual(ssFinal[1], { id: 'id-peter', name: 'peter(modify)', value: 123 })
258
- })
259
-
260
- })
261
-
262
-
263
- describe('mssql transaction rollback', function() {
264
-
265
- let w = null
266
- let instance = null
267
-
268
- before(async function() {
269
- w = wo(genOpt())
270
- await w.createStorage()
271
- await w.delAll().catch(() => {})
272
- })
273
-
274
- after(async function() {
275
- if (instance) {
276
- await instance.close().catch(() => {})
277
- }
278
- })
279
-
280
- it('交易內insert+save+del, rollback後數據全數還原', async function() {
281
- instance = await w.init()
282
- let transaction = await w.genTransaction()
283
- let connState = { instance, transaction }
284
-
285
- let mi = await w.insert(genRs(), connState)
286
- assert.deepStrictEqual(mi, { n: 3, nInserted: 3, ok: 1 })
287
-
288
- let msv = await w.save(genRsm(), { ...connState, autoInsert: false })
289
- assert.deepStrictEqual(msv, [
290
- { n: 1, nModified: 1, ok: 1 },
291
- { n: 1, nModified: 1, ok: 1 },
292
- { n: 0, nModified: 0, ok: 1 },
293
- ])
294
-
295
- let md = await w.del({ id: 'id-rosemary' }, connState)
296
- assert.deepStrictEqual(md, [{ n: 1, nDeleted: 1, ok: 1 }])
297
-
298
- //交易內select可查到暫時有效的數據
299
- let ssIn = sortByName(await w.select(null, connState))
300
- assert.strictEqual(ssIn.length, 2)
301
- assert.strictEqual(ssIn[0].name, 'kettle')
302
- assert.strictEqual(ssIn[1].name, 'peter(modify)')
303
-
304
- await transaction.rollback()
305
- await instance.close()
306
- instance = null
307
-
308
- let ssFinal = await w.select()
309
- assert.deepStrictEqual(ssFinal, [])
310
- })
311
-
312
- })
115
+ defineSuites('mssql', getOpt)
@@ -1,30 +1,34 @@
1
1
  import fs from 'fs'
2
- import assert from 'assert'
3
- import wo from '../src/WOrmReladb.mjs'
4
- import { genRs, genRsm, sortByName } from './api-fixtures.mjs'
2
+ import { defineSuites } from './api-suite.mjs'
5
3
 
6
4
 
7
5
  //sqlite使用獨立暫存storage檔測試, 不使用專案根目錄之worm.sqlite
8
6
 
9
7
 
10
- let genOpt = (storage) => {
8
+ let storage = './tmp/api-sqlite.sqlite'
9
+
10
+
11
+ let getOpt = (ex = {}) => {
11
12
  return {
12
13
  url: 'sqlite://:',
13
14
  db: 'worm',
14
15
  cl: 'users',
15
16
  fdModels: './models',
16
17
  storage,
18
+ ...ex,
17
19
  }
18
20
  }
19
21
 
20
- let prepStorage = (storage) => {
22
+
23
+ before(function() {
21
24
  fs.mkdirSync('./tmp', { recursive: true })
22
25
  if (fs.existsSync(storage)) {
23
26
  fs.unlinkSync(storage)
24
27
  }
25
- }
28
+ })
29
+
26
30
 
27
- let cleanStorage = (storage) => {
31
+ after(function() {
28
32
  if (fs.existsSync(storage)) {
29
33
  fs.unlinkSync(storage)
30
34
  }
@@ -32,205 +36,7 @@ let cleanStorage = (storage) => {
32
36
  fs.rmdirSync('./tmp') //僅在空資料夾時移除
33
37
  }
34
38
  catch (err) {}
35
- }
36
-
37
-
38
- describe('sqlite crud', function() {
39
-
40
- let storage = './tmp/api-sqlite-crud.sqlite'
41
- let w = wo(genOpt(storage))
42
-
43
- before(async function() {
44
- prepStorage(storage)
45
- await w.createStorage()
46
- })
47
-
48
- after(function() {
49
- cleanStorage(storage)
50
- })
51
-
52
- it('insert 3筆, 空id自動產生主鍵', async function() {
53
- let msg = await w.insert(genRs())
54
- assert.deepStrictEqual(msg, { n: 3, nInserted: 3, ok: 1 })
55
- })
56
-
57
- it('save({autoInsert:false}) 修改2筆且不插入空id項', async function() {
58
- let msg = await w.save(genRsm(), { autoInsert: false })
59
- assert.deepStrictEqual(msg, [
60
- { n: 1, nModified: 1, ok: 1 },
61
- { n: 1, nModified: 1, ok: 1 },
62
- { n: 0, nModified: 0, ok: 1 },
63
- ])
64
- })
65
-
66
- it('select() 查全部得3筆', async function() {
67
- let ss = sortByName(await w.select())
68
- assert.strictEqual(ss.length, 3)
69
- let [kettle, peter, rosemary] = ss
70
- assert.ok(typeof kettle.id === 'string' && kettle.id.length > 0)
71
- assert.strictEqual(kettle.name, 'kettle')
72
- assert.strictEqual(kettle.value, 456)
73
- assert.deepStrictEqual(peter, { id: 'id-peter', name: 'peter(modify)', value: 123 })
74
- assert.deepStrictEqual(rosemary, { id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 })
75
- })
76
-
77
- it('select({id}) 依主鍵查詢', async function() {
78
- let so = await w.select({ id: 'id-rosemary' })
79
- assert.deepStrictEqual(so, [{ id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 }])
80
- })
81
-
82
- it('select $and+$gt+$lt', async function() {
83
- let sp = await w.select({ '$and': [{ value: { '$gt': 123 } }, { value: { '$lt': 200 } }] })
84
- assert.deepStrictEqual(sp, [{ id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 }])
85
- })
86
-
87
- it('select $or+$gte+$lte', async function() {
88
- let sp = await w.select({ '$or': [{ value: { '$lte': -1 } }, { value: { '$gte': 200 } }] })
89
- assert.strictEqual(sp.length, 1)
90
- assert.strictEqual(sp[0].name, 'kettle')
91
- assert.strictEqual(sp[0].value, 456)
92
- })
93
-
94
- it('select 巢狀$or+$and+$ne+$in+$nin', async function() {
95
- let sp = sortByName(await w.select({ '$or': [{ '$and': [{ value: { '$ne': 123 } }, { value: { '$in': [123, 321, 123.456, 456] } }, { value: { '$nin': [456, 654] } }] }, { '$or': [{ value: { '$lte': -1 } }, { value: { '$gte': 400 } }] }] }))
96
- assert.strictEqual(sp.length, 2)
97
- assert.strictEqual(sp[0].name, 'kettle')
98
- assert.strictEqual(sp[0].value, 456)
99
- assert.deepStrictEqual(sp[1], { id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 })
100
- })
101
-
102
- it('select $regex不分大小寫', async function() {
103
- let sr = await w.select({ name: { $regex: 'PeT', $options: '$i' } })
104
- assert.deepStrictEqual(sr, [{ id: 'id-peter', name: 'peter(modify)', value: 123 }])
105
- })
106
-
107
- it('del 刪除2筆並保留kettle', async function() {
108
- let ss = await w.select()
109
- let d = ss.filter((v) => v.name !== 'kettle')
110
- let msg = await w.del(d)
111
- assert.deepStrictEqual(msg, [
112
- { n: 1, nDeleted: 1, ok: 1 },
113
- { n: 1, nDeleted: 1, ok: 1 },
114
- ])
115
- let left = await w.select()
116
- assert.strictEqual(left.length, 1)
117
- assert.strictEqual(left[0].name, 'kettle')
118
- })
119
-
120
- it('delAll 清空後select回傳空陣列', async function() {
121
- let msg = await w.delAll()
122
- assert.deepStrictEqual(msg, { n: 1, nDeleted: 1, ok: 1 })
123
- let ss = await w.select()
124
- assert.deepStrictEqual(ss, [])
125
- })
126
-
127
39
  })
128
40
 
129
41
 
130
- describe('sqlite transaction commit', function() {
131
-
132
- let storage = './tmp/api-sqlite-commit.sqlite'
133
- let w = wo(genOpt(storage))
134
- let instance = null
135
-
136
- before(async function() {
137
- prepStorage(storage)
138
- await w.createStorage()
139
- })
140
-
141
- after(async function() {
142
- if (instance) {
143
- await instance.close().catch(() => {})
144
- }
145
- cleanStorage(storage)
146
- })
147
-
148
- it('交易內insert+save+del, commit後數據持久化', async function() {
149
- instance = await w.init()
150
- let transaction = await w.genTransaction()
151
- let connState = { instance, transaction }
152
-
153
- let mi = await w.insert(genRs(), connState)
154
- assert.deepStrictEqual(mi, { n: 3, nInserted: 3, ok: 1 })
155
-
156
- let msv = await w.save(genRsm(), { ...connState, autoInsert: false })
157
- assert.deepStrictEqual(msv, [
158
- { n: 1, nModified: 1, ok: 1 },
159
- { n: 1, nModified: 1, ok: 1 },
160
- { n: 0, nModified: 0, ok: 1 },
161
- ])
162
-
163
- let md = await w.del({ id: 'id-rosemary' }, connState)
164
- assert.deepStrictEqual(md, [{ n: 1, nDeleted: 1, ok: 1 }])
165
-
166
- //交易內select可查到暫時有效的數據
167
- let ssIn = sortByName(await w.select(null, connState))
168
- assert.strictEqual(ssIn.length, 2)
169
- assert.strictEqual(ssIn[0].name, 'kettle')
170
- assert.strictEqual(ssIn[1].name, 'peter(modify)')
171
-
172
- await transaction.commit()
173
- await instance.close()
174
- instance = null
175
-
176
- let ssFinal = sortByName(await w.select())
177
- assert.strictEqual(ssFinal.length, 2)
178
- assert.strictEqual(ssFinal[0].name, 'kettle')
179
- assert.strictEqual(ssFinal[0].value, 456)
180
- assert.deepStrictEqual(ssFinal[1], { id: 'id-peter', name: 'peter(modify)', value: 123 })
181
- })
182
-
183
- })
184
-
185
-
186
- describe('sqlite transaction rollback', function() {
187
-
188
- let storage = './tmp/api-sqlite-rollback.sqlite'
189
- let w = wo(genOpt(storage))
190
- let instance = null
191
-
192
- before(async function() {
193
- prepStorage(storage)
194
- await w.createStorage()
195
- })
196
-
197
- after(async function() {
198
- if (instance) {
199
- await instance.close().catch(() => {})
200
- }
201
- cleanStorage(storage)
202
- })
203
-
204
- it('交易內insert+save+del, rollback後數據全數還原', async function() {
205
- instance = await w.init()
206
- let transaction = await w.genTransaction()
207
- let connState = { instance, transaction }
208
-
209
- let mi = await w.insert(genRs(), connState)
210
- assert.deepStrictEqual(mi, { n: 3, nInserted: 3, ok: 1 })
211
-
212
- let msv = await w.save(genRsm(), { ...connState, autoInsert: false })
213
- assert.deepStrictEqual(msv, [
214
- { n: 1, nModified: 1, ok: 1 },
215
- { n: 1, nModified: 1, ok: 1 },
216
- { n: 0, nModified: 0, ok: 1 },
217
- ])
218
-
219
- let md = await w.del({ id: 'id-rosemary' }, connState)
220
- assert.deepStrictEqual(md, [{ n: 1, nDeleted: 1, ok: 1 }])
221
-
222
- //交易內select可查到暫時有效的數據
223
- let ssIn = sortByName(await w.select(null, connState))
224
- assert.strictEqual(ssIn.length, 2)
225
- assert.strictEqual(ssIn[0].name, 'kettle')
226
- assert.strictEqual(ssIn[1].name, 'peter(modify)')
227
-
228
- await transaction.rollback()
229
- await instance.close()
230
- instance = null
231
-
232
- let ssFinal = await w.select()
233
- assert.deepStrictEqual(ssFinal, [])
234
- })
235
-
236
- })
42
+ defineSuites('sqlite', getOpt)