import {
  convertSecondsToFormattedDateString,
  isInteger,
  slugifyString,
  underscorizeString,
  recursivelyChangeNullAndUndefined,
} from './helpers';

test('it can slugify a string', () => {
  expect(slugifyString('hello---world_ and then Some such-')).toEqual(
    'hello-world-and-then-some-such'
  );
});

test('it can underscorize a string', () => {
  expect(underscorizeString('hello---world_ and then Some such-')).toEqual(
    'hello_world_and_then_some_such'
  );
});

test('it can keep the correct date when converting seconds to date', () => {
  const dateString = convertSecondsToFormattedDateString(1666325400);
  expect(dateString).toEqual('2022-10-21');
});

test('it can validate numeric values', () => {
  expect(isInteger('11')).toEqual(true);
  expect(isInteger('hey')).toEqual(false);
  expect(isInteger('        ')).toEqual(false);
  expect(isInteger('1 2')).toEqual(false);
  expect(isInteger(2)).toEqual(true);
});

test('it can replace undefined values in object with null', () => {
  const sampleData = {
    talentType: 'foo',
    rating: 'bar',
    contacts: {
      gmeets: undefined,
      zoom: undefined,
      phone: 'baz',
      awesome: false,
      info: '',
    },
    items: [
      undefined,
      {
        contacts: {
          gmeets: undefined,
          zoom: undefined,
          phone: 'baz',
        },
      },
      'HEY',
    ],
    undefined,
  };

  expect((sampleData.items[1] as any).contacts.zoom).toEqual(undefined);

  const result = recursivelyChangeNullAndUndefined(sampleData, null);
  expect(result).toEqual(sampleData);
  expect(result.items[1].contacts.zoom).toEqual(null);
  expect(result.items[2]).toEqual('HEY');
  expect(result.contacts.awesome).toEqual(false);
  expect(result.contacts.info).toEqual('');
});

test('it can replace null values in object with undefined', () => {
  const sampleData = {
    talentType: 'foo',
    rating: 'bar',
    contacts: {
      gmeets: null,
      zoom: null,
      phone: 'baz',
      awesome: false,
      info: '',
    },
    items: [
      null,
      {
        contacts: {
          gmeets: null,
          zoom: null,
          phone: 'baz',
        },
      },
      'HEY',
    ],
  };

  expect((sampleData.items[1] as any).contacts.zoom).toEqual(null);

  const result = recursivelyChangeNullAndUndefined(sampleData, undefined);
  expect(result).toEqual(sampleData);
  expect(result.items[1].contacts.zoom).toEqual(undefined);
  expect(result.items[2]).toEqual('HEY');
  expect(result.contacts.awesome).toEqual(false);
  expect(result.contacts.info).toEqual('');
});
