From 11bcdb2a053689db2beac814f07f7a27b8c4cf96 Mon Sep 17 00:00:00 2001 From: Pavel Strunkin Date: Sat, 18 Jul 2020 20:10:47 +0200 Subject: [PATCH 1/2] test variation delete added --- .../test-variations.controller.ts | 15 ++++++++-- .../test-variations.service.ts | 29 ++++++++++++++++++- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/test-variations/test-variations.controller.ts b/src/test-variations/test-variations.controller.ts index 5f2f265c..0a88b1bd 100644 --- a/src/test-variations/test-variations.controller.ts +++ b/src/test-variations/test-variations.controller.ts @@ -1,4 +1,4 @@ -import { Controller, ParseUUIDPipe, Get, UseGuards, Param, Query, Put, Body } from '@nestjs/common'; +import { Controller, ParseUUIDPipe, Get, UseGuards, Param, Query, Put, Body, Delete } from '@nestjs/common'; import { ApiTags, ApiParam, ApiBearerAuth, ApiQuery, ApiOkResponse } from '@nestjs/swagger'; import { TestVariationsService } from './test-variations.service'; import { TestVariation, Baseline } from '@prisma/client'; @@ -56,7 +56,18 @@ export class TestVariationsController { @ApiOkResponse({ type: BuildDto }) @ApiBearerAuth() @UseGuards(JwtAuthGuard) - merge(@Query('projectId') projectId: string, @Query('branchName') branchName: string): Promise { + merge( + @Query('projectId', new ParseUUIDPipe()) projectId: string, + @Query('branchName') branchName: string + ): Promise { return this.testVariations.merge(projectId, branchName); } + + @Delete(':id') + @ApiParam({ name: 'id', required: true }) + @ApiBearerAuth() + @UseGuards(JwtAuthGuard) + delete(@Param('id', new ParseUUIDPipe()) id: string): Promise { + return this.testVariations.delete(id); + } } diff --git a/src/test-variations/test-variations.service.ts b/src/test-variations/test-variations.service.ts index cdcb543e..6b0afe75 100644 --- a/src/test-variations/test-variations.service.ts +++ b/src/test-variations/test-variations.service.ts @@ -1,7 +1,7 @@ import { Injectable, Inject, forwardRef } from '@nestjs/common'; import { IgnoreAreaDto } from '../test-runs/dto/ignore-area.dto'; import { PrismaService } from '../prisma/prisma.service'; -import { TestVariation, Baseline, Project, Build } from '@prisma/client'; +import { TestVariation, Baseline, Project, Build, TestRun } from '@prisma/client'; import { StaticService } from '../shared/static/static.service'; import { CommentDto } from '../shared/dto/comment.dto'; import { BaselineDataDto, convertBaselineDataToQuery } from '../shared/dto/baseline-data.dto'; @@ -165,4 +165,31 @@ export class TestVariationsService { return build; } + + async delete(id: string): Promise { + const [testVariation, testRuns] = await Promise.all([ + this.getDetails(id), + this.prismaService.testRun.findMany({ + where: { testVariationId: id }, + }) + ]) + + // delete testRun + await Promise.all(testRuns.map(item => this.testRunsService.delete(item.id))); + + // delete baseline + await Promise.all(testVariation.baselines.map(baseline => this.deleteBaseline(baseline))); + + // delete testVariation + return this.prismaService.testVariation.delete({ + where: { id }, + }); + } + + private async deleteBaseline(baseline: Baseline): Promise { + this.staticService.deleteImage(baseline.baselineName); + return this.prismaService.baseline.delete({ + where: { id: baseline.id }, + }); + } } From cc0b78106993e437fe050cf7763409cfcc7d3afc Mon Sep 17 00:00:00 2001 From: Pavel Strunkin Date: Sat, 18 Jul 2020 22:51:49 +0200 Subject: [PATCH 2/2] tests are added --- src/projects/projects.service.ts | 2 +- .../test-variations.service.spec.ts | 167 ++++++++++++------ .../test-variations.service.ts | 28 +-- 3 files changed, 116 insertions(+), 81 deletions(-) diff --git a/src/projects/projects.service.ts b/src/projects/projects.service.ts index 7cf65699..c87fee54 100644 --- a/src/projects/projects.service.ts +++ b/src/projects/projects.service.ts @@ -49,7 +49,7 @@ export class ProjectsService { try { await Promise.all(project.builds.map(build => this.buildsService.remove(build.id))); await Promise.all( - project.testVariations.map(testVariation => this.testVariationsService.remove(testVariation.id)) + project.testVariations.map(testVariation => this.testVariationsService.delete(testVariation.id)) ); } catch (err) { console.log(err); diff --git a/src/test-variations/test-variations.service.spec.ts b/src/test-variations/test-variations.service.spec.ts index 8c612f4d..db1f80fa 100644 --- a/src/test-variations/test-variations.service.spec.ts +++ b/src/test-variations/test-variations.service.spec.ts @@ -4,7 +4,7 @@ import { PrismaService } from '../prisma/prisma.service'; import { CreateTestRequestDto } from '../test-runs/dto/create-test-request.dto'; import { StaticService } from '../shared/static/static.service'; import { IgnoreAreaDto } from '../test-runs/dto/ignore-area.dto'; -import { TestVariation, Baseline, Project, Build } from '@prisma/client'; +import { TestVariation, Baseline, Project, Build, TestRun } from '@prisma/client'; import { CommentDto } from '../shared/dto/comment.dto'; import { convertBaselineDataToQuery } from '../shared/dto/baseline-data.dto'; import { PNG } from 'pngjs'; @@ -23,6 +23,8 @@ const initModule = async ({ projectFindOneMock = jest.fn(), buildCreateMock = jest.fn(), testRunCreateMock = jest.fn(), + testRunFindMany = jest.fn(), + testRunDeleteMock = jest.fn(), }) => { const module: TestingModule = await Test.createTestingModule({ providers: [ @@ -43,6 +45,7 @@ const initModule = async ({ { provide: TestRunsService, useValue: { + delete: testRunDeleteMock, create: testRunCreateMock, }, }, @@ -62,6 +65,9 @@ const initModule = async ({ project: { findOne: projectFindOneMock, }, + testRun: { + findMany: testRunFindMany, + }, }, }, ], @@ -300,59 +306,6 @@ describe('TestVariationsService', () => { }); }); - describe('remove', () => { - it('can remove', async () => { - const id = 'test id'; - const variation: TestVariation & { - baselines: Baseline[]; - } = { - id, - projectId: 'project Id', - name: 'Test name', - baselineName: 'baselineName', - os: 'OS', - browser: 'browser', - viewport: 'viewport', - device: 'device', - ignoreAreas: '[]', - comment: 'some comment', - branchName: 'develop', - createdAt: new Date(), - updatedAt: new Date(), - baselines: [ - { - id: 'baseline id 1', - baselineName: 'image name 1', - testVariationId: id, - testRunId: 'test run id 1', - createdAt: new Date(), - updatedAt: new Date(), - }, - ], - }; - const variationFindOneMock = jest.fn(); - const variationDeleteMock = jest.fn(); - const imageDeleteMock = jest.fn(); - const baselineDeleteMock = jest.fn(); - service = await initModule({ - variationFindOneMock: variationFindOneMock.mockResolvedValueOnce(variation), - variationDeleteMock, - imageDeleteMock, - baselineDeleteMock, - }); - - await service.remove(id); - - expect(imageDeleteMock).toHaveBeenCalledWith(variation.baselines[0].baselineName); - expect(baselineDeleteMock).toHaveBeenCalledWith({ - where: { id: variation.baselines[0].id }, - }); - expect(variationDeleteMock).toHaveBeenCalledWith({ - where: { id: variation.id }, - }); - }); - }); - it('updateComment', async () => { const id = 'some id'; const commentDto: CommentDto = { @@ -517,4 +470,110 @@ describe('TestVariationsService', () => { }); expect(testRunCreateMock).toHaveBeenCalledTimes(2); }); + + it('delete', async () => { + const testRunId = 'test run id'; + const testVariationId = 'test variation id'; + const testRun: TestRun = { + id: testRunId, + imageName: '1592423768112.screenshot.png', + diffName: null, + diffPercent: null, + diffTollerancePercent: 1, + pixelMisMatchCount: null, + status: 'new', + buildId: '146e7a8d-89f0-4565-aa2c-e61efabb0afd', + testVariationId: testVariationId, + updatedAt: new Date(), + createdAt: new Date(), + name: 'ss2f77', + browser: 'chromium', + device: null, + os: null, + viewport: '1800x1600', + baselineName: null, + ignoreAreas: '[]', + comment: 'some comment', + baselineBranchName: 'master', + branchName: 'develop', + merge: false, + }; + const variation: TestVariation & { + baselines: Baseline[]; + } = { + id: testVariationId, + projectId: 'project Id', + name: 'Test name', + baselineName: 'baselineName', + os: 'OS', + browser: 'browser', + viewport: 'viewport', + device: 'device', + ignoreAreas: '[]', + comment: 'some comment', + branchName: 'develop', + createdAt: new Date(), + updatedAt: new Date(), + baselines: [ + { + id: 'baseline id 1', + baselineName: 'image name 1', + testVariationId: testVariationId, + testRunId: 'test run id 1', + createdAt: new Date(), + updatedAt: new Date(), + }, + ], + }; + + const variationDeleteMock = jest.fn(); + const testRunFindMany = jest.fn().mockResolvedValueOnce([testRun]); + const testRunDeleteMock = jest.fn(); + const getDetailsMock = jest.fn().mockResolvedValueOnce(variation); + const deleteBaselineMock = jest.fn().mockResolvedValueOnce(variation.baselines[0]); + const service = await initModule({ + variationDeleteMock, + testRunFindMany, + testRunDeleteMock, + }); + service.getDetails = getDetailsMock; + service.deleteBaseline = deleteBaselineMock; + + await service.delete(testVariationId); + + expect(service.getDetails).toHaveBeenCalledWith(testVariationId); + expect(testRunFindMany).toHaveBeenCalledWith({ + where: { testVariationId }, + }); + expect(testRunDeleteMock).toHaveBeenCalledWith(testRunId); + expect(service.deleteBaseline).toHaveBeenCalledWith(variation.baselines[0]); + expect(variationDeleteMock).toHaveBeenCalledWith({ + where: { id: testVariationId }, + }); + }); + + it('deleteBaseline', async () => { + const baseline: Baseline = { + id: 'baseline id 1', + baselineName: 'image name 1', + testVariationId: 'test variation id', + testRunId: 'test run id 1', + createdAt: new Date(), + updatedAt: new Date(), + }; + + const baselineDeleteMock = jest.fn(); + const imageDeleteMock = jest.fn(); + const service = await initModule({ + baselineDeleteMock, + imageDeleteMock, + }); + + await service.deleteBaseline(baseline); + + expect(imageDeleteMock).toHaveBeenCalledWith(baseline.baselineName); + expect(baselineDeleteMock).toHaveBeenCalledWith({ + where: { id: baseline.id }, + }); + }); }); diff --git a/src/test-variations/test-variations.service.ts b/src/test-variations/test-variations.service.ts index 6b0afe75..0aafa49f 100644 --- a/src/test-variations/test-variations.service.ts +++ b/src/test-variations/test-variations.service.ts @@ -95,30 +95,6 @@ export class TestVariationsService { }); } - async remove(id: string): Promise { - const variation = await this.getDetails(id); - - // clear history - try { - await Promise.all( - variation.baselines.map(baseline => - Promise.all([ - this.staticService.deleteImage(baseline.baselineName), - this.prismaService.baseline.delete({ - where: { id: baseline.id }, - }), - ]) - ) - ); - } catch (err) { - console.log(err); - } - - return this.prismaService.testVariation.delete({ - where: { id }, - }); - } - async merge(projectId: string, branchName: string): Promise { const project: Project = await this.prismaService.project.findOne({ where: { id: projectId } }); @@ -176,7 +152,7 @@ export class TestVariationsService { // delete testRun await Promise.all(testRuns.map(item => this.testRunsService.delete(item.id))); - + // delete baseline await Promise.all(testVariation.baselines.map(baseline => this.deleteBaseline(baseline))); @@ -186,7 +162,7 @@ export class TestVariationsService { }); } - private async deleteBaseline(baseline: Baseline): Promise { + async deleteBaseline(baseline: Baseline): Promise { this.staticService.deleteImage(baseline.baselineName); return this.prismaService.baseline.delete({ where: { id: baseline.id },