diff --git a/services/nuget/nuget-v3-service-family.js b/services/nuget/nuget-v3-service-family.js index 01faeab660b57438d4415c75364bc29dd5689848..783cc05a7816deb841cdb91cdbd0228d068c76bf 100644 --- a/services/nuget/nuget-v3-service-family.js +++ b/services/nuget/nuget-v3-service-family.js @@ -76,7 +76,7 @@ async function fetch( serviceInstance, { baseUrl, packageName, includePrereleases = false } ) { - const json = await serviceInstance._requestJson({ + return serviceInstance._requestJson({ schema, url: await searchServiceUrl(baseUrl, 'SearchQueryService'), options: { @@ -89,12 +89,6 @@ async function fetch( }, }, }) - - if (json.data.length === 1) { - return json.data[0] - } else { - throw new NotFound({ prettyMessage: 'package not found' }) - } } /* @@ -139,6 +133,21 @@ function createServiceFamily({ return renderVersionBadge(props) } + /* + * Extract version information from the raw package info. + */ + transform({ json, includePrereleases }) { + if (json.data.length === 1 && json.data[0].versions.length > 0) { + const { versions: packageVersions } = json.data[0] + const versions = packageVersions.map(item => + stripBuildMetadata(item.version) + ) + return selectVersion(versions, includePrereleases) + } else { + throw new NotFound({ prettyMessage: 'package not found' }) + } + } + async handle({ tenant, feed, which, packageName }) { const includePrereleases = which === 'vpre' const baseUrl = apiUrl({ @@ -149,9 +158,8 @@ function createServiceFamily({ withFeed, feed, }) - let { versions } = await fetch(this, { baseUrl, packageName }) - versions = versions.map(item => stripBuildMetadata(item.version)) - const version = selectVersion(versions, includePrereleases) + const json = await fetch(this, { baseUrl, packageName }) + const version = this.transform({ json, includePrereleases }) return this.constructor.render({ version, feed }) } } @@ -170,6 +178,20 @@ function createServiceFamily({ return renderDownloadBadge(props) } + /* + * Extract download count from the raw package. + */ + transform({ json }) { + if (json.data.length === 1) { + const packageInfo = json.data[0] + // Official NuGet server uses "totalDownloads" whereas MyGet uses + // "totaldownloads" (lowercase D). Ugh. + return packageInfo.totalDownloads || packageInfo.totaldownloads || 0 + } else { + throw new NotFound({ prettyMessage: 'package not found' }) + } + } + async handle({ tenant, feed, which, packageName }) { const baseUrl = apiUrl({ withTenant, @@ -179,13 +201,8 @@ function createServiceFamily({ withFeed, feed, }) - const packageInfo = await fetch(this, { baseUrl, packageName }) - - // Official NuGet server uses "totalDownloads" whereas MyGet uses - // "totaldownloads" (lowercase D). Ugh. - const downloads = - packageInfo.totalDownloads || packageInfo.totaldownloads || 0 - + const json = await fetch(this, { baseUrl, packageName }) + const downloads = this.transform({ json }) return this.constructor.render({ downloads }) } } diff --git a/services/nuget/nuget-v3-service-family.spec.js b/services/nuget/nuget-v3-service-family.spec.js new file mode 100644 index 0000000000000000000000000000000000000000..18b92dccd78992f30796e55028ca4bfffc775d15 --- /dev/null +++ b/services/nuget/nuget-v3-service-family.spec.js @@ -0,0 +1,91 @@ +'use strict' + +const { test, given } = require('sazerac') +const { createServiceFamily } = require('./nuget-v3-service-family') + +const { NugetVersionService, NugetDownloadService } = createServiceFamily({ + defaultLabel: 'nuget', + serviceBaseUrl: 'nuget', + apiBaseUrl: 'test', +}) + +function versionJson(versions) { + return { + data: [ + { + versions: versions.map(v => ({ + version: v, + })), + }, + ], + } +} + +function downloadsJson(payload) { + return { + data: [payload], + } +} + +const noDataJson = { data: [] } +const tooMuchDataJson = { data: [{}, {}] } + +describe('Nuget Version service', function () { + test(NugetVersionService.prototype.transform, () => { + given({ json: versionJson(['1.0.0']), includePrereleases: false }).expect( + '1.0.0' + ) + given({ + json: versionJson(['1.0.0', '1.0.1']), + includePrereleases: false, + }).expect('1.0.1') + given({ + json: versionJson(['1.0.0', '1.0.1-beta1']), + includePrereleases: false, + }).expect('1.0.0') + given({ + json: versionJson(['1.0.0', '1.0.1-beta1']), + includePrereleases: true, + }).expect('1.0.1-beta1') + + given({ + json: versionJson(['1.0.0+1', '1.0.1-beta1+1']), + includePrereleases: false, + }).expect('1.0.0') + given({ + json: versionJson(['1.0.0+1', '1.0.1-beta1+1']), + includePrereleases: true, + }).expect('1.0.1-beta1') + + given({ json: versionJson([]), includePrereleases: false }).expectError( + 'Not Found: package not found' + ) + given({ json: versionJson([]), includePrereleases: true }).expectError( + 'Not Found: package not found' + ) + given({ json: noDataJson, includePrereleases: false }).expectError( + 'Not Found: package not found' + ) + given({ json: noDataJson, includePrereleases: true }).expectError( + 'Not Found: package not found' + ) + given({ json: tooMuchDataJson, includePrereleases: false }).expectError( + 'Not Found: package not found' + ) + given({ json: tooMuchDataJson, includePrereleases: true }).expectError( + 'Not Found: package not found' + ) + }) +}) + +describe('Nuget Download service', function () { + test(NugetDownloadService.prototype.transform, () => { + given({ json: downloadsJson({ totalDownloads: 10 }) }).expect(10) + given({ json: downloadsJson({ totaldownloads: 11 }) }).expect(11) + given({ json: downloadsJson({ other: 11 }) }).expect(0) + given({ json: downloadsJson({}) }).expect(0) + + given({ json: noDataJson }).expectError('Not Found: package not found') + given({ json: tooMuchDataJson }).expectError('Not Found: package not found') + }) +})