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

const RULE_PAYLOAD = 'this is something in rule';

const rule = {
  *beforeSendRequest(requestDetail) {
    const requestOptions = requestDetail.requestOptions;
    return {
      requestOptions,
      requestData: RULE_PAYLOAD,
    };
  },

  *beforeDealHttpsRequest(requestDetail) {
    return requestDetail.host.indexOf('httpbin.org') >= 0;
  }
};

describe('Rule beforeDealHttpsRequest', () => {
  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 https request body', async () => {
    const url = 'https://httpbin.org/put';
    const payloadStream = fs.createReadStream(path.resolve(__dirname, '../fixtures/upload.txt'));
    const postHeaders = {
      anyproxy_header: 'header_value',
    };

    await basicProxyRequest(proxyHost, 'PUT', url, postHeaders, {}, payloadStream).then((result) => {
      const proxyRes = result.response;
      const body = JSON.parse(result.body);
      expect(proxyRes.statusCode).toBe(200);
      expect(body.data).toEqual(RULE_PAYLOAD);
      expect(body.url.indexOf('/put')).toBeGreaterThan(0);
    });
  });
});