From cb2ebe2e944e6f479c6c93f6df2e957c1d154205 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Bigourdan <10694593+PyvesB@users.noreply.github.com> Date: Wed, 14 Feb 2024 19:52:47 +0100 Subject: [PATCH] migrate examples to openApi part 37; affects [bitbucket bitrise chromewebstore circleci] (#9881) * migrate some services from examples to openApi * Fix Bitbucket tests and examples * Fix CircleCI and Bitrise tests * Use fake token in Bitrise examples * Use JohnEstropia/CoreStore token in Bitrise tests --- .../bitbucket/bitbucket-issues.service.js | 31 +++++--- services/bitbucket/bitbucket-issues.tester.js | 8 +- .../bitbucket/bitbucket-pipelines.service.js | 6 +- .../bitbucket/bitbucket-pipelines.tester.js | 28 ++++--- .../bitbucket-pull-request.service.js | 46 +++++++----- .../bitbucket/bitbucket-pull-request.spec.js | 2 +- .../bitbucket-pull-request.tester.js | 8 +- services/bitrise/bitrise.service.js | 46 ++++++++++-- services/bitrise/bitrise.tester.js | 10 +-- .../chrome-web-store-rating.service.js | 50 ++++++++----- services/circleci/circleci.service.js | 75 +++++++++++++++---- services/circleci/circleci.tester.js | 2 +- 12 files changed, 208 insertions(+), 104 deletions(-) diff --git a/services/bitbucket/bitbucket-issues.service.js b/services/bitbucket/bitbucket-issues.service.js index 2da5a629cd224..58a4b14619926 100644 --- a/services/bitbucket/bitbucket-issues.service.js +++ b/services/bitbucket/bitbucket-issues.service.js @@ -1,7 +1,7 @@ import Joi from 'joi' import { metric } from '../text-formatters.js' import { nonNegativeInteger } from '../validators.js' -import { BaseJsonService } from '../index.js' +import { BaseJsonService, pathParams } from '../index.js' const bitbucketIssuesSchema = Joi.object({ size: nonNegativeInteger, @@ -10,22 +10,33 @@ const bitbucketIssuesSchema = Joi.object({ function issueClassGenerator(raw) { const routePrefix = raw ? 'issues-raw' : 'issues' const badgeSuffix = raw ? '' : ' open' + const titleSuffix = raw ? ' (raw)' : '' return class BitbucketIssues extends BaseJsonService { static name = `BitbucketIssues${raw ? 'Raw' : ''}` static category = 'issue-tracking' static route = { base: `bitbucket/${routePrefix}`, pattern: ':user/:repo' } - static examples = [ - { - title: 'Bitbucket open issues', - namedParams: { - user: 'atlassian', - repo: 'python-bitbucket', + static get openApi() { + const key = `/bitbucket/${routePrefix}/{user}/{repo}` + const route = {} + route[key] = { + get: { + summary: `Bitbucket open issues ${titleSuffix}`, + parameters: pathParams( + { + name: 'user', + example: 'shields-io', + }, + { + name: 'repo', + example: 'test-repo', + }, + ), }, - staticPreview: this.render({ issues: 33 }), - }, - ] + } + return route + } static defaultBadgeData = { label: 'issues' } diff --git a/services/bitbucket/bitbucket-issues.tester.js b/services/bitbucket/bitbucket-issues.tester.js index 4bdb300b52e05..cdf434ea00b77 100644 --- a/services/bitbucket/bitbucket-issues.tester.js +++ b/services/bitbucket/bitbucket-issues.tester.js @@ -8,14 +8,14 @@ export const t = new ServiceTester({ }) t.create('issues-raw (valid)') - .get('/issues-raw/atlassian/python-bitbucket.json') + .get('/issues-raw/shields-io/test-repo.json') .expectBadge({ label: 'issues', message: isMetric, }) t.create('issues-raw (not found)') - .get('/issues-raw/atlassian/not-a-repo.json') + .get('/issues-raw/shields-io/not-a-repo.json') .expectBadge({ label: 'issues', message: 'not found' }) t.create('issues-raw (private repo)') @@ -23,14 +23,14 @@ t.create('issues-raw (private repo)') .expectBadge({ label: 'issues', message: 'private repo' }) t.create('issues (valid)') - .get('/issues/atlassian/python-bitbucket.json') + .get('/issues/shields-io/test-repo.json') .expectBadge({ label: 'issues', message: isMetricOpenIssues, }) t.create('issues (not found)') - .get('/issues/atlassian/not-a-repo.json') + .get('/issues/shields-io/not-a-repo.json') .expectBadge({ label: 'issues', message: 'not found' }) t.create('issues (private repo)') diff --git a/services/bitbucket/bitbucket-pipelines.service.js b/services/bitbucket/bitbucket-pipelines.service.js index 76373a15acc76..3e26df343f80f 100644 --- a/services/bitbucket/bitbucket-pipelines.service.js +++ b/services/bitbucket/bitbucket-pipelines.service.js @@ -37,15 +37,15 @@ class BitbucketPipelines extends BaseJsonService { parameters: pathParams( { name: 'user', - example: 'atlassian', + example: 'shields-io', }, { name: 'repo', - example: 'adf-builder-javascript', + example: 'test-repo', }, { name: 'branch', - example: 'task/SECO-2168', + example: 'main', }, ), }, diff --git a/services/bitbucket/bitbucket-pipelines.tester.js b/services/bitbucket/bitbucket-pipelines.tester.js index a271c04daea5e..3cdbb09aed124 100644 --- a/services/bitbucket/bitbucket-pipelines.tester.js +++ b/services/bitbucket/bitbucket-pipelines.tester.js @@ -23,27 +23,27 @@ function bitbucketApiResponse(status) { }) } -t.create('master build result (not found)') - .get('/atlassian/not-a-repo/master.json') +t.create('main build result (not found)') + .get('/shields-io/not-a-repo/main.json') .expectBadge({ label: 'build', message: 'not found' }) t.create('branch build result (valid)') - .get('/atlassian/adf-builder-javascript/shields-test-dont-remove.json') + .get('/shields-io/test-repo/main.json') .expectBadge({ label: 'build', message: isBuildStatus, }) t.create('branch build result (not found)') - .get('/atlassian/not-a-repo/some-branch.json') + .get('/shields-io/not-a-repo/some-branch.json') .expectBadge({ label: 'build', message: 'not found' }) t.create('branch build result (never built)') - .get('/atlassian/adf-builder-javascript/some/new/branch.json') + .get('/shields-io/test-repo/P-Y/update-readme-1704629121998.json') .expectBadge({ label: 'build', message: 'never built' }) t.create('build result (passing)') - .get('/atlassian/adf-builder-javascript/master.json') + .get('/shields-io/test-repo/main.json') .intercept(nock => nock('https://api.bitbucket.org') .get(/^\/2.0\/.*/) @@ -52,7 +52,7 @@ t.create('build result (passing)') .expectBadge({ label: 'build', message: 'passing' }) t.create('build result (failing)') - .get('/atlassian/adf-builder-javascript/master.json') + .get('/shields-io/test-repo/main.json') .intercept(nock => nock('https://api.bitbucket.org') .get(/^\/2.0\/.*/) @@ -61,7 +61,7 @@ t.create('build result (failing)') .expectBadge({ label: 'build', message: 'failing' }) t.create('build result (error)') - .get('/atlassian/adf-builder-javascript/master.json') + .get('/shields-io/test-repo/main.json') .intercept(nock => nock('https://api.bitbucket.org') .get(/^\/2.0\/.*/) @@ -70,7 +70,7 @@ t.create('build result (error)') .expectBadge({ label: 'build', message: 'error' }) t.create('build result (stopped)') - .get('/atlassian/adf-builder-javascript/master.json') + .get('/shields-io/test-repo/main.json') .intercept(nock => nock('https://api.bitbucket.org') .get(/^\/2.0\/.*/) @@ -79,7 +79,7 @@ t.create('build result (stopped)') .expectBadge({ label: 'build', message: 'stopped' }) t.create('build result (expired)') - .get('/atlassian/adf-builder-javascript/master.json') + .get('/shields-io/test-repo/main.json') .intercept(nock => nock('https://api.bitbucket.org') .get(/^\/2.0\/.*/) @@ -88,7 +88,7 @@ t.create('build result (expired)') .expectBadge({ label: 'build', message: 'expired' }) t.create('build result (unexpected status)') - .get('/atlassian/adf-builder-javascript/master.json') + .get('/shields-io/test-repo/main.json') .intercept(nock => nock('https://api.bitbucket.org') .get(/^\/2.0\/.*/) @@ -97,7 +97,5 @@ t.create('build result (unexpected status)') .expectBadge({ label: 'build', message: 'invalid response data' }) t.create('build result no branch redirect') - .get('/atlassian/adf-builder-javascript.svg') - .expectRedirect( - '/bitbucket/pipelines/atlassian/adf-builder-javascript/master.svg', - ) + .get('/shields-io/test-repo.svg') + .expectRedirect('/bitbucket/pipelines/shields-io/test-repo/master.svg') diff --git a/services/bitbucket/bitbucket-pull-request.service.js b/services/bitbucket/bitbucket-pull-request.service.js index 58c51acb765be..0e89e1d79c211 100644 --- a/services/bitbucket/bitbucket-pull-request.service.js +++ b/services/bitbucket/bitbucket-pull-request.service.js @@ -2,7 +2,7 @@ import Joi from 'joi' import { AuthHelper } from '../../core/base-service/auth-helper.js' import { metric } from '../text-formatters.js' import { nonNegativeInteger, optionalUrl } from '../validators.js' -import { BaseJsonService } from '../index.js' +import { BaseJsonService, pathParam, queryParam } from '../index.js' const schema = Joi.object({ size: nonNegativeInteger, @@ -21,6 +21,7 @@ const httpErrors = { function pullRequestClassGenerator(raw) { const routePrefix = raw ? 'pr-raw' : 'pr' const badgeSuffix = raw ? '' : ' open' + const titleSuffix = raw ? ' (raw)' : '' return class BitbucketPullRequest extends BaseJsonService { static name = `BitbucketPullRequest${raw ? 'Raw' : ''}` @@ -31,25 +32,32 @@ function pullRequestClassGenerator(raw) { queryParamSchema, } - static examples = [ - { - title: 'Bitbucket open pull requests', - namedParams: { - user: 'atlassian', - repo: 'python-bitbucket', + static get openApi() { + const key = `/bitbucket/${routePrefix}/{user}/{repo}` + const route = {} + route[key] = { + get: { + summary: `Bitbucket open pull requests ${titleSuffix}`, + parameters: [ + pathParam({ + name: 'user', + example: 'shields-io', + }), + pathParam({ + name: 'repo', + example: 'test-repo', + }), + queryParam({ + name: 'server', + example: 'https://bitbucket.mydomain.net', + description: + 'When not specified, this will default to `https://bitbucket.org`.', + }), + ], }, - staticPreview: this.render({ prs: 22 }), - }, - { - title: 'Bitbucket Server open pull requests', - namedParams: { - user: 'foo', - repo: 'bar', - }, - queryParams: { server: 'https://bitbucket.mydomain.net' }, - staticPreview: this.render({ prs: 42 }), - }, - ] + } + return route + } static defaultBadgeData = { label: 'pull requests' } diff --git a/services/bitbucket/bitbucket-pull-request.spec.js b/services/bitbucket/bitbucket-pull-request.spec.js index 1c136fadc1258..ff504d1cd428b 100644 --- a/services/bitbucket/bitbucket-pull-request.spec.js +++ b/services/bitbucket/bitbucket-pull-request.spec.js @@ -28,7 +28,7 @@ describe('BitbucketPullRequest', function () { }, private: { bitbucket_username: user, bitbucket_password: pass }, }, - { user: 'atlassian', repo: 'python-bitbucket' }, + { user: 'shields-io', repo: 'test-repo' }, ), ).to.deep.equal({ message: '42', diff --git a/services/bitbucket/bitbucket-pull-request.tester.js b/services/bitbucket/bitbucket-pull-request.tester.js index c1e6e04ee2298..a8e72f103d581 100644 --- a/services/bitbucket/bitbucket-pull-request.tester.js +++ b/services/bitbucket/bitbucket-pull-request.tester.js @@ -8,27 +8,27 @@ export const t = new ServiceTester({ }) t.create('pr-raw (valid)') - .get('/pr-raw/atlassian/python-bitbucket.json') + .get('/pr-raw/shields-io/test-repo.json') .expectBadge({ label: 'pull requests', message: isMetric, }) t.create('pr-raw (not found)') - .get('/pr-raw/atlassian/not-a-repo.json') + .get('/pr-raw/shields-io/not-a-repo.json') .expectBadge({ label: 'pull requests', message: 'not found' }) t.create('pr-raw (private repo)') .get('/pr-raw/chris48s/example-private-repo.json') .expectBadge({ label: 'pull requests', message: 'not found' }) -t.create('pr (valid)').get('/pr/atlassian/python-bitbucket.json').expectBadge({ +t.create('pr (valid)').get('/pr/shields-io/test-repo.json').expectBadge({ label: 'pull requests', message: isMetricOpenIssues, }) t.create('pr (not found)') - .get('/pr/atlassian/not-a-repo.json') + .get('/pr/shields-io/not-a-repo.json') .expectBadge({ label: 'pull requests', message: 'not found' }) t.create('pr (private repo)') diff --git a/services/bitrise/bitrise.service.js b/services/bitrise/bitrise.service.js index 47d6c1cd34991..73d8538fbd79c 100644 --- a/services/bitrise/bitrise.service.js +++ b/services/bitrise/bitrise.service.js @@ -1,5 +1,5 @@ import Joi from 'joi' -import { BaseJsonService } from '../index.js' +import { BaseJsonService, pathParam, queryParam } from '../index.js' // https://devcenter.bitrise.io/api/app-status-badge/ const schema = Joi.object({ @@ -18,14 +18,44 @@ export default class Bitrise extends BaseJsonService { queryParamSchema, } - static examples = [ - { - title: 'Bitrise', - namedParams: { appId: '3ff11fe8457bd304', branch: 'master' }, - queryParams: { token: 'lESRN9rEFFfDq92JtXs_jw' }, - staticPreview: this.render({ status: 'success' }), + static openApi = { + '/bitrise/{appId}': { + get: { + summary: 'Bitrise', + parameters: [ + pathParam({ + name: 'appId', + example: '4a2b10a819d12b67', + }), + queryParam({ + name: 'token', + example: 'abc123def456', + required: true, + }), + ], + }, + }, + '/bitrise/{appId}/{branch}': { + get: { + summary: 'Bitrise (branch)', + parameters: [ + pathParam({ + name: 'appId', + example: 'e736852157296019', + }), + pathParam({ + name: 'branch', + example: 'master', + }), + queryParam({ + name: 'token', + example: 'abc123def456', + required: true, + }), + ], + }, }, - ] + } static defaultBadgeData = { label: 'bitrise' } diff --git a/services/bitrise/bitrise.tester.js b/services/bitrise/bitrise.tester.js index 059d88a1f1c7e..df3cdddd90ada 100644 --- a/services/bitrise/bitrise.tester.js +++ b/services/bitrise/bitrise.tester.js @@ -3,27 +3,27 @@ import { createServiceTester } from '../tester.js' export const t = await createServiceTester() t.create('deploy status') - .get('/3ff11fe8457bd304.json?token=lESRN9rEFFfDq92JtXs_jw') + .get('/e736852157296019.json?token=vhgAmaiF3tWZoQyFLkKM7g') .expectBadge({ label: 'bitrise', message: isBuildStatus, }) t.create('deploy status with branch') - .get('/3ff11fe8457bd304/master.json?token=lESRN9rEFFfDq92JtXs_jw') + .get('/e736852157296019/master.json?token=vhgAmaiF3tWZoQyFLkKM7g') .expectBadge({ label: 'bitrise', message: isBuildStatus, }) t.create('unknown branch') - .get('/cde737473028420d/unknown.json?token=GCIdEzacE4GW32jLVrZb7A') + .get('/e736852157296019/unknown.json?token=vhgAmaiF3tWZoQyFLkKM7g') .expectBadge({ label: 'bitrise', message: 'branch not found' }) t.create('invalid token') - .get('/cde737473028420d/unknown.json?token=token') + .get('/e736852157296019/unknown.json?token=token') .expectBadge({ label: 'bitrise', message: 'app not found or invalid token' }) t.create('invalid App ID') - .get('/invalid/master.json?token=GCIdEzacE4GW32jLVrZb7A') + .get('/invalid/master.json?token=vhgAmaiF3tWZoQyFLkKM7g') .expectBadge({ label: 'bitrise', message: 'app not found or invalid token' }) diff --git a/services/chrome-web-store/chrome-web-store-rating.service.js b/services/chrome-web-store/chrome-web-store-rating.service.js index 5c273b5357961..2386ca482f507 100644 --- a/services/chrome-web-store/chrome-web-store-rating.service.js +++ b/services/chrome-web-store/chrome-web-store-rating.service.js @@ -1,6 +1,6 @@ import { floorCount as floorCountColor } from '../color-formatters.js' import { metric, starRating } from '../text-formatters.js' -import { NotFound } from '../index.js' +import { NotFound, pathParams } from '../index.js' import BaseChromeWebStoreService from './chrome-web-store-base.js' class BaseChromeWebStoreRating extends BaseChromeWebStoreService { @@ -15,13 +15,17 @@ class ChromeWebStoreRating extends BaseChromeWebStoreRating { pattern: ':storeId', } - static examples = [ - { - title: 'Chrome Web Store', - namedParams: { storeId: 'ogffaloegjglncjfehdfplabnoondfjo' }, - staticPreview: this.render({ rating: '3.67' }), + static openApi = { + '/chrome-web-store/rating/{storeId}': { + get: { + summary: 'Chrome Web Store Rating', + parameters: pathParams({ + name: 'storeId', + example: 'ogffaloegjglncjfehdfplabnoondfjo', + }), + }, }, - ] + } static render({ rating }) { rating = Math.round(rating * 100) / 100 @@ -47,13 +51,17 @@ class ChromeWebStoreRatingCount extends BaseChromeWebStoreRating { pattern: ':storeId', } - static examples = [ - { - title: 'Chrome Web Store', - namedParams: { storeId: 'ogffaloegjglncjfehdfplabnoondfjo' }, - staticPreview: this.render({ ratingCount: 12 }), + static openApi = { + '/chrome-web-store/rating-count/{storeId}': { + get: { + summary: 'Chrome Web Store Rating Count', + parameters: pathParams({ + name: 'storeId', + example: 'ogffaloegjglncjfehdfplabnoondfjo', + }), + }, }, - ] + } static render({ ratingCount }) { return { @@ -81,13 +89,17 @@ class ChromeWebStoreRatingStars extends BaseChromeWebStoreRating { pattern: ':storeId', } - static examples = [ - { - title: 'Chrome Web Store', - namedParams: { storeId: 'ogffaloegjglncjfehdfplabnoondfjo' }, - staticPreview: this.render({ rating: '3.75' }), + static openApi = { + '/chrome-web-store/stars/{storeId}': { + get: { + summary: 'Chrome Web Store Stars', + parameters: pathParams({ + name: 'storeId', + example: 'ogffaloegjglncjfehdfplabnoondfjo', + }), + }, }, - ] + } static render({ rating }) { return { diff --git a/services/circleci/circleci.service.js b/services/circleci/circleci.service.js index 49ca87d5d07eb..ad04dc5a399b1 100644 --- a/services/circleci/circleci.service.js +++ b/services/circleci/circleci.service.js @@ -1,11 +1,16 @@ import Joi from 'joi' import { isBuildStatus, renderBuildStatusBadge } from '../build-status.js' -import { BaseSvgScrapingService, redirector } from '../index.js' +import { + BaseSvgScrapingService, + redirector, + pathParam, + queryParam, +} from '../index.js' const circleSchema = Joi.object({ message: isBuildStatus }).required() const queryParamSchema = Joi.object({ token: Joi.string() }).required() -const documentation = ` +const tokenDescription = `
You may specify an optional token to get the status for a private repository.
@@ -25,22 +30,62 @@ class CircleCi extends BaseSvgScrapingService {
queryParamSchema,
}
- static examples = [
- {
- title: 'CircleCI',
- namedParams: {
- vcsType: 'github',
- user: 'RedSparr0w',
- repo: 'node-csgo-parser',
- branch: 'master',
+ static openApi = {
+ '/circleci/build/{vcsType}/{user}/{repo}': {
+ get: {
+ summary: 'CircleCI',
+ parameters: [
+ pathParam({
+ name: 'vcsType',
+ schema: { type: 'string', enum: this.getEnum('vcsType') },
+ example: 'github',
+ }),
+ pathParam({
+ name: 'user',
+ example: 'RedSparr0w',
+ }),
+ pathParam({
+ name: 'repo',
+ example: 'node-csgo-parser',
+ }),
+ queryParam({
+ name: 'token',
+ example: 'abc123def456',
+ description: tokenDescription,
+ }),
+ ],
},
- queryParams: {
- token: 'abc123def456',
+ },
+ '/circleci/build/{vcsType}/{user}/{repo}/{branch}': {
+ get: {
+ summary: 'CircleCI (branch)',
+ parameters: [
+ pathParam({
+ name: 'vcsType',
+ schema: { type: 'string', enum: this.getEnum('vcsType') },
+ example: 'github',
+ }),
+ pathParam({
+ name: 'user',
+ example: 'RedSparr0w',
+ }),
+ pathParam({
+ name: 'repo',
+ example: 'node-csgo-parser',
+ }),
+ pathParam({
+ name: 'branch',
+ example: 'master',
+ }),
+ queryParam({
+ name: 'token',
+ example: 'abc123def456',
+ description: tokenDescription,
+ }),
+ ],
},
- staticPreview: this.render({ status: 'success' }),
- documentation,
},
- ]
+ }
static defaultBadgeData = { label: 'build' }
diff --git a/services/circleci/circleci.tester.js b/services/circleci/circleci.tester.js
index 614971a97efd3..fdebfb82d1db2 100644
--- a/services/circleci/circleci.tester.js
+++ b/services/circleci/circleci.tester.js
@@ -33,7 +33,7 @@ t.create('circle ci (not found)')
t.create('circle ci (valid, with token)')
.get(
- '/build/gh/RedSparr0w/node-csgo-parser/master.json?token=b90b5c49e59a4c67ba3a92f7992587ac7a0408c2',
+ '/build/gh/justkd/uidmanager/main.json?token=2edcfec5c13eaf6d951a8f2939b220cdca74644c',
)
.expectBadge({
label: 'build',