@angular-ru/cdk/class-transformer
import {
ONLY_TO_CLASS,
transformAsPrepareFieldsFromClass,
transformParseFloat,
transformParseInt,
transformToBoolean,
transformToClass,
transformToFormatDateTime,
transformToNullableBoolean,
transformToNumber,
transformToPrettyFormat,
transformToStringVal,
transformToTrim,
transformToUnix,
transformDateToFormat
} from '@angular-ru/cdk/class-transformer';
describe('[TEST]: Integration with class-transformer', () => {
@Exclude()
class IsoDto {
@Expose() @Transform(transformToNumber, ONLY_TO_CLASS) public a?: string;
@Expose() @Transform(transformToNumber, ONLY_TO_CLASS) public b?: string;
}
@Exclude()
class DemoDto {
@Expose() @Transform(transformToFormatDateTime, ONLY_TO_CLASS) public startDate?: number;
@Expose() @Transform(transformToUnix, ONLY_TO_CLASS) public endDate?: string;
@Expose() @Transform(transformToTrim, ONLY_TO_CLASS) public comment?: string;
@Expose() @Transform(transformToPrettyFormat, ONLY_TO_CLASS) public lastChanged?: number;
@Expose() @Transform(transformToStringVal, ONLY_TO_CLASS) public enabled?: boolean;
@Expose() @Transform(transformParseFloat, ONLY_TO_CLASS) public floatVal?: number;
@Expose() @Transform(transformParseInt, ONLY_TO_CLASS) public intVal?: number;
@Expose() @Transform(transformToNumber, ONLY_TO_CLASS) public numVal?: string;
@Expose() @Transform(transformToBoolean, ONLY_TO_CLASS) public checked?: boolean;
@Expose() @Transform(transformToNullableBoolean, ONLY_TO_CLASS) public checkedNullable?: Nullable<boolean>;
@Expose()
@Type(transformToClass(IsoDto))
@Transform(transformAsPrepareFieldsFromClass(IsoDto), ONLY_TO_CLASS)
public iso?: IsoDto;
@Expose()
@Transform(transformDateToFormat({ format: 'dd.MM.yyyy', timezone: 'GMT+03:00' }), ONLY_TO_CLASS)
public dateCustomFormatWithTimezone?: number;
@Expose()
@Transform(transformDateToFormat({ format: 'dd.MM.yyyy HH:mm', timezone: 'GMT+06:00' }), ONLY_TO_CLASS)
public datetimeCustomFormatWithTimezone?: number;
@Expose()
@Transform(transformDateToFormat({ format: 'dd.MM.yyyy' }), ONLY_TO_CLASS)
public dateCustomFormatWithoutTimezone?: number;
@Expose() @Transform(transformDateToFormat(), ONLY_TO_CLASS) public dateCustomFormatEmptyOptions?: number;
}
it('should be correct use @Transform', () => {
expect(
plainToClass(DemoDto, {
startDate: 757803600000,
endDate: '01.06.1994',
comment: ' Hello World ',
lastChanged: 757803600000,
enabled: false,
floatVal: 123.25,
intVal: 11.5,
numVal: '1234',
iso: {
a: ' 2 ',
b: ' 3 ',
c: false
},
checked: undefined,
checkedNullable: undefined,
dateCustomFormatWithTimezone: 1622657925000,
datetimeCustomFormatWithTimezone: 1622657925000,
dateCustomFormatWithoutTimezone: 1622657925000,
dateCustomFormatEmptyOptions: 1622657925000
} as DemoDto)
).toEqual({
startDate: '06.01.1994 00:00:00',
endDate: 757803600000,
comment: 'Hello World',
lastChanged: '06.01.1994 00:00:00',
enabled: 'false',
floatVal: 123.25,
intVal: 11,
numVal: 1234,
iso: { a: 2, b: 3 },
checked: false,
checkedNullable: null,
dateCustomFormatWithTimezone: '02.06.2021',
datetimeCustomFormatWithTimezone: '03.06.2021 00:18',
dateCustomFormatWithoutTimezone: expect.any(String),
dateCustomFormatEmptyOptions: expect.any(String)
});
});
it('should be invalid transform to number as NaN', (): void => {
const actual: DemoDto = new DemoDto();
actual.numVal = 'INVALID NUMBER';
expect(actual.numVal).toEqual('INVALID NUMBER');
expect(plainToClass(DemoDto, actual).numVal).toEqual(NaN);
});
it('should be correct transform to number', (): void => {
const actual: DemoDto = new DemoDto();
actual.numVal = ' 100 ';
expect(actual.numVal).toEqual(' 100 ');
expect(plainToClass(DemoDto, actual).numVal).toEqual(100);
});
});
Last updated