// helper for testing action with expected mutations
export const testAction = ({action, payload, params, expectedMutations, expectedActions}, done) => {
  let mutationsCount = 0
  let actionsCount = 0

  if (!expectedMutations) {
    expectedMutations = []
  }
  if (!expectedActions) {
    expectedActions = []
  }
  const isOver = () => {
    return mutationsCount >= expectedMutations.length && actionsCount >= expectedActions.length
  }
  // mock commit
  const commit = (type, payload) => {
    const mutation = expectedMutations[mutationsCount]

    try {
      expect(mutation.type).to.equal(type)
      if (payload) {
        expect(mutation.payload).to.deep.equal(payload)
      }
    } catch (error) {
      done(error)
    }

    mutationsCount++
    if (isOver()) {
      done()
    }
  }
  // mock dispatch
  const dispatch = (type, payload, options) => {
    const a = expectedActions[actionsCount]
    try {
      expect(a.type).to.equal(type)
      if (payload) {
        expect(a.payload).to.deep.equal(payload)
      }
      if (a.options) {
        expect(options).to.deep.equal(a.options)
      }
    } catch (error) {
      done(error)
    }

    actionsCount++
    if (isOver()) {
      done()
    }
  }

  let end = function () {
    // check if no mutations should have been dispatched
    if (expectedMutations.length === 0) {
      expect(mutationsCount).to.equal(0)
    }
    if (expectedActions.length === 0) {
      expect(actionsCount).to.equal(0)
    }
    if (isOver()) {
      done()
    }
  }
  // call the action with mocked store and arguments
  let promise = action({ commit, dispatch, ...params }, payload)
  if (promise) {
    return promise.then(end)
  } else {
    return end()
  }
}
