import { Test, TestingModule } from '@nestjs/testing'; import { PipelineTaskLogger } from './pipeline-task.logger'; import { PipelineTaskEvent } from './models/pipeline-task-event'; import { take, timeout } from 'rxjs/operators'; describe('PipelineTaskRunner', () => { let logger: PipelineTaskLogger; let module: TestingModule; beforeEach(async () => { module = await Test.createTestingModule({ providers: [PipelineTaskLogger], }).compile(); logger = module.get(PipelineTaskLogger); }); it('should be defined', () => { expect(logger).toBeDefined(); }); describe('getMessage$', () => { it('normal', async () => { const event = new PipelineTaskEvent(); event.taskId = 'test'; const emittedAt = new Date(); event.emittedAt = emittedAt.toISOString() as any; const message$ = logger.getMessage$('test'); let receiveEvent; message$.pipe(take(1)).subscribe((value) => (receiveEvent = value)); await logger.handleEvent(event); expect(receiveEvent).toMatchObject({ ...event, emittedAt, }); }); it('no match', async () => { const event = new PipelineTaskEvent(); event.taskId = 'test'; const message$ = logger.getMessage$('other'); setTimeout(() => { logger.handleEvent(event); }); expect(message$.pipe(take(1), timeout(100)).toPromise()).rejects.toMatch( 'timeout', ); }); it('multiple subscribers', async () => { const event = new PipelineTaskEvent(); event.taskId = 'test'; const message$ = logger.getMessage$('test'); const message2$ = logger.getMessage$('test'); setTimeout(() => { logger.handleEvent(event); }); expect(message$.pipe(take(1), timeout(100)).toPromise()).resolves.toEqual( event, ); expect( message2$.pipe(take(1), timeout(100)).toPromise(), ).resolves.toEqual(event); }); }); describe('onModuleDestroy', () => { it('complete observable when destroying module', async () => { logger.onModuleDestroy(); await expect( (logger as any).message$.toPromise(), ).resolves.toBeUndefined(); }); }); });