Add robot comment count to patchset dropdown in findings tab

Screenshot : https://imgur.com/a/Sep83GD

Change-Id: Ia1501274ba873f18d0cdf1a902cefddb93dc2cdf
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
index 8550a9d..929c214 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
@@ -332,7 +332,8 @@
         _robotCommentsPatchSetDropdownItems: {
           type: Array,
           value() { return []; },
-          computed: '_computeRobotCommentsPatchSetDropdownItems(_change)',
+          computed: '_computeRobotCommentsPatchSetDropdownItems(_change, ' +
+            '_commentThreads)',
         },
         _currentRobotCommentsPatchSet: {
           type: Number,
@@ -631,13 +632,35 @@
       return false;
     }
 
-    _computeRobotCommentsPatchSetDropdownItems(change) {
-      if (!change.revisions) return [];
+    _robotCommentCountPerPatchSet(threads) {
+      return threads.reduce((robotCommentCountMap, thread) => {
+        const comments = thread.comments;
+        const robotCommentsCount = comments.reduce((acc, comment) =>
+          (comment.robot_id ? acc + 1 : acc), 0);
+        robotCommentCountMap[comments[0].patch_set] =
+            (robotCommentCountMap[comments[0].patch_set] || 0) +
+          robotCommentsCount;
+        return robotCommentCountMap;
+      }, {});
+    }
+
+    _computeText(patch, commentThreads) {
+      const commentCount = this._robotCommentCountPerPatchSet(commentThreads);
+      const commentCnt = commentCount[patch._number] || 0;
+      if (commentCnt === 0) return `Patchset ${patch._number}`;
+      const findingsText = commentCnt === 1 ? 'finding' : 'findings';
+      return `Patchset ${patch._number}`
+              + ` (${commentCnt} ${findingsText})`;
+    }
+
+    _computeRobotCommentsPatchSetDropdownItems(change, commentThreads) {
+      if (!change || !commentThreads || !change.revisions) return [];
+
       return Object.values(change.revisions)
           .filter(patch => patch._number !== 'edit')
           .map(patch => {
             return {
-              text: 'Patchset ' + patch._number,
+              text: this._computeText(patch, commentThreads),
               value: patch._number,
             };
           })
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
index 9b40f3e..17a6921 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
@@ -80,6 +80,21 @@
               name: 'user',
               username: 'user',
             },
+            patch_set: 2,
+            robot_id: 'rb1',
+            id: 'ecf9fa_fe1a5f62',
+            line: 5,
+            updated: '2018-02-08 18:49:18.000000000',
+            message: 'test',
+            unresolved: true,
+          },
+          {
+            __path: '/COMMIT_MSG',
+            author: {
+              _account_id: 1000000,
+              name: 'user',
+              username: 'user',
+            },
             patch_set: 4,
             id: 'ecf0b9fa_fe1a5f62',
             line: 5,
@@ -110,6 +125,21 @@
       {
         comments: [
           {
+            __path: '/COMMIT_MSG',
+            author: {
+              _account_id: 1000000,
+              name: 'user',
+              username: 'user',
+            },
+            patch_set: 3,
+            id: 'ecf0b9fa_fe5f62',
+            robot_id: 'rb2',
+            line: 5,
+            updated: '2018-02-08 18:49:18.000000000',
+            message: 'test',
+            unresolved: true,
+          },
+          {
             __path: 'test.txt',
             author: {
               _account_id: 1000000,
@@ -735,6 +765,23 @@
           done();
         });
       });
+
+      test('robot comments count per patchset', () => {
+        const count = element._robotCommentCountPerPatchSet(THREADS);
+        const expectedCount = {
+          2: 1,
+          3: 1,
+          4: 2,
+        };
+        assert.deepEqual(count, expectedCount);
+        assert.equal(element._computeText({_number: 2}, THREADS),
+            'Patchset 2 (1 finding)');
+        assert.equal(element._computeText({_number: 4}, THREADS),
+            'Patchset 4 (2 findings)');
+        assert.equal(element._computeText({_number: 5}, THREADS),
+            'Patchset 5');
+      });
+
       test('only robot comments are rendered', () => {
         assert.equal(element._robotCommentThreads.length, 2);
         assert.equal(element._robotCommentThreads[0].comments[0].robot_id,
@@ -745,7 +792,7 @@
       test('changing patchsets resets robot comments', done => {
         element.set('_change.current_revision', 'rev3');
         flush(() => {
-          assert.equal(element._robotCommentThreads.length, 0);
+          assert.equal(element._robotCommentThreads.length, 1);
           done();
         });
       });