import { getRefreshFromUrl } from './getRefreshFromUrl';

describe('getRefreshFromUrl', () => {
  describe('when refresh is not part of params', () => {
    it('then it should return current refresh value', () => {
      const params = {};
      const currentRefresh = false;
      const minRefreshInterval = '5s';
      const isAllowedIntervalFn = () => false;

      const actual = getRefreshFromUrl({
        params,
        currentRefresh,
        minRefreshInterval,
        isAllowedIntervalFn,
      });

      expect(actual).toBe(false);
    });
  });

  describe('when refresh is part of params', () => {
    describe('and refresh is an existing and valid interval', () => {
      it('then it should return the refresh value', () => {
        const params = { refresh: '10s' };
        const currentRefresh = '';
        const minRefreshInterval = '5s';
        const isAllowedIntervalFn = () => true;
        const refreshIntervals = ['5s', '10s', '30s'];

        const actual = getRefreshFromUrl({
          params,
          currentRefresh,
          minRefreshInterval,
          isAllowedIntervalFn,
          refreshIntervals,
        });

        expect(actual).toBe('10s');
      });
    });

    it.each`
      refresh | isAllowedInterval | minRefreshInterval | refreshIntervals              | expected
      ${'6s'} | ${true}           | ${'1s'}            | ${['5s', '6s', '10s', '30s']} | ${'6s'}
      ${'6s'} | ${true}           | ${'10s'}           | ${['5s', '10s', '30s']}       | ${'10s'}
      ${'6s'} | ${true}           | ${'1s'}            | ${['5s', '10s', '30s']}       | ${'5s'}
      ${'6s'} | ${true}           | ${'1s'}            | ${undefined}                  | ${'5s'}
      ${'6s'} | ${true}           | ${'10s'}           | ${undefined}                  | ${'10s'}
      ${'6s'} | ${true}           | ${'1s'}            | ${[]}                         | ${'currentRefresh'}
      ${'6s'} | ${true}           | ${'10s'}           | ${[]}                         | ${'currentRefresh'}
      ${'6s'} | ${false}          | ${'1s'}            | ${['5s', '6s', '10s', '30s']} | ${'5s'}
      ${'6s'} | ${false}          | ${'10s'}           | ${['5s', '6s', '10s', '30s']} | ${'10s'}
      ${'6s'} | ${false}          | ${'1s'}            | ${['5s', '10s', '30s']}       | ${'5s'}
      ${'6s'} | ${false}          | ${'10s'}           | ${['5s', '10s', '30s']}       | ${'10s'}
      ${'6s'} | ${false}          | ${'1s'}            | ${undefined}                  | ${'5s'}
      ${'6s'} | ${false}          | ${'10s'}           | ${undefined}                  | ${'10s'}
      ${'6s'} | ${false}          | ${'1s'}            | ${[]}                         | ${'currentRefresh'}
      ${'6s'} | ${false}          | ${'10s'}           | ${[]}                         | ${'currentRefresh'}
    `(
      'when called with refresh:{$refresh}, isAllowedInterval:{$isAllowedInterval}, minRefreshInterval:{$minRefreshInterval}, refreshIntervals:{$refreshIntervals} then it should return: $expected',
      ({ refresh, isAllowedInterval, minRefreshInterval, refreshIntervals, expected }) => {
        const actual = getRefreshFromUrl({
          params: { refresh },
          currentRefresh: 'currentRefresh',
          minRefreshInterval,
          isAllowedIntervalFn: () => isAllowedInterval,
          refreshIntervals,
        });

        expect(actual).toBe(expected);
      }
    );
  });
});
