From b4579adc44329e33c7491a78f14a53a7b30ce34c Mon Sep 17 00:00:00 2001
From: "Felix C. Stegerman" <flx@obfusk.net>
Date: Sat, 27 Jun 2020 22:44:48 +0200
Subject: [PATCH] [crates] recent_downloads can be null (#5237)

* crates: recent_downloads can be null

* crates: add test for recent_downloads = null
---
 services/crates/crates-base.js              |  2 +-
 services/crates/crates-downloads.service.js |  2 +-
 services/crates/crates-downloads.tester.js  | 16 ++++++++++++++++
 3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/services/crates/crates-base.js b/services/crates/crates-base.js
index 00a5742378..c14521c059 100644
--- a/services/crates/crates-base.js
+++ b/services/crates/crates-base.js
@@ -9,7 +9,7 @@ const keywords = ['Rust']
 const crateSchema = Joi.object({
   crate: Joi.object({
     downloads: nonNegativeInteger,
-    recent_downloads: nonNegativeInteger,
+    recent_downloads: nonNegativeInteger.allow(null),
     max_version: Joi.string().required(),
   }).required(),
   versions: Joi.array()
diff --git a/services/crates/crates-downloads.service.js b/services/crates/crates-downloads.service.js
index 4363716dac..b26fe393d2 100644
--- a/services/crates/crates-downloads.service.js
+++ b/services/crates/crates-downloads.service.js
@@ -87,7 +87,7 @@ module.exports = class CratesDownloads extends BaseCratesService {
       case 'dv':
         return json.crate ? json.versions[0].downloads : json.version.downloads
       case 'dr':
-        return json.crate.recent_downloads
+        return json.crate.recent_downloads || 0
       default:
         return json.crate ? json.crate.downloads : json.version.downloads
     }
diff --git a/services/crates/crates-downloads.tester.js b/services/crates/crates-downloads.tester.js
index c68374a403..da064bf954 100644
--- a/services/crates/crates-downloads.tester.js
+++ b/services/crates/crates-downloads.tester.js
@@ -37,6 +37,22 @@ t.create('recent downloads').get('/dr/libc.json').expectBadge({
   message: isMetric,
 })
 
+t.create('recent downloads (null)')
+  .get('/dr/libc.json')
+  .intercept(nock =>
+    nock('https://crates.io')
+      .get('/api/v1/crates/libc')
+      .reply(200, {
+        crate: {
+          downloads: 42,
+          recent_downloads: null,
+          max_version: '0.2.71',
+        },
+        versions: [{ downloads: 42, license: 'MIT OR Apache-2.0' }],
+      })
+  )
+  .expectBadge({ label: 'recent downloads', message: '0' })
+
 t.create('recent downloads (with version)')
   .get('/dr/libc/0.2.31.json')
   .expectBadge({
-- 
GitLab