import { fetchWebapi, setGlobalConfig, globalConfigMap } from "../src";

const url = `https://maimai.cn/web/pingback?type=pc&device_id=0bb8c8ab5b2d45996d1a9ab0e35da215`;

describe("fetch", () => {
  it("base", done => {
    fetchWebapi(url, {
      method: "GET"
    }).then(res => {
      expect(res).toBeDefined();
      done();
    });
  });

  it("get request start time and end time", done => {
    fetchWebapi(url, {
      method: "GET"
    }).then(res => {
      expect(res.result).toBeDefined();
      expect(res.startTime).toBeDefined();
      expect(res.endTime).toBeDefined();
      done();
    });
  });

  it("set global prefix", done => {
    const url = `/web/pingback?type=pc&device_id=0bb8c8ab5b2d45996d1a9ab0e35da215`;
    const prefix = `https://maimai.cn`;

    setGlobalConfig({
      prefix
    });

    fetchWebapi(url, {
      method: "GET"
    }).then(res => {
      expect(res.result).toBeDefined();
      expect(res.startTime).toBeDefined();
      expect(res.endTime).toBeDefined();
      done();
    });
  });

  it("set global fetchOption", done => {
    globalConfigMap.clear();
    const url = `/web/pingback?type=pc&device_id=0bb8c8ab5b2d45996d1a9ab0e35da215`;
    const prefix = `https://maimai.cn`;

    setGlobalConfig({
      prefix,
      fetchOption: {
        method: "GET"
      }
    });

    fetchWebapi(url).then(res => {
      expect(res.result).toBeDefined();
      expect(res.startTime).toBeDefined();
      expect(res.endTime).toBeDefined();
      done();
    });
  });

  it("set global requestInterceptor", done => {
    globalConfigMap.clear();
    const url = `/web/pingback?type=pc&device_id=0bb8c8ab5b2d45996d1a9ab0e35da215`;
    const prefix = `https://maimai.cn`;

    const fn = ({ api, options }) => {
      return {
        api: `${prefix}${api}`,
        options: {
          ...options,
          method: "GET"
        }
      };
    };
    setGlobalConfig({
      interceptor: {
        requestInterceptor: [fn]
      }
    });

    fetchWebapi(url).then(res => {
      expect(res.result).toBeDefined();
      expect(res.startTime).toBeDefined();
      expect(res.endTime).toBeDefined();
      done();
    });
  });

  it("set global responseInterceptor", done => {
    globalConfigMap.clear();
    const fn = res => {
      return {
        ...res,
        a: 1
      };
    };
    setGlobalConfig({
      interceptor: {
        responseInterceptor: [fn]
      }
    });

    fetchWebapi(url, {
      method: "GET"
    }).then(res => {
      expect(res.result).toBeDefined();
      expect(res.startTime).toBeDefined();
      expect(res.endTime).toBeDefined();
      expect(res.a).toBe(1);
      done();
    });
  });

  it("set global mult responseInterceptors", done => {
    globalConfigMap.clear();
    const fn = res => {
      return {
        ...res,
        a: 1
      };
    };

    const fn1 = res => {
      return {
        ...res,
        b: 2
      };
    };

    setGlobalConfig({
      interceptor: {
        responseInterceptor: [fn, fn1]
      }
    });

    fetchWebapi(url, {
      method: "GET"
    }).then(res => {
      expect(res.a).toBe(1);
      expect(res.b).toBe(2);
      expect(res.result).toBeDefined();
      expect(res.startTime).toBeDefined();
      expect(res.endTime).toBeDefined();
      done();
    });
  });

  it("set global errorInterceptor", done => {
    const errUrl = "xxx";
    const errMethod = "POST";
    const fn = ({ error, options }) => {
      expect(options.url).toEqual(errUrl);
      expect(options.args.options.method).toEqual(errMethod);
      expect(error.toString()).toEqual(
        "Error: only absolute urls are supported"
      );
      done();
    };

    setGlobalConfig({
      interceptor: {
        errorInterceptor: [fn]
      }
    });

    fetchWebapi(errUrl, {
      method: errMethod
    });
  });

  it("fast api get ", done => {
    fetchWebapi.get(url).then(res => {
      expect(res.result).toBeDefined();
      expect(res.startTime).toBeDefined();
      expect(res.endTime).toBeDefined();
      done();
    });
  });
});
