From fe82cc474efa9653919bdaab0bd3f34c4dd0e5c3 Mon Sep 17 00:00:00 2001 From: Pavel Strunkin Date: Thu, 11 Feb 2021 23:05:35 +0200 Subject: [PATCH 1/6] AutoApproveNewFeatureBranchBasedOnHistory added https://github.com/Visual-Regression-Tracker/Visual-Regression-Tracker/issues/205 --- src/test-runs/test-runs.service.ts | 43 +++++++++++++++- test/image_edited.png | Bin 0 -> 102632 bytes test/preconditions.ts | 23 +++++++++ test/test-runs.e2e-spec.ts | 79 +++++++++++++++++++++++++++++ 4 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 test/image_edited.png create mode 100644 test/test-runs.e2e-spec.ts diff --git a/src/test-runs/test-runs.service.ts b/src/test-runs/test-runs.service.ts index e3853874..04bf964d 100644 --- a/src/test-runs/test-runs.service.ts +++ b/src/test-runs/test-runs.service.ts @@ -5,7 +5,7 @@ import { CreateTestRequestDto } from './dto/create-test-request.dto'; import { IgnoreAreaDto } from './dto/ignore-area.dto'; import { StaticService } from '../shared/static/static.service'; import { PrismaService } from '../prisma/prisma.service'; -import { TestRun, TestStatus, TestVariation } from '@prisma/client'; +import { Baseline, TestRun, TestStatus, TestVariation } from '@prisma/client'; import { DiffResult } from './diffResult'; import { EventsGateway } from '../shared/events/events.gateway'; import { CommentDto } from '../shared/dto/comment.dto'; @@ -233,6 +233,11 @@ export class TestRunsService { let testRunWithResult = await this.saveDiffResult(testRun.id, diffResult); + testRunWithResult = await this.tryAutoApproveNewFeatureBranchBasedOnHistory( + testVariation, + testRunWithResult, + ignoreAreas + ); testRunWithResult = await this.tryAutoApproveBasedOnHistory(testVariation, testRunWithResult, image, ignoreAreas); this.eventsGateway.testRunCreated(testRunWithResult); @@ -334,6 +339,31 @@ export class TestRunsService { return image.data; } + private async tryAutoApproveNewFeatureBranchBasedOnHistory( + testVariation: TestVariation, + testRun: TestRun, + ignoreAreas: IgnoreAreaDto[] + ): Promise { + if ( + !process.env.AUTO_APPROVE_BASED_ON_HISTORY || + testRun.status === TestStatus.ok || + testRun.branchName === testRun.baselineBranchName + ) { + return testRun; + } + + this.logger.log(`Try pass based on history for testRun: ${testRun.id}`); + const testVariationHistory = await this.testVariationService.getDetails(testVariation.id); + for (const baseline of testVariationHistory.baselines) { + if (this.shouldAutoApprove(baseline, testRun, ignoreAreas)) { + return this.approve(testRun.id, false, true); + } + } + + this.logger.log(`Cannot auto approve FEATURE testRun: ${testRun.id}`); + return testRun; + } + private async tryAutoApproveBasedOnHistory( testVariation: TestVariation, testRun: TestRun, @@ -399,4 +429,15 @@ export class TestRunsService { } return testRun; } + + private shouldAutoApprove(baseline: Baseline, testRun: TestRun, ignoreAreas: Array): boolean { + const approvedImage = this.staticService.getImage(baseline.baselineName); + const image = this.staticService.getImage(testRun.imageName); + const diffResult = this.getDiff(approvedImage, image, testRun.diffTollerancePercent, ignoreAreas); + + if (diffResult.status === TestStatus.ok) { + this.logger.log(`TestRun ${testRun.id} could be approved based on Baseline ${baseline.id}`); + return true; + } + } } diff --git a/test/image_edited.png b/test/image_edited.png new file mode 100644 index 0000000000000000000000000000000000000000..a6c4624abd5d5ae15affe3dd67292b14ae593aba GIT binary patch literal 102632 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
(A4rE*{mDjou9_tnM3A)#neF>!g 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

CZXglYQ(m57N! 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%0A8DBi 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

oW*bEKcjz^jsa7P<<9(xuLRb^WwPRY5khQ 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 WP^eaUz$)ti0000anz9j literal 0 HcmV?d00001 diff --git a/test/preconditions.ts b/test/preconditions.ts index 8638a05f..8d27264d 100644 --- a/test/preconditions.ts +++ b/test/preconditions.ts @@ -2,6 +2,11 @@ import { INestApplication } from '@nestjs/common'; import { UsersService } from 'src/users/users.service'; import uuidAPIKey from 'uuid-apikey'; import request, { Test } from 'supertest'; +import { BuildsService } from 'src/builds/builds.service'; +import { TestRunsService } from 'src/test-runs/test-runs.service'; +import { readFileSync } from 'fs'; +import { TestRun } from 'prisma/node_modules/@prisma/client'; +import { TestRunResultDto } from 'src/test-runs/dto/testRunResult.dto'; export const generateUser = ( password: string @@ -41,3 +46,21 @@ export const haveUserLogged = async (usersService: UsersService) => { password, }); }; + +export const haveTestRunCreated = async ( + buildsService: BuildsService, + testRunsService: TestRunsService, + projectId: string, + branchName: string, + imagePath: string +): Promise => { + const build = await buildsService.create({ project: projectId, branchName }); + return testRunsService.postTestRun({ + projectId: build.projectId, + branchName: build.branchName, + imageBase64: readFileSync(imagePath).toString('base64'), + buildId: build.id, + name: 'Image name', + merge: false, + }); +}; diff --git a/test/test-runs.e2e-spec.ts b/test/test-runs.e2e-spec.ts new file mode 100644 index 00000000..4b6e9452 --- /dev/null +++ b/test/test-runs.e2e-spec.ts @@ -0,0 +1,79 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import { AppModule } from '../src/app.module'; +import { UsersService } from '../src/users/users.service'; +import { haveTestRunCreated, haveUserLogged } from './preconditions'; +import { UserLoginResponseDto } from '../src/users/dto/user-login-response.dto'; +import { TestRunsService } from '../src/test-runs/test-runs.service'; +import { ProjectsService } from '../src/projects/projects.service'; +import { Project, TestStatus } from '../prisma/node_modules/@prisma/client'; +import { BuildsService } from '../src/builds/builds.service'; +import { BuildDto } from '../src/builds/dto/build.dto'; +import { TestVariationsService } from '../src/test-variations/test-variations.service'; + +jest.setTimeout(20000); + +describe('TestRuns (e2e)', () => { + let app: INestApplication; + let testRunsService: TestRunsService; + let usersService: UsersService; + let projecstService: ProjectsService; + let buildsService: BuildsService; + let user: UserLoginResponseDto; + let project: Project; + + beforeAll(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + testRunsService = moduleFixture.get(TestRunsService); + usersService = moduleFixture.get(UsersService); + projecstService = moduleFixture.get(ProjectsService); + buildsService = moduleFixture.get(BuildsService); + + await app.init(); + }); + + beforeEach(async () => { + user = await haveUserLogged(usersService); + project = await projecstService.create({ name: 'TestRun E2E test', mainBranchName: 'master' }); + }); + + afterEach(async () => { + await projecstService.remove(project.id); + await usersService.delete(user.id); + }); + + afterAll(async () => { + await app.close(); + }); + + describe('POST /', () => { + const image_v1 = './test/image.png'; + const image_v2 = './test/image_edited.png'; + it('Auto approve feature branch based on history', async () => { + const testRun1 = await haveTestRunCreated( + buildsService, + testRunsService, + project.id, + project.mainBranchName, + image_v1 + ); + await testRunsService.approve(testRun1.id, false, false); + const testRun2 = await haveTestRunCreated( + buildsService, + testRunsService, + project.id, + project.mainBranchName, + image_v2 + ); + await testRunsService.approve(testRun2.id, false, false); + + const testRun = await haveTestRunCreated(buildsService, testRunsService, project.id, 'develop', image_v1); + + expect(testRun.status).toBe(TestStatus.autoApproved); + }); + }); +}); From 9c7dfa657e342513c791f330d536fe12e07dbe47 Mon Sep 17 00:00:00 2001 From: Pavel Strunkin Date: Fri, 12 Feb 2021 09:49:03 +0200 Subject: [PATCH 2/6] refactoring --- test/preconditions.ts | 1 - test/test-runs.e2e-spec.ts | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/test/preconditions.ts b/test/preconditions.ts index 8d27264d..32ceeb07 100644 --- a/test/preconditions.ts +++ b/test/preconditions.ts @@ -5,7 +5,6 @@ import request, { Test } from 'supertest'; import { BuildsService } from 'src/builds/builds.service'; import { TestRunsService } from 'src/test-runs/test-runs.service'; import { readFileSync } from 'fs'; -import { TestRun } from 'prisma/node_modules/@prisma/client'; import { TestRunResultDto } from 'src/test-runs/dto/testRunResult.dto'; export const generateUser = ( diff --git a/test/test-runs.e2e-spec.ts b/test/test-runs.e2e-spec.ts index 4b6e9452..0c0f148d 100644 --- a/test/test-runs.e2e-spec.ts +++ b/test/test-runs.e2e-spec.ts @@ -6,10 +6,8 @@ import { haveTestRunCreated, haveUserLogged } from './preconditions'; import { UserLoginResponseDto } from '../src/users/dto/user-login-response.dto'; import { TestRunsService } from '../src/test-runs/test-runs.service'; import { ProjectsService } from '../src/projects/projects.service'; -import { Project, TestStatus } from '../prisma/node_modules/@prisma/client'; +import { Project, TestStatus } from '@prisma/client'; import { BuildsService } from '../src/builds/builds.service'; -import { BuildDto } from '../src/builds/dto/build.dto'; -import { TestVariationsService } from '../src/test-variations/test-variations.service'; jest.setTimeout(20000); From d366c2c3fad70572086d7d2d35faaccd1c074483 Mon Sep 17 00:00:00 2001 From: Pavel Strunkin Date: Fri, 12 Feb 2021 10:45:05 +0200 Subject: [PATCH 3/6] tests added --- src/test-runs/test-runs.service.ts | 30 +++++++++++++++++++------- test/test-runs.e2e-spec.ts | 34 +++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/src/test-runs/test-runs.service.ts b/src/test-runs/test-runs.service.ts index 04bf964d..e02be02d 100644 --- a/src/test-runs/test-runs.service.ts +++ b/src/test-runs/test-runs.service.ts @@ -233,12 +233,8 @@ export class TestRunsService { let testRunWithResult = await this.saveDiffResult(testRun.id, diffResult); - testRunWithResult = await this.tryAutoApproveNewFeatureBranchBasedOnHistory( - testVariation, - testRunWithResult, - ignoreAreas - ); - testRunWithResult = await this.tryAutoApproveBasedOnHistory(testVariation, testRunWithResult, image, ignoreAreas); + testRunWithResult = await this.tryAutoApproveByPastBaselines(testVariation, testRunWithResult, ignoreAreas); + testRunWithResult = await this.tryAutoApproveByNewBaselines(testVariation, testRunWithResult, image, ignoreAreas); this.eventsGateway.testRunCreated(testRunWithResult); return testRunWithResult; @@ -339,7 +335,14 @@ export class TestRunsService { return image.data; } - private async tryAutoApproveNewFeatureBranchBasedOnHistory( + /** + * Reason: not rebased code from feature branch is compared agains new main branch baseline thus diff is expected + * Tries to find past baseline in main branch and autoApprove in case matched + * @param testVariation + * @param testRun + * @param ignoreAreas + */ + private async tryAutoApproveByPastBaselines( testVariation: TestVariation, testRun: TestRun, ignoreAreas: IgnoreAreaDto[] @@ -354,6 +357,7 @@ export class TestRunsService { this.logger.log(`Try pass based on history for testRun: ${testRun.id}`); const testVariationHistory = await this.testVariationService.getDetails(testVariation.id); + // TODO: skip first baseline as it was used by default in general flow for (const baseline of testVariationHistory.baselines) { if (this.shouldAutoApprove(baseline, testRun, ignoreAreas)) { return this.approve(testRun.id, false, true); @@ -364,7 +368,17 @@ export class TestRunsService { return testRun; } - private async tryAutoApproveBasedOnHistory( + /** + * Reason: branch got another one merged thus diff is expected + * Tries to find latest baseline in test variation + * that has already approved test agains the same baseline image + * and autoApprove in case matched + * @param testVariation + * @param testRun + * @param image + * @param ignoreAreas + */ + private async tryAutoApproveByNewBaselines( testVariation: TestVariation, testRun: TestRun, image: PNG, diff --git a/test/test-runs.e2e-spec.ts b/test/test-runs.e2e-spec.ts index 0c0f148d..8dbce73b 100644 --- a/test/test-runs.e2e-spec.ts +++ b/test/test-runs.e2e-spec.ts @@ -51,7 +51,7 @@ describe('TestRuns (e2e)', () => { describe('POST /', () => { const image_v1 = './test/image.png'; const image_v2 = './test/image_edited.png'; - it('Auto approve feature branch based on history', async () => { + it('Auto approve not rebased feature branch', async () => { const testRun1 = await haveTestRunCreated( buildsService, testRunsService, @@ -73,5 +73,37 @@ describe('TestRuns (e2e)', () => { expect(testRun.status).toBe(TestStatus.autoApproved); }); + + it('Auto approve merged feature into feature branch', async () => { + const testRun1 = await haveTestRunCreated(buildsService, testRunsService, project.id, 'feature1', image_v1); + await testRunsService.approve(testRun1.id, false, false); + + const testRun = await haveTestRunCreated(buildsService, testRunsService, project.id, 'feature2', image_v1); + + expect(testRun.status).toBe(TestStatus.autoApproved); + }); + + it('Auto approve merged feature into main branch', async () => { + const testRun1 = await haveTestRunCreated( + buildsService, + testRunsService, + project.id, + project.mainBranchName, + image_v1 + ); + await testRunsService.approve(testRun1.id, false, false); + const testRun2 = await haveTestRunCreated(buildsService, testRunsService, project.id, 'develop', image_v2); + await testRunsService.approve(testRun2.id, false, false); + + const testRun = await haveTestRunCreated( + buildsService, + testRunsService, + project.id, + project.mainBranchName, + image_v2 + ); + + expect(testRun.status).toBe(TestStatus.autoApproved); + }); }); }); From 7a00a9069dc5c621159b436f947e64685ccf1bc8 Mon Sep 17 00:00:00 2001 From: Pavel Strunkin Date: Fri, 12 Feb 2021 12:17:02 +0200 Subject: [PATCH 4/6] Update test-runs.service.ts --- src/test-runs/test-runs.service.ts | 75 ++++++++---------------------- 1 file changed, 19 insertions(+), 56 deletions(-) diff --git a/src/test-runs/test-runs.service.ts b/src/test-runs/test-runs.service.ts index e02be02d..4b877611 100644 --- a/src/test-runs/test-runs.service.ts +++ b/src/test-runs/test-runs.service.ts @@ -234,7 +234,7 @@ export class TestRunsService { let testRunWithResult = await this.saveDiffResult(testRun.id, diffResult); testRunWithResult = await this.tryAutoApproveByPastBaselines(testVariation, testRunWithResult, ignoreAreas); - testRunWithResult = await this.tryAutoApproveByNewBaselines(testVariation, testRunWithResult, image, ignoreAreas); + testRunWithResult = await this.tryAutoApproveByNewBaselines(testVariation, testRunWithResult, ignoreAreas); this.eventsGateway.testRunCreated(testRunWithResult); return testRunWithResult; @@ -355,7 +355,7 @@ export class TestRunsService { return testRun; } - this.logger.log(`Try pass based on history for testRun: ${testRun.id}`); + this.logger.log(`Try AutoApproveByPastBaselines testRun: ${testRun.id}`); const testVariationHistory = await this.testVariationService.getDetails(testVariation.id); // TODO: skip first baseline as it was used by default in general flow for (const baseline of testVariationHistory.baselines) { @@ -364,7 +364,6 @@ export class TestRunsService { } } - this.logger.log(`Cannot auto approve FEATURE testRun: ${testRun.id}`); return testRun; } @@ -381,66 +380,30 @@ export class TestRunsService { private async tryAutoApproveByNewBaselines( testVariation: TestVariation, testRun: TestRun, - image: PNG, ignoreAreas: IgnoreAreaDto[] ): Promise { - if (process.env.AUTO_APPROVE_BASED_ON_HISTORY && testRun.status !== TestStatus.ok) { - this.logger.log(`Try auto approve testRun: ${testRun.id}`); - - const alreadyApprovedTestRuns: TestRun[] = await this.prismaService.testRun.findMany({ - where: { - ...getTestVariationUniqueData(testVariation), - baselineName: testVariation.baselineName, - status: TestStatus.approved, - }, - }); - - let autoApproved = false; - for (const approvedTestRun of alreadyApprovedTestRuns) { - this.logger.log( - `Found already approved baseline for testRun: ${testRun.id} - testVariation: ${approvedTestRun.testVariationId} - branch: ${approvedTestRun.branchName} - testRun: ${approvedTestRun.id} - build: ${approvedTestRun.buildId}` - ); - - const approvedTestVariation = await this.prismaService.testVariation.findUnique({ - where: { - id: approvedTestRun.testVariationId, - }, - }); + if (!process.env.AUTO_APPROVE_BASED_ON_HISTORY || testRun.status === TestStatus.ok) { + return testRun; + } + this.logger.log(`Try AutoApproveByNewBaselines testRun: ${testRun.id}`); - const approvedBaseline = this.staticService.getImage(approvedTestVariation.baselineName); - const diffResult = this.getDiff(approvedBaseline, image, testRun.diffTollerancePercent, ignoreAreas); + const alreadyApprovedTestRuns: TestRun[] = await this.prismaService.testRun.findMany({ + where: { + ...getTestVariationUniqueData(testVariation), + baselineName: testVariation.baselineName, + status: TestStatus.approved, + }, + }); - if (diffResult.status === TestStatus.ok) { - autoApproved = true; - const baseline = await this.prismaService.baseline.findFirst({ - where: { - testVariationId: approvedTestVariation.id, - baselineName: approvedTestVariation.baselineName, - }, - include: { - testRun: true, - }, - }); - this.logger.log( - `Found reason to auto approve testRun: ${testRun.id} - testVariation: ${baseline.testVariationId} - baseline: ${baseline.id} - branch: ${approvedTestVariation.branchName} - testRun: ${baseline.testRunId} - build: ${baseline.testRun.buildId}` - ); - } - } + for (const approvedTestRun of alreadyApprovedTestRuns) { + const approvedTestVariation = await this.testVariationService.getDetails(approvedTestRun.testVariationId); + const baseline = approvedTestVariation.baselines.shift(); - if (autoApproved) { + if (this.shouldAutoApprove(baseline, testRun, ignoreAreas)) { return this.approve(testRun.id, false, true); } - this.logger.log(`Cannot auto approve testRun: ${testRun.id}`); } + return testRun; } @@ -450,7 +413,7 @@ export class TestRunsService { const diffResult = this.getDiff(approvedImage, image, testRun.diffTollerancePercent, ignoreAreas); if (diffResult.status === TestStatus.ok) { - this.logger.log(`TestRun ${testRun.id} could be approved based on Baseline ${baseline.id}`); + this.logger.log(`TestRun ${testRun.id} could be auto approved based on Baseline ${baseline.id}`); return true; } } From 3c33e8be4350dda39bf2592ea45435c467e78ae6 Mon Sep 17 00:00:00 2001 From: Pavel Strunkin Date: Fri, 12 Feb 2021 12:28:38 +0200 Subject: [PATCH 5/6] Update test-runs.service.spec.ts --- src/test-runs/test-runs.service.spec.ts | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/test-runs/test-runs.service.spec.ts b/src/test-runs/test-runs.service.spec.ts index 7aec62b8..597a6b17 100644 --- a/src/test-runs/test-runs.service.spec.ts +++ b/src/test-runs/test-runs.service.spec.ts @@ -514,8 +514,10 @@ describe('TestRunsService', () => { service.getDiff = getDiffMock; const saveDiffResultMock = jest.fn(); service.saveDiffResult = saveDiffResultMock.mockResolvedValueOnce(testRunWithResult); - const tryAutoApproveBasedOnHistory = jest.fn(); - service['tryAutoApproveBasedOnHistory'] = tryAutoApproveBasedOnHistory.mockResolvedValueOnce(testRunWithResult); + const tryAutoApproveByPastBaselines = jest.fn(); + service['tryAutoApproveByPastBaselines'] = tryAutoApproveByPastBaselines.mockResolvedValueOnce(testRunWithResult); + const tryAutoApproveByNewBaselines = jest.fn(); + service['tryAutoApproveByNewBaselines'] = tryAutoApproveByNewBaselines.mockResolvedValueOnce(testRunWithResult); const result = await service.create(testVariation, createTestRequestDto); @@ -566,7 +568,21 @@ describe('TestRunsService', () => { }, ]); expect(saveDiffResultMock).toHaveBeenCalledWith(testRun.id, diffResult); - expect(tryAutoApproveBasedOnHistory).toHaveBeenCalledWith(testVariation, testRunWithResult, image, [ + expect(tryAutoApproveByPastBaselines).toHaveBeenCalledWith(testVariation, testRunWithResult, [ + { + x: 3, + y: 4, + width: 500, + height: 600, + }, + { + x: 1, + y: 2, + width: 100, + height: 200, + }, + ]); + expect(tryAutoApproveByNewBaselines).toHaveBeenCalledWith(testVariation, testRunWithResult, [ { x: 3, y: 4, From ff9b87d53190f9de6241c55cb847fdd909517081 Mon Sep 17 00:00:00 2001 From: Pavel Strunkin Date: Fri, 12 Feb 2021 12:31:47 +0200 Subject: [PATCH 6/6] Update test-runs.service.ts --- src/test-runs/test-runs.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test-runs/test-runs.service.ts b/src/test-runs/test-runs.service.ts index 4b877611..dad02035 100644 --- a/src/test-runs/test-runs.service.ts +++ b/src/test-runs/test-runs.service.ts @@ -357,8 +357,8 @@ export class TestRunsService { this.logger.log(`Try AutoApproveByPastBaselines testRun: ${testRun.id}`); const testVariationHistory = await this.testVariationService.getDetails(testVariation.id); - // TODO: skip first baseline as it was used by default in general flow - for (const baseline of testVariationHistory.baselines) { + // skip first baseline as it was used by default in general flow + for (const baseline of testVariationHistory.baselines.slice(1)) { if (this.shouldAutoApprove(baseline, testRun, ignoreAreas)) { return this.approve(testRun.id, false, true); }