Skip to content

Commit 5d95b56

Browse files
authored
Merge pull request #16 from Visual-Regression-Tracker/68-duplicated-assert
delete previous test run if exists in scope of one build
2 parents 6a47cee + f204327 commit 5d95b56

File tree

5 files changed

+79
-53
lines changed

5 files changed

+79
-53
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { ApiProperty } from '@nestjs/swagger';
2+
import { IsString, IsOptional } from 'class-validator';
3+
4+
export class BaselineDataDto {
5+
@ApiProperty()
6+
@IsString()
7+
name: string;
8+
9+
@ApiProperty()
10+
@IsOptional()
11+
@IsString()
12+
os?: string;
13+
14+
@ApiProperty()
15+
@IsOptional()
16+
@IsString()
17+
browser?: string;
18+
19+
@ApiProperty()
20+
@IsOptional()
21+
@IsString()
22+
viewport?: string;
23+
24+
@ApiProperty()
25+
@IsOptional()
26+
@IsString()
27+
device?: string;
28+
}
29+
30+
export const convertBaselineDataToQuery = (data: BaselineDataDto) => {
31+
return {
32+
name: data.name,
33+
os: data.os ? data.os : null,
34+
browser: data.browser ? data.browser : null,
35+
device: data.device ? data.device : null,
36+
viewport: data.viewport ? data.viewport : null,
37+
};
38+
};

src/test-runs/dto/create-test-request.dto.ts

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,12 @@
11
import { ApiProperty } from '@nestjs/swagger';
2-
import { IsString, IsOptional, IsBase64, IsUUID, IsNumber } from 'class-validator';
3-
4-
export class CreateTestRequestDto {
5-
@ApiProperty()
6-
@IsString()
7-
name: string;
2+
import { IsOptional, IsBase64, IsUUID, IsNumber } from 'class-validator';
3+
import { BaselineDataDto } from '../../shared/dto/baseline-data.dto';
84

5+
export class CreateTestRequestDto extends BaselineDataDto {
96
@ApiProperty()
107
@IsBase64()
118
imageBase64: string;
129

13-
@ApiProperty()
14-
@IsOptional()
15-
@IsString()
16-
os?: string;
17-
18-
@ApiProperty()
19-
@IsOptional()
20-
@IsString()
21-
browser?: string;
22-
23-
@ApiProperty()
24-
@IsOptional()
25-
@IsString()
26-
viewport?: string;
27-
28-
@ApiProperty()
29-
@IsOptional()
30-
@IsString()
31-
device?: string;
32-
3310
@ApiProperty()
3411
@IsUUID()
3512
buildId: string;

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

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,16 @@ import { CommentDto } from '../shared/dto/comment.dto';
1212
import { BuildDto } from '../builds/dto/build.dto';
1313
import { TestRunResultDto } from '../test-runs/dto/testRunResult.dto';
1414
import { TestVariationsService } from '../test-variations/test-variations.service';
15+
import { convertBaselineDataToQuery } from '../shared/dto/baseline-data.dto';
1516

1617
@Injectable()
1718
export class TestRunsService {
1819
constructor(
1920
private testVariationService: TestVariationsService,
2021
private prismaService: PrismaService,
2122
private staticService: StaticService,
22-
private eventsGateway: EventsGateway,
23-
) { }
23+
private eventsGateway: EventsGateway
24+
) {}
2425

2526
async findMany(buildId: string): Promise<TestRun[]> {
2627
return this.prismaService.testRun.findMany({
@@ -44,8 +45,24 @@ export class TestRunsService {
4445
}
4546

4647
async postTestRun(createTestRequestDto: CreateTestRequestDto): Promise<TestRunResultDto> {
47-
const testVariation = await this.testVariationService.findOrCreate(createTestRequestDto);
48+
const baselineData = convertBaselineDataToQuery(createTestRequestDto);
4849

50+
// creates variatioin if does not exist
51+
const testVariation = await this.testVariationService.findOrCreate(createTestRequestDto.projectId, baselineData);
52+
53+
// delete previous test run if exists
54+
let [previousTestRun] = await this.prismaService.testRun.findMany({
55+
where: {
56+
buildId: createTestRequestDto.buildId,
57+
...baselineData,
58+
},
59+
});
60+
61+
if (!!previousTestRun) {
62+
await this.delete(previousTestRun.id);
63+
}
64+
65+
// create test run result
4966
const testRun = await this.create(testVariation, createTestRequestDto);
5067

5168
return new TestRunResultDto(testRun, testVariation);
@@ -54,14 +71,14 @@ export class TestRunsService {
5471
async emitUpdateBuildEvent(buildId: string) {
5572
const build = await this.prismaService.build.findOne({
5673
where: {
57-
id: buildId
74+
id: buildId,
5875
},
5976
include: {
60-
testRuns: true
61-
}
62-
})
63-
const buildDto = new BuildDto(build)
64-
this.eventsGateway.buildUpdated(buildDto)
77+
testRuns: true,
78+
},
79+
});
80+
const buildDto = new BuildDto(build);
81+
this.eventsGateway.buildUpdated(buildDto);
6582
}
6683

6784
async approve(id: string): Promise<TestRun> {
@@ -93,7 +110,7 @@ export class TestRunsService {
93110
},
94111
});
95112

96-
this.emitUpdateBuildEvent(testRun.buildId)
113+
this.emitUpdateBuildEvent(testRun.buildId);
97114
return testRunUpdated;
98115
}
99116

@@ -105,7 +122,7 @@ export class TestRunsService {
105122
},
106123
});
107124

