Skip to content

Commit 5826006

Browse files
committed
1 parent 58ea1a3 commit 5826006

File tree

8 files changed

+104
-8
lines changed

8 files changed

+104
-8
lines changed

package-lock.json

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,13 @@
3131
"@nestjs/swagger": "^4.5.12",
3232
"@nestjs/websockets": "^7.4.2",
3333
"@prisma/client": "2.12.1",
34+
"@types/lodash.debounce": "^4.0.6",
3435
"bcryptjs": "^2.4.3",
3536
"cache-manager": "^3.4.0",
3637
"class-transformer": "^0.3.1",
3738
"class-validator": "^0.12.2",
3839
"fs-extra": "^9.0.1",
40+
"lodash.debounce": "^4.0.8",
3941
"passport": "^0.4.1",
4042
"passport-jwt": "^4.0.0",
4143
"passport-local": "^1.0.0",

src/builds/builds.service.spec.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -304,14 +304,13 @@ describe('BuildsService', () => {
304304
});
305305

306306
it('approve', async () => {
307-
const eventsBuildUpdatedMock = jest.fn();
308307
const buildFindUniqueMock = jest.fn().mockResolvedValueOnce(build);
309308
const testRunApproveMock = jest.fn().mockResolvedValueOnce({
310309
...build.testRuns[0],
311310
status: TestStatus.approved,
312311
});
313312
mocked(BuildDto).mockReturnValueOnce(buildDto);
314-
service = await initService({ eventsBuildUpdatedMock, buildFindUniqueMock, testRunApproveMock });
313+
service = await initService({ buildFindUniqueMock, testRunApproveMock });
315314

316315
await service.approve('someId', true);
317316

@@ -337,6 +336,16 @@ describe('BuildsService', () => {
337336
},
338337
],
339338
});
339+
});
340+
341+
it('emitUpdateBuildEvent', async () => {
342+
const eventsBuildUpdatedMock = jest.fn();
343+
service = await initService({ eventsBuildUpdatedMock });
344+
service.findOne = jest.fn().mockResolvedValueOnce(buildDto);
345+
346+
await service.emitUpdateBuildEvent('someId');
347+
348+
expect(service.findOne).toHaveBeenCalledWith('someId');
340349
expect(eventsBuildUpdatedMock).toHaveBeenCalledWith(buildDto);
341350
});
342351
});

src/builds/builds.service.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,11 @@ export class BuildsService {
148148
);
149149

150150
const buildDto = new BuildDto(build);
151-
this.eventsGateway.buildUpdated(buildDto);
152151
return buildDto;
153152
}
153+
154+
async emitUpdateBuildEvent(buildId: string) {
155+
const build = await this.findOne(buildId);
156+
this.eventsGateway.buildUpdated(build);
157+
}
154158
}

src/shared/events/events.gateway.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@ import { WebSocketGateway, WebSocketServer } from '@nestjs/websockets';
22
import { Server } from 'socket.io';
33
import { TestRun } from '@prisma/client';
44
import { BuildDto } from '../../builds/dto/build.dto';
5+
import debounce from 'lodash.debounce';
56

