const R = require('ramda');
const { CpanelClient } = require('../utils/lib/cpanel');

const mockFetch = (expectRequest, decorate = R.identity) => (reqUrl, request) => {
  expectRequest(reqUrl, request);
  return Promise.resolve({
    json: async () => decorate(request),
  });
};

describe('Cpanel client', () => {
  describe('fetchzonerecords', () => {
    it('should make the correct request', async () => {
      const fetch = mockFetch((url, request) => {
        expect(url).toBe('https://example.com:2000/json-api/cpanel?customonly=0&domain=a.b&cpanel_jsonapi_user=boy&cpanel_jsonapi_module=ZoneEdit&cpanel_jsonapi_func=fetchzone_records&cpanel_jsonapi_apiversion=2');
        expect(request).toEqual({
          headers: {
            Authorization: 'cpanel boy:boybyebye',
          },
          rejectUnauthorized: false,
        });
      });

      const cpanel = CpanelClient({
        host: 'example.com',
        port: 2000,
        username: 'boy',
        apiKey: 'boybyebye',
        domain: 'a.b',
        dependencies: { fetch },
      });

      await cpanel.zone.fetch();
    });

    it('should make the correct request with query', async () => {
      const fetch = mockFetch((url, request) => {
        expect(url).toBe('https://example.com:2000/json-api/cpanel?customonly=0&domain=foobar.boeey&cpanel_jsonapi_user=boy&cpanel_jsonapi_module=ZoneEdit&cpanel_jsonapi_func=fetchzone_records&cpanel_jsonapi_apiversion=2');
        expect(request).toEqual({
          headers: {
            Authorization: 'cpanel boy:boybyebye',
          },
          rejectUnauthorized: false,
        });
      });

      const cpanel = CpanelClient({
        host: 'example.com',
        port: 2000,
        username: 'boy',
        apiKey: 'boybyebye',
        domain: 'a.b',
        dependencies: { fetch },
      });

      await cpanel.zone.fetch({ domain: 'foobar.boeey' });
    });
  });

  describe('addzonerecord', () => {
    it('should make the correct request', async () => {
      const fetch = mockFetch((url, request) => {
        expect(url).toBe('https://example.com:2000/json-api/cpanel?domain=a.b&name=googo&type=CNAME&cname=beey&ttl=2020&cpanel_jsonapi_user=boy&cpanel_jsonapi_module=ZoneEdit&cpanel_jsonapi_func=add_zone_record&cpanel_jsonapi_apiversion=2');
        expect(request).toEqual({
          headers: {
            Authorization: 'cpanel boy:boybyebye',
          },
          rejectUnauthorized: false,
        });
      });

      const cpanel = CpanelClient({
        host: 'example.com',
        port: 2000,
        username: 'boy',
        apiKey: 'boybyebye',
        domain: 'a.b',
        dependencies: { fetch },
      });

      await cpanel.zone.add({
        name: 'googo',
        type: 'boyee',
        cname: 'beey',
        type: 'CNAME',
        ttl: 2020,
      });
    });
  });

  describe('addzonerecord', () => {
    it('should make the correct request', async () => {
      const fetch = mockFetch((url, request) => {
        expect(url).toBe('https://example.com:2000/json-api/cpanel?domain=a.b&line=500&cpanel_jsonapi_user=boy&cpanel_jsonapi_module=ZoneEdit&cpanel_jsonapi_func=remove_zone_record&cpanel_jsonapi_apiversion=2');
        expect(request).toEqual({
          headers: {
            Authorization: 'cpanel boy:boybyebye',
          },
          rejectUnauthorized: false,
        });
      });

      const cpanel = CpanelClient({
        host: 'example.com',
        port: 2000,
        username: 'boy',
        apiKey: 'boybyebye',
        domain: 'a.b',
        dependencies: { fetch },
      });

      await cpanel.zone.remove({
        line: 500,
      });
    });
  });

  describe('fetchredirections', () => {
    it('should make the correct request', async () => {
      const fetch = mockFetch((url, request) => {
        expect(url).toBe('https://example.com:2000/execute/Mime/list_redirects?cpanel_jsonapi_user=boy&cpanel_jsonapi_module=Mime&cpanel_jsonapi_func=list_redirects&cpanel_jsonapi_apiversion=2');
        expect(request).toEqual({
          headers: {
            Authorization: 'cpanel boy:boybyebye',
          },
          rejectUnauthorized: false,
        });
      });

      const cpanel = CpanelClient({
        host: 'example.com',
        port: 2000,
        username: 'boy',
        apiKey: 'boybyebye',
        domain: 'a.b',
        dependencies: { fetch },
      });

      await cpanel.redirection.fetch();
    });
  });
  describe('addredirection', () => {
    it('should make the correct request', async () => {
      const fetch = mockFetch((url, request) => {
        expect(url).toBe('https://example.com:2000/execute/Mime/add_redirect?domain=googo&destination=https%3A%2F%2Foodf.com&cpanel_jsonapi_user=boy&cpanel_jsonapi_module=Mime&cpanel_jsonapi_func=add_redirect&cpanel_jsonapi_apiversion=2');
        expect(request).toEqual({
          headers: {
            Authorization: 'cpanel boy:boybyebye',
          },
          rejectUnauthorized: false,
        });
      });

      const cpanel = CpanelClient({
        host: 'example.com',
        port: 2000,
        username: 'boy',
        apiKey: 'boybyebye',
        domain: 'a.b',
        dependencies: { fetch },
      });

      await cpanel.redirection.add({
        domain: 'googo',
        destination: 'https://oodf.com'
      });
    });
  });

  describe('deleteredirection', () => {
    it('should make the correct request', async () => {
      const fetch = mockFetch((url, request) => {
        expect(url).toBe('https://example.com:2000/execute/Mime/delete_redirect?domain=googo&cpanel_jsonapi_user=boy&cpanel_jsonapi_module=Mime&cpanel_jsonapi_func=delete_redirect&cpanel_jsonapi_apiversion=2');
        expect(request).toEqual({
          headers: {
            Authorization: 'cpanel boy:boybyebye',
          },
          rejectUnauthorized: false,
        });
      });

      const cpanel = CpanelClient({
        host: 'example.com',
        port: 2000,
        username: 'boy',
        apiKey: 'boybyebye',
        domain: 'a.b',
        dependencies: { fetch },
      });

      await cpanel.redirection.remove({ domain: 'googo' });
    });
  });
});

