From f6b09e9ca3d09a833474f55e22f7ed01eeb3fe8a Mon Sep 17 00:00:00 2001
From: Paula Barszcz <paula.anna.barszcz@gmail.com>
Date: Sun, 11 Sep 2022 21:53:54 +0200
Subject: [PATCH] fix Docker build status invalid response data bug (#8392)

closes #6235
---
 .../docker/docker-cloud-automated.service.js  |  6 ++++++
 .../docker/docker-cloud-automated.tester.js   | 20 +++++++++++++++++--
 services/docker/docker-cloud-build.service.js |  8 +++++++-
 services/docker/docker-cloud-build.tester.js  | 20 +++++++++++++++++--
 services/docker/docker-cloud-common-fetch.js  |  2 +-
 services/docker/docker-version.tester.js      |  2 +-
 6 files changed, 51 insertions(+), 7 deletions(-)

diff --git a/services/docker/docker-cloud-automated.service.js b/services/docker/docker-cloud-automated.service.js
index a4692a6435..55da8e9fe7 100644
--- a/services/docker/docker-cloud-automated.service.js
+++ b/services/docker/docker-cloud-automated.service.js
@@ -28,6 +28,12 @@ export default class DockerCloudAutomatedBuild extends BaseJsonService {
 
   async handle({ user, repo }) {
     const data = await fetchBuild(this, { user, repo })
+
+    if (data.objects.length === 0) {
+      return this.constructor.render({
+        buildSettings: [],
+      })
+    }
     return this.constructor.render({
       buildSettings: data.objects[0].build_settings,
     })
diff --git a/services/docker/docker-cloud-automated.tester.js b/services/docker/docker-cloud-automated.tester.js
index 936451900d..25e3614876 100644
--- a/services/docker/docker-cloud-automated.tester.js
+++ b/services/docker/docker-cloud-automated.tester.js
@@ -5,13 +5,29 @@ export const t = await createServiceTester()
 
 const isAutomatedBuildStatus = Joi.string().valid('automated', 'manual')
 
-t.create('docker cloud automated build (valid, user)')
-  .get('/jrottenberg/ffmpeg.json')
+t.create('docker cloud automated build (valid user)')
+  .get('/pavics/magpie.json')
   .expectBadge({
     label: 'docker build',
     message: isAutomatedBuildStatus,
   })
 
+t.create('docker cloud automated build status (invalid, nonexisting user)')
+  .get('/pavicsssss/magpie.json')
+  .expectBadge({
+    label: 'docker build',
+    message: `manual`,
+  })
+
+t.create(
+  `docker cloud build status (valid user, but the 'objects' array from the response is empty)`
+)
+  .get('/pavics/weaver.json')
+  .expectBadge({
+    label: 'docker build',
+    message: `manual`,
+  })
+
 t.create('docker cloud automated build (not found)')
   .get('/badges/not-a-real-repo.json')
   .intercept(nock =>
diff --git a/services/docker/docker-cloud-build.service.js b/services/docker/docker-cloud-build.service.js
index 8fd3aa8b45..22ec6f5d4f 100644
--- a/services/docker/docker-cloud-build.service.js
+++ b/services/docker/docker-cloud-build.service.js
@@ -1,4 +1,4 @@
-import { BaseJsonService } from '../index.js'
+import { BaseJsonService, NotFound } from '../index.js'
 import { dockerBlue, buildDockerUrl } from './docker-helpers.js'
 import { fetchBuild } from './docker-cloud-common-fetch.js'
 
@@ -31,6 +31,12 @@ export default class DockerCloudBuild extends BaseJsonService {
 
   async handle({ user, repo }) {
     const data = await fetchBuild(this, { user, repo })
+
+    if (data.objects.length === 0) {
+      throw new NotFound({
+        prettyMessage: `automated builds not set up`,
+      })
+    }
     return this.constructor.render({ state: data.objects[0].state })
   }
 }
diff --git a/services/docker/docker-cloud-build.tester.js b/services/docker/docker-cloud-build.tester.js
index 9335af2501..1f874d5879 100644
--- a/services/docker/docker-cloud-build.tester.js
+++ b/services/docker/docker-cloud-build.tester.js
@@ -3,13 +3,29 @@ import { createServiceTester } from '../tester.js'
 import { dockerBlue } from './docker-helpers.js'
 export const t = await createServiceTester()
 
-t.create('docker cloud build status (valid, user)')
-  .get('/jrottenberg/ffmpeg.json')
+t.create('docker cloud build status (valid user)')
+  .get('/pavics/magpie.json')
   .expectBadge({
     label: 'docker build',
     message: isBuildStatus,
   })
 
+t.create('docker cloud build status (invalid, nonexisting user)')
+  .get('/pavicsssss/magpie.json')
+  .expectBadge({
+    label: 'docker build',
+    message: `automated builds not set up`,
+  })
+
+t.create(
+  `docker cloud build status (valid user, but the 'objects' array from the response is empty)`
+)
+  .get('/pavics/weaver.json')
+  .expectBadge({
+    label: 'docker build',
+    message: `automated builds not set up`,
+  })
+
 t.create('docker cloud build status (not found)')
   .get('/badges/not-a-real-repo.json')
   .intercept(nock =>
diff --git a/services/docker/docker-cloud-common-fetch.js b/services/docker/docker-cloud-common-fetch.js
index f0047cb576..26204daee5 100644
--- a/services/docker/docker-cloud-common-fetch.js
+++ b/services/docker/docker-cloud-common-fetch.js
@@ -6,7 +6,7 @@ const cloudBuildSchema = Joi.object({
       Joi.object({
         state: Joi.string(),
         build_settings: Joi.array(),
-      }).required()
+      })
     )
     .required(),
 }).required()
diff --git a/services/docker/docker-version.tester.js b/services/docker/docker-version.tester.js
index fe13f28594..c737cb8abe 100644
--- a/services/docker/docker-version.tester.js
+++ b/services/docker/docker-version.tester.js
@@ -39,5 +39,5 @@ t.create('docker version (invalid, unknown repository)')
   .get('/_/not-a-real-repo.json')
   .expectBadge({
     label: 'version',
-    message: 'repository not found',
+    message: 'repository or tag not found',
   })
-- 
GitLab