67
@WebSocketGateway()
78
export class EventsGateway {
89
@WebSocketServer()
910
server: Server;
1011

12+
private testRuns: TestRun[] = [];
13+
1114
buildCreated(build: BuildDto): void {
1215
this.server.emit('build_created', build);
1316
}
@@ -21,7 +24,18 @@ export class EventsGateway {
2124
}
2225

2326
testRunCreated(testRun: TestRun): void {
24-
this.server.emit('testRun_created', testRun);
27+
this.testRuns.push(testRun);
28+
debounce(
29+
() =>
30+
this.emitEvent('testRun_created', this.testRuns, () => {
31+
this.testRuns = [];
32+
}),
33+
3000,
34+
{
35+
maxWait: 5000,
36+
}
37+
)();
38+
// this.server.emit('testRun_created', testRun);
2539
}
2640

2741
testRunUpdated(testRun: TestRun): void {
@@ -31,4 +45,10 @@ export class EventsGateway {
3145
testRunDeleted(testRun: TestRun): void {
3246
this.server.emit('testRun_deleted', testRun);
3347
}
48+
49+
private emitEvent(event: string, object: object, callbackfn: () => void) {
50+
console.log(object)
51+
this.server.emit(event, object);
52+
callbackfn();
53+
}
3454
}

src/test-runs/test-runs.module.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import { SharedModule } from '../shared/shared.module';
44
import { PrismaService } from '../prisma/prisma.service';
55
import { TestRunsController } from './test-runs.controller';
66
import { TestVariationsModule } from '../test-variations/test-variations.module';
7+
import { BuildsModule } from '../builds/builds.module';
78

89
@Module({
9-
imports: [SharedModule, forwardRef(() => TestVariationsModule)],
10+
imports: [SharedModule, forwardRef(() => TestVariationsModule), forwardRef(() => BuildsModule)],
1011
providers: [TestRunsService, PrismaService],
1112
controllers: [TestRunsController],
1213
exports: [TestRunsService],

src/test-runs/test-runs.service.spec.ts

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { CommentDto } from '../shared/dto/comment.dto';
1515
import { TestVariationsService } from '../test-variations/test-variations.service';
1616
import { convertBaselineDataToQuery } from '../shared/dto/baseline-data.dto';
1717
import { TestRunDto } from './dto/testRun.dto';
18+
import { BuildsService } from '../builds/builds.service';
1819

1920
jest.mock('pixelmatch');
2021
jest.mock('./dto/testRunResult.dto');
@@ -32,13 +33,13 @@ const initService = async ({
3233
eventTestRunUpdatedMock = jest.fn(),
3334
eventTestRunCreatedMock = jest.fn(),
3435
eventTestRunDeletedMock = jest.fn(),
35-
eventBuildUpdatedMock = jest.fn(),
3636
eventBuildCreatedMock = jest.fn(),
3737
testVariationCreateMock = jest.fn(),
3838
testVariationFindManyMock = jest.fn(),
3939
baselineCreateMock = jest.fn(),
4040
testVariationFindOrCreateMock = jest.fn(),
4141
projectFindOneMock = jest.fn(),
42+
buildEmitUpdateBuildEventMock = jest.fn(),
4243
}) => {
4344
const module: TestingModule = await Test.createTestingModule({
4445
providers: [
@@ -80,7 +81,6 @@ const initService = async ({
8081
testRunUpdated: eventTestRunUpdatedMock,
8182
testRunCreated: eventTestRunCreatedMock,
8283
testRunDeleted: eventTestRunDeletedMock,
83-
buildUpdated: eventBuildUpdatedMock,
8484
buildCreated: eventBuildCreatedMock,
8585
},
8686
},
@@ -90,6 +90,12 @@ const initService = async ({
9090
findOrCreate: testVariationFindOrCreateMock,
9191
},
9292
},
93+
{
94+
provide: BuildsService,
95+
useValue: {
96+
emitUpdateBuildEvent: buildEmitUpdateBuildEventMock,
97+
},
98+
},
9399
],
94100
}).compile();
95101

@@ -130,9 +136,11 @@ describe('TestRunsService', () => {
130136
};
131137
const testRunUpdateMock = jest.fn().mockResolvedValueOnce(testRun);
132138
const eventTestRunUpdatedMock = jest.fn();
139+
const buildEmitUpdateBuildEventMock = jest.fn();
133140
service = await initService({
134141
testRunUpdateMock,
135142
eventTestRunUpdatedMock,
143+
buildEmitUpdateBuildEventMock,
136144
});
137145

138146
await service.reject(testRun.id);
@@ -144,6 +152,7 @@ describe('TestRunsService', () => {
144152
},
145153
});
146154
expect(eventTestRunUpdatedMock).toBeCalledWith(testRun);
155+
expect(buildEmitUpdateBuildEventMock).toBeCalledWith(testRun.buildId);
147156
});
148157

149158
describe('approve', () => {
@@ -178,6 +187,7 @@ describe('TestRunsService', () => {
178187
status: TestStatus.approved,
179188
});
180189
const eventTestRunUpdatedMock = jest.fn();
190+
const buildEmitUpdateBuildEventMock = jest.fn();
181191
const testRunFindOneMock = jest.fn().mockResolvedValueOnce(testRun);
182192
const baselineName = 'some baseline name';
183193
const saveImageMock = jest.fn().mockReturnValueOnce(baselineName);
@@ -192,6 +202,7 @@ describe('TestRunsService', () => {
192202
saveImageMock,
193203
getImageMock,
194204
eventTestRunUpdatedMock,
205+
buildEmitUpdateBuildEventMock,
195206
});
196207
service.findOne = testRunFindOneMock;
197208

@@ -225,6 +236,7 @@ describe('TestRunsService', () => {
225236
...testRun,
226237
status: TestStatus.approved,
227238
});
239+
expect(buildEmitUpdateBuildEventMock).toHaveBeenCalledWith(testRun.buildId);
228240
});
229241

230242
it('should approve merge', async () => {
@@ -258,6 +270,7 @@ describe('TestRunsService', () => {
258270
status: TestStatus.approved,
259271
});
260272
const eventTestRunUpdatedMock = jest.fn();
273+
const buildEmitUpdateBuildEventMock = jest.fn();
261274
const testRunFindOneMock = jest.fn().mockResolvedValueOnce(testRun);
262275
const baselineName = 'some baseline name';
263276
const saveImageMock = jest.fn().mockReturnValueOnce(baselineName);
@@ -272,6 +285,7 @@ describe('TestRunsService', () => {
272285
saveImageMock,
273286
getImageMock,
274287
eventTestRunUpdatedMock,
288+
buildEmitUpdateBuildEventMock,
275289
});
276290
service.findOne = testRunFindOneMock;
277291

@@ -305,6 +319,7 @@ describe('TestRunsService', () => {
305319
...testRun,
306320
status: TestStatus.approved,
307321
});
322+
expect(buildEmitUpdateBuildEventMock).toBeCalledWith(testRun.buildId);
308323
});
309324

310325
it('should approve different branch', async () => {
@@ -370,6 +385,7 @@ describe('TestRunsService', () => {
370385
status: TestStatus.approved,
371386
});
372387
const eventTestRunUpdatedMock = jest.fn();
388+
const buildEmitUpdateBuildEventMock = jest.fn();
373389
const testRunFindOneMock = jest.fn().mockResolvedValueOnce(testRun);
374390
const baselineName = 'some baseline name';
375391
const saveImageMock = jest.fn().mockReturnValueOnce(baselineName);
@@ -388,6 +404,7 @@ describe('TestRunsService', () => {
388404
testVariationCreateMock,
389405
baselineCreateMock,
390406
eventTestRunUpdatedMock,
407+
buildEmitUpdateBuildEventMock,
391408
});
392409
service.findOne = testRunFindOneMock;
393410

@@ -436,6 +453,7 @@ describe('TestRunsService', () => {
436453
...testRun,
437454
status: TestStatus.approved,
438455
});
456+
expect(buildEmitUpdateBuildEventMock).toBeCalledWith(testRun.buildId);
439457
});
440458
});
441459

@@ -463,6 +481,7 @@ describe('TestRunsService', () => {
463481
};
464482
const testRunWithResult = {
465483
id: 'id',
484+
buildId: 'buildId',
466485
imageName: 'imageName',
467486
baselineName: 'baselineName',
468487
diffTollerancePercent: 1,
@@ -502,7 +521,14 @@ describe('TestRunsService', () => {
502521
const baseline = 'baseline';
503522
const getImageMock = jest.fn().mockReturnValueOnce(baseline).mockReturnValueOnce(image);
504523
const eventTestRunCreatedMock = jest.fn();
505-
service = await initService({ testRunCreateMock, saveImageMock, getImageMock, eventTestRunCreatedMock });
524+
const buildEmitUpdateBuildEventMock = jest.fn();
525+
service = await initService({
526+
testRunCreateMock,
527+
saveImageMock,
528+
getImageMock,
529+
eventTestRunCreatedMock,
530+
buildEmitUpdateBuildEventMock,
531+
});
506532
const diffResult: DiffResult = {
507533
status: TestStatus.unresolved,
508534
diffName: 'diff image name',
@@ -581,6 +607,7 @@ describe('TestRunsService', () => {
581607
},
582608
]);
583609
expect(eventTestRunCreatedMock).toHaveBeenCalledWith(testRunWithResult);
610+
expect(buildEmitUpdateBuildEventMock).toHaveBeenCalledWith(testRunWithResult.buildId);
584611
expect(result).toBe(testRunWithResult);
585612
});
586613

@@ -718,6 +745,7 @@ describe('TestRunsService', () => {
718745
const testRunFindOneMock = jest.fn().mockResolvedValueOnce(testRun);
719746
const testRunUpdateMock = jest.fn();
720747
const eventTestRunUpdatedMock = jest.fn();
748+
const buildEmitUpdateBuildEventMock = jest.fn();
721749
const baselineMock = 'baseline image';
722750
const imageeMock = 'image';
723751
const getImageMock = jest.fn().mockReturnValueOnce(baselineMock).mockReturnValueOnce(imageeMock);
@@ -731,6 +759,7 @@ describe('TestRunsService', () => {
731759
eventTestRunUpdatedMock,
732760
getImageMock,
733761
deleteImageMock,
762+
buildEmitUpdateBuildEventMock,
734763
});
735764
service.findOne = testRunFindOneMock;
736765
service.getDiff = getDiffMock;
@@ -748,6 +777,7 @@ describe('TestRunsService', () => {
748777
JSON.parse(testRun.ignoreAreas)
749778
);
750779
expect(eventTestRunUpdatedMock).toBeCalledWith(testRun);
780+
expect(buildEmitUpdateBuildEventMock).toBeCalledWith(testRun.buildId);
751781
});
752782

753783
describe('saveDiffResult', () => {
@@ -854,17 +884,20 @@ describe('TestRunsService', () => {
854884
it('delete', async () => {
855885
const id = 'some id';
856886
const testRun = {
887+
buildId: 'buildId',
857888
diffName: 'diffName',
858889
imageName: 'imageName',
859890
};
860891
const findOneMock = jest.fn().mockResolvedValueOnce(testRun);
861892
const deleteImageMock = jest.fn();
862893
const testRunDeleteMock = jest.fn();
863894
const eventTestRunDeletedMock = jest.fn();
895+
const buildEmitUpdateBuildEventMock = jest.fn();
864896
service = await initService({
865897
deleteImageMock,
866898
testRunDeleteMock,
867899
eventTestRunDeletedMock,
900+
buildEmitUpdateBuildEventMock,
868901
});
869902
service.findOne = findOneMock;
870903

@@ -877,6 +910,7 @@ describe('TestRunsService', () => {
877910
where: { id },
878911
});
879912
expect(eventTestRunDeletedMock).toHaveBeenCalledWith(testRun);
913+
expect(buildEmitUpdateBuildEventMock).toHaveBeenCalledWith(testRun.buildId);
880914
});
881915

882916
it('updateIgnoreAreas', async () => {

0 commit comments

Comments
 (0)