Skip to content

Commit bcf9f97

Browse files
authored
Variations : On deleting a variation, there is an error (#107)
closes Visual-Regression-Tracker/Visual-Regression-Tracker#233
1 parent a246cad commit bcf9f97

File tree

11 files changed

+314
-24
lines changed

11 files changed

+314
-24
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# Migration `20210228121726-test-run--nullable-test-variation-id`
2+
3+
This migration has been generated by Pavel Strunkin at 2/28/2021, 2:17:26 PM.
4+
You can check out the [state of the schema](./schema.prisma) after the migration.
5+
6+
## Database Steps
7+
8+
```sql
9+
ALTER TYPE "TestStatus" ADD VALUE 'autoApproved'
10+
```
11+
12+
## Changes
13+
14+
```diff
15+
diff --git schema.prisma schema.prisma
16+
migration 20210130115922-test-run-auto-approve-status-added..20210228121726-test-run--nullable-test-variation-id
17+
--- datamodel.dml
18+
+++ datamodel.dml
19+
@@ -3,9 +3,9 @@
20+
}
21+
datasource db {
22+
provider = "postgresql"
23+
- url = "***"
24+
+ url = "***"
25+
}
26+
model Build {
27+
id String @id @default(uuid())
28+
@@ -38,35 +38,35 @@
29+
@@unique([name])
30+
}
31+
model TestRun {
32+
- id String @id @default(uuid())
33+
+ id String @id @default(uuid())
34+
imageName String
35+
diffName String?
36+
diffPercent Float?
37+
- diffTollerancePercent Float @default(0)
38+
+ diffTollerancePercent Float @default(0)
39+
pixelMisMatchCount Int?
40+
status TestStatus
41+
buildId String
42+
- build Build @relation(fields: [buildId], references: [id])
43+
- testVariationId String
44+
- testVariation TestVariation @relation(fields: [testVariationId], references: [id])
45+
- merge Boolean @default(false)
46+
- updatedAt DateTime @updatedAt
47+
- createdAt DateTime @default(now())
48+
+ build Build @relation(fields: [buildId], references: [id])
49+
+ testVariationId String?
50+
+ testVariation TestVariation? @relation(fields: [testVariationId], references: [id])
51+
+ merge Boolean @default(false)
52+
+ updatedAt DateTime @updatedAt
53+
+ createdAt DateTime @default(now())
54+
// Test variation data
55+
- name String @default("")
56+
+ name String @default("")
57+
browser String?
58+
device String?
59+
os String?
60+
viewport String?
61+
baselineName String?
62+
comment String?
63+
baseline Baseline?
64+
- branchName String @default("master")
65+
+ branchName String @default("master")
66+
baselineBranchName String?
67+
- ignoreAreas String @default("[]")
68+
- tempIgnoreAreas String @default("[]")
69+
+ ignoreAreas String @default("[]")
70+
+ tempIgnoreAreas String @default("[]")
71+
}
72+
model TestVariation {
73+
id String @id @default(uuid())
74+
```
75+
76+
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
generator client {
2+
provider = "prisma-client-js"
3+
}
4+
5+
datasource db {
6+
provider = "postgresql"
7+
url = "***"
8+
}
9+
10+
model Build {
11+
id String @id @default(uuid())
12+
ciBuildId String?
13+
number Int?
14+
branchName String?
15+
status String?
16+
testRuns TestRun[]
17+
projectId String
18+
project Project @relation(fields: [projectId], references: [id])
19+
updatedAt DateTime @updatedAt
20+
createdAt DateTime @default(now())
21+
user User? @relation(fields: [userId], references: [id])
22+
userId String?
23+
isRunning Boolean?
24+
25+
@@unique([projectId, ciBuildId])
26+
}
27+
28+
model Project {
29+
id String @id @default(uuid())
30+
name String
31+
mainBranchName String @default("master")
32+
builds Build[]
33+
buildsCounter Int @default(0)
34+
testVariations TestVariation[]
35+
updatedAt DateTime @updatedAt
36+
createdAt DateTime @default(now())
37+
38+
@@unique([name])
39+
}
40+
41+
model TestRun {
42+
id String @id @default(uuid())
43+
imageName String
44+
diffName String?
45+
diffPercent Float?
46+
diffTollerancePercent Float @default(0)
47+
pixelMisMatchCount Int?
48+
status TestStatus
49+
buildId String
50+
build Build @relation(fields: [buildId], references: [id])
51+
testVariationId String?
52+
testVariation TestVariation? @relation(fields: [testVariationId], references: [id])
53+
merge Boolean @default(false)
54+
updatedAt DateTime @updatedAt
55+
createdAt DateTime @default(now())
56+
// Test variation data
57+
name String @default("")
58+
browser String?
59+
device String?
60+
os String?
61+
viewport String?
62+
baselineName String?
63+
comment String?
64+
baseline Baseline?
65+
branchName String @default("master")
66+
baselineBranchName String?
67+
ignoreAreas String @default("[]")
68+
tempIgnoreAreas String @default("[]")
69+
}
70+
71+
model TestVariation {
72+
id String @id @default(uuid())
73+
name String
74+
branchName String @default("master")
75+
browser String?
76+
device String?
77+
os String?
78+
viewport String?
79+
baselineName String?
80+
ignoreAreas String @default("[]")
81+
projectId String
82+
project Project @relation(fields: [projectId], references: [id])
83+
testRuns TestRun[]
84+
baselines Baseline[]
85+
comment String?
86+
updatedAt DateTime @updatedAt
87+
createdAt DateTime @default(now())
88+
89+
@@unique([projectId, name, browser, device, os, viewport, branchName])
90+
}
91+
92+
model Baseline {
93+
id String @id @default(uuid())
94+
baselineName String
95+
testVariationId String
96+
testVariation TestVariation @relation(fields: [testVariationId], references: [id])
97+
testRunId String?
98+
testRun TestRun? @relation(fields: [testRunId], references: [id])
99+
updatedAt DateTime @updatedAt
100+
createdAt DateTime @default(now())
101+
}
102+
103+
model User {
104+
id String @id @default(uuid())
105+
email String @unique
106+
password String
107+
firstName String?
108+
lastName String?
109+
apiKey String @unique
110+
isActive Boolean @default(true)
111+
builds Build[]
112+
updatedAt DateTime @updatedAt
113+
createdAt DateTime @default(now())
114+
}
115+
116+
enum TestStatus {
117+
failed
118+
new
119+
ok
120+
unresolved
121+
approved
122+
autoApproved
123+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"version": "0.3.14-fixed",
3+
"steps": [
4+
{
5+
"tag": "UpdateField",
6+
"model": "TestRun",
7+
"field": "testVariationId",
8+
"arity": "Optional"
9+
},
10+
{
11+
"tag": "UpdateField",
12+
"model": "TestRun",
13+
"field": "testVariation",
14+
"arity": "Optional"
15+
}
16+
]
17+
}

prisma/migrations/migrate.lock

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@
1313
20201115155739-ci-build-id-added
1414
20201201211711-test-run--temp-ignore-areas-added
1515
20210118201534-build--project-id---ci-build-id-constraint
16-
20210130115922-test-run-auto-approve-status-added
16+
20210130115922-test-run-auto-approve-status-added
17+
20210228121726-test-run--nullable-test-variation-id

prisma/schema.prisma

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,33 +39,33 @@ model Project {
3939
}
4040

4141
model TestRun {
42-
id String @id @default(uuid())
42+
id String @id @default(uuid())
4343
imageName String
4444
diffName String?
4545
diffPercent Float?
46-
diffTollerancePercent Float @default(0)
46+
diffTollerancePercent Float @default(0)
4747
pixelMisMatchCount Int?
4848
status TestStatus
4949
buildId String
50-
build Build @relation(fields: [buildId], references: [id])
51-
testVariationId String
52-
testVariation TestVariation @relation(fields: [testVariationId], references: [id])
53-
merge Boolean @default(false)
54-
updatedAt DateTime @updatedAt
55-
createdAt DateTime @default(now())
50+
build Build @relation(fields: [buildId], references: [id])
51+
testVariationId String?
52+
testVariation TestVariation? @relation(fields: [testVariationId], references: [id])
53+
merge Boolean @default(false)
54+
updatedAt DateTime @updatedAt
55+
createdAt DateTime @default(now())
5656
// Test variation data
57-
name String @default("")
57+
name String @default("")
5858
browser String?
5959
device String?
6060
os String?
6161
viewport String?
6262
baselineName String?
6363
comment String?
6464
baseline Baseline?
65-
branchName String @default("master")
65+
branchName String @default("master")
6666
baselineBranchName String?
67-
ignoreAreas String @default("[]")
68-
tempIgnoreAreas String @default("[]")
67+
ignoreAreas String @default("[]")
68+
tempIgnoreAreas String @default("[]")
6969
}
7070

7171
model TestVariation {

src/projects/projects.service.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,10 @@ export class ProjectsService {
6464
},
6565
});
6666

