From 2a9d142baf2ef8bd7682c584552b2eed6aec21a0 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Thu, 25 Apr 2019 12:28:40 +0200
Subject: [PATCH] fix(nuget): flexible query for non-nuget registries

---
 lib/datasource/nuget/v3.js    | 16 +++++++++++-----
 test/datasource/nuget.spec.js | 15 +++++++++++++++
 2 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/lib/datasource/nuget/v3.js b/lib/datasource/nuget/v3.js
index 2ccf6969d9..1b5a3073aa 100644
--- a/lib/datasource/nuget/v3.js
+++ b/lib/datasource/nuget/v3.js
@@ -60,7 +60,11 @@ async function getQueryUrl(url) {
 }
 
 async function getPkgReleases(registryUrl, feedUrl, pkgName) {
-  const queryUrl = `${feedUrl}?q=PackageId:${pkgName}&semVerLevel=2.0.0&prerelease=true`;
+  let queryUrl = `${feedUrl}?q=${pkgName}`;
+  if (registryUrl.toLowerCase() === defaultNugetFeed.toLowerCase()) {
+    queryUrl = queryUrl.replace('q=', 'q=PackageId:');
+    queryUrl += '&semVerLevel=2.0.0&prerelease=true';
+  }
   const dep = {
     pkgName,
   };
@@ -77,12 +81,14 @@ async function getPkgReleases(registryUrl, feedUrl, pkgName) {
       return null;
     }
 
-    // There are no pkgName is current feed
-    if (pkgUrlListRaw.body.totalHits === 0) {
+    const match = pkgUrlListRaw.body.data.find(
+      item => item.id.toLowerCase() === pkgName.toLowerCase()
+    );
+    if (!match) {
+      // There are no pkgName is current feed
       return null;
     }
-
-    dep.releases = (pkgUrlListRaw.body.data[0].versions || []).map(item => ({
+    dep.releases = (match.versions || []).map(item => ({
       version: item.version,
     }));
 
diff --git a/test/datasource/nuget.spec.js b/test/datasource/nuget.spec.js
index e1cc3abee4..0ef9a60c85 100644
--- a/test/datasource/nuget.spec.js
+++ b/test/datasource/nuget.spec.js
@@ -268,6 +268,21 @@ describe('datasource/nuget', () => {
       expect(res).toMatchSnapshot();
       expect(res.sourceUrl).toBeDefined();
     });
+    it('processes real data (v3) feed is not a nuget.org with mismatch', async () => {
+      got.mockReturnValueOnce({
+        body: JSON.parse(nugetIndexV3),
+        statusCode: 200,
+      });
+      got.mockReturnValueOnce({
+        body: JSON.parse(pkgListV3),
+        statusCode: 200,
+      });
+      const res = await datasource.getPkgReleases({
+        ...configV3NotNugetOrg,
+        lookupName: 'nun',
+      });
+      expect(res).toBeNull();
+    });
     it('processes real data without project url (v3)', async () => {
       got.mockReturnValueOnce({
         body: JSON.parse(nugetIndexV3),
-- 
GitLab