import {getExactDuration, userDisplayName} from 'sentry/utils/formatters';

describe('formatters', function () {
  describe('userDisplayName', function () {
    it('should only show email, if name and email are the same', function () {
      expect(
        userDisplayName({
          name: 'foo@bar.com',
          email: 'foo@bar.com',
        })
      ).toEqual('foo@bar.com');
    });

    it('should show name + email, if name and email differ', function () {
      expect(
        userDisplayName({
          name: 'user',
          email: 'foo@bar.com',
        })
      ).toEqual('user (foo@bar.com)');
    });

    it('should show unknown author with email, if email is only provided', function () {
      expect(
        userDisplayName({
          email: 'foo@bar.com',
        })
      ).toEqual('Unknown author (foo@bar.com)');
    });

    it('should show unknown author, if author or email is just whitespace', function () {
      expect(
        userDisplayName({
          // eslint-disable-next-line quotes
          name: `\t\n `,
        })
      ).toEqual('Unknown author');

      expect(
        userDisplayName({
          // eslint-disable-next-line quotes
          email: `\t\n `,
        })
      ).toEqual('Unknown author');
    });

    it('should show unknown author, if user object is either not an object or incomplete', function () {
      expect(userDisplayName()).toEqual('Unknown author');
      expect(userDisplayName({})).toEqual('Unknown author');
    });
  });

  describe('getExactDuration', () => {
    it('should provide default value', () => {
      expect(getExactDuration(0)).toEqual('0 milliseconds');
    });

    it('should format in the right way', () => {
      expect(getExactDuration(2.030043848568126)).toEqual('2 seconds 30 milliseconds');
      expect(getExactDuration(0.2)).toEqual('200 milliseconds');
      expect(getExactDuration(13)).toEqual('13 seconds');
      expect(getExactDuration(60)).toEqual('1 minute');
      expect(getExactDuration(121)).toEqual('2 minutes 1 second');
      expect(getExactDuration(234235435)).toEqual(
        '387 weeks 2 days 1 hour 23 minutes 55 seconds'
      );
    });

    it('should format negative durations', () => {
      expect(getExactDuration(-2.030043848568126)).toEqual('-2 seconds -30 milliseconds');
      expect(getExactDuration(-0.2)).toEqual('-200 milliseconds');
      expect(getExactDuration(-13)).toEqual('-13 seconds');
      expect(getExactDuration(-60)).toEqual('-1 minute');
      expect(getExactDuration(-121)).toEqual('-2 minutes -1 second');
      expect(getExactDuration(-234235435)).toEqual(
        '-387 weeks -2 days -1 hour -23 minutes -55 seconds'
      );
    });

    it('should abbreviate label', () => {
      expect(getExactDuration(234235435, true)).toEqual('387wk 2d 1hr 23min 55s');
    });
  });
});