const { basicProxyRequest, proxyServerWithRule, } = require('../util.js');

const RULE_REPLACE_HEADER_KEY = 'rule_replace_header_key';
const RULE_REPLACE_HEADER_VALUE = 'rule_replace_header_value';
const RULE_REPLACE_BODY = 'RULE_REPLACE_BODY';
const rule = {
  *beforeSendResponse(requestDetail, responseDetail) {
    if (requestDetail.url.indexOf('/uuid') >= 0) {
      const newResponse = responseDetail.response;
      newResponse.header[RULE_REPLACE_HEADER_KEY] = RULE_REPLACE_HEADER_VALUE;
      newResponse.body = RULE_REPLACE_BODY;
      newResponse.statusCode = 502;
      return {
        response: newResponse,
      };
    }
  },
};

describe('Rule replaceResponseData', () => {
  let proxyServer;
  let proxyPort;
  let proxyHost;

  beforeAll(async () => {
    proxyServer = await proxyServerWithRule(rule);
    proxyPort = proxyServer.proxyPort;
    proxyHost = `http://localhost:${proxyPort}`;
  });

  afterAll(() => {
    return proxyServer && proxyServer.close();
  });

  it('Should replace the header and body', async () => {
    const url = 'http://httpbin.org/uuid';
    await basicProxyRequest(proxyHost, 'GET', url).then((result) => {
      const proxyRes = result.response;
      const body = result.body;
      expect(proxyRes.statusCode).toBe(502);
      expect(proxyRes.headers[RULE_REPLACE_HEADER_KEY]).toBe(RULE_REPLACE_HEADER_VALUE);
      expect(body).toBe(RULE_REPLACE_BODY);
    });
  });
});