From c620ad0b7b99ebc91488d921f2a5f4306b618dcd Mon Sep 17 00:00:00 2001 From: Surat Das Date: Thu, 4 Feb 2021 00:08:29 -0800 Subject: [PATCH 1/5] Issue#197 : Add possibility to update build with ci build id. --- src/builds/builds.controller.ts | 6 +++--- src/builds/builds.service.ts | 14 +++++++------- src/test-variations/test-variations.service.ts | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/builds/builds.controller.ts b/src/builds/builds.controller.ts index 87703eda..5e1a0fcc 100644 --- a/src/builds/builds.controller.ts +++ b/src/builds/builds.controller.ts @@ -25,7 +25,7 @@ import { PaginatedBuildDto } from './dto/build-paginated.dto'; @Controller('builds') @ApiTags('builds') export class BuildsController { - constructor(private buildsService: BuildsService) {} + constructor(private buildsService: BuildsService) { } @Get() @ApiOkResponse({ type: PaginatedBuildDto }) @@ -67,8 +67,8 @@ export class BuildsController { @ApiSecurity('api_key') @ApiBearerAuth() @UseGuards(MixedGuard) - stop(@Param('id', new ParseUUIDPipe()) id: string): Promise { - return this.buildsService.stop(id); + update(@Param('id', new ParseUUIDPipe()) id: string,@Body() body: {}): Promise { + return this.buildsService.update(id, body); } @Patch(':id/approve') diff --git a/src/builds/builds.service.ts b/src/builds/builds.service.ts index b0ac5a30..0d9f434b 100644 --- a/src/builds/builds.service.ts +++ b/src/builds/builds.service.ts @@ -1,7 +1,7 @@ import { forwardRef, Inject, Injectable } from '@nestjs/common'; import { CreateBuildDto } from './dto/build-create.dto'; import { PrismaService } from '../prisma/prisma.service'; -import { Build, TestStatus } from '@prisma/client'; +import { Build, Prisma, TestStatus } from '@prisma/client'; import { TestRunsService } from '../test-runs/test-runs.service'; import { EventsGateway } from '../shared/events/events.gateway'; import { BuildDto } from './dto/build.dto'; @@ -17,7 +17,7 @@ export class BuildsService { private testRunsService: TestRunsService, @Inject(forwardRef(() => ProjectsService)) private projectService: ProjectsService - ) {} + ) { } async findOne(id: string): Promise { return this.prismaService.build @@ -99,18 +99,18 @@ export class BuildsService { return new BuildDto(build); } - async stop(id: string): Promise { + async update(id: string, body: {}): Promise { const build = await this.prismaService.build.update({ where: { id }, include: { testRuns: true, }, - data: { - isRunning: false, - }, + data: body as Prisma.BuildUpdateInput }); const buildDto = new BuildDto(build); - this.eventsGateway.buildFinished(buildDto); + if(!buildDto.isRunning){ + this.eventsGateway.buildFinished(buildDto); + } return buildDto; } diff --git a/src/test-variations/test-variations.service.ts b/src/test-variations/test-variations.service.ts index 6abc1611..3faee286 100644 --- a/src/test-variations/test-variations.service.ts +++ b/src/test-variations/test-variations.service.ts @@ -21,7 +21,7 @@ export class TestVariationsService { private testRunsService: TestRunsService, @Inject(forwardRef(() => BuildsService)) private buildsService: BuildsService - ) {} + ) { } async getDetails(id: string): Promise { return this.prismaService.testVariation.findUnique({ @@ -138,7 +138,7 @@ export class TestVariationsService { }); // stop build - return this.buildsService.stop(build.id); + return this.buildsService.update(build.id, { "isRunning": false }); } async delete(id: string): Promise { From 6a70fc2a9e207e1de600e010300af697b7378f4b Mon Sep 17 00:00:00 2001 From: Surat Das Date: Thu, 4 Feb 2021 16:27:45 -0800 Subject: [PATCH 2/5] Fixed codacy errors, fixed review comments. --- src/builds/builds.controller.ts | 2 +- src/builds/builds.service.spec.ts | 6 ++---- src/builds/builds.service.ts | 6 ++---- src/shared/events/events.gateway.ts | 4 ---- 4 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/builds/builds.controller.ts b/src/builds/builds.controller.ts index 5e1a0fcc..a5b4a90d 100644 --- a/src/builds/builds.controller.ts +++ b/src/builds/builds.controller.ts @@ -67,7 +67,7 @@ export class BuildsController { @ApiSecurity('api_key') @ApiBearerAuth() @UseGuards(MixedGuard) - update(@Param('id', new ParseUUIDPipe()) id: string,@Body() body: {}): Promise { + update(@Param('id', new ParseUUIDPipe()) id: string, @Body() body: Record): Promise { return this.buildsService.update(id, body); } diff --git a/src/builds/builds.service.spec.ts b/src/builds/builds.service.spec.ts index 4e45f093..f17aed00 100644 --- a/src/builds/builds.service.spec.ts +++ b/src/builds/builds.service.spec.ts @@ -288,16 +288,14 @@ describe('BuildsService', () => { mocked(BuildDto).mockReturnValueOnce(buildDto); service = await initService({ buildUpdateMock, eventsBuildFinishedMock }); - const result = await service.stop(id); + const result = await service.update(id, { "isRunning": false }); expect(buildUpdateMock).toHaveBeenCalledWith({ where: { id }, include: { testRuns: true, }, - data: { - isRunning: false, - }, + data: { "isRunning": false } }); expect(eventsBuildFinishedMock).toHaveBeenCalledWith(buildDto); expect(result).toBe(buildDto); diff --git a/src/builds/builds.service.ts b/src/builds/builds.service.ts index 0d9f434b..285f5daf 100644 --- a/src/builds/builds.service.ts +++ b/src/builds/builds.service.ts @@ -99,7 +99,7 @@ export class BuildsService { return new BuildDto(build); } - async update(id: string, body: {}): Promise { + async update(id: string, body: Record): Promise { const build = await this.prismaService.build.update({ where: { id }, include: { @@ -108,9 +108,7 @@ export class BuildsService { data: body as Prisma.BuildUpdateInput }); const buildDto = new BuildDto(build); - if(!buildDto.isRunning){ - this.eventsGateway.buildFinished(buildDto); - } + this.eventsGateway.buildUpdated(buildDto); return buildDto; } diff --git a/src/shared/events/events.gateway.ts b/src/shared/events/events.gateway.ts index b594a4a2..3087f522 100644 --- a/src/shared/events/events.gateway.ts +++ b/src/shared/events/events.gateway.ts @@ -12,10 +12,6 @@ export class EventsGateway { this.server.emit('build_created', build); } - buildFinished(build: BuildDto): void { - this.server.emit('build_finished', build); - } - buildUpdated(build: BuildDto): void { this.server.emit('build_updated', build); } From 648a4f30695a3ec728d3fe765497555172599771 Mon Sep 17 00:00:00 2001 From: Surat Das Date: Fri, 5 Feb 2021 21:00:42 -0800 Subject: [PATCH 3/5] Fixed review comments: made use of DTO for passed body. --- src/builds/builds.controller.ts | 5 +++-- src/builds/builds.service.ts | 7 ++++--- src/builds/dto/build-modify.dto.ts | 4 ++++ 3 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 src/builds/dto/build-modify.dto.ts diff --git a/src/builds/builds.controller.ts b/src/builds/builds.controller.ts index a5b4a90d..0d8ed1e4 100644 --- a/src/builds/builds.controller.ts +++ b/src/builds/builds.controller.ts @@ -21,6 +21,7 @@ import { Build } from '@prisma/client'; import { BuildDto } from './dto/build.dto'; import { MixedGuard } from '../auth/guards/mixed.guard'; import { PaginatedBuildDto } from './dto/build-paginated.dto'; +import { ModifyBuildDto } from './dto/build-modify.dto'; @Controller('builds') @ApiTags('builds') @@ -67,8 +68,8 @@ export class BuildsController { @ApiSecurity('api_key') @ApiBearerAuth() @UseGuards(MixedGuard) - update(@Param('id', new ParseUUIDPipe()) id: string, @Body() body: Record): Promise { - return this.buildsService.update(id, body); + update(@Param('id', new ParseUUIDPipe()) id: string, @Body() modifyBuildDto: ModifyBuildDto): Promise { + return this.buildsService.update(id, modifyBuildDto); } @Patch(':id/approve') diff --git a/src/builds/builds.service.ts b/src/builds/builds.service.ts index 285f5daf..9e364036 100644 --- a/src/builds/builds.service.ts +++ b/src/builds/builds.service.ts @@ -1,12 +1,13 @@ import { forwardRef, Inject, Injectable } from '@nestjs/common'; import { CreateBuildDto } from './dto/build-create.dto'; import { PrismaService } from '../prisma/prisma.service'; -import { Build, Prisma, TestStatus } from '@prisma/client'; +import { Build, TestStatus } from '@prisma/client'; import { TestRunsService } from '../test-runs/test-runs.service'; import { EventsGateway } from '../shared/events/events.gateway'; import { BuildDto } from './dto/build.dto'; import { ProjectsService } from '../projects/projects.service'; import { PaginatedBuildDto } from './dto/build-paginated.dto'; +import { ModifyBuildDto } from './dto/build-modify.dto'; @Injectable() export class BuildsService { @@ -99,13 +100,13 @@ export class BuildsService { return new BuildDto(build); } - async update(id: string, body: Record): Promise { + async update(id: string, modifyBuildDto: ModifyBuildDto): Promise { const build = await this.prismaService.build.update({ where: { id }, include: { testRuns: true, }, - data: body as Prisma.BuildUpdateInput + data: modifyBuildDto }); const buildDto = new BuildDto(build); this.eventsGateway.buildUpdated(buildDto); diff --git a/src/builds/dto/build-modify.dto.ts b/src/builds/dto/build-modify.dto.ts new file mode 100644 index 00000000..f11402d3 --- /dev/null +++ b/src/builds/dto/build-modify.dto.ts @@ -0,0 +1,4 @@ +export interface ModifyBuildDto { + ciBuildId?: string; + isRunning?: boolean; +} From 4aecfc7bd70a318f7fa0481d62ba3e972694700e Mon Sep 17 00:00:00 2001 From: Surat Das Date: Mon, 8 Feb 2021 15:08:07 -0800 Subject: [PATCH 4/5] Made patch body optional so that SDK will not be impacted. --- src/builds/builds.controller.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/builds/builds.controller.ts b/src/builds/builds.controller.ts index 0d8ed1e4..377c3a66 100644 --- a/src/builds/builds.controller.ts +++ b/src/builds/builds.controller.ts @@ -68,7 +68,11 @@ export class BuildsController { @ApiSecurity('api_key') @ApiBearerAuth() @UseGuards(MixedGuard) - update(@Param('id', new ParseUUIDPipe()) id: string, @Body() modifyBuildDto: ModifyBuildDto): Promise { + update(@Param('id', new ParseUUIDPipe()) id: string, @Body() modifyBuildDto?: ModifyBuildDto): Promise { + //In future, no or empty body will do nothing as this check will be removed. It will expect a proper body to perform any patch. + if (modifyBuildDto === null || Object.keys(modifyBuildDto).length === 0) { + modifyBuildDto.isRunning = false; + } return this.buildsService.update(id, modifyBuildDto); } From 9164cd627936fe32eab03f1c2cbd354505576dd9 Mon Sep 17 00:00:00 2001 From: Surat Das Date: Wed, 10 Feb 2021 14:53:21 -0800 Subject: [PATCH 5/5] Fixed failing unit tests. --- src/builds/builds.service.spec.ts | 10 ++++------ src/test-variations/test-variations.service.spec.ts | 10 +++++----- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/builds/builds.service.spec.ts b/src/builds/builds.service.spec.ts index f17aed00..c4d4db77 100644 --- a/src/builds/builds.service.spec.ts +++ b/src/builds/builds.service.spec.ts @@ -23,7 +23,6 @@ const initService = async ({ testRunApproveMock = jest.fn(), eventsBuildUpdatedMock = jest.fn(), eventsBuildCreatedMock = jest.fn(), - eventsBuildFinishedMock = jest.fn(), projectFindOneMock = jest.fn(), projectUpdateMock = jest.fn(), }) => { @@ -58,8 +57,7 @@ const initService = async ({ provide: EventsGateway, useValue: { buildUpdated: eventsBuildUpdatedMock, - buildCreated: eventsBuildCreatedMock, - buildFinished: eventsBuildFinishedMock, + buildCreated: eventsBuildCreatedMock }, }, { @@ -284,9 +282,9 @@ describe('BuildsService', () => { it('should stop', async () => { const id = 'some id'; const buildUpdateMock = jest.fn(); - const eventsBuildFinishedMock = jest.fn(); + const eventsBuildUpdatedMock = jest.fn(); mocked(BuildDto).mockReturnValueOnce(buildDto); - service = await initService({ buildUpdateMock, eventsBuildFinishedMock }); + service = await initService({ buildUpdateMock, eventsBuildUpdatedMock }); const result = await service.update(id, { "isRunning": false }); @@ -297,7 +295,7 @@ describe('BuildsService', () => { }, data: { "isRunning": false } }); - expect(eventsBuildFinishedMock).toHaveBeenCalledWith(buildDto); + expect(eventsBuildUpdatedMock).toHaveBeenCalledWith(buildDto); expect(result).toBe(buildDto); }); diff --git a/src/test-variations/test-variations.service.spec.ts b/src/test-variations/test-variations.service.spec.ts index e9f1b0ae..5188305e 100644 --- a/src/test-variations/test-variations.service.spec.ts +++ b/src/test-variations/test-variations.service.spec.ts @@ -22,7 +22,7 @@ const initModule = async ({ baselineDeleteMock = jest.fn(), projectFindUniqueMock = jest.fn(), buildCreateMock = jest.fn(), - buildStopMock = jest.fn(), + buildUpdateMock = jest.fn(), testRunCreateMock = jest.fn(), testRunFindMany = jest.fn(), testRunDeleteMock = jest.fn(), @@ -41,7 +41,7 @@ const initModule = async ({ provide: BuildsService, useValue: { create: buildCreateMock, - stop: buildStopMock, + update: buildUpdateMock, }, }, { @@ -417,11 +417,11 @@ describe('TestVariationsService', () => { .mockResolvedValueOnce(testVariationMainBranch) .mockResolvedValueOnce(testVariationMainBranch); const testRunCreateMock = jest.fn(); - const buildStopMock = jest.fn(); + const buildUpdateMock = jest.fn(); const service = await initModule({ projectFindUniqueMock, buildCreateMock, - buildStopMock, + buildUpdateMock, testRunCreateMock, variationFindManyMock, getImageMock, @@ -466,7 +466,7 @@ describe('TestVariationsService', () => { ignoreAreas: JSON.parse(testVariationSecond.ignoreAreas), }); expect(testRunCreateMock).toHaveBeenCalledTimes(2); - expect(buildStopMock).toHaveBeenCalledWith(build.id); + expect(buildUpdateMock).toHaveBeenCalledWith(build.id, { "isRunning": false }); }); it('delete', async () => {