From 6e8ce2511ffc4028a9b3a77893289ce778c8848f Mon Sep 17 00:00:00 2001 From: Pavel Strunkin Date: Mon, 2 Nov 2020 09:40:20 +0200 Subject: [PATCH 1/4] CreateTestRequestDto added with ignoreAreas https://github.com/Visual-Regression-Tracker/Visual-Regression-Tracker/issues/132 --- src/test-runs/dto/create-test-request.dto.ts | 5 +++++ src/test-variations/test-variations.service.ts | 1 + 2 files changed, 6 insertions(+) diff --git a/src/test-runs/dto/create-test-request.dto.ts b/src/test-runs/dto/create-test-request.dto.ts index d3ecf207..fef46324 100644 --- a/src/test-runs/dto/create-test-request.dto.ts +++ b/src/test-runs/dto/create-test-request.dto.ts @@ -2,6 +2,7 @@ import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; import { IsOptional, IsUUID, IsNumber, IsBoolean, IsBase64 } from 'class-validator'; import { BaselineDataDto } from '../../shared/dto/baseline-data.dto'; +import { IgnoreAreaDto } from './ignore-area.dto'; export class CreateTestRequestDto extends BaselineDataDto { @ApiProperty() @@ -26,4 +27,8 @@ export class CreateTestRequestDto extends BaselineDataDto { @IsBoolean() @IsOptional() merge?: boolean; + + @ApiProperty({ type: [IgnoreAreaDto] }) + @IsOptional() + ignoreAreas?: IgnoreAreaDto[]; } diff --git a/src/test-variations/test-variations.service.ts b/src/test-variations/test-variations.service.ts index 6ce21f8a..276e725a 100644 --- a/src/test-variations/test-variations.service.ts +++ b/src/test-variations/test-variations.service.ts @@ -130,6 +130,7 @@ export class TestVariationsService { imageBase64, diffTollerancePercent: 0, merge: true, + ignoreAreas: JSON.parse(sideBranchTestVariation.ignoreAreas) }; return this.testRunsService.create(mainBranchTestVariation, createTestRequestDto); From c104cb7ae423c2dc1345792d421b3a2cb1f3a253 Mon Sep 17 00:00:00 2001 From: Pavel Strunkin Date: Mon, 2 Nov 2020 18:09:17 +0200 Subject: [PATCH 2/4] ignore area concat added --- src/test-runs/test-runs.service.spec.ts | 21 ++++++++++++------- src/test-runs/test-runs.service.ts | 17 ++++++++++----- .../test-variations.service.spec.ts | 2 ++ 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/test-runs/test-runs.service.spec.ts b/src/test-runs/test-runs.service.spec.ts index d405032d..ea969f89 100644 --- a/src/test-runs/test-runs.service.spec.ts +++ b/src/test-runs/test-runs.service.spec.ts @@ -491,7 +491,7 @@ describe('TestRunsService', () => { baseline, image, testRun.diffTollerancePercent, - testVariation.ignoreAreas + JSON.parse(testVariation.ignoreAreas) ); expect(getImageMock).toHaveBeenNthCalledWith(1, testVariation.baselineName); expect(getImageMock).toHaveBeenNthCalledWith(2, imageName); @@ -523,7 +523,12 @@ describe('TestRunsService', () => { status: TestStatus.new, }, }); - expect(getDiffMock).toHaveBeenCalledWith(baseline, image, testRun.diffTollerancePercent, testRun.ignoreAreas); + expect(getDiffMock).toHaveBeenCalledWith( + baseline, + image, + testRun.diffTollerancePercent, + JSON.parse(testRun.ignoreAreas) + ); expect(saveDiffResultMock).toHaveBeenCalledWith(testRun.id, diffResult); expect(eventTestRunCreatedMock).toHaveBeenCalledWith(testRunWithResult); expect(result).toBe(testRunWithResult); @@ -538,7 +543,7 @@ describe('TestRunsService', () => { }); service = await initService({}); - const result = service.getDiff(baseline, image, 0, '[]'); + const result = service.getDiff(baseline, image, 0, []); expect(result).toStrictEqual({ status: undefined, @@ -560,7 +565,7 @@ describe('TestRunsService', () => { }); service = await initService({}); - const result = service.getDiff(baseline, image, 0, '[]'); + const result = service.getDiff(baseline, image, 0, []); expect(result).toStrictEqual({ status: TestStatus.unresolved, @@ -583,7 +588,7 @@ describe('TestRunsService', () => { service = await initService({}); mocked(Pixelmatch).mockReturnValueOnce(0); - const result = service.getDiff(baseline, image, 0, '[]'); + const result = service.getDiff(baseline, image, 0, []); expect(result).toStrictEqual({ status: TestStatus.ok, @@ -608,7 +613,7 @@ describe('TestRunsService', () => { const pixelMisMatchCount = 150; mocked(Pixelmatch).mockReturnValueOnce(pixelMisMatchCount); - const result = service.getDiff(baseline, image, 1.5, '[]'); + const result = service.getDiff(baseline, image, 1.5, []); expect(saveImageMock).toHaveBeenCalledTimes(0); expect(result).toStrictEqual({ @@ -637,7 +642,7 @@ describe('TestRunsService', () => { saveImageMock, }); - const result = service.getDiff(baseline, image, 1, '[]'); + const result = service.getDiff(baseline, image, 1, []); expect(saveImageMock).toHaveBeenCalledTimes(1); expect(result).toStrictEqual({ @@ -689,7 +694,7 @@ describe('TestRunsService', () => { baselineMock, imageeMock, testRun.diffTollerancePercent, - testRun.ignoreAreas + JSON.parse(testRun.ignoreAreas) ); expect(service.emitUpdateBuildEvent).toBeCalledWith(testRun.buildId); }); diff --git a/src/test-runs/test-runs.service.ts b/src/test-runs/test-runs.service.ts index e1b6bc8a..b034311d 100644 --- a/src/test-runs/test-runs.service.ts +++ b/src/test-runs/test-runs.service.ts @@ -184,7 +184,7 @@ export class TestRunsService { const image = this.staticService.getImage(testRun.imageName); await this.staticService.deleteImage(testRun.diffName); - const diffResult = this.getDiff(baseline, image, testRun.diffTollerancePercent, testRun.ignoreAreas); + const diffResult = this.getDiff(baseline, image, testRun.diffTollerancePercent, JSON.parse(testRun.ignoreAreas)); const updatedTestRun = await this.saveDiffResult(id, diffResult); this.emitUpdateBuildEvent(testRun.buildId); return updatedTestRun; @@ -227,7 +227,14 @@ export class TestRunsService { const baseline = this.staticService.getImage(testRun.baselineName); const image = this.staticService.getImage(imageName); - const diffResult = this.getDiff(baseline, image, testRun.diffTollerancePercent, testVariation.ignoreAreas); + let ignoreAreas: IgnoreAreaDto[] = []; + if (!!testVariation.ignoreAreas) { + ignoreAreas = ignoreAreas.concat(JSON.parse(testVariation.ignoreAreas)); + } + if (createTestRequestDto.ignoreAreas?.length > 0) { + ignoreAreas = ignoreAreas.concat(createTestRequestDto.ignoreAreas); + } + const diffResult = this.getDiff(baseline, image, testRun.diffTollerancePercent, ignoreAreas); const testRunWithResult = await this.saveDiffResult(testRun.id, diffResult); this.eventsGateway.testRunCreated(testRunWithResult); @@ -267,7 +274,7 @@ export class TestRunsService { }); } - getDiff(baseline: PNG, image: PNG, diffTollerancePercent: number, ignoreAreas: string): DiffResult { + getDiff(baseline: PNG, image: PNG, diffTollerancePercent: number, ignoreAreas: IgnoreAreaDto[]): DiffResult { const result: DiffResult = { status: undefined, diffName: null, @@ -287,8 +294,8 @@ export class TestRunsService { // compare result.pixelMisMatchCount = Pixelmatch( - this.applyIgnoreAreas(baseline, JSON.parse(ignoreAreas)), - this.applyIgnoreAreas(image, JSON.parse(ignoreAreas)), + this.applyIgnoreAreas(baseline, ignoreAreas), + this.applyIgnoreAreas(image, ignoreAreas), diff.data, baseline.width, baseline.height, diff --git a/src/test-variations/test-variations.service.spec.ts b/src/test-variations/test-variations.service.spec.ts index c7b4b6a9..3849b8cc 100644 --- a/src/test-variations/test-variations.service.spec.ts +++ b/src/test-variations/test-variations.service.spec.ts @@ -454,6 +454,7 @@ describe('TestVariationsService', () => { imageBase64: PNG.sync.write(image).toString('base64'), diffTollerancePercent: 0, merge: true, + ignoreAreas: JSON.parse(testVariation.ignoreAreas), }); expect(testRunCreateMock).toHaveBeenNthCalledWith(2, testVariationMainBranch, { ...testVariationSecond, @@ -461,6 +462,7 @@ describe('TestVariationsService', () => { imageBase64: PNG.sync.write(image).toString('base64'), diffTollerancePercent: 0, merge: true, + ignoreAreas: JSON.parse(testVariationSecond.ignoreAreas), }); expect(testRunCreateMock).toHaveBeenCalledTimes(2); expect(buildStopMock).toHaveBeenCalledWith(build.id); From 41e28b3fab24380c46205450543b2f34085aa3b6 Mon Sep 17 00:00:00 2001 From: Pavel Strunkin Date: Mon, 2 Nov 2020 18:37:51 +0200 Subject: [PATCH 3/4] coverage updated --- src/test-runs/test-runs.service.spec.ts | 36 ++++++++++++++++--------- src/test-runs/test-runs.service.ts | 6 ++--- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/test-runs/test-runs.service.spec.ts b/src/test-runs/test-runs.service.spec.ts index ea969f89..b124039c 100644 --- a/src/test-runs/test-runs.service.spec.ts +++ b/src/test-runs/test-runs.service.spec.ts @@ -429,6 +429,14 @@ describe('TestRunsService', () => { diffTollerancePercent: undefined, branchName: 'develop', merge: true, + ignoreAreas: [ + { + x: 1, + y: 2, + width: 100, + height: 200, + }, + ], }; const testRunWithResult = { id: 'id', @@ -457,7 +465,7 @@ describe('TestRunsService', () => { browser: 'browser', viewport: 'viewport', device: 'device', - ignoreAreas: '[]', + ignoreAreas: '[{"x":3,"y":4,"width":500,"height":600}]', comment: 'some comment', createdAt: new Date(), updatedAt: new Date(), @@ -487,12 +495,6 @@ describe('TestRunsService', () => { const result = await service.create(testVariation, createTestRequestDto); expect(saveImageMock).toHaveBeenCalledWith('screenshot', Buffer.from(createTestRequestDto.imageBase64, 'base64')); - expect(service.getDiff).toHaveBeenCalledWith( - baseline, - image, - testRun.diffTollerancePercent, - JSON.parse(testVariation.ignoreAreas) - ); expect(getImageMock).toHaveBeenNthCalledWith(1, testVariation.baselineName); expect(getImageMock).toHaveBeenNthCalledWith(2, imageName); expect(testRunCreateMock).toHaveBeenCalledWith({ @@ -523,12 +525,20 @@ describe('TestRunsService', () => { status: TestStatus.new, }, }); - expect(getDiffMock).toHaveBeenCalledWith( - baseline, - image, - testRun.diffTollerancePercent, - JSON.parse(testRun.ignoreAreas) - ); + expect(getDiffMock).toHaveBeenCalledWith(baseline, image, testRun.diffTollerancePercent, [ + { + x: 3, + y: 4, + width: 500, + height: 600, + }, + { + x: 1, + y: 2, + width: 100, + height: 200, + }, + ]); expect(saveDiffResultMock).toHaveBeenCalledWith(testRun.id, diffResult); expect(eventTestRunCreatedMock).toHaveBeenCalledWith(testRunWithResult); expect(result).toBe(testRunWithResult); diff --git a/src/test-runs/test-runs.service.ts b/src/test-runs/test-runs.service.ts index b034311d..c18f5b55 100644 --- a/src/test-runs/test-runs.service.ts +++ b/src/test-runs/test-runs.service.ts @@ -227,10 +227,8 @@ export class TestRunsService { const baseline = this.staticService.getImage(testRun.baselineName); const image = this.staticService.getImage(imageName); - let ignoreAreas: IgnoreAreaDto[] = []; - if (!!testVariation.ignoreAreas) { - ignoreAreas = ignoreAreas.concat(JSON.parse(testVariation.ignoreAreas)); - } + // combine ignore areas from testVarition together with testRun request + let ignoreAreas: IgnoreAreaDto[] = JSON.parse(testVariation.ignoreAreas); if (createTestRequestDto.ignoreAreas?.length > 0) { ignoreAreas = ignoreAreas.concat(createTestRequestDto.ignoreAreas); } From 226b1c92d51e7369968e142539ff834f1888262a Mon Sep 17 00:00:00 2001 From: Pavel Strunkin Date: Mon, 2 Nov 2020 18:46:56 +0200 Subject: [PATCH 4/4] Update test-runs.service.ts --- src/test-runs/test-runs.service.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test-runs/test-runs.service.ts b/src/test-runs/test-runs.service.ts index c18f5b55..114473ca 100644 --- a/src/test-runs/test-runs.service.ts +++ b/src/test-runs/test-runs.service.ts @@ -227,7 +227,6 @@ export class TestRunsService { const baseline = this.staticService.getImage(testRun.baselineName); const image = this.staticService.getImage(imageName); - // combine ignore areas from testVarition together with testRun request let ignoreAreas: IgnoreAreaDto[] = JSON.parse(testVariation.ignoreAreas); if (createTestRequestDto.ignoreAreas?.length > 0) { ignoreAreas = ignoreAreas.concat(createTestRequestDto.ignoreAreas);