Skip to content

Commit

Permalink
refactor: tweak libraries/bower service classes and tests
Browse files Browse the repository at this point in the history
  • Loading branch information
calebcartwright committed Sep 29, 2021
1 parent e4588b4 commit baab63c
Show file tree
Hide file tree
Showing 9 changed files with 171 additions and 53 deletions.
9 changes: 0 additions & 9 deletions services/bower/bower-license.tester.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,6 @@ t.create('licence')
.get('/bootstrap.json')
.expectBadge({ label: 'license', message: 'MIT' })

t.create('license not declared')
.get('/bootstrap.json')
.intercept(nock =>
nock('https://libraries.io')
.get('/api/bower/bootstrap')
.reply(200, { normalized_licenses: [] })
)
.expectBadge({ label: 'license', message: 'missing' })

t.create('licence for Invalid Package')
.timeout(10000)
.get('/it-is-a-invalid-package-should-error.json')
Expand Down
12 changes: 9 additions & 3 deletions services/bower/bower-version.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,7 @@ class BowerVersion extends BaseBowerService {

static defaultBadgeData = { label: 'bower' }

async handle({ packageName }, queryParams) {
const data = await this.fetch({ packageName })
const includePrereleases = queryParams.include_prereleases !== undefined
static transform(data, includePrereleases) {
const version = includePrereleases
? data.latest_release_number
: data.latest_stable_release_number
Expand All @@ -38,6 +36,14 @@ class BowerVersion extends BaseBowerService {
throw new InvalidResponse({ prettyMessage: 'no releases' })
}

return version
}

async handle({ packageName }, queryParams) {
const data = await this.fetch({ packageName })
const includePrereleases = queryParams.include_prereleases !== undefined
const version = this.constructor.transform(data, includePrereleases)

return renderVersionBadge({ version })
}
}
Expand Down
92 changes: 92 additions & 0 deletions services/bower/bower-version.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import { expect } from 'chai'
import { test, given } from 'sazerac'
import nock from 'nock'
import { cleanUpNockAfterEach, defaultContext } from '../test-helpers.js'
import { InvalidResponse } from '../index.js'
import LibrariesIoApiProvider from '../librariesio/librariesio-api-provider.js'
import { BowerVersion } from './bower-version.service.js'

describe('BowerVersion', function () {
test(BowerVersion.transform, () => {
given(
{
latest_release_number: '2.0.0-beta',
latest_stable_release_number: '1.8.3',
},
false
).expect('1.8.3')
given(
{
latest_release_number: '2.0.0-beta',
latest_stable_release_number: '1.8.3',
},
true
).expect('2.0.0-beta')
})

it('throws `no releases` InvalidResponse if no stable version', function () {
expect(() =>
BowerVersion.transform({ latest_release_number: 'panda' }, false)
)
.to.throw(InvalidResponse)
.with.property('prettyMessage', 'no releases')
})

it('throws `no releases` InvalidResponse if no prereleases', function () {
expect(() =>
BowerVersion.transform({ latest_stable_release_number: 'penguin' }, true)
)
.to.throw(InvalidResponse)
.with.property('prettyMessage', 'no releases')
})

context('auth', function () {
cleanUpNockAfterEach()
const fakeApiKey = 'fakeness'
const response = {
normalized_licenses: [],
latest_release_number: '2.0.0-beta',
latest_stable_release_number: '1.8.3',
}
const config = {
private: {
librariesio_tokens: fakeApiKey,
},
}
const librariesIoApiProvider = new LibrariesIoApiProvider({
baseUrl: 'https://libraries.io/api',
tokens: [fakeApiKey],
})

it('sends the auth information as configured', async function () {
const scope = nock('https://libraries.io/api')
// This ensures that the expected credentials are actually being sent with the HTTP request.
// Without this the request wouldn't match and the test would fail.
.get(`/bower/bootstrap?api_key=${fakeApiKey}`)
.reply(200, response)

expect(
await BowerVersion.invoke(
{
...defaultContext,
librariesIoApiProvider,
},
config,
{
platform: 'bower',
packageName: 'bootstrap',
},
{
include_prereleases: '',
}
)
).to.deep.equal({
message: 'v2.0.0-beta',
color: 'orange',
label: undefined,
})

scope.done()
})
})
})
18 changes: 0 additions & 18 deletions services/bower/bower-version.tester.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,24 +34,6 @@ t.create('Pre Version for Invalid Package')
.get('/v/it-is-a-invalid-package-should-error.json?include_prereleases')
.expectBadge({ label: 'bower', message: 'package not found' })

t.create('Version label should be `no releases` if no stable version')
.get('/v/bootstrap.json')
.intercept(nock =>
nock('https://libraries.io')
.get('/api/bower/bootstrap')
.reply(200, { normalized_licenses: [], latest_stable_release: null })
)
.expectBadge({ label: 'bower', message: 'no releases' })

t.create('Version label should be `no releases` if no pre-release')
.get('/v/bootstrap.json?include_prereleases')
.intercept(nock =>
nock('https://libraries.io')
.get('/api/bower/bootstrap')
.reply(200, { normalized_licenses: [], latest_release_number: null })
)
.expectBadge({ label: 'bower', message: 'no releases' })

t.create('Version (legacy redirect: vpre)')
.get('/vpre/bootstrap.svg')
.expectRedirect('/bower/v/bootstrap.svg?include_prereleases')
14 changes: 7 additions & 7 deletions services/librariesio/librariesio-dependencies.service.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Joi from 'joi'
import { BaseJsonService } from '../index.js'
import LibrariesIoBase from './librariesio-base.js'
import {
transform,
renderDependenciesBadge,
Expand All @@ -16,7 +16,7 @@ const schema = Joi.object({
.default([]),
}).required()

class LibrariesIoProjectDependencies extends BaseJsonService {
class LibrariesIoProjectDependencies extends LibrariesIoBase {
static category = 'dependencies'

static route = {
Expand Down Expand Up @@ -82,7 +82,7 @@ class LibrariesIoProjectDependencies extends BaseJsonService {
]

async handle({ platform, scope, packageName, version = 'latest' }) {
const url = `https://libraries.io/api/${encodeURIComponent(platform)}/${
const url = `/${encodeURIComponent(platform)}/${
scope ? encodeURIComponent(`${scope}/`) : ''
}${encodeURIComponent(packageName)}/${encodeURIComponent(
version
Expand All @@ -97,7 +97,7 @@ class LibrariesIoProjectDependencies extends BaseJsonService {
}
}

class LibrariesIoRepoDependencies extends BaseJsonService {
class LibrariesIoRepoDependencies extends LibrariesIoBase {
static category = 'dependencies'

static route = {
Expand All @@ -117,9 +117,9 @@ class LibrariesIoRepoDependencies extends BaseJsonService {
]

async handle({ user, repo }) {
const url = `https://libraries.io/api/github/${encodeURIComponent(
user
)}/${encodeURIComponent(repo)}/dependencies`
const url = `/github/${encodeURIComponent(user)}/${encodeURIComponent(
repo
)}/dependencies`
const json = await this._requestJson({
url,
schema,
Expand Down
13 changes: 5 additions & 8 deletions services/librariesio/librariesio-dependent-repos.service.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { metric } from '../text-formatters.js'
import { BaseJsonService } from '../index.js'
import { fetchProject } from './librariesio-common.js'
import LibrariesIoBase from './librariesio-base.js'

// https://libraries.io/api#project-dependent-repositories
export default class LibrariesIoDependentRepos extends BaseJsonService {
export default class LibrariesIoDependentRepos extends LibrariesIoBase {
static category = 'other'

static route = {
Expand Down Expand Up @@ -45,14 +44,12 @@ export default class LibrariesIoDependentRepos extends BaseJsonService {
}

async handle({ platform, scope, packageName }) {
const { dependent_repos_count: dependentReposCount } = await fetchProject(
this,
{
const { dependent_repos_count: dependentReposCount } =
await this.fetchProject({
platform,
scope,
packageName,
}
)
})
return this.constructor.render({ dependentReposCount })
}
}
7 changes: 3 additions & 4 deletions services/librariesio/librariesio-dependents.service.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { metric } from '../text-formatters.js'
import { BaseJsonService } from '../index.js'
import { fetchProject } from './librariesio-common.js'
import LibrariesIoBase from './librariesio-base.js'

// https://libraries.io/api#project-dependents
export default class LibrariesIoDependents extends BaseJsonService {
export default class LibrariesIoDependents extends LibrariesIoBase {
static category = 'other'

static route = {
Expand Down Expand Up @@ -45,7 +44,7 @@ export default class LibrariesIoDependents extends BaseJsonService {
}

async handle({ platform, scope, packageName }) {
const { dependents_count: dependentCount } = await fetchProject(this, {
const { dependents_count: dependentCount } = await this.fetchProject({
platform,
scope,
packageName,
Expand Down
7 changes: 3 additions & 4 deletions services/librariesio/librariesio-sourcerank.service.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import { colorScale } from '../color-formatters.js'
import { BaseJsonService } from '../index.js'
import { fetchProject } from './librariesio-common.js'
import LibrariesIoBase from './librariesio-base.js'

const sourceRankColor = colorScale([10, 15, 20, 25, 30])

export default class LibrariesIoSourcerank extends BaseJsonService {
export default class LibrariesIoSourcerank extends LibrariesIoBase {
static category = 'rating'

static route = {
Expand Down Expand Up @@ -46,7 +45,7 @@ export default class LibrariesIoSourcerank extends BaseJsonService {
}

async handle({ platform, scope, packageName }) {
const { rank } = await fetchProject(this, {
const { rank } = await this.fetchProject({
platform,
scope,
packageName,
Expand Down
52 changes: 52 additions & 0 deletions services/librariesio/librariesio-sourcerank.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { expect } from 'chai'
import nock from 'nock'
import { cleanUpNockAfterEach, defaultContext } from '../test-helpers.js'
import LibrariesIoSourcerank from './librariesio-sourcerank.service.js'
import LibrariesIoApiProvider from './librariesio-api-provider.js'

describe('LibrariesIoSourcerank', function () {
cleanUpNockAfterEach()
const fakeApiKey = 'fakeness'
const response = {
platform: 'npm',
dependents_count: 150,
dependent_repos_count: 191,
rank: 100,
}
const config = {
private: {
librariesio_tokens: fakeApiKey,
},
}
const librariesIoApiProvider = new LibrariesIoApiProvider({
baseUrl: 'https://libraries.io/api',
tokens: [fakeApiKey],
})

it('sends the auth information as configured', async function () {
const scope = nock('https://libraries.io/api')
// This ensures that the expected credentials are actually being sent with the HTTP request.
// Without this the request wouldn't match and the test would fail.
.get(`/npm/badge-maker?api_key=${fakeApiKey}`)
.reply(200, response)

expect(
await LibrariesIoSourcerank.invoke(
{
...defaultContext,
librariesIoApiProvider,
},
config,
{
platform: 'npm',
packageName: 'badge-maker',
}
)
).to.deep.equal({
message: 100,
color: 'brightgreen',
})

scope.done()
})
})

0 comments on commit baab63c

Please sign in to comment.