/** @babel */
import {it, fit, ffit, fffit, beforeEach, afterEach} from './async-spec-helpers'

const StateStore = require('../src/state-store.js')

describe("StateStore", () => {
  let databaseName = `test-database-${Date.now()}`
  let version = 1

  it("can save and load states", () => {
    const store = new StateStore(databaseName, version)
    return store.save('key', {foo:'bar'})
      .then(() => store.load('key'))
      .then((state) => {
        expect(state).toEqual({foo:'bar'})
      })
  })

  it("resolves with null when a non-existent key is loaded", () => {
    const store = new StateStore(databaseName, version)
    return store.load('no-such-key').then((value) => {
      expect(value).toBeNull()
    })
  })

  it("can clear the state object store", () => {
    const store = new StateStore(databaseName, version)
    return store.save('key', {foo:'bar'})
      .then(() => store.count())
      .then((count) =>
        expect(count).toBe(1)
      )
      .then(() => store.clear())
      .then(() => store.count())
      .then((count) => {
        expect(count).toBe(0)
      })
  })

  describe("when there is an error reading from the database", () => {
    it("rejects the promise returned by load", () => {
      const store = new StateStore(databaseName, version)

      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)
        })
    })
  })
})
