Skip to content

Commit

Permalink
Merge pull request #1390 from argos-ci/use-approved-builds
Browse files Browse the repository at this point in the history
fix: only use approved builds as baseline
  • Loading branch information
gregberge authored Oct 8, 2024
2 parents 4784b35 + b4dbd74 commit 4fd8aba
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 16 deletions.
78 changes: 70 additions & 8 deletions apps/backend/src/build/strategy/strategies/ci/query.e2e.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ describe("#getBaseBucketForBuildAndCommit", () => {
describe("when the build is triggered by a pull request", () => {
let baseBucket: ScreenshotBucket;
let build: Build;
let baseBucketBuild: Build;

beforeEach(async () => {
await setupDatabase();
Expand All @@ -29,10 +30,12 @@ describe("#getBaseBucketForBuildAndCommit", () => {
{
baseScreenshotBucketId: null,
compareScreenshotBucketId: baseBucket.id,
jobStatus: "pending",
jobStatus: "complete",
prHeadCommit: "766b744bc5fa27a330283dfd47ffafdaf905a941",
name: "default",
projectId: project.id,
type: "reference",
mode: "ci",
},
{
baseScreenshotBucketId: null,
Expand All @@ -41,17 +44,75 @@ describe("#getBaseBucketForBuildAndCommit", () => {
prHeadCommit: null,
name: "default",
projectId: project.id,
mode: "ci",
},
]);
baseBucketBuild = builds[0]!;
build = builds[1]!;
});

it("returns the base bucket", async () => {
const result = await getBaseBucketForBuildAndCommit(
build,
"766b744bc5fa27a330283dfd47ffafdaf905a941",
);
expect(result).toEqual(baseBucket);
describe("if the associated build is pending", () => {
beforeEach(async () => {
await baseBucketBuild.$query().patch({ jobStatus: "pending" });
});

it("does not returns the bucket", async () => {
const result = await getBaseBucketForBuildAndCommit(
build,
"766b744bc5fa27a330283dfd47ffafdaf905a941",
);
expect(result).toBeNull();
});
});

describe("if the associated build is a type check without any diff", () => {
beforeEach(async () => {
await baseBucketBuild.$query().patch({ type: "check" });
});

it("does not returns the bucket", async () => {
const result = await getBaseBucketForBuildAndCommit(
build,
"766b744bc5fa27a330283dfd47ffafdaf905a941",
);
expect(result).toBeNull();
});
});

describe("if the associated build is a type check with unapproved diff", () => {
beforeEach(async () => {
await baseBucketBuild.$query().patch({ type: "check" });
await factory.ScreenshotDiff.create({
buildId: baseBucketBuild.id,
validationStatus: "rejected",
});
});

it("does not returns the bucket", async () => {
const result = await getBaseBucketForBuildAndCommit(
build,
"766b744bc5fa27a330283dfd47ffafdaf905a941",
);
expect(result).toBeNull();
});
});

describe("if the associated build is a type check with approved diff", () => {
beforeEach(async () => {
await baseBucketBuild.$query().patch({ type: "check" });
await factory.ScreenshotDiff.create({
buildId: baseBucketBuild.id,
validationStatus: "accepted",
});
});

it("returns the bucket", async () => {
const result = await getBaseBucketForBuildAndCommit(
build,
"766b744bc5fa27a330283dfd47ffafdaf905a941",
);
expect(result).toEqual(baseBucket);
});
});
});

Expand All @@ -78,7 +139,8 @@ describe("#getBaseBucketForBuildAndCommit", () => {
{
baseScreenshotBucketId: null,
compareScreenshotBucketId: baseBucket.id,
jobStatus: "pending",
jobStatus: "complete",
type: "reference",
prHeadCommit: null,
name: "default",
projectId: project.id,
Expand Down
41 changes: 33 additions & 8 deletions apps/backend/src/build/strategy/strategies/ci/query.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
import { Build, ScreenshotBucket } from "@/database/models/index.js";
import {
Build,
ScreenshotBucket,
ScreenshotDiff,
} from "@/database/models/index.js";

/**
* Get the base bucket for a build and a commit.
Expand Down Expand Up @@ -30,11 +34,32 @@ export async function getBaseBucketForBuildAndCommit(
* Query the base bucket from a build.
*/
export function queryBaseBucket(build: Build) {
return ScreenshotBucket.query().where({
projectId: build.projectId,
name: build.name,
complete: true,
valid: true,
mode: build.mode,
});
const approvedBuilds = Build.query()
.select("compareScreenshotBucketId")
.where("projectId", build.projectId)
.where("name", build.name)
.where("mode", build.mode)
.where("jobStatus", "complete")
.whereNot("id", build.id)
.where((qb) => {
// Reference build or check build with accepted diffs
qb.where("type", "reference").orWhere((qb) => {
qb.where("type", "check").whereExists(
ScreenshotDiff.query()
.select(1)
.whereRaw('"buildId" = builds.id')
.where("validationStatus", "accepted"),
);
});
});

return ScreenshotBucket.query()
.where({
projectId: build.projectId,
name: build.name,
complete: true,
valid: true,
mode: build.mode,
})
.whereIn("id", approvedBuilds);
}

0 comments on commit 4fd8aba

Please sign in to comment.