improve tests
This commit is contained in:
		
							parent
							
								
									b12ba842c0
								
							
						
					
					
						commit
						6fafbbd109
					
				|  | @ -102,6 +102,7 @@ | |||
|       "libs/exceptions", | ||||
|       "libs/types", | ||||
|       "prisma.service.ts", | ||||
|       "convert-props-to-object.util.ts", | ||||
|       "main.ts" | ||||
|     ], | ||||
|     "rootDir": "src", | ||||
|  | @ -122,6 +123,7 @@ | |||
|       "libs/exceptions", | ||||
|       "libs/types", | ||||
|       "prisma.service.ts", | ||||
|       "convert-props-to-object.util.ts", | ||||
|       "main.ts" | ||||
|     ], | ||||
|     "coverageDirectory": "../coverage", | ||||
|  |  | |||
|  | @ -0,0 +1,42 @@ | |||
| import { DomainEvent, DomainEventProps } from '@libs/ddd'; | ||||
| import { ArgumentNotProvidedException } from '@libs/exceptions'; | ||||
| 
 | ||||
| class FakeDomainEvent extends DomainEvent { | ||||
|   readonly name: string; | ||||
| 
 | ||||
|   constructor(props: DomainEventProps<FakeDomainEvent>) { | ||||
|     super(props); | ||||
|     this.name = props.name; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| describe('DomainEvent Base', () => { | ||||
|   it('should define a domain event based object instance', () => { | ||||
|     const fakeDomainEvent = new FakeDomainEvent({ | ||||
|       aggregateId: 'some-id', | ||||
|       name: 'some-name', | ||||
|     }); | ||||
|     expect(fakeDomainEvent).toBeDefined(); | ||||
|     expect(fakeDomainEvent.id.length).toBe(36); | ||||
|   }); | ||||
| 
 | ||||
|   it('should define a domain event based object instance with metadata', () => { | ||||
|     const fakeDomainEvent = new FakeDomainEvent({ | ||||
|       aggregateId: 'some-id', | ||||
|       name: 'some-name', | ||||
|       metadata: { | ||||
|         correlationId: 'some-correlation-id', | ||||
|         causationId: 'some-causation-id', | ||||
|         userId: 'some-user-id', | ||||
|         timestamp: new Date('2023-06-28T05:00:00Z').getTime(), | ||||
|       }, | ||||
|     }); | ||||
|     expect(fakeDomainEvent.metadata.timestamp).toBe(1687928400000); | ||||
|   }); | ||||
|   it('should throw an exception if props are empty', () => { | ||||
|     const emptyProps: DomainEventProps<FakeDomainEvent> = undefined; | ||||
|     expect(() => new FakeDomainEvent(emptyProps)).toThrow( | ||||
|       ArgumentNotProvidedException, | ||||
|     ); | ||||
|   }); | ||||
| }); | ||||
|  | @ -0,0 +1,209 @@ | |||
| import { Entity } from '@libs/ddd'; | ||||
| import { ArgumentOutOfRangeException } from '@libs/exceptions'; | ||||
| 
 | ||||
| interface FakeProps { | ||||
|   name: string; | ||||
| } | ||||
| 
 | ||||
| class FakeEntity extends Entity<FakeProps> { | ||||
|   protected _id: string; | ||||
| 
 | ||||
|   validate(): void { | ||||
|     // not implemented
 | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| describe('Entity Base', () => { | ||||
|   it('should define an entity based object instance', () => { | ||||
|     const fakeInstance = new FakeEntity({ | ||||
|       id: 'some-id', | ||||
|       props: { | ||||
|         name: 'some-name', | ||||
|       }, | ||||
|     }); | ||||
|     expect(fakeInstance).toBeDefined(); | ||||
|     expect(fakeInstance.id).toBe('some-id'); | ||||
|     expect(fakeInstance.createdAt).toBeInstanceOf(Date); | ||||
|     expect(fakeInstance.updatedAt).toBeInstanceOf(Date); | ||||
|     expect(FakeEntity.isEntity(fakeInstance)).toBeTruthy(); | ||||
|   }); | ||||
| 
 | ||||
|   it('should define an entity with given created and updated dates', () => { | ||||
|     const fakeInstance = new FakeEntity({ | ||||
|       id: 'some-id', | ||||
|       createdAt: new Date('2023-06-28T05:00:00Z'), | ||||
|       updatedAt: new Date('2023-06-28T06:00:00Z'), | ||||
|       props: { | ||||
|         name: 'some-name', | ||||
|       }, | ||||
|     }); | ||||
|     expect(fakeInstance.createdAt.getUTCHours()).toBe(5); | ||||
|     expect(fakeInstance.updatedAt.getUTCHours()).toBe(6); | ||||
|   }); | ||||
| 
 | ||||
|   it('should compare entities', () => { | ||||
|     const fakeInstance = new FakeEntity({ | ||||
|       id: 'some-id', | ||||
|       props: { | ||||
|         name: 'some-name', | ||||
|       }, | ||||
|     }); | ||||
|     const fakeInstanceClone = new FakeEntity({ | ||||
|       id: 'some-id', | ||||
|       props: { | ||||
|         name: 'some-name', | ||||
|       }, | ||||
|     }); | ||||
|     const fakeInstanceNotReallyClone = new FakeEntity({ | ||||
|       id: 'some-slightly-different-id', | ||||
|       props: { | ||||
|         name: 'some-name', | ||||
|       }, | ||||
|     }); | ||||
|     const undefinedFakeInstance: FakeEntity = undefined; | ||||
|     expect(fakeInstance.equals(undefinedFakeInstance)).toBeFalsy(); | ||||
|     expect(fakeInstance.equals(fakeInstance)).toBeTruthy(); | ||||
|     expect(fakeInstance.equals(fakeInstanceClone)).toBeTruthy(); | ||||
|     expect(fakeInstance.equals(fakeInstanceNotReallyClone)).toBeFalsy(); | ||||
|   }); | ||||
| 
 | ||||
|   it('should convert entity to plain object', () => { | ||||
|     const fakeInstance = new FakeEntity({ | ||||
|       id: 'some-id', | ||||
|       createdAt: new Date('2023-06-28T05:00:00Z'), | ||||
|       updatedAt: new Date('2023-06-28T06:00:00Z'), | ||||
|       props: { | ||||
|         name: 'some-name', | ||||
|       }, | ||||
|     }); | ||||
|     expect(fakeInstance.toObject()).toEqual({ | ||||
|       id: 'some-id', | ||||
|       createdAt: new Date('2023-06-28T05:00:00.000Z'), | ||||
|       updatedAt: new Date('2023-06-28T06:00:00.000Z'), | ||||
|       name: 'some-name', | ||||
|     }); | ||||
|   }); | ||||
| 
 | ||||
|   it('should throw an exception if props number is too high', () => { | ||||
|     interface BigFakeProps { | ||||
|       prop1: string; | ||||
|       prop2: string; | ||||
|       prop3: string; | ||||
|       prop4: string; | ||||
|       prop5: string; | ||||
|       prop6: string; | ||||
|       prop7: string; | ||||
|       prop8: string; | ||||
|       prop9: string; | ||||
|       prop10: string; | ||||
|       prop11: string; | ||||
|       prop12: string; | ||||
|       prop13: string; | ||||
|       prop14: string; | ||||
|       prop15: string; | ||||
|       prop16: string; | ||||
|       prop17: string; | ||||
|       prop18: string; | ||||
|       prop19: string; | ||||
|       prop20: string; | ||||
|       prop21: string; | ||||
|       prop22: string; | ||||
|       prop23: string; | ||||
|       prop24: string; | ||||
|       prop25: string; | ||||
|       prop26: string; | ||||
|       prop27: string; | ||||
|       prop28: string; | ||||
|       prop29: string; | ||||
|       prop30: string; | ||||
|       prop31: string; | ||||
|       prop32: string; | ||||
|       prop33: string; | ||||
|       prop34: string; | ||||
|       prop35: string; | ||||
|       prop36: string; | ||||
|       prop37: string; | ||||
|       prop38: string; | ||||
|       prop39: string; | ||||
|       prop40: string; | ||||
|       prop41: string; | ||||
|       prop42: string; | ||||
|       prop43: string; | ||||
|       prop44: string; | ||||
|       prop45: string; | ||||
|       prop46: string; | ||||
|       prop47: string; | ||||
|       prop48: string; | ||||
|       prop49: string; | ||||
|       prop50: string; | ||||
|       prop51: string; | ||||
|     } | ||||
| 
 | ||||
|     class BigFakeEntity extends Entity<BigFakeProps> { | ||||
|       protected _id: string; | ||||
| 
 | ||||
|       validate(): void { | ||||
|         // not implemented
 | ||||
|       } | ||||
|     } | ||||
|     expect( | ||||
|       () => | ||||
|         new BigFakeEntity({ | ||||
|           id: 'some-id', | ||||
|           props: { | ||||
|             prop1: 'some-name', | ||||
|             prop2: 'some-name', | ||||
|             prop3: 'some-name', | ||||
|             prop4: 'some-name', | ||||
|             prop5: 'some-name', | ||||
|             prop6: 'some-name', | ||||
|             prop7: 'some-name', | ||||
|             prop8: 'some-name', | ||||
|             prop9: 'some-name', | ||||
|             prop10: 'some-name', | ||||
|             prop11: 'some-name', | ||||
|             prop12: 'some-name', | ||||
|             prop13: 'some-name', | ||||
|             prop14: 'some-name', | ||||
|             prop15: 'some-name', | ||||
|             prop16: 'some-name', | ||||
|             prop17: 'some-name', | ||||
|             prop18: 'some-name', | ||||
|             prop19: 'some-name', | ||||
|             prop20: 'some-name', | ||||
|             prop21: 'some-name', | ||||
|             prop22: 'some-name', | ||||
|             prop23: 'some-name', | ||||
|             prop24: 'some-name', | ||||
|             prop25: 'some-name', | ||||
|             prop26: 'some-name', | ||||
|             prop27: 'some-name', | ||||
|             prop28: 'some-name', | ||||
|             prop29: 'some-name', | ||||
|             prop30: 'some-name', | ||||
|             prop31: 'some-name', | ||||
|             prop32: 'some-name', | ||||
|             prop33: 'some-name', | ||||
|             prop34: 'some-name', | ||||
|             prop35: 'some-name', | ||||
|             prop36: 'some-name', | ||||
|             prop37: 'some-name', | ||||
|             prop38: 'some-name', | ||||
|             prop39: 'some-name', | ||||
|             prop40: 'some-name', | ||||
|             prop41: 'some-name', | ||||
|             prop42: 'some-name', | ||||
|             prop43: 'some-name', | ||||
|             prop44: 'some-name', | ||||
|             prop45: 'some-name', | ||||
|             prop46: 'some-name', | ||||
|             prop47: 'some-name', | ||||
|             prop48: 'some-name', | ||||
|             prop49: 'some-name', | ||||
|             prop50: 'some-name', | ||||
|             prop51: 'some-name', | ||||
|           }, | ||||
|         }), | ||||
|     ).toThrow(ArgumentOutOfRangeException); | ||||
|   }); | ||||
| }); | ||||
|  | @ -0,0 +1,40 @@ | |||
| import { | ||||
|   PaginatedParams, | ||||
|   PaginatedQueryBase, | ||||
|   QueryBase, | ||||
| } from '@libs/ddd/query.base'; | ||||
| 
 | ||||
| class FakeQuery extends QueryBase { | ||||
|   readonly id: string; | ||||
| 
 | ||||
|   constructor(id: string) { | ||||
|     super(); | ||||
|     this.id = id; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| describe('Query Base', () => { | ||||
|   it('should define a query based object instance', () => { | ||||
|     const fakeQuery = new FakeQuery('some-id'); | ||||
|     expect(fakeQuery).toBeDefined(); | ||||
|   }); | ||||
| }); | ||||
| 
 | ||||
| class FakePaginatedQuery extends PaginatedQueryBase { | ||||
|   readonly id: string; | ||||
| 
 | ||||
|   constructor(props: PaginatedParams<FakePaginatedQuery>) { | ||||
|     super(props); | ||||
|     this.id = props.id; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| describe('Paginated Query Base', () => { | ||||
|   it('should define a paginated query based object instance', () => { | ||||
|     const fakePaginatedQuery = new FakePaginatedQuery({ | ||||
|       id: 'some-id', | ||||
|       page: 1, | ||||
|     }); | ||||
|     expect(fakePaginatedQuery).toBeDefined(); | ||||
|   }); | ||||
| }); | ||||
|  | @ -0,0 +1,42 @@ | |||
| import { ValueObject } from '@libs/ddd'; | ||||
| 
 | ||||
| interface FakeProps { | ||||
|   name: string; | ||||
| } | ||||
| 
 | ||||
| class FakeValueObject extends ValueObject<FakeProps> { | ||||
|   get name(): string { | ||||
|     return this.props.name; | ||||
|   } | ||||
| 
 | ||||
|   // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|   protected validate(props: FakeProps): void { | ||||
|     return; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| describe('Value Object Base', () => { | ||||
|   it('should create a base value object', () => { | ||||
|     const fakeValueObject = new FakeValueObject({ name: 'fakeName' }); | ||||
|     expect(fakeValueObject).toBeDefined(); | ||||
|     expect(ValueObject.isValueObject(fakeValueObject)).toBeTruthy(); | ||||
|   }); | ||||
| 
 | ||||
|   it('should compare value objects', () => { | ||||
|     const fakeValueObject = new FakeValueObject({ name: 'fakeName' }); | ||||
|     const fakeValueObjectClone = new FakeValueObject({ name: 'fakeName' }); | ||||
|     const undefinedFakeValueObject: FakeValueObject = undefined; | ||||
|     const nullFakeValueObject: FakeValueObject = null; | ||||
|     expect(fakeValueObject.equals(undefinedFakeValueObject)).toBeFalsy(); | ||||
|     expect(fakeValueObject.equals(nullFakeValueObject)).toBeFalsy(); | ||||
|     expect(fakeValueObject.equals(fakeValueObject)).toBeTruthy(); | ||||
|     expect(fakeValueObject.equals(fakeValueObjectClone)).toBeTruthy(); | ||||
|   }); | ||||
| 
 | ||||
|   it('should unpack value object props', () => { | ||||
|     const fakeValueObject = new FakeValueObject({ name: 'fakeName' }); | ||||
|     expect(fakeValueObject.unpack()).toEqual({ | ||||
|       name: 'fakeName', | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
		Loading…
	
		Reference in New Issue