1 | var db
|
2 | , verifyNotFoundError = require('./util').verifyNotFoundError
|
3 | , isTypedArray = require('./util').isTypedArray
|
4 | , sourceData = (function () {
|
5 | var d = []
|
6 | , i = 0
|
7 | , k
|
8 | for (; i < 100; i++) {
|
9 | k = (i < 10 ? '0' : '') + i
|
10 | d.push({
|
11 | type : 'put'
|
12 | , key : k
|
13 | , value : Math.random()
|
14 | })
|
15 | }
|
16 | d.push({
|
17 | type : 'put'
|
18 | , key : "foo"
|
19 | , value : "bar"
|
20 | })
|
21 | return d
|
22 | }())
|
23 | , transformSource = function (d) {
|
24 | return { key: d.key, value: String(d.value) }
|
25 | }
|
26 | , valueTransformSource = function (d) {
|
27 | return String(d.value)
|
28 | }
|
29 |
|
30 |
|
31 | module.exports.setUp = function (NoSqlDatabase, test, testCommon) {
|
32 | test('setUp common', testCommon.setUp)
|
33 | test('setUp db', function (t) {
|
34 | db = NoSqlDatabase(testCommon.location())
|
35 | db.open(function () {
|
36 | db.batch(sourceData, t.end.bind(t))
|
37 | })
|
38 | })
|
39 | }
|
40 |
|
41 | module.exports.args = function (test) {
|
42 | }
|
43 |
|
44 | module.exports.mgetSync = function (test) {
|
45 | test('test mGet() keys=false sync', function (t) {
|
46 | var arr = db.mGetSync(["01","02","03",'foo'], {keys: false})
|
47 | t.equal(arr.length, 4)
|
48 | var expected = sourceData.slice(1, 4).map(valueTransformSource)
|
49 | expected.push("bar")
|
50 | t.deepEqual(arr, expected)
|
51 | t.end()
|
52 | })
|
53 | }
|
54 |
|
55 | module.exports.mget = function (test) {
|
56 | test('test simple mGet() with default options', function (t) {
|
57 | db.mGet(['foo'], function (err, arr) {
|
58 | t.error(err)
|
59 | t.deepEqual(arr, [{key:'foo', value:'bar'}])
|
60 | t.end()
|
61 | })
|
62 | })
|
63 |
|
64 | test('test simple mGet() with asBuffer option', function (t) {
|
65 | db.mGet(['foo'], {asBuffer: true}, function (err, arr) {
|
66 | t.error(err)
|
67 | t.type(arr, 'Array')
|
68 | t.equal(arr.length, 1)
|
69 | value = arr[0].value
|
70 | t.ok(typeof value !== 'string', 'should not be string by default')
|
71 |
|
72 | var result
|
73 | if (isTypedArray(value)) {
|
74 | result = String.fromCharCode.apply(null, new Uint16Array(value))
|
75 | } else {
|
76 | t.ok(typeof Buffer != 'undefined' && value instanceof Buffer)
|
77 | try {
|
78 | result = value.toString()
|
79 | } catch (e) {
|
80 | t.error(e, 'should not throw when converting value to a string')
|
81 | }
|
82 | }
|
83 | t.equal(result, 'bar')
|
84 | t.end()
|
85 | })
|
86 | })
|
87 |
|
88 | test('test simple mGet() with specified keys', function (t) {
|
89 | db.mGet(["01","02","03",'foo'], function (err, arr) {
|
90 | t.error(err)
|
91 | t.equal(arr.length, 4)
|
92 | var expected = sourceData.slice(1, 4).map(transformSource)
|
93 | expected.push({key:"foo", value:"bar"})
|
94 | t.deepEqual(arr, expected)
|
95 | t.end()
|
96 | })
|
97 | })
|
98 | test('test mGet() raiseError', function (t) {
|
99 | db.mGet(["01","02","03",'foo', 'Not Found'], {raiseError: true}, function (err, arr) {
|
100 | t.ok(err, "should err")
|
101 | t.ok((/NotFound/i).test(err))
|
102 | t.ok(arr == null)
|
103 | t.end()
|
104 | })
|
105 | })
|
106 | test('test mGet() raiseError=false', function (t) {
|
107 | db.mGet(["01","02","03",'foo', 'Not Found'], {raiseError: false}, function (err, arr) {
|
108 | t.error(err)
|
109 | t.equal(arr.length, 5)
|
110 | var expected = sourceData.slice(1, 4).map(transformSource)
|
111 | expected.push({key:"foo", value:"bar"})
|
112 | expected.push({key:"Not Found", value:undefined})
|
113 | t.deepEqual(arr, expected)
|
114 | t.end()
|
115 | })
|
116 | })
|
117 | test('test mGet() keys=false', function (t) {
|
118 | db.mGet(["01","02","03",'foo'], {keys: false}, function (err, arr) {
|
119 | t.error(err)
|
120 | t.equal(arr.length, 4)
|
121 | var expected = sourceData.slice(1, 4).map(valueTransformSource)
|
122 | expected.push("bar")
|
123 | t.deepEqual(arr, expected)
|
124 | t.end()
|
125 | })
|
126 | })
|
127 |
|
128 | test('test simultaniously mGet()', function (t) {
|
129 | db.put('hello', 'world', function (err) {
|
130 | t.error(err)
|
131 | var r = 0
|
132 | , done = function () {
|
133 | if (++r == 20)
|
134 | t.end()
|
135 | }
|
136 | , i = 0
|
137 | , j = 0
|
138 |
|
139 | for (; i < 10; ++i)
|
140 | db.mGet(['hello'], function(err, arr) {
|
141 | t.error(err)
|
142 | t.deepEqual(arr, [{key:'hello', value:'world'}])
|
143 | done()
|
144 | })
|
145 |
|
146 | for (; j < 10; ++j)
|
147 | db.mGet(['not found'], function(err, value) {
|
148 | t.ok(err, 'should error')
|
149 | t.ok(verifyNotFoundError(err), 'should have correct error message')
|
150 | t.ok(typeof value == 'undefined', 'value is undefined')
|
151 | done()
|
152 | })
|
153 | })
|
154 | })
|
155 | }
|
156 |
|
157 | module.exports.tearDown = function (test, testCommon) {
|
158 | test('tearDown', function (t) {
|
159 | db.close(testCommon.tearDown.bind(null, t))
|
160 | })
|
161 | }
|
162 |
|
163 | module.exports.sync = function (test) {
|
164 | test('sync', function (t) {
|
165 | if (db._mGetSync) {
|
166 | delete db.__proto__._mGet
|
167 | }
|
168 | t.end()
|
169 | })
|
170 | }
|
171 |
|
172 | module.exports.all = function (NoSqlDatabase, test, testCommon) {
|
173 | module.exports.setUp(NoSqlDatabase, test, testCommon)
|
174 | module.exports.args(test)
|
175 | module.exports.mget(test)
|
176 | module.exports.mgetSync(test)
|
177 | if (NoSqlDatabase.prototype._mGetSync) {
|
178 | module.exports.sync(test)
|
179 | module.exports.mget(test)
|
180 | }
|
181 | module.exports.tearDown(test, testCommon)
|
182 | }
|