Fix incorrect disabled state for prev/next buttons

Prev/next buttons don't recalculate disable attributes values after
reopen dialog for a different fix.

Change-Id: I75f8dbf81bc7f27adcc66f9ee12010a2a259d3f8
diff --git a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.html b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.html
index 06edb9b..c650bb5 100644
--- a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.html
+++ b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.html
@@ -76,10 +76,10 @@
         </div>
         <div slot="footer" class="fix-picker" hidden$="[[hasSingleFix(_fixSuggestions)]]">
           <span>Suggested fix [[addOneTo(_selectedFixIdx)]] of [[_fixSuggestions.length]]</span>
-          <gr-button on-click="_onPrevFixClick" disabled$="[[_noPrevFix(_selectedFixIdx)]]">
+          <gr-button id="prevFix" on-click="_onPrevFixClick" disabled$="[[_noPrevFix(_selectedFixIdx)]]">
             <iron-icon icon="gr-icons:chevron-left"></iron-icon>
           </gr-button>
-          <gr-button on-click="_onNextFixClick" disabled$="[[_noNextFix(_selectedFixIdx)]]">
+          <gr-button id="nextFix" on-click="_onNextFixClick" disabled$="[[_noNextFix(_selectedFixIdx, _fixSuggestions)]]">
             <iron-icon icon="gr-icons:chevron-right"></iron-icon>
           </gr-button>
         </div>
diff --git a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.js b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.js
index 033ef02..102b2c7 100644
--- a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.js
+++ b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.js
@@ -152,9 +152,9 @@
       return _selectedFixIdx === 0;
     },
 
-    _noNextFix(_selectedFixIdx) {
-      if (this._fixSuggestions == null) return true;
-      return _selectedFixIdx === this._fixSuggestions.length - 1;
+    _noNextFix(_selectedFixIdx, fixSuggestions) {
+      if (fixSuggestions == null) return true;
+      return _selectedFixIdx === fixSuggestions.length - 1;
     },
 
     _close() {
diff --git a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog_test.html b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog_test.html
index f9bbd88..c1c1f6a 100644
--- a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog_test.html
@@ -40,11 +40,16 @@
     await readyToTest();
     let element;
     let sandbox;
-    const ROBOT_COMMENT = {
+    const ROBOT_COMMENT_WITH_TWO_FIXES = {
       robot_id: 'robot_1',
       fix_suggestions: [{fix_id: 'fix_1'}, {fix_id: 'fix_2'}],
     };
 
+    const ROBOT_COMMENT_WITH_ONE_FIX = {
+      robot_id: 'robot_1',
+      fix_suggestions: [{fix_id: 'fix_1'}],
+    };
+
     setup(() => {
       sandbox = sinon.sandbox.create();
       element = fixture('basic');
@@ -101,7 +106,7 @@
           }));
       sandbox.stub(element.$.applyFixOverlay, 'open').returns(Promise.resolve());
 
-      element.open({detail: {patchNum: 2, comment: ROBOT_COMMENT}})
+      element.open({detail: {patchNum: 2, comment: ROBOT_COMMENT_WITH_TWO_FIXES}})
           .then(() => {
             assert.equal(element._currentFix.fix_id, 'fix_1');
             assert.equal(element._currentPreviews.length, 2);
@@ -110,6 +115,22 @@
           });
     });
 
+    test('next button state updated when suggestions changed', done => {
+      sandbox.stub(element.$.restAPI, 'getRobotCommentFixPreview')
+          .returns(Promise.resolve({}));
+      sandbox.stub(element.$.applyFixOverlay, 'open').returns(Promise.resolve());
+
+      element.open({detail: {patchNum: 2, comment: ROBOT_COMMENT_WITH_ONE_FIX}})
+          .then(() => assert.isTrue(element.$.nextFix.disabled))
+          .then(() =>
+            element.open({detail: {patchNum: 2,
+              comment: ROBOT_COMMENT_WITH_TWO_FIXES}}))
+          .then(() => {
+            assert.isFalse(element.$.nextFix.disabled);
+            done();
+          });
+    });
+
     test('preview endpoint throws error should reset dialog', done => {
       sandbox.stub(window, 'fetch', (url => {
         if (url.endsWith('/preview')) {
@@ -123,7 +144,8 @@
       }));
       const errorStub = sinon.stub();
       document.addEventListener('network-error', errorStub);
-      element.open({detail: {patchNum: 2, comment: ROBOT_COMMENT}});
+      element.open({detail: {patchNum: 2,
+        comment: ROBOT_COMMENT_WITH_TWO_FIXES}});
       flush(() => {
         assert.isTrue(errorStub.called);
         assert.deepEqual(element._currentFix, {});
@@ -189,7 +211,7 @@
           }));
       sandbox.stub(element.$.applyFixOverlay, 'open').returns(Promise.resolve());
 
-      element.open({detail: {patchNum: 2, comment: ROBOT_COMMENT}})
+      element.open({detail: {patchNum: 2, comment: ROBOT_COMMENT_WITH_TWO_FIXES}})
           .then(() => {
             element._onNextFixClick();
             assert.equal(element._currentFix.fix_id, 'fix_2');