Check for missing "all" list on change detail label responses

Sometimes the "all" list is mistakenly omitted from detail responses.
Check for this and fail gracefully, rather than halting page load.

Also rearrange the order of some test assertion arguments.

Bug: Issue 7874
Change-Id: I10b143745401546e9a4d7ffd4f53420d762fa52a
diff --git a/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list.js b/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list.js
index 8c92199..b1e6a5a 100644
--- a/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list.js
+++ b/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list.js
@@ -118,6 +118,9 @@
      * @return {number}
      */
     _getReviewerPermittedScore(reviewer, change, label) {
+      // Note (issue 7874): sometimes the "all" list is not included in change
+      // detail responses, even when DETAILED_LABELS is included in options.
+      if (!change.labels[label].all) { return NaN; }
       const detailed = change.labels[label].all.filter(
           ({_account_id}) => reviewer._account_id === _account_id).pop();
       if (!detailed || !detailed.hasOwnProperty('permitted_voting_range')) {
diff --git a/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.html b/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.html
index c747415..985e4bb 100644
--- a/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.html
+++ b/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.html
@@ -311,12 +311,36 @@
           FooBar: ['-1', ' 0'],
         },
       };
-      assert.strictEqual('Votable: Bar',
-          element._computeReviewerTooltip({_account_id: 1}, change));
-      assert.strictEqual('Votable: Foo: +2, Bar, FooBar',
-          element._computeReviewerTooltip({_account_id: 7}, change));
-      assert.strictEqual('',
-          element._computeReviewerTooltip({_account_id: 2}, change));
+      assert.strictEqual(
+          element._computeReviewerTooltip({_account_id: 1}, change),
+          'Votable: Bar');
+      assert.strictEqual(
+          element._computeReviewerTooltip({_account_id: 7}, change),
+          'Votable: Foo: +2, Bar, FooBar');
+      assert.strictEqual(
+          element._computeReviewerTooltip({_account_id: 2}, change),
+          '');
+    });
+
+    test('fails gracefully when all is not included', () => {
+      const change = {
+        labels: {
+          Foo: {},
+          Bar: {},
+          FooBar: {},
+        },
+        permitted_labels: {
+          Foo: ['-1', ' 0', '+1', '+2'],
+          Bar: ['-1', ' 0', '+1', '+2'],
+          FooBar: ['-1', ' 0'],
+        },
+      };
+      assert.strictEqual(
+          element._computeReviewerTooltip({_account_id: 1}, change), '');
+      assert.strictEqual(
+          element._computeReviewerTooltip({_account_id: 7}, change), '');
+      assert.strictEqual(
+          element._computeReviewerTooltip({_account_id: 2}, change), '');
     });
   });
 </script>