67-
try {
68-
await Promise.all(project.builds.map((build) => this.buildsService.remove(build.id)));
69-
await Promise.all(
70-
project.testVariations.map((testVariation) => this.testVariationsService.delete(testVariation.id))
71-
);
72-
} catch (err) {
73-
console.log(err);
74-
}
67+
await Promise.all(project.builds.map((build) => this.buildsService.remove(build.id)));
68+
await Promise.all(
69+
project.testVariations.map((testVariation) => this.testVariationsService.delete(testVariation.id))
70+
);
7571

7672
return this.prismaService.project.delete({
7773
where: { id },

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ const initModule = async ({
2626
testRunCreateMock = jest.fn(),
2727
testRunFindMany = jest.fn(),
2828
testRunDeleteMock = jest.fn(),
29+
$executeRawMock = jest.fn(),
2930
}) => {
3031
const module: TestingModule = await Test.createTestingModule({
3132
providers: [
@@ -54,6 +55,7 @@ const initModule = async ({
5455
{
5556
provide: PrismaService,
5657
useValue: {
58+
$executeRaw: $executeRawMock,
5759
testVariation: {
5860
findUnique: variationfindUniqueMock,
5961
findMany: variationFindManyMock,
@@ -500,11 +502,13 @@ describe('TestVariationsService', () => {
500502
],
501503
};
502504

505+
const $executeRawMock = jest.fn();
503506
const variationDeleteMock = jest.fn();
504507
const getDetailsMock = jest.fn().mockResolvedValueOnce(variation);
505508
const deleteBaselineMock = jest.fn().mockResolvedValueOnce(variation.baselines[0]);
506509
const service = await initModule({
507510
variationDeleteMock,
511+
$executeRawMock,
508512
});
509513
service.getDetails = getDetailsMock;
510514
service.deleteBaseline = deleteBaselineMock;
@@ -513,6 +517,7 @@ describe('TestVariationsService', () => {
513517

514518
expect(service.getDetails).toHaveBeenCalledWith(testVariationId);
515519
expect(service.deleteBaseline).toHaveBeenCalledWith(variation.baselines[0]);
520+
expect($executeRawMock).toHaveBeenCalled();
516521
expect(variationDeleteMock).toHaveBeenCalledWith({
517522
where: { id: testVariationId },
518523
});

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,15 @@ export class TestVariationsService {
144144
async delete(id: string): Promise<TestVariation> {
145145
const testVariation = await this.getDetails(id);
146146

147-
// delete baseline
147+
// delete Baselines
148148
await Promise.all(testVariation.baselines.map((baseline) => this.deleteBaseline(baseline)));
149149

150-
// delete testVariation
150+
// disconnect TestRuns
151+
// workaround due to https://github.com/prisma/prisma/issues/2810
152+
await this.prismaService
153+
.$executeRaw`UPDATE "public"."TestRun" SET "testVariationId" = NULL::text WHERE "testVariationId" = ${id}`;
154+
155+
// delete TestVariation
151156
return this.prismaService.testVariation.delete({
152157
where: { id },
153158
});

test/jest-e2e.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"rootDir": "../",
44
"testEnvironment": "node",
55
"testRegex": ".e2e-spec.ts$",
6+
"testTimeout": 30000,
67
"transform": {
78
"^.+\\.(t|j)s$": "ts-jest"
89
}

test/test-runs.e2e-spec.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import { ProjectsService } from '../src/projects/projects.service';
99
import { Project, TestStatus } from '@prisma/client';
1010
import { BuildsService } from '../src/builds/builds.service';
1111

12-
jest.setTimeout(20000);
1312
jest.useFakeTimers();
1413

1514
describe('TestRuns (e2e)', () => {

0 commit comments

Comments
 (0)