Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add API to list builds for an app #18

Merged
merged 1 commit into from
Sep 17, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,38 @@ declare interface App {
* include a git tag or a commit hash, a branch or a workfow ID.
*/
triggerBuild(buildParams?: BuildOptions): Promise<Build>;

/**
* @see https://api-docs.bitrise.io/#/builds/build-list
*
* @param listParams Parameters for the builds to list.
*/
listBuilds(listParams?: ListBuildOptions): Promise<BuildList>;
}

declare interface ListBuildOptions {
readonly sort_by?: string;
readonly branch?: string;
readonly workflow?: string;
readonly commit_message?: string;
readonly trigger_event_type?: string;
readonly pull_request_id?: number;
readonly build_number?: number;
readonly after?: number;
readonly before?: number;
readonly status?: number;
readonly next?: string;
readonly limit?: number;
}

declare interface BuildList {
readonly builds: Build[];
readonly paging: PageInfo;
}

declare interface PageInfo {
readonly next?: string;
readonly total_item_count: number;
}

declare interface AbortOptions {
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@
"dependencies": {
"axios": "^0.18.0",
"axios-retry": "^3.1.1",
"lodash": "^4.17.10"
"lodash": "^4.17.10",
"query-string": "^6.8.3"
},
"devDependencies": {
"@lifeomic/eslint-plugin-node": "^2.0.1",
Expand Down
18 changes: 18 additions & 0 deletions src/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ const isNil = require('lodash/isNil');
const negate = require('lodash/negate');
const pickBy = require('lodash/pickBy');
const project = require('../package.json');
const queryString = require('query-string');

const buildEnvironment = (environment) => {
if (!environment) {
Expand Down Expand Up @@ -65,8 +66,25 @@ const triggerBuild = async ({ client, slug }, options = {}) => {
return build({ appSlug: slug, client, buildSlug: response.data.build_slug });
};

const listBuilds = async ({ client, slug }, options = {}) => {
const query = queryString.stringify(options);
const queryPart = query ? `?${query}` : '';

const response = await client.get(`/apps/${slug}/builds${queryPart}`);

const builds = response.data.data.map((buildInfo) => {
return build({ appSlug: slug, client, buildSlug: buildInfo.slug });
});

return {
builds,
paging: response.data.paging
};
};

module.exports = ({ client, slug }) => {
const app = { slug };
app.triggerBuild = triggerBuild.bind(app, { client, slug });
app.listBuilds = listBuilds.bind(app, { client, slug });
return app;
};
27 changes: 26 additions & 1 deletion test/app.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const sinon = require('sinon');
const test = require('ava');
const uuid = require('uuid/v4');

const { stubTriggerBuild } = require('./stubs');
const { stubTriggerBuild, stubListBuilds } = require('./stubs');

test.beforeEach((test) => {
const client = axios.create();
Expand Down Expand Up @@ -280,3 +280,28 @@ test('environment variables can be supplied to a build', async (test) => {
})
);
});

test('an app can list builds', async (test) => {
const { app, client, slug } = test.context;
const stub = stubListBuilds({ appSlug: slug, axios: client });

const buildList = await app.listBuilds();
test.is(buildList.builds.length, 2);
test.is(buildList.builds[0].appSlug, slug);
test.is(buildList.builds[0].buildSlug, stub.builds[0].build_slug);
test.is(buildList.builds[1].appSlug, slug);
test.is(buildList.builds[1].buildSlug, stub.builds[1].build_slug);
});

test('an app can list a second page of builds', async (test) => {
const { app, client, slug } = test.context;
const next = uuid();
const stub = stubListBuilds({ appSlug: slug, axios: client, next });

const buildList = await app.listBuilds({ next });
test.is(buildList.builds.length, 2);
test.is(buildList.builds[0].appSlug, slug);
test.is(buildList.builds[0].buildSlug, stub.builds[0].build_slug);
test.is(buildList.builds[1].appSlug, slug);
test.is(buildList.builds[1].buildSlug, stub.builds[1].build_slug);
});
30 changes: 30 additions & 0 deletions test/stubs.js
Original file line number Diff line number Diff line change
Expand Up @@ -114,3 +114,33 @@ exports.stubTriggerBuild = ({ appSlug, axios, body }) => {
stub.build = build;
return stub;
};

exports.stubListBuilds = ({ appSlug, axios, next }) => {
const build1 = generateBuild();
const build2 = generateBuild();

const urlParts = [`/apps/${appSlug}/builds`];
if (next) {
urlParts.push(`?next=${next}`);
}
const url = urlParts.join('');

const stub = getStub(axios, 'get')
.withArgs(url)
.resolves({
data: {
data: [
{ slug: build1.build_slug },
{ slug: build2.build_slug }
],
paging: {
page_item_limit: 2,
total_item_count: 2
}
},
status: 200
});

stub.builds = [build1, build2];
return stub;
};
19 changes: 19 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -4069,6 +4069,15 @@ qs@~6.5.2:
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==

query-string@^6.8.3:
version "6.8.3"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.8.3.tgz#fd9fb7ffb068b79062b43383685611ee47777d4b"
integrity sha512-llcxWccnyaWlODe7A9hRjkvdCKamEKTh+wH8ITdTc3OhchaqUZteiSCX/2ablWHVrkVIe04dntnaZJ7BdyW0lQ==
dependencies:
decode-uri-component "^0.2.0"
split-on-first "^1.0.0"
strict-uri-encode "^2.0.0"

randomatic@^3.0.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed"
Expand Down Expand Up @@ -4606,6 +4615,11 @@ spdx-license-ids@^3.0.0:
resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654"
integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==

split-on-first@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f"
integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==

split-string@^3.0.1, split-string@^3.0.2:
version "3.1.0"
resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
Expand Down Expand Up @@ -4646,6 +4660,11 @@ static-extend@^0.1.1:
define-property "^0.2.5"
object-copy "^0.1.0"

strict-uri-encode@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=

string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
Expand Down