diff --git a/services/macports/macports.service.js b/services/macports/macports.service.js new file mode 100644 index 0000000000000..67b2a362bcc2a --- /dev/null +++ b/services/macports/macports.service.js @@ -0,0 +1,50 @@ +import Joi from 'joi' +import { renderVersionBadge } from '../version.js' +import { BaseJsonService, pathParam } from '../index.js' + +const schema = Joi.object({ + version: Joi.string().required(), +}).required() + +export default class Macports extends BaseJsonService { + static category = 'version' + + static route = { + base: 'macports/v', + pattern: ':packageName', + } + + static openApi = { + '/macports/v/{packageName}': { + get: { + summary: 'MacPorts Package Version', + parameters: [ + pathParam({ + name: 'packageName', + example: 'proxy-audio-device', + }), + ], + }, + }, + } + + static defaultBadgeData = { + label: 'macports', + } + + portUrl({ packageName }) { + return `https://ports.macports.org/api/v1/ports/${encodeURIComponent(packageName)}/` + } + + async fetch({ packageName }) { + return this._requestJson({ + schema, + url: this.portUrl({ packageName }), + }) + } + + async handle({ packageName }) { + const data = await this.fetch({ packageName }) + return renderVersionBadge({ version: data.version }) + } +} diff --git a/services/macports/macports.service.spec.js b/services/macports/macports.service.spec.js new file mode 100644 index 0000000000000..ae55fd2013cdb --- /dev/null +++ b/services/macports/macports.service.spec.js @@ -0,0 +1,13 @@ +import { test, given } from 'sazerac' +import Macports from './macports.service.js' + +describe('Macports service', function () { + test(Macports.prototype.portUrl, () => { + given({ packageName: 'proxy-audio-device' }).expect( + 'https://ports.macports.org/api/v1/ports/proxy-audio-device/', + ) + given({ packageName: 'foo bar' }).expect( + 'https://ports.macports.org/api/v1/ports/foo%20bar/', + ) + }) +}) diff --git a/services/macports/macports.tester.js b/services/macports/macports.tester.js new file mode 100644 index 0000000000000..78932bfc1b5dc --- /dev/null +++ b/services/macports/macports.tester.js @@ -0,0 +1,21 @@ +import { isVPlusTripleDottedVersion } from '../test-validators.js' +import { createServiceTester } from '../tester.js' +export const t = await createServiceTester() + +t.create('macports (valid)').get('/proxy-audio-device.json').expectBadge({ + label: 'macports', + message: isVPlusTripleDottedVersion, +}) + +t.create('macports (valid, mocked)') + .get('/proxy-audio-device.json') + .intercept(nock => + nock('https://ports.macports.org') + .get('/api/v1/ports/proxy-audio-device/') + .reply(200, { version: '1.0.7' }), + ) + .expectBadge({ label: 'macports', message: 'v1.0.7' }) + +t.create('macports (not found)') + .get('/not-a-real-package.json') + .expectBadge({ label: 'macports', message: 'not found' })