@live-change/db-store-localstorage 0.6.0
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/index.js +1 -0
- package/lib/Store.js +416 -0
- package/lib/storage.js +158 -0
- package/package.json +34 -0
- package/tests/broadcast-object-changes.js +80 -0
- package/tests/broadcast-range-changes.js +168 -0
- package/tests/limited-range-observable.js +176 -0
- package/tests/limited-reverse-range-observable.js +175 -0
- package/tests/object-observable.js +68 -0
- package/tests/range-observable.js +140 -0
- package/tests/reverse-range-observable.js +139 -0
- package/tests/store-non-reactive.js +120 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
const test = require('tape')
|
|
2
|
+
|
|
3
|
+
require('fake-indexeddb/auto.js')
|
|
4
|
+
const idb = require('idb')
|
|
5
|
+
const Store = require('../lib/Store.js')
|
|
6
|
+
|
|
7
|
+
const nextTick = () => new Promise(resolve => {
|
|
8
|
+
console.log("WAIT!")
|
|
9
|
+
setTimeout(resolve, 100)
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
test("store broadcast range changes", t => {
|
|
13
|
+
t.plan(5)
|
|
14
|
+
|
|
15
|
+
let writeStore
|
|
16
|
+
let readStore
|
|
17
|
+
|
|
18
|
+
t.test("create stores", async t => {
|
|
19
|
+
t.plan(2)
|
|
20
|
+
readStore = new Store('test-broadcast-object-changes', 'test', 'local')
|
|
21
|
+
await readStore.open()
|
|
22
|
+
t.pass('read store created')
|
|
23
|
+
writeStore = new Store('test-broadcast-object-changes', 'test', 'local')
|
|
24
|
+
await writeStore.open()
|
|
25
|
+
t.pass('write store created')
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
t.test("put objects", async t => {
|
|
29
|
+
t.plan(1)
|
|
30
|
+
await writeStore.put({ v: 1, id: 'a' })
|
|
31
|
+
await writeStore.put({ v: 3, id: 'c' })
|
|
32
|
+
t.pass('objects written')
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
let nextValueResolve
|
|
36
|
+
let gotNextValue
|
|
37
|
+
const getNextValue = () => {
|
|
38
|
+
if(gotNextValue) {
|
|
39
|
+
gotNextValue = false
|
|
40
|
+
return rangeObservable.list
|
|
41
|
+
}
|
|
42
|
+
return new Promise((resolve, reject) => nextValueResolve = resolve)
|
|
43
|
+
}
|
|
44
|
+
let rangeObservable
|
|
45
|
+
const rangeObserver = (signal, value, ...rest) => {
|
|
46
|
+
console.log("SIGNAL", signal, value, ...rest)
|
|
47
|
+
if(nextValueResolve) {
|
|
48
|
+
nextValueResolve(rangeObservable.list)
|
|
49
|
+
} else {
|
|
50
|
+
gotNextValue = true
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
t.test("observe range [a,z]", t => {
|
|
55
|
+
t.plan(6)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
let values
|
|
59
|
+
|
|
60
|
+
t.test("get values", async t => {
|
|
61
|
+
t.plan(1)
|
|
62
|
+
await nextTick()
|
|
63
|
+
rangeObservable = readStore.rangeObservable({ gte: 'a', lte: 'z' })
|
|
64
|
+
rangeObservable.observe(rangeObserver)
|
|
65
|
+
values = await getNextValue()
|
|
66
|
+
t.deepEqual(values, [{v: 1, id: 'a'}, {v: 3, id: 'c'}], 'range value')
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
t.test("remove object 'a' from observed range", async t => {
|
|
70
|
+
t.plan(1)
|
|
71
|
+
await nextTick()
|
|
72
|
+
await writeStore.delete('a')
|
|
73
|
+
let values = await getNextValue()
|
|
74
|
+
t.deepEqual(values, [ { v: 3, id: 'c' } ], 'range value' )
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
t.test("add object 'a' to observed range", async t => {
|
|
78
|
+
t.plan(1)
|
|
79
|
+
await nextTick()
|
|
80
|
+
await writeStore.put({ id: 'a', v: 4 })
|
|
81
|
+
let values = await getNextValue()
|
|
82
|
+
t.deepEqual(values, [ { v: 4, id: 'a' }, { v: 3, id: 'c' } ], 'range value' )
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
t.test("add object 'b' to observed range", async t => {
|
|
86
|
+
t.plan(1)
|
|
87
|
+
await nextTick()
|
|
88
|
+
await writeStore.put({ id: 'b', v: 5 })
|
|
89
|
+
let values = await getNextValue()
|
|
90
|
+
t.deepEqual(values, [ { v: 4, id: 'a' }, { v: 5, id: 'b' }, { v: 3, id: 'c' } ], 'range value' )
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
t.test("add object 'd' to observed range", async t => {
|
|
94
|
+
t.plan(1)
|
|
95
|
+
await nextTick()
|
|
96
|
+
await writeStore.put({ id: 'd', v: 6 })
|
|
97
|
+
let values = await getNextValue()
|
|
98
|
+
t.deepEqual(values, [ { v: 4, id: 'a' }, { v: 5, id: 'b' }, { v: 3, id: 'c' }, { v: 6, id: 'd' } ], 'range value' )
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
t.test("unobserve range", async t => {
|
|
102
|
+
t.plan(1)
|
|
103
|
+
await nextTick()
|
|
104
|
+
rangeObservable.unobserve(rangeObserver)
|
|
105
|
+
t.pass('unobserved')
|
|
106
|
+
})
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
t.test("observe range (a,d)", t => {
|
|
110
|
+
t.plan(6)
|
|
111
|
+
|
|
112
|
+
let values
|
|
113
|
+
|
|
114
|
+
t.test("get values", async t => {
|
|
115
|
+
t.plan(1)
|
|
116
|
+
await nextTick()
|
|
117
|
+
rangeObservable = readStore.rangeObservable({ gt: 'a', lt: 'd' })
|
|
118
|
+
rangeObservable.observe(rangeObserver)
|
|
119
|
+
values = await getNextValue()
|
|
120
|
+
t.deepEqual(values, [{v: 5, id: 'b'}, {v: 3, id: 'c'}], 'range value')
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
t.test("remove object 'd' outside observed range", async t => {
|
|
124
|
+
t.plan(1)
|
|
125
|
+
await nextTick()
|
|
126
|
+
await writeStore.delete('d')
|
|
127
|
+
t.pass('deleted')
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
t.test("remove object 'a' outside observed range", async t => {
|
|
131
|
+
t.plan(1)
|
|
132
|
+
await nextTick()
|
|
133
|
+
await writeStore.delete('a')
|
|
134
|
+
t.pass('deleted')
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
t.test("add object 'ab' to observed range", async t => {
|
|
138
|
+
t.plan(1)
|
|
139
|
+
await nextTick()
|
|
140
|
+
await writeStore.put({ id: 'ab', v: 7 })
|
|
141
|
+
let values = await getNextValue()
|
|
142
|
+
t.deepEqual(values, [ { v: 7, id: 'ab' }, { v: 5, id: 'b' }, { v: 3, id: 'c' } ], 'range value' )
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
t.test("remove object 'ab' from observed range", async t => {
|
|
146
|
+
t.plan(1)
|
|
147
|
+
await nextTick()
|
|
148
|
+
await writeStore.delete('ab')
|
|
149
|
+
let values = await getNextValue()
|
|
150
|
+
t.deepEqual(values, [ { v: 5, id: 'b' }, { v: 3, id: 'c' } ], 'range value' )
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
t.test("unobserve range", async t => {
|
|
154
|
+
t.plan(1)
|
|
155
|
+
await nextTick()
|
|
156
|
+
rangeObservable.unobserve(rangeObserver)
|
|
157
|
+
t.pass('unobserved')
|
|
158
|
+
})
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
t.test("close database", async t => {
|
|
162
|
+
await readStore.close()
|
|
163
|
+
await writeStore.close()
|
|
164
|
+
t.pass('closed')
|
|
165
|
+
t.end()
|
|
166
|
+
})
|
|
167
|
+
|
|
168
|
+
})
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
const test = require('tape')
|
|
2
|
+
|
|
3
|
+
require('fake-indexeddb/auto.js')
|
|
4
|
+
const idb = require('idb')
|
|
5
|
+
const Store = require('../lib/Store.js')
|
|
6
|
+
|
|
7
|
+
test("store limited range observable", t => {
|
|
8
|
+
t.plan(5)
|
|
9
|
+
|
|
10
|
+
let store
|
|
11
|
+
|
|
12
|
+
t.test("create store", async t => {
|
|
13
|
+
t.plan(1)
|
|
14
|
+
store = new Store('test-limited-range-observable', 'test', 'local')
|
|
15
|
+
await store.open()
|
|
16
|
+
t.pass('store created')
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
let objects = []
|
|
20
|
+
|
|
21
|
+
t.test("put objects", async t => {
|
|
22
|
+
t.plan(1)
|
|
23
|
+
store.put({ id: 'a_0', v: 1 })
|
|
24
|
+
for(let i = 0; i < 10; i++) {
|
|
25
|
+
let obj = { id: 'b_' + i, v: i }
|
|
26
|
+
objects.push(obj)
|
|
27
|
+
await store.put(obj)
|
|
28
|
+
}
|
|
29
|
+
await store.put({ id: 'c_0', v: 1 })
|
|
30
|
+
t.pass('objects written')
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
let nextValueResolve
|
|
34
|
+
let gotNextValue
|
|
35
|
+
const getNextValue = () => {
|
|
36
|
+
if(gotNextValue) {
|
|
37
|
+
gotNextValue = false
|
|
38
|
+
return rangeObservable.list
|
|
39
|
+
}
|
|
40
|
+
return new Promise((resolve, reject) => nextValueResolve = resolve)
|
|
41
|
+
}
|
|
42
|
+
let rangeObservable
|
|
43
|
+
const rangeObserver = (signal, value, ...rest) => {
|
|
44
|
+
console.log("SIGNAL", signal, value, ...rest)
|
|
45
|
+
gotNextValue = true
|
|
46
|
+
if(nextValueResolve) nextValueResolve(rangeObservable.list)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
t.test("observe range [b_0,b_9]", t => {
|
|
50
|
+
t.plan(7)
|
|
51
|
+
rangeObservable = store.rangeObservable({ gte: 'b_0', lte: 'b_9', limit: 5 })
|
|
52
|
+
rangeObservable.observe(rangeObserver)
|
|
53
|
+
|
|
54
|
+
let values
|
|
55
|
+
|
|
56
|
+
t.test("get values", async t => {
|
|
57
|
+
t.plan(1)
|
|
58
|
+
values = await getNextValue()
|
|
59
|
+
t.deepEqual(values, objects.slice(0,5), 'range value')
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
t.test("remove object 'b_3' from observed range", async t => {
|
|
63
|
+
t.plan(1)
|
|
64
|
+
await store.delete('b_3')
|
|
65
|
+
objects.splice(3, 1)
|
|
66
|
+
await getNextValue() // one shorter
|
|
67
|
+
let values = await getNextValue()
|
|
68
|
+
t.deepEqual(values, objects.slice(0, 5), 'range value' )
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
t.test("add object 'b_3' to observed range", async t => {
|
|
72
|
+
t.plan(1)
|
|
73
|
+
const obj = { id: 'b_3', v: 10 }
|
|
74
|
+
await store.put(obj)
|
|
75
|
+
objects.splice(3, 0, obj)
|
|
76
|
+
let values = await getNextValue()
|
|
77
|
+
t.deepEqual(values, objects.slice(0, 5), 'range value' )
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
t.test("add object 'b_32' to observed range", async t => {
|
|
81
|
+
t.plan(1)
|
|
82
|
+
const obj = { id: 'b_32', v: 11 }
|
|
83
|
+
await store.put(obj)
|
|
84
|
+
objects.splice(4, 0, obj)
|
|
85
|
+
let values = await getNextValue()
|
|
86
|
+
t.deepEqual(values, objects.slice(0, 5), 'range value' )
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
t.test("add object 'b_35' outside observed range limits", async t => {
|
|
90
|
+
t.plan(1)
|
|
91
|
+
const obj = { id: 'b_35', v: 11 }
|
|
92
|
+
await store.put(obj)
|
|
93
|
+
objects.splice(5, 0, obj)
|
|
94
|
+
t.pass('added')
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
t.test("delete object 'b_32' so b_35 will enter into range limits", async t => {
|
|
98
|
+
t.plan(1)
|
|
99
|
+
await store.delete('b_32')
|
|
100
|
+
objects.splice(4, 1)
|
|
101
|
+
await getNextValue()
|
|
102
|
+
let values = await getNextValue()
|
|
103
|
+
t.deepEqual(values, objects.slice(0, 5), 'range value' )
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
t.test("unobserve range", async t => {
|
|
107
|
+
t.plan(1)
|
|
108
|
+
rangeObservable.unobserve(rangeObserver)
|
|
109
|
+
t.pass('unobserved')
|
|
110
|
+
})
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
t.test("observe range (b_0,b_5)", t => {
|
|
114
|
+
t.plan(7)
|
|
115
|
+
gotNextValue = false
|
|
116
|
+
rangeObservable = store.rangeObservable({ gt: 'b_0', lt: 'b_5', limit: 3 })
|
|
117
|
+
rangeObservable.observe(rangeObserver)
|
|
118
|
+
|
|
119
|
+
let values
|
|
120
|
+
|
|
121
|
+
t.test("get values", async t => {
|
|
122
|
+
t.plan(1)
|
|
123
|
+
values = await getNextValue()
|
|
124
|
+
t.deepEqual(values, objects.slice(1,4), 'range value')
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
t.test("remove object 'b_0' outside observed range", async t => {
|
|
128
|
+
t.plan(1)
|
|
129
|
+
await store.delete('b_0')
|
|
130
|
+
t.pass('deleted')
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
t.test("remove object 'b_5' outside observed range", async t => {
|
|
134
|
+
t.plan(1)
|
|
135
|
+
await store.delete('b_5')
|
|
136
|
+
t.pass('deleted')
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
t.test("remove object 'b_4' outside observed range limits", async t => {
|
|
140
|
+
t.plan(1)
|
|
141
|
+
await store.delete('b_4')
|
|
142
|
+
t.pass('deleted')
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
t.test("add object 'b_12' to observed range", async t => {
|
|
146
|
+
t.plan(1)
|
|
147
|
+
const obj = { id: 'b_12', v: 7 }
|
|
148
|
+
await store.put(obj)
|
|
149
|
+
objects.splice(2, 0, obj)
|
|
150
|
+
let values = await getNextValue()
|
|
151
|
+
t.deepEqual(values, objects.slice(1,4), 'range value' )
|
|
152
|
+
})
|
|
153
|
+
|
|
154
|
+
t.test("remove object 'b_12' from observed range", async t => {
|
|
155
|
+
t.plan(1)
|
|
156
|
+
await store.delete('b_12')
|
|
157
|
+
objects.splice(2, 1)
|
|
158
|
+
await getNextValue()
|
|
159
|
+
let values = await getNextValue()
|
|
160
|
+
t.deepEqual(values, objects.slice(1,4) , 'range value' )
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
t.test("unobserve range", async t => {
|
|
164
|
+
t.plan(1)
|
|
165
|
+
rangeObservable.unobserve(rangeObserver)
|
|
166
|
+
t.pass('unobserved')
|
|
167
|
+
})
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
t.test("close database", async t => {
|
|
171
|
+
await store.close()
|
|
172
|
+
t.pass('closed')
|
|
173
|
+
t.end()
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
})
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
const test = require('tape')
|
|
2
|
+
|
|
3
|
+
require('fake-indexeddb/auto.js')
|
|
4
|
+
const idb = require('idb')
|
|
5
|
+
const Store = require('../lib/Store.js')
|
|
6
|
+
|
|
7
|
+
test("store limited reverse range observable", t => {
|
|
8
|
+
t.plan(5)
|
|
9
|
+
|
|
10
|
+
let store
|
|
11
|
+
|
|
12
|
+
t.test("create store", async t => {
|
|
13
|
+
t.plan(1)
|
|
14
|
+
store = new Store('test-limited-reverse-range-observable', 'test', 'local')
|
|
15
|
+
await store.open()
|
|
16
|
+
t.pass('store created')
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
let objects = []
|
|
20
|
+
|
|
21
|
+
t.test("put objects", async t => {
|
|
22
|
+
t.plan(1)
|
|
23
|
+
await store.put({ id: 'a_0', v: 1 })
|
|
24
|
+
for(let i = 0; i < 10; i++) {
|
|
25
|
+
let obj = { id: 'b_' + i, v: i }
|
|
26
|
+
objects.unshift(obj)
|
|
27
|
+
await store.put(obj)
|
|
28
|
+
}
|
|
29
|
+
await store.put({ id: 'c_0', v: 1 })
|
|
30
|
+
t.pass('objects written')
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
let nextValueResolve
|
|
34
|
+
let gotNextValue
|
|
35
|
+
const getNextValue = () => {
|
|
36
|
+
if(gotNextValue) {
|
|
37
|
+
gotNextValue = false
|
|
38
|
+
return rangeObservable.list
|
|
39
|
+
}
|
|
40
|
+
return new Promise((resolve, reject) => nextValueResolve = resolve)
|
|
41
|
+
}
|
|
42
|
+
let rangeObservable
|
|
43
|
+
const rangeObserver = (signal, value, ...rest) => {
|
|
44
|
+
console.log("SIGNAL", signal, value, ...rest)
|
|
45
|
+
gotNextValue = true
|
|
46
|
+
if(nextValueResolve) nextValueResolve(rangeObservable.list)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
t.test("observe reverse range [b_9,b_0]", t => {
|
|
50
|
+
t.plan(7)
|
|
51
|
+
rangeObservable = store.rangeObservable({ gte: 'b_0', lte: 'b_9', limit: 5, reverse: true })
|
|
52
|
+
rangeObservable.observe(rangeObserver)
|
|
53
|
+
|
|
54
|
+
let values
|
|
55
|
+
|
|
56
|
+
t.test("get values", async t => {
|
|
57
|
+
t.plan(1)
|
|
58
|
+
values = await getNextValue()
|
|
59
|
+
t.deepEqual(values, objects.slice(0,5), 'range value')
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
t.test("remove object 'b_6' from observed range", async t => {
|
|
63
|
+
t.plan(1)
|
|
64
|
+
await store.delete('b_6')
|
|
65
|
+
objects.splice(3, 1)
|
|
66
|
+
await getNextValue() // one shorter
|
|
67
|
+
let values = await getNextValue()
|
|
68
|
+
t.deepEqual(values, objects.slice(0, 5), 'range value' )
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
t.test("add object 'b_6' to observed range", async t => {
|
|
72
|
+
t.plan(1)
|
|
73
|
+
const obj = { id: 'b_6', v: 10 }
|
|
74
|
+
await store.put(obj)
|
|
75
|
+
objects.splice(3, 0, obj)
|
|
76
|
+
let values = await getNextValue()
|
|
77
|
+
t.deepEqual(values, objects.slice(0, 5), 'range value' )
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
t.test("add object 'b_58' to observed range", async t => {
|
|
81
|
+
t.plan(1)
|
|
82
|
+
const obj = { id: 'b_58', v: 11 }
|
|
83
|
+
await store.put(obj)
|
|
84
|
+
objects.splice(4, 0, obj)
|
|
85
|
+
let values = await getNextValue()
|
|
86
|
+
t.deepEqual(values, objects.slice(0, 5), 'range value' )
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
t.test("add object 'b_52' outside observed range limits", async t => {
|
|
90
|
+
t.plan(1)
|
|
91
|
+
const obj = { id: 'b_52', v: 11 }
|
|
92
|
+
await store.put(obj)
|
|
93
|
+
objects.splice(5, 0, obj)
|
|
94
|
+
t.pass('added')
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
t.test("delete object 'b_58' so b_52 will enter into range limits", async t => {
|
|
98
|
+
t.plan(1)
|
|
99
|
+
await store.delete('b_58')
|
|
100
|
+
objects.splice(4, 1)
|
|
101
|
+
await getNextValue()
|
|
102
|
+
let values = await getNextValue()
|
|
103
|
+
t.deepEqual(values, objects.slice(0, 5), 'range value' )
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
t.test("unobserve range", async t => {
|
|
107
|
+
t.plan(1)
|
|
108
|
+
rangeObservable.unobserve(rangeObserver)
|
|
109
|
+
t.pass('unobserved')
|
|
110
|
+
})
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
t.test("observe reverse range (b_5,b_0)", t => {
|
|
114
|
+
t.plan(7)
|
|
115
|
+
gotNextValue = false
|
|
116
|
+
rangeObservable = store.rangeObservable({ gt: 'b_0', lt: 'b_5', limit: 3, reverse: true })
|
|
117
|
+
rangeObservable.observe(rangeObserver)
|
|
118
|
+
|
|
119
|
+
let values
|
|
120
|
+
t.test("get values", async t => {
|
|
121
|
+
t.plan(1)
|
|
122
|
+
values = await getNextValue()
|
|
123
|
+
t.deepEqual(values, objects.slice(6,9), 'range value')
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
t.test("remove object 'b_5' outside observed range", async t => {
|
|
127
|
+
t.plan(1)
|
|
128
|
+
await store.delete('b_5')
|
|
129
|
+
t.pass('deleted')
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
t.test("remove object 'b_0' outside observed range", async t => {
|
|
133
|
+
t.plan(1)
|
|
134
|
+
await store.delete('b_0')
|
|
135
|
+
t.pass('deleted')
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
t.test("remove object 'b_1' outside observed range limits", async t => {
|
|
139
|
+
t.plan(1)
|
|
140
|
+
await store.delete('b_1')
|
|
141
|
+
t.pass('deleted')
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
t.test("add object 'b_48' to observed range", async t => {
|
|
145
|
+
t.plan(1)
|
|
146
|
+
const obj = { id: 'b_48', v: 7 }
|
|
147
|
+
await store.put(obj)
|
|
148
|
+
objects.splice(6, 0, obj)
|
|
149
|
+
let values = await getNextValue()
|
|
150
|
+
t.deepEqual(values, objects.slice(6,9), 'range value' )
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
t.test("remove object 'b_48' from observed range", async t => {
|
|
154
|
+
t.plan(1)
|
|
155
|
+
await store.delete('b_48')
|
|
156
|
+
objects.splice(6, 1)
|
|
157
|
+
await getNextValue()
|
|
158
|
+
let values = await getNextValue()
|
|
159
|
+
t.deepEqual(values, objects.slice(6,9) , 'range value' )
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
t.test("unobserve range", async t => {
|
|
163
|
+
t.plan(1)
|
|
164
|
+
rangeObservable.unobserve(rangeObserver)
|
|
165
|
+
t.pass('unobserved')
|
|
166
|
+
})
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
t.test("close database", async t => {
|
|
170
|
+
await store.close()
|
|
171
|
+
t.pass('closed')
|
|
172
|
+
t.end()
|
|
173
|
+
})
|
|
174
|
+
|
|
175
|
+
})
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
const test = require('tape')
|
|
2
|
+
|
|
3
|
+
require('fake-indexeddb/auto.js')
|
|
4
|
+
const idb = require('idb')
|
|
5
|
+
const Store = require('../lib/Store.js')
|
|
6
|
+
|
|
7
|
+
test("store object observable", t => {
|
|
8
|
+
t.plan(3)
|
|
9
|
+
|
|
10
|
+
let store
|
|
11
|
+
|
|
12
|
+
t.test("create store", async t => {
|
|
13
|
+
t.plan(1)
|
|
14
|
+
store = new Store('test-object-observable', 'test', 'local')
|
|
15
|
+
await store.open()
|
|
16
|
+
t.pass('store created')
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
let nextValueResolve
|
|
20
|
+
let gotNextValue
|
|
21
|
+
const getNextValue = () => {
|
|
22
|
+
if(gotNextValue) {
|
|
23
|
+
gotNextValue = false
|
|
24
|
+
return objectObservable.value
|
|
25
|
+
}
|
|
26
|
+
return new Promise((resolve, reject) => nextValueResolve = resolve)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let objectObservable
|
|
30
|
+
const objectObserver = (signal, value, ...rest) => {
|
|
31
|
+
console.log("SIGNAL", signal, value, ...rest)
|
|
32
|
+
gotNextValue = true
|
|
33
|
+
if(nextValueResolve) nextValueResolve(value)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
t.test('observe object A', t => {
|
|
37
|
+
t.plan(3)
|
|
38
|
+
objectObservable = store.objectObservable('A')
|
|
39
|
+
objectObservable.observe(objectObserver)
|
|
40
|
+
|
|
41
|
+
t.test('get value', async t => {
|
|
42
|
+
t.plan(1)
|
|
43
|
+
let value = await getNextValue()
|
|
44
|
+
t.deepEqual(value, null, 'found null')
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
t.test("add object A", async t => {
|
|
48
|
+
t.plan(1)
|
|
49
|
+
await store.put({ id: 'A', a: 1 })
|
|
50
|
+
let value = await getNextValue()
|
|
51
|
+
t.deepEqual(value, { id: 'A', a: 1 } , 'found object' )
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
t.test("delete object A", async t => {
|
|
55
|
+
t.plan(1)
|
|
56
|
+
await store.delete('A')
|
|
57
|
+
let value = await getNextValue()
|
|
58
|
+
t.deepEqual(value, null , 'found null' )
|
|
59
|
+
})
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
t.test("close database", async t => {
|
|
63
|
+
await store.close()
|
|
64
|
+
t.pass('closed')
|
|
65
|
+
t.end()
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
})
|