/*
* test for rule replaceOption rule
*
*/

const ProxyServerUtil = require('../util/ProxyServerUtil.js');
const { proxyGet, generateUrl, directGet } = require('../util/HttpUtil.js');
const Server = require('../server/server.js');
const { printLog } = require('../util/CommonUtil.js');

const rule = require('./rule/rule_replace_request_option.js');

testWrapper('http');
testWrapper('https');

function testWrapper(protocol) {
  describe('Rule replaceRequestOption should be working in :' + protocol, () => {
    let proxyServer;
    let serverInstance;

    beforeAll(done => {
      jasmine.DEFAULT_TIMEOUT_INTERVAL = 50000;
      printLog('Start server for rule_replace_request_option_spec');

      serverInstance = new Server();

      proxyServer = ProxyServerUtil.proxyServerWithRule(rule);

      setTimeout(() => {
        done();
      }, 2000);
    });

    afterAll(() => {
      serverInstance && serverInstance.close();
      proxyServer && proxyServer.close();
      printLog('Close server for rule_replace_request_option_spec');
    });

    it('Should replace request option if the assertion is true', done => {
      const url = generateUrl(protocol, '/test/should_replace_option');
      const replacedUrl = generateUrl(protocol, '/test/new_replace_option');

      const token = 'replacedOption' + Date.now();
      const directToken = 'notRepacedOption' + Date.now();
      proxyGet(url, {}, { token })
        .then(proxyRes => {
          directGet(url, {}, { token: directToken })
            .then(directRes => {
              expect(proxyRes.statusCode).toEqual(200);
              expect(proxyRes.body).toEqual('the_new_replaced_option_page_content');

              const proxyRequestObj = serverInstance.getProxyRequestRecord(replacedUrl);
              expect(proxyRequestObj.headers.token).toEqual(token);
              expect(proxyRequestObj.headers['via-proxy']).toEqual('true');

              expect(directRes.statusCode).toEqual(200);
              expect(directRes.body).toEqual('the_request_that_has_not_be_replaced');

              const directRequestObj = serverInstance.getRequestRecord(url);
              expect(directRequestObj.headers.token).toEqual(directToken);

              done();
            }).catch(error => {
              console.error('error happened in direct get for replaceOption rule: ', error);
              done.fail('error happened when direct test replaceOption rule ');
            });
        }).catch(error => {
          console.error('error happened in proxy get for replaceOption rule: ', error);
          done.fail('error happened when proxy test replaceOption rule ');
        });
    });

    it('Should not replace request option if the assertion is false', done => {
      const url = generateUrl(protocol, '/test/should_not_replace_option');

      proxyGet(url)
        .then(proxyRes => {
          done();
        }, error => {
          console.error('error happened in proxy get:', error);
          done.fail('error happened in proxy get');
        }).catch(error => {
          console.error('error happend in syntax:', error);
          done.fail('error happend in syntax');
        });
    });
  });
}