/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

"use strict";

const { createStore, applyMiddleware } = require("devtools/client/shared/vendor/redux");
const { task, ERROR_TYPE } = require("devtools/client/shared/redux/middleware/task");

/**
 * Tests that the middleware handles errors thrown in tasks, and rejected promises.
 */

function run_test() {
  run_next_test();
}

add_task(async function() {
  let store = applyMiddleware(task)(createStore)(reducer);

  store.dispatch(generatorError());
  await waitUntilState(store, () => store.getState().length === 1);
  equal(store.getState()[0].type, ERROR_TYPE,
        "generator errors dispatch ERROR_TYPE actions");
  equal(store.getState()[0].error, "task-middleware-error-generator",
        "generator errors dispatch ERROR_TYPE actions with error");
});

function generatorError() {
  return function* (dispatch, getState) {
    let error = "task-middleware-error-generator";
    throw error;
  };
}

function reducer(state = [], action) {
  info("Action called: " + action.type);
  if (action.type === ERROR_TYPE) {
    state.push(action);
  }
  return [...state];
}
