w-serv-orm 1.1.16 → 1.1.18
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.
- package/README.md +110 -0
- package/dist/w-serv-orm.umd.js +2 -2
- package/dist/w-serv-orm.umd.js.map +1 -1
- package/docs/WServOrm.html +11 -4
- package/docs/WServOrm.mjs.html +96 -3
- package/docs/baseline.mjs.html +624 -0
- package/docs/global.html +1786 -0
- package/docs/index.html +2 -2
- package/docs/isOrmFail.mjs.html +102 -0
- package/package.json +1 -1
- package/src/WServOrm.mjs +94 -1
- package/src/baseline.mjs +552 -0
- package/src/genTestData.mjs +6 -0
- package/src/getDb.mjs +1 -1
- package/src/getDbBackupAndRecover.mjs +44 -0
- package/src/getMapOrm.mjs +229 -12
- package/src/getProc.mjs +13 -4
- package/src/isOrmFail.mjs +30 -0
- package/test/api-guard.test.mjs +401 -0
- package/test/api-keepuser.test.mjs +131 -0
- package/test/api-procOrm.test.mjs +142 -0
- package/test/tools/memOrm.mjs +122 -0
- package/test/unit-baseline.test.mjs +766 -0
- package/test/unit-getDb.test.mjs +78 -0
- package/test/unit-guard.test.mjs +952 -0
- package/test/unit-isOrmFail.test.mjs +35 -0
- package/test/unit-keepuser.test.mjs +307 -0
- package/test/unit-mapOrm.test.mjs +213 -0
- package/test/unit-ormsites.test.mjs +61 -0
package/test/unit-getDb.test.mjs
CHANGED
|
@@ -31,6 +31,26 @@ function mkWoItems(log, behavior = {}) {
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
//多表替身: results[表名]為該表insert之回傳函數(未給則回契約內之成功結果)
|
|
35
|
+
function mkWoItemsMulti(log, results = {}) {
|
|
36
|
+
let woItems = {}
|
|
37
|
+
for (let name of ['t1', 't2', 't3']) {
|
|
38
|
+
woItems[name] = {
|
|
39
|
+
select: async () => [],
|
|
40
|
+
insert: async (d) => {
|
|
41
|
+
log.push({ fn: 'insert', table: name, d })
|
|
42
|
+
if (results[name]) {
|
|
43
|
+
return results[name](d)
|
|
44
|
+
}
|
|
45
|
+
return { n: d.length, nInserted: d.length, ok: 1 }
|
|
46
|
+
},
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return woItems
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
let BK3 = [{ name: 't1', data: [{ id: 'a' }] }, { name: 't2', data: [{ id: 'b' }, { id: 'c' }] }, { name: 't3', data: [{ id: 'd' }] }]
|
|
53
|
+
|
|
34
54
|
async function getReject(pm) {
|
|
35
55
|
try {
|
|
36
56
|
await pm
|
|
@@ -131,6 +151,64 @@ describe('getDb備份與還原', function() {
|
|
|
131
151
|
assert.strict.deepEqual(log, [{ fn: 'insert', table: 'tests', d: [{ id: 'a' }] }])
|
|
132
152
|
})
|
|
133
153
|
|
|
154
|
+
it('B05b recover之insert聚合結果ok為0即reject Error並停止, 先前之表已寫入、之後之表不寫入', async function() {
|
|
155
|
+
//R-DB-01 規則3(orm-run04): ORM回報失敗不得當成功; 錯誤型別為Error(R-ERR-01規則2); 訊息含失敗表名、ORM回傳原文與先前已寫入之表
|
|
156
|
+
let log = []
|
|
157
|
+
let fp = writeBackup('fail-agg.json', JSON.stringify(BK3))
|
|
158
|
+
let woItems = mkWoItemsMulti(log, { t2: (d) => ({ n: d.length, nInserted: 0, ok: 0, err: 'E-ins' }) })
|
|
159
|
+
let err = await quiet(() => getReject(getDb.recover(woItems, fp, { bLog: false })))
|
|
160
|
+
assert.ok(err instanceof Error)
|
|
161
|
+
assert.strict.equal(err.message, 'failed to recover data into table[t2]: {"n":2,"nInserted":0,"ok":0,"err":"E-ins"}; tables already written: t1')
|
|
162
|
+
assert.strict.deepEqual(log.map((v) => v.table), ['t1', 't2'])
|
|
163
|
+
})
|
|
164
|
+
|
|
165
|
+
it('B05c recover之insert陣列形逐筆ok為0即reject Error, 訊息列失敗筆', async function() {
|
|
166
|
+
//R-DB-01 規則3(orm-run04): 陣列形(非契約形狀)任一筆ok為0同聚合形處置; 失敗筆取輸入同位置數據之id(getItemsFail)
|
|
167
|
+
let log = []
|
|
168
|
+
let fp = writeBackup('fail-arr.json', JSON.stringify(BK3))
|
|
169
|
+
let woItems = mkWoItemsMulti(log, { t2: () => [{ n: 1, nInserted: 0, ok: 0, err: 'E-ins' }, { n: 1, nInserted: 1, ok: 1 }] })
|
|
170
|
+
let err = await quiet(() => getReject(getDb.recover(woItems, fp, { bLog: false })))
|
|
171
|
+
assert.ok(err instanceof Error)
|
|
172
|
+
assert.strict.equal(err.message, 'failed to recover data into table[t2]: [{"k":0,"id":"b","err":"E-ins"}]; tables already written: t1')
|
|
173
|
+
assert.strict.deepEqual(log.map((v) => v.table), ['t1', 't2'])
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
it('B05d recover之首表失敗無已寫入之表可列, 失敗筆超過10筆僅列前10筆並附總數', async function() {
|
|
177
|
+
//R-DB-01 規則3(orm-run04): 同getMsgFail之上限(10筆)
|
|
178
|
+
let log = []
|
|
179
|
+
let rows = []
|
|
180
|
+
for (let i = 1; i <= 12; i++) {
|
|
181
|
+
rows.push({ id: `r${i}` })
|
|
182
|
+
}
|
|
183
|
+
let fp = writeBackup('fail-many.json', JSON.stringify([{ name: 't1', data: rows }, { name: 't2', data: [{ id: 'b' }] }]))
|
|
184
|
+
let woItems = mkWoItemsMulti(log, { t1: (d) => d.map(() => ({ n: 1, nInserted: 0, ok: 0, err: 'E-full' })) })
|
|
185
|
+
let err = await quiet(() => getReject(getDb.recover(woItems, fp, { bLog: false })))
|
|
186
|
+
let fails = rows.slice(0, 10).map((v, k) => ({ k, id: v.id, err: 'E-full' }))
|
|
187
|
+
assert.strict.equal(err.message, `failed to recover data into table[t1]: ${JSON.stringify(fails)}, ... (12 in total)`)
|
|
188
|
+
assert.strict.deepEqual(log.map((v) => v.table), ['t1'])
|
|
189
|
+
})
|
|
190
|
+
|
|
191
|
+
it('B05e recover之insert無失敗(略過既有主鍵、回傳undefined、null、空物件、空陣列、逐筆皆ok為1)照舊resolve並寫入全部表', async function() {
|
|
192
|
+
//R-DB-01 規則3(orm-run04): 只認聚合物件ok為0與陣列內任一筆ok為0, 其餘維持舊行為
|
|
193
|
+
for (let rIns of [{ n: 0, nInserted: 0, ok: 1 }, undefined, null, {}, [], [{ n: 1, nInserted: 1, ok: 1 }]]) {
|
|
194
|
+
let log = []
|
|
195
|
+
let fp = writeBackup('ok-shapes.json', JSON.stringify(BK3))
|
|
196
|
+
let woItems = mkWoItemsMulti(log, { t2: () => rIns })
|
|
197
|
+
await quiet(() => getDb.recover(woItems, fp, { bLog: false }))
|
|
198
|
+
assert.strict.deepEqual(log.map((v) => v.table), ['t1', 't2', 't3'], JSON.stringify(rIns))
|
|
199
|
+
}
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
it('B05f 低階recover之insert失敗亦reject Error', async function() {
|
|
203
|
+
//R-DB-01 規則3(orm-run04): WServOrm實例上之recover即此低階函數
|
|
204
|
+
let log = []
|
|
205
|
+
let fp = writeBackup('fail-low.json', JSON.stringify(BK3))
|
|
206
|
+
let woItems = mkWoItemsMulti(log, { t3: (d) => ({ n: d.length, nInserted: 0, ok: 0 }) })
|
|
207
|
+
let err = await quiet(() => getReject(br.recover(fp, woItems)))
|
|
208
|
+
assert.ok(err instanceof Error)
|
|
209
|
+
assert.strict.equal(err.message, 'failed to recover data into table[t3]: {"n":1,"nInserted":0,"ok":0}; tables already written: t1, t2')
|
|
210
|
+
})
|
|
211
|
+
|
|
134
212
|
it('B06 recover之bRela缺ds或genModelsByTabs即於寫入前reject', async function() {
|
|
135
213
|
//P4-1: 明確訊息, 不寫入
|
|
136
214
|
let log = []
|