text: import timezoneMock from 'timezone-mock';
  
  import {
    isValidInputString,
    inputStringToIsoDate,
    isoDateToInputString,
  } from '~/vue_shared/components/date_time_picker/date_time_picker_lib';
  
  describe('date time picker lib', () => {
    describe('isValidInputString', () => {
      [
        {
          input: '2019-09-09T00:00:00.000Z',
          output: true,
        },
        {
          input: '2019-09-09T000:00.000Z',
          output: false,
        },
        {
          input: 'a2019-09-09T000:00.000Z',
          output: false,
        },
        {
          input: '2019-09-09T',
          output: false,
        },
        {
          input: '2019-09-09',
          output: true,
        },
        {
          input: '2019-9-9',
          output: true,
        },
        {
          input: '2019-9-',
          output: true,
        },
        {
          input: '2019--',
          output: false,
        },
        {
          input: '2019',
          output: true,
        },
        {
          input: '',
          output: false,
        },
        {
          input: null,
          output: false,
        },
      ].forEach(({ input, output }) => {
        it(`isValidInputString return ${output} for ${input}`, () => {
          expect(isValidInputString(input)).toBe(output);
        });
      });
    });
  
    describe('inputStringToIsoDate', () => {
      [
        '',
        'null',
        undefined,
        'abc',
        'xxxx-xx-xx',
        '9999-99-19',
        '2019-19-23',
        '2019-09-23 x',
        '2019-09-29 24:24:24',
      ].forEach(input => {
        it(`throws error for invalid input like ${input}`, () => {
          expect(() => inputStringToIsoDate(input)).toThrow();
        });
      });
  
      [
        {
          input: '2019-09-08 01:01:01',
          output: '2019-09-08T01:01:01Z',
        },
        {
          input: '2019-09-08 00:00:00',
          output: '2019-09-08T00:00:00Z',
        },
        {
          input: '2019-09-08 23:59:59',
          output: '2019-09-08T23:59:59Z',
        },
        {
          input: '2019-09-08',
          output: '2019-09-08T00:00:00Z',
        },
        {
          input: '2019-09-08',
          output: '2019-09-08T00:00:00Z',
        },
        {
          input: '2019-09-08 00:00:00',
          output: '2019-09-08T00:00:00Z',
        },
        {
          input: '2019-09-08 23:24:24',
          output: '2019-09-08T23:24:24Z',
        },
        {
          input: '2019-09-08 0:0:0',
          output: '2019-09-08T00:00:00Z',
        },
      ].forEach(({ input, output }) => {
        it(`returns ${output} from ${input}`, () => {
          expect(inputStringToIsoDate(input)).toBe(output);
        });
      });
  
      describe('timezone formatting', () => {
        const value = '2019-09-08 01:01:01';
        const utcResult = '2019-09-08T01:01:01Z';
        const localResult = '2019-09-08T08:01:01Z';
  
        test.each`
          val      | locatTimezone   | utc          | result
          ${value} | ${'UTC'}        | ${undefined} | ${utcResult}
          ${value} | ${'UTC'}        | ${false}     | ${utcResult}
          ${value} | ${'UTC'}        | ${true}      | ${utcResult}
          ${value} | ${'US/Pacific'} | ${undefined} | ${localResult}
          ${value} | ${'US/Pacific'} | ${false}     | ${localResult}
          ${value} | ${'US/Pacific'} | ${true}      | ${utcResult}
        `(
          'when timezone is $locatTimezone, formats $result for utc = $utc',
          ({ val, locatTimezone, utc, result }) => {
            timezoneMock.register(locatTimezone);
  
            expect(inputStringToIsoDate(val, utc)).toBe(result);
  
            timezoneMock.unregister();
          },
        );
      });
    });
  
    describe('isoDateToInputString', () => {
      [
        {
          input: '2019-09-08T01:01:01Z',
          output: '2019-09-08 01:01:01',
        },
        {
          input: '2019-09-08T01:01:01.999Z',
          output: '2019-09-08 01:01:01',
        },
        {
          input: '2019-09-08T00:00:00Z',
          output: '2019-09-08 00:00:00',
        },
      ].forEach(({ input, output }) => {
        it(`returns ${output} for ${input}`, () => {
          expect(isoDateToInputString(input)).toBe(output);
        });
      });
  
      describe('timezone formatting', () => {
        const value = '2019-09-08T08:01:01Z';
        const utcResult = '2019-09-08 08:01:01';
        const localResult = '2019-09-08 01:01:01';
  
        test.each`
          val      | locatTimezone   | utc          | result
          ${value} | ${'UTC'}        | ${undefined} | ${utcResult}
          ${value} | ${'UTC'}        | ${false}     | ${utcResult}
          ${value} | ${'UTC'}        | ${true}      | ${utcResult}
          ${value} | ${'US/Pacific'} | ${undefined} | ${localResult}
          ${value} | ${'US/Pacific'} | ${false}     | ${localResult}
          ${value} | ${'US/Pacific'} | ${true}      | ${utcResult}
        `(
          'when timezone is $locatTimezone, formats $result for utc = $utc',
          ({ val, locatTimezone, utc, result }) => {
            timezoneMock.register(locatTimezone);
  
            expect(isoDateToInputString(val, utc)).toBe(result);
  
            timezoneMock.unregister();
          },
        );
      });
    });
  });
  