108-
this.emitUpdateBuildEvent(testRun.buildId)
125+
this.emitUpdateBuildEvent(testRun.buildId);
109126
return testRun;
110127
}
111128

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { StaticService } from '../shared/static/static.service';
66
import { IgnoreAreaDto } from '../test-runs/dto/ignore-area.dto';
77
import { TestVariation, Baseline } from '@prisma/client';
88
import { CommentDto } from '../shared/dto/comment.dto';
9+
import { convertBaselineDataToQuery } from '../shared/dto/baseline-data.dto';
910

1011
const initModule = async ({
1112
imageDeleteMock = jest.fn(),
@@ -97,7 +98,7 @@ describe('TestVariationsService', () => {
9798
const variationFindManyMock = jest.fn();
9899
service = await initModule({ variationFindManyMock: variationFindManyMock.mockResolvedValueOnce([data]) });
99100

100-
const result = await service.findOrCreate(data);
101+
const result = await service.findOrCreate(data.projectId, convertBaselineDataToQuery(data));
101102

102103
expect(variationFindManyMock).toHaveBeenCalledWith({
103104
where: {
@@ -117,7 +118,7 @@ describe('TestVariationsService', () => {
117118
const variationFindManyMock = jest.fn();
118119
service = await initModule({ variationFindManyMock: variationFindManyMock.mockResolvedValueOnce([data]) });
119120

120-
const result = await service.findOrCreate(data);
121+
const result = await service.findOrCreate(data.projectId, convertBaselineDataToQuery(data));
121122

122123
expect(variationFindManyMock).toHaveBeenCalledWith({
123124
where: {
@@ -137,7 +138,7 @@ describe('TestVariationsService', () => {
137138
const variationCreateMock = jest.fn();
138139
service = await initModule({ variationCreateMock: variationCreateMock.mockResolvedValueOnce(data) });
139140

140-
const result = await service.findOrCreate(data);
141+
const result = await service.findOrCreate(data.projectId, convertBaselineDataToQuery(data));
141142

142143
expect(variationCreateMock).toHaveBeenCalledWith({
143144
data: {

src/test-variations/test-variations.service.ts

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { Injectable } from '@nestjs/common';
2-
import { CreateTestRequestDto } from '../test-runs/dto/create-test-request.dto';
32
import { IgnoreAreaDto } from '../test-runs/dto/ignore-area.dto';
43
import { PrismaService } from '../prisma/prisma.service';
54
import { TestVariation, Baseline } from '@prisma/client';
65
import { StaticService } from '../shared/static/static.service';
76
import { CommentDto } from '../shared/dto/comment.dto';
7+
import { BaselineDataDto } from '../shared/dto/baseline-data.dto';
88

99
@Injectable()
1010
export class TestVariationsService {
@@ -26,26 +26,19 @@ export class TestVariationsService {
2626
});
2727
}
2828

29-
async findOrCreate(createTestDto: CreateTestRequestDto): Promise<TestVariation> {
30-
const data = {
31-
name: createTestDto.name,
32-
os: createTestDto.os ? createTestDto.os : null,
33-
browser: createTestDto.browser ? createTestDto.browser : null,
34-
viewport: createTestDto.viewport ? createTestDto.viewport : null,
35-
device: createTestDto.device ? createTestDto.device : null,
36-
};
29+
async findOrCreate(projectId: string, baselineData: BaselineDataDto): Promise<TestVariation> {
3730
let [testVariation] = await this.prismaService.testVariation.findMany({
3831
where: {
39-
projectId: createTestDto.projectId,
40-
...data,
32+
projectId,
33+
...baselineData,
4134
},
4235
});
4336

4437
if (!testVariation) {
4538
testVariation = await this.prismaService.testVariation.create({
4639
data: {
47-
project: { connect: { id: createTestDto.projectId } },
48-
...data,
40+
project: { connect: { id: projectId } },
41+
...baselineData,
4942
},
5043
});
5144
}

0 commit comments

Comments
 (0)