Create StateStore class and specs for storing state in IndexedDB

This commit is contained in:
Katrina Uychaco
2016-02-04 21:43:44 -08:00
parent 81f30d4908
commit 3b500daab4
2 changed files with 82 additions and 0 deletions

37
spec/state-store-spec.js Normal file
View File

@@ -0,0 +1,37 @@
/** @babel */
import {it, ffit, fffit, beforeEach, afterEach} from './async-spec-helpers'
const StateStore = require('../src/state-store.js')
describe("StateStore", () => {
it("can save and load states", () => {
const store = new StateStore()
return store.save('key', {foo:'bar'})
.then(() => store.load('key'))
.then((state) => {
expect(state).toEqual({foo:'bar'})
})
})
describe("when there is an error reading from the database", () => {
it("rejects the promise returned by load", () => {
const store = new StateStore()
const fakeErrorEvent = {target: {errorCode: "Something bad happened"}}
spyOn(IDBObjectStore.prototype, 'get').andCallFake((key) => {
let request = {}
process.nextTick(() => request.onerror(fakeErrorEvent))
return request
})
return store.load('nonexistentKey')
.then(() => {
throw new Error("Promise should have been rejected")
})
.catch((event) => {
expect(event).toBe(fakeErrorEvent)
})
})
})
})

45
src/state-store.js Normal file
View File

@@ -0,0 +1,45 @@
'use strict'
module.exports =
class StateStore {
constructor () {
this.dbPromise = new Promise((resolve, reject) => {
let dbOpenRequest = indexedDB.open('AtomEnvironments', 1)
dbOpenRequest.onupgradeneeded = (event) => {
let db = event.target.result
db.createObjectStore('states')
resolve(db)
}
dbOpenRequest.onsuccess = () => {
resolve(dbOpenRequest.result)
}
dbOpenRequest.onerror = reject
})
}
save (key, value) {
return this.dbPromise.then(db => {
return new Promise((resolve, reject) => {
var request = db.transaction(['states'], 'readwrite')
.objectStore('states')
.put(value, key)
request.onsuccess = resolve
request.onerror = reject
})
})
}
load (key) {
return this.dbPromise.then(db => {
return new Promise((resolve, reject) => {
var request = db.transaction(['states'])
.objectStore('states')
.get(key)
request.onsuccess = (event) => resolve(event.target.result)
request.onerror = (event) => reject(event)
})
})
}
}