import { BadRequestException } from '@nestjs/common';

import { serializeDefaultValue } from 'src/metadata/field-metadata/utils/serialize-default-value';

describe('serializeDefaultValue', () => {
  it('should return null for undefined defaultValue', () => {
    expect(serializeDefaultValue()).toBeNull();
  });

  it('should handle uuid dynamic default value', () => {
    expect(serializeDefaultValue({ type: 'uuid' })).toBe(
      'public.uuid_generate_v4()',
    );
  });

  it('should handle now dynamic default value', () => {
    expect(serializeDefaultValue({ type: 'now' })).toBe('now()');
  });

  it('should throw BadRequestException for invalid dynamic default value type', () => {
    // eslint-disable-next-line @typescript-eslint/ban-ts-comment
    // @ts-expect-error Just for testing purposes
    expect(() => serializeDefaultValue({ type: 'invalid' })).toThrow(
      BadRequestException,
    );
  });

  it('should handle string static default value', () => {
    expect(serializeDefaultValue('test')).toBe("'test'");
  });

  it('should handle number static default value', () => {
    expect(serializeDefaultValue(123)).toBe(123);
  });

  it('should handle boolean static default value', () => {
    expect(serializeDefaultValue(true)).toBe(true);
    expect(serializeDefaultValue(false)).toBe(false);
  });

  it('should handle Date static default value', () => {
    const date = new Date('2023-01-01');
    expect(serializeDefaultValue(date)).toBe(`'${date.toISOString()}'`);
  });
});
