Add rebase action with confirmation dialog

TODO in follow-up change
+ Autocomplete revisions/change numbers from the input
+ Consolidate button classes (it’s enough repeated code
  that it’s becomming a nuisance).
+ Perhaps move confirmation dialog functions into
  a behavior.

Change-Id: I382cc63591cd537dbe1d29a0451f392c1e77f287
diff --git a/polygerrit-ui/app/test/gr-change-actions-test.html b/polygerrit-ui/app/test/gr-change-actions-test.html
index 14dd010..3fc5ef1 100644
--- a/polygerrit-ui/app/test/gr-change-actions-test.html
+++ b/polygerrit-ui/app/test/gr-change-actions-test.html
@@ -78,30 +78,34 @@
           ')]}\'\n{}',  // The response is not used by the element.
         ]
       );
-    });
 
-    test('submit button shows', function(done) {
+      server.respondWith(
+        'POST',
+        '/changes/42/revisions/2/rebase',
+        [
+          200,
+          {'Content-Type': 'application/json'},
+          ')]}\'\n{}',  // The response is not used by the element.
+        ]
+      );
+
       element.changeNum = '42';
       element.patchNum = '2';
       element.reload();
 
       server.respond();
+    });
 
+    test('submit and rebase buttons show', function(done) {
       element.async(function() {
         var buttonEls = Polymer.dom(element.root).querySelectorAll('button');
-        assert.equal(buttonEls.length, 1);
+        assert.equal(buttonEls.length, 2);
         assert.isFalse(element.hidden);
         done();
       }, 1);
     });
 
     test('submit change', function(done) {
-      element.changeNum = '42';
-      element.patchNum = '2';
-      element.reload();
-
-      server.respond();
-
       element.async(function() {
         var submitButton = element.$$('button[data-action-key="submit"]');
         assert.ok(submitButton);
@@ -114,5 +118,38 @@
         });
       }, 1);
     });
+
+    test('rebase change', function(done) {
+      element.async(function() {
+        var rebaseButton = element.$$('button[data-action-key="rebase"]');
+        MockInteractions.tap(rebaseButton);
+
+        element.$.confirmRebase.base = '1234';
+        element._handleRebaseConfirm();
+        server.respond();
+        var lastRequest = server.requests[server.requests.length - 1];
+        assert.equal(lastRequest.requestBody, '{"base":"1234"}');
+
+        element.$.confirmRebase.base = '';
+        element._handleRebaseConfirm();
+        server.respond();
+        lastRequest = server.requests[server.requests.length - 1];
+        assert.equal(lastRequest.requestBody, '{}');
+
+        element.$.confirmRebase.base = 'does not matter';
+        element.$.confirmRebase.clearParent = true;
+        element._handleRebaseConfirm();
+        server.respond();
+        lastRequest = server.requests[server.requests.length - 1];
+        assert.equal(lastRequest.requestBody, '{"base":""}');
+
+        // Upon each request success it should fire the reload-change event.
+        var numEvents = 0;
+        element.addEventListener('reload-change', function(e) {
+          if (++numEvents == 3) { done(); }
+        });
+      }, 1);
+    });
+
   });
 </script>