w-orm-mongodb 1.1.39 → 1.1.41

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.
@@ -20,6 +20,16 @@ let genOpt = (cl) => {
20
20
  }
21
21
  }
22
22
 
23
+ //genOptPk, 明確指定autoGenPk
24
+ let genOptPk = (cl, autoGenPk) => {
25
+ return {
26
+ url: genUrl(ctPort),
27
+ db: ctDb,
28
+ cl,
29
+ autoGenPk,
30
+ }
31
+ }
32
+
23
33
  //genKeys, 取回傳物件之鍵集合, 用於驗證鍵集合固定
24
34
  let genKeys = (v) => {
25
35
  return Object.keys(v).sort().join(',')
@@ -528,6 +538,235 @@ describe('gfs legacy duplicated id', function() {
528
538
  })
529
539
 
530
540
 
541
+ describe('gfs autoGenPk', function() {
542
+ let rt = null
543
+ let vans = {}
544
+ let vget = {}
545
+
546
+ before(async function() {
547
+ this.timeout(300000)
548
+
549
+ //woDef, 未給autoGenPk以驗證其預設值為true
550
+ let clDef = 'pkdefaultGfs'
551
+ let woDef = WOrm(genOpt(clDef))
552
+ await woDef.delAllGfs()
553
+
554
+ //預設未帶id者須自動產生
555
+ vget[1] = await woDef.insertGfs({ u8a: genU8a(100, 1) })
556
+ vget[2] = (await countDocs(clDef)).files
557
+
558
+ //woOff, 關閉後主鍵須由呼叫端自備
559
+ let clOff = 'pkoffGfs'
560
+ let woOff = WOrm(genOptPk(clOff, false))
561
+ await woOff.delAllGfs()
562
+
563
+ //帶id者正常寫入
564
+ vget[3] = await woOff.insertGfs({ id: 'g1', u8a: genU8a(100, 2) })
565
+ vget[4] = genHash((await woOff.selectByPkGfs('g1')).u8a) === genHash(genU8a(100, 2))
566
+
567
+ //未帶id者須reject
568
+ rt = null
569
+ // vans[5] = 'Error: invalid data[0].id, autoGenPk is false'
570
+ await woOff.insertGfs({ u8a: genU8a(100, 3) })
571
+ .then(function(msg) {
572
+ rt = `不應resolve: ${JSON.stringify(msg)}`
573
+ })
574
+ .catch(function(msg) {
575
+ rt = msg.toString()
576
+ })
577
+ vget[5] = rt
578
+
579
+ //整批reject時, 同批之有效筆數亦不得被寫入
580
+ let cBefore = await countDocs(clOff)
581
+ rt = null
582
+ // vans[6] = 'Error: invalid data[1].id, autoGenPk is false'
583
+ await woOff.insertGfs([
584
+ { id: 'g-ok1', u8a: genU8a(100, 4) },
585
+ { u8a: genU8a(100, 5) },
586
+ { id: 'g-ok2', u8a: genU8a(100, 6) },
587
+ ])
588
+ .then(function(msg) {
589
+ rt = `不應resolve: ${JSON.stringify(msg)}`
590
+ })
591
+ .catch(function(msg) {
592
+ rt = msg.toString()
593
+ })
594
+ vget[6] = rt
595
+ let cAfter = await countDocs(clOff)
596
+ vget[7] = { files: cAfter.files - cBefore.files, chunks: cAfter.chunks - cBefore.chunks }
597
+ vget[8] = [
598
+ await woOff.selectByPkGfs('g-ok1'),
599
+ await woOff.selectByPkGfs('g-ok2'),
600
+ ]
601
+
602
+ //delGfs不受autoGenPk影響, 未帶有效id仍為該筆ok為0而非reject
603
+ vget[9] = await woOff.delGfs({ u8a: genU8a(10) })
604
+
605
+ //輸入無效仍依T5回空結果
606
+ vget[10] = await woOff.insertGfs(null)
607
+
608
+ })
609
+
610
+ vans[1] = { n: 1, nInserted: 1, ok: 1 }
611
+ it(`should get ${JSON.stringify(vans[1])} for insertGfs without id by default autoGenPk`, async function() {
612
+ assert.strict.deepStrictEqual(vget[1], vans[1])
613
+ })
614
+
615
+ vans[2] = 1
616
+ it(`should get ${JSON.stringify(vans[2])} for files after insertGfs without id by default autoGenPk`, async function() {
617
+ assert.strict.deepStrictEqual(vget[2], vans[2])
618
+ })
619
+
620
+ vans[3] = { n: 1, nInserted: 1, ok: 1 }
621
+ it(`should get ${JSON.stringify(vans[3])} for insertGfs with id by autoGenPk=false`, async function() {
622
+ assert.strict.deepStrictEqual(vget[3], vans[3])
623
+ })
624
+
625
+ vans[4] = true
626
+ it(`should get ${JSON.stringify(vans[4])} for content after insertGfs with id by autoGenPk=false`, async function() {
627
+ assert.strict.deepStrictEqual(vget[4], vans[4])
628
+ })
629
+
630
+ vans[5] = 'Error: invalid data[0].id, autoGenPk is false'
631
+ it(`should get ${JSON.stringify(vans[5])} for insertGfs without id by autoGenPk=false`, async function() {
632
+ assert.strict.deepStrictEqual(vget[5], vans[5])
633
+ })
634
+
635
+ vans[6] = 'Error: invalid data[1].id, autoGenPk is false'
636
+ it(`should get ${JSON.stringify(vans[6])} for insertGfs with 1 record without id by autoGenPk=false`, async function() {
637
+ assert.strict.deepStrictEqual(vget[6], vans[6])
638
+ })
639
+
640
+ vans[7] = { files: 0, chunks: 0 }
641
+ it(`should get ${JSON.stringify(vans[7])} for not writing valid records in rejected insertGfs batch`, async function() {
642
+ assert.strict.deepStrictEqual(vget[7], vans[7])
643
+ })
644
+
645
+ vans[8] = [null, null]
646
+ it(`should get ${JSON.stringify(vans[8])} for records after rejected insertGfs batch`, async function() {
647
+ assert.strict.deepStrictEqual(vget[8], vans[8])
648
+ })
649
+
650
+ vans[9] = [{ n: 0, nDeleted: 0, ok: 0, err: 'invalid id[undefined]' }]
651
+ it(`should get ${JSON.stringify(vans[9])} for delGfs without id by autoGenPk=false`, async function() {
652
+ assert.strict.deepStrictEqual(vget[9], vans[9])
653
+ })
654
+
655
+ vans[10] = { n: 0, nInserted: 0, ok: 1 }
656
+ it(`should get ${JSON.stringify(vans[10])} for insertGfs with invalid data by autoGenPk=false`, async function() {
657
+ assert.strict.deepStrictEqual(vget[10], vans[10])
658
+ })
659
+
660
+ })
661
+
662
+
663
+ describe('gfs error event', function() {
664
+ let vans = {}
665
+ let vget = {}
666
+
667
+ before(async function() {
668
+ this.timeout(300000)
669
+
670
+ //collect, 收集事件
671
+ let collect = (wo) => {
672
+ let evs = []
673
+ wo.on('error', function(mode, data, err) {
674
+ evs.push({ mode, data, err })
675
+ })
676
+ return evs
677
+ }
678
+
679
+ //insertGfs之整批性錯誤
680
+ let woB = WOrm(genOptPk('everrGfs', false))
681
+ await woB.delAllGfs()
682
+ let evsB = collect(woB)
683
+ let msgB = null
684
+ await woB.insertGfs({ u8a: genU8a(100, 1) }).catch((err) => {
685
+ msgB = err.toString()
686
+ })
687
+ vget[1] = evsB.length
688
+ vget[2] = evsB[0].mode
689
+ vget[3] = typeof evsB[0].err === 'string' && msgB.indexOf(evsB[0].err) >= 0
690
+
691
+ //delGfs之逐筆失敗, 未帶有效id者亦須發出
692
+ let woD = WOrm(genOpt('everrDelGfs'))
693
+ await woD.delAllGfs()
694
+ await woD.insertGfs({ id: 'd1', u8a: genU8a(100, 2) })
695
+ let evsD = collect(woD)
696
+ let rd = await woD.delGfs([{ id: 'd1' }, { u8a: genU8a(10) }])
697
+ vget[4] = evsD.length
698
+ vget[5] = evsD[0].mode
699
+ vget[6] = evsD[0].err === rd[1].err
700
+
701
+ //正常結果不得發出error
702
+ let woN = WOrm(genOpt('everrNormalGfs'))
703
+ await woN.delAllGfs()
704
+ let evsN = collect(woN)
705
+ await woN.insertGfs({ id: 'n1', u8a: genU8a(100, 3) })
706
+ await woN.insertGfs({ id: 'n1', u8a: genU8a(100, 3) }) //已存在則跳過
707
+ await woN.delGfs({ id: 'n-not-existed' }) //主鍵未命中
708
+ await woN.delAllGfs({ filename: 'not-existed' }) //條件無命中
709
+ await woN.selectByPkGfs('n-not-existed') //查無數據
710
+ await woN.selectByPkGfs('') //主鍵值無效
711
+ vget[7] = evsN.length
712
+
713
+ //訂閱函數拋錯不得影響本次操作之結果
714
+ let woT = WOrm(genOpt('everrThrowGfs'))
715
+ await woT.delAllGfs()
716
+ woT.on('error', function() {
717
+ throw new Error('訂閱者拋錯')
718
+ })
719
+ await woT.insertGfs({ id: 't1', u8a: genU8a(100, 4) })
720
+ vget[8] = await woT.delGfs([{ id: 't1' }, { u8a: genU8a(10) }])
721
+
722
+ })
723
+
724
+ vans[1] = 1
725
+ it(`should get ${JSON.stringify(vans[1])} for count of error event in insertGfs batch error`, async function() {
726
+ assert.strict.deepStrictEqual(vget[1], vans[1])
727
+ })
728
+
729
+ vans[2] = 'insertGfs'
730
+ it(`should get ${JSON.stringify(vans[2])} for mode of error event in insertGfs batch error`, async function() {
731
+ assert.strict.deepStrictEqual(vget[2], vans[2])
732
+ })
733
+
734
+ vans[3] = true
735
+ it(`should get ${JSON.stringify(vans[3])} for same err between error event and reject`, async function() {
736
+ assert.strict.deepStrictEqual(vget[3], vans[3])
737
+ })
738
+
739
+ vans[4] = 1
740
+ it(`should get ${JSON.stringify(vans[4])} for count of error event in delGfs single failure`, async function() {
741
+ assert.strict.deepStrictEqual(vget[4], vans[4])
742
+ })
743
+
744
+ vans[5] = 'delGfs'
745
+ it(`should get ${JSON.stringify(vans[5])} for mode of error event in delGfs single failure`, async function() {
746
+ assert.strict.deepStrictEqual(vget[5], vans[5])
747
+ })
748
+
749
+ vans[6] = true
750
+ it(`should get ${JSON.stringify(vans[6])} for same err between error event and result of delGfs`, async function() {
751
+ assert.strict.deepStrictEqual(vget[6], vans[6])
752
+ })
753
+
754
+ vans[7] = 0
755
+ it(`should get ${JSON.stringify(vans[7])} for count of error event in normal results`, async function() {
756
+ assert.strict.deepStrictEqual(vget[7], vans[7])
757
+ })
758
+
759
+ vans[8] = [
760
+ { n: 1, nDeleted: 1, ok: 1 },
761
+ { n: 0, nDeleted: 0, ok: 0, err: 'invalid id[undefined]' }
762
+ ]
763
+ it(`should get ${JSON.stringify(vans[8])} for result with throwing error listener`, async function() {
764
+ assert.strict.deepStrictEqual(vget[8], vans[8])
765
+ })
766
+
767
+ })
768
+
769
+
531
770
  describe('gfs change event', function() {
532
771
  let vans = {}
533
772
  let vget = {}