From 8664c19199e88bae8346b0a03bdb6163eb316b12 Mon Sep 17 00:00:00 2001 From: kristof0425 Date: Mon, 2 Sep 2019 22:11:07 +0200 Subject: [PATCH] feat(ci_source): add Buddy.works --- source/ci_source/providers/BuddyWorks.ts | 35 ++++++++ .../providers/_tests/_buddyWorks.test.ts | 82 +++++++++++++++++++ source/ci_source/providers/index.ts | 3 + 3 files changed, 120 insertions(+) create mode 100644 source/ci_source/providers/BuddyWorks.ts create mode 100644 source/ci_source/providers/_tests/_buddyWorks.test.ts diff --git a/source/ci_source/providers/BuddyWorks.ts b/source/ci_source/providers/BuddyWorks.ts new file mode 100644 index 000000000..e98d7d0d1 --- /dev/null +++ b/source/ci_source/providers/BuddyWorks.ts @@ -0,0 +1,35 @@ +import { Env, CISource } from "../ci_source" +import { ensureEnvKeysExist, ensureEnvKeysAreInt } from "../ci_source_helpers" +// TODO add Setup comments +export class BuddyWorks implements CISource { + constructor(private readonly env: Env) {} + + get name(): string { + return "Buddy.works" + } + + get isCI(): boolean { + return ensureEnvKeysExist(this.env, ["BUDDY_PIPELINE_ID"]) + } + + get isPR(): boolean { + const mustHave = ["BUDDY_PIPELINE_ID", "BUDDY_EXECUTION_PULL_REQUEST_ID", "BUDDY_REPO_SLUG"] + const mustBeInts = ["BUDDY_EXECUTION_PULL_REQUEST_ID"] + return ensureEnvKeysExist(this.env, mustHave) && ensureEnvKeysAreInt(this.env, mustBeInts) + } + + get pullRequestID(): string { + return this.env.BUDDY_EXECUTION_PULL_REQUEST_ID + } + + get repoSlug(): string { + return this.env.BUDDY_REPO_SLUG + } + + get ciRunURL() { + return this.env.BUDDY_EXECUTION_URL + } +} + +// Default ENV vars provided by Buddy.works +// https://buddy.works/docs/pipelines/environment-variables#default-environment-variables diff --git a/source/ci_source/providers/_tests/_buddyWorks.test.ts b/source/ci_source/providers/_tests/_buddyWorks.test.ts new file mode 100644 index 000000000..945b3930a --- /dev/null +++ b/source/ci_source/providers/_tests/_buddyWorks.test.ts @@ -0,0 +1,82 @@ +import { BuddyWorks } from "../BuddyWorks" +import { getCISourceForEnv } from "../../get_ci_source" + +const correctEnv = { + BUDDY_PIPELINE_ID: "170873", + BUDDY_EXECUTION_PULL_REQUEST_ID: "1799", + BUDDY_REPO_SLUG: "danger/dangerjs", + BUDDY_EXECUTION_URL: + "https://app.buddy.works/danger/dangerjs/pipelines/pipeline/170873/execution/5d6d49dbaab2cb6fdf975c71", +} + +describe("being found when looking for CI", () => { + it("finds Buddy.works with the right ENV", () => { + const ci = getCISourceForEnv(correctEnv) + expect(ci).toBeInstanceOf(BuddyWorks) + }) +}) + +describe(".isCI", () => { + test("validates when all Buddy.works environment vars are set", () => { + const buddyWorks = new BuddyWorks(correctEnv) + expect(buddyWorks.isCI).toBeTruthy() + }) + + test("does not validate without pipeline ID", () => { + const buddyWorks = new BuddyWorks({}) + expect(buddyWorks.isCI).toBeFalsy() + }) +}) + +describe(".isPR", () => { + test("validates when all Buddy.works environment vars are set", () => { + const buddyWorks = new BuddyWorks(correctEnv) + expect(buddyWorks.isPR).toBeTruthy() + }) + + test("does not validate without pipeline ID", () => { + const buddyWorks = new BuddyWorks({}) + expect(buddyWorks.isPR).toBeFalsy() + }) + + const envs = ["BUDDY_EXECUTION_PULL_REQUEST_ID", "BUDDY_REPO_SLUG"] + envs.forEach((key: string) => { + const env = Object.assign({}, correctEnv) + env[key] = null + + test(`does not validate when ${key} is missing`, () => { + const buddyWorks = new BuddyWorks(env) + expect(buddyWorks.isPR).toBeFalsy() + }) + }) + + it("needs to have a PR number", () => { + const env = Object.assign({}, correctEnv) + delete env.BUDDY_EXECUTION_PULL_REQUEST_ID + const buddyWorks = new BuddyWorks(env) + expect(buddyWorks.isPR).toBeFalsy() + }) +}) + +describe(".pullRequestID", () => { + it("pulls it out of the env", () => { + const buddyWorks = new BuddyWorks(correctEnv) + expect(buddyWorks.pullRequestID).toEqual("1799") + }) +}) + +describe(".repoSlug", () => { + it("pulls it out of the env", () => { + const buddyWorks = new BuddyWorks(correctEnv) + expect(buddyWorks.repoSlug).toEqual("danger/dangerjs") + }) +}) + +describe(".ciRunURL", () => { + it("pulls it out of the env", () => { + const buddyWorks = new BuddyWorks(correctEnv) + expect(buddyWorks.ciRunURL).toEqual( + "https://app.buddy.works/danger/dangerjs/pipelines/pipeline/170873/execution/5d6d49dbaab2cb6fdf975c71" + ) + }) +}) diff --git a/source/ci_source/providers/index.ts b/source/ci_source/providers/index.ts index 050753560..37616665c 100644 --- a/source/ci_source/providers/index.ts +++ b/source/ci_source/providers/index.ts @@ -1,6 +1,7 @@ import { AppCenter } from "./AppCenter" import { Bitrise } from "./Bitrise" import { BuddyBuild } from "./BuddyBuild" +import { BuddyWorks } from "./BuddyWorks" import { Buildkite } from "./Buildkite" import { Circle } from "./Circle" import { CodeBuild } from "./CodeBuild" @@ -38,6 +39,7 @@ const providers = [ Drone, Buildkite, BuddyBuild, + BuddyWorks, VSTS, Bitrise, TeamCity, @@ -65,6 +67,7 @@ const realProviders = [ Drone, Buildkite, BuddyBuild, + BuddyWorks, VSTS, TeamCity, Screwdriver,