/* eslint-env mocha */
import expect from "expect"
import { fromJS } from "immutable"
import reducer from "corePlugins/spec/reducers"

describe("spec plugin - reducer", function(){

  describe("update operation value", function() {
    it("should update the operation at the specified key", () => {
      const updateOperationValue = reducer["spec_update_operation_value"]

      const state = fromJS({
        resolved: {
          "paths": {
            "/pet": {
              "post": {
                "description": "my operation"
              }
            }
          }
        }
      })

      let result = updateOperationValue(state, {
        payload: {
          path: ["/pet", "post"],
          value: "application/json",
          key: "consumes_value"
        }
      })

      let expectedResult = {
        resolved: {
          "paths": {
            "/pet": {
              "post": {
                "description": "my operation",
                "consumes_value": "application/json"
              }
            }
          }
        }
      }

      expect(result.toJS()).toEqual(expectedResult)
    })

    it("shouldn't throw an error if we try to update the consumes_value of a null operation", () => {
      const updateOperationValue = reducer["spec_update_operation_value"]

      const state = fromJS({
        resolved: {
          "paths": {
            "/pet": {
              "post": null
            }
          }
        }
      })

      let result = updateOperationValue(state, {
        payload: {
          path: ["/pet", "post"],
          value: "application/json",
          key: "consumes_value"
        }
      })

      expect(result.toJS()).toEqual(state.toJS())
    })
  })

  describe("set response value", function() {
    it("should combine the response and error objects", () => {
      const setResponse = reducer["spec_set_response"]

      const path = "/pet/post"
      const method = "POST"

      const state = fromJS({})
      const result = setResponse(state, {
        payload: {
          path: path,
          method: method,
          res: {
            error: true,
            err: {
              message: "Not Found",
              name: "Error",
              response: {
                data: "response data",
                headers: {
                  key: "value"
                },
                ok: false,
                status: 404,
                statusText: "Not Found"
              },
              status: 404,
              statusCode: 404
            }
          }
        }
      })

      let expectedResult = {
        error: true,
        message: "Not Found",
        name: "Error",
        data: "response data",
        headers: {
          key: "value"
        },
        ok: false,
        status: 404,
        statusCode: 404,
        statusText: "Not Found"
      }

      const response = result.getIn(["responses", path, method]).toJS()
      expect(response).toEqual(expectedResult)
    })
  })
})
