import { fetch, setGlobalConfig, setBlockConfig } from "../src";

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

describe("fetch", () => {
  it("base", done => {
    fetch(url, {
      method: "GET"
    }).then(res => {
      expect(res.result).toEqual("ok");
      expect(res.startTime).toBeDefined();
      expect(res.endTime).toBeDefined();
      done();
    });
  });

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

  /***
   * 区块的配置会和全局的配置合并
   * 基础类型 为 区块 覆盖 全局
   * 复杂类型 为 区块 合并 全局，且全局先执行
   */
  it("combine config", done => {
    const url = `/web/pingback?type=pc&device_id=0bb8c8ab5b2d45996d1a9ab0e35da215`;
    const prefix = `https://maimai.cn`;

    setGlobalConfig({
      prefix: "xxxxxx",
      responseHandle: async res => {
        const data = await res.response.clone().json();
        return {
          ...data,
          ...res.options
        };
      },
      fetchOption: {
        a: 1
      },
      interceptor: {
        requestInterceptor: [
          res => {
            expect(res.api).toEqual(`${prefix}${url}`);
            expect(res.options).toEqual({
              method: "GET",
              a: 1,
              b: 1
            });
            return { ...res, request1: 1 };
          }
        ],
        responseInterceptor: [
          res => ({
            ...res,
            response1: 1
          })
        ]
      }
    });

    setBlockConfig("app", {
      prefix,
      fetchOption: {
        b: 1
      },
      responseHandle: async res => {
        const data = await res.response.clone().json();
        return {
          ...data,
          ...res.options,
          test: 1
        };
      },
      interceptor: {
        requestInterceptor: [
          (res: any) => {
            expect(res.request1).toEqual(1);
            return res;
          }
        ],
        responseInterceptor: [
          res => ({
            ...res,
            response2: 2
          })
        ]
      }
    });

    fetch("app", url, {
      method: "GET"
    }).then(res => {
      expect(res.result).toEqual("ok");
      expect(res.startTime).toBeDefined();
      expect(res.endTime).toBeDefined();
      expect(res.test).toEqual(1);
      expect(res.response1).toEqual(1);
      expect(res.response2).toEqual(2);
      done();
    });
  });
});
