Merge "Use page-error in gr-repo-detail-list and gr-plugin-list"
diff --git a/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.js b/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.js
index 1bcbcaa..6cbc94a 100644
--- a/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.js
+++ b/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.js
@@ -81,7 +81,10 @@
     },
 
     _getPlugins(filter, pluginsPerPage, offset) {
-      return this.$.restAPI.getPlugins(filter, pluginsPerPage, offset)
+      const errFn = response => {
+        this.fire('page-error', {response});
+      };
+      return this.$.restAPI.getPlugins(filter, pluginsPerPage, offset, errFn)
           .then(plugins => {
             if (!plugins) {
               this._plugins = [];
diff --git a/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list_test.html b/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list_test.html
index 5752aa1..9781cf7 100644
--- a/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list_test.html
@@ -131,8 +131,12 @@
           offset: 25,
         };
         element._paramsChanged(value).then(() => {
-          assert.isTrue(element.$.restAPI.getPlugins.lastCall
-              .calledWithExactly('test', 25, 25));
+          assert.equal(element.$.restAPI.getPlugins.lastCall.args[0],
+              'test');
+          assert.equal(element.$.restAPI.getPlugins.lastCall.args[1],
+              25);
+          assert.equal(element.$.restAPI.getPlugins.lastCall.args[2],
+              25);
           done();
         });
       });
@@ -152,5 +156,26 @@
         assert.equal(getComputedStyle(element.$.loading).display, 'none');
       });
     });
+
+    suite('404', () => {
+      test('fires page-error', done => {
+        const response = {status: 404};
+        sandbox.stub(element.$.restAPI, 'getPlugins',
+            (filter, pluginsPerPage, opt_offset, errFn) => {
+              errFn(response);
+            });
+
+        element.addEventListener('page-error', e => {
+          assert.deepEqual(e.detail.response, response);
+          done();
+        });
+
+        const value = {
+          filter: 'test',
+          offset: 25,
+        };
+        element._paramsChanged(value);
+      });
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.js b/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.js
index eaad353..feaadc7 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.js
+++ b/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.js
@@ -118,16 +118,19 @@
       this._loading = true;
       this._items = [];
       Polymer.dom.flush();
+      const errFn = response => {
+        this.fire('page-error', {response});
+      };
       if (detailType === DETAIL_TYPES.BRANCHES) {
         return this.$.restAPI.getRepoBranches(
-            filter, repo, itemsPerPage, offset) .then(items => {
+            filter, repo, itemsPerPage, offset, errFn).then(items => {
               if (!items) { return; }
               this._items = items;
               this._loading = false;
             });
       } else if (detailType === DETAIL_TYPES.TAGS) {
         return this.$.restAPI.getRepoTags(
-            filter, repo, itemsPerPage, offset) .then(items => {
+            filter, repo, itemsPerPage, offset, errFn).then(items => {
               if (!items) { return; }
               this._items = items;
               this._loading = false;
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list_test.html b/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list_test.html
index 6f75805..24edadc 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list_test.html
@@ -305,12 +305,41 @@
           offset: 25,
         };
         element._paramsChanged(params).then(() => {
-          assert.isTrue(element.$.restAPI.getRepoBranches.lastCall
-              .calledWithExactly('test', 'test', 25, 25));
+          assert.equal(element.$.restAPI.getRepoBranches.lastCall.args[0],
+              'test');
+          assert.equal(element.$.restAPI.getRepoBranches.lastCall.args[1],
+              'test');
+          assert.equal(element.$.restAPI.getRepoBranches.lastCall.args[2],
+              25);
+          assert.equal(element.$.restAPI.getRepoBranches.lastCall.args[3],
+              25);
           done();
         });
       });
     });
+
+    suite('404', () => {
+      test('fires page-error', done => {
+        const response = {status: 404};
+        sandbox.stub(element.$.restAPI, 'getRepoBranches',
+            (filter, repo, reposBranchesPerPage, opt_offset, errFn) => {
+              errFn(response);
+            });
+
+        element.addEventListener('page-error', e => {
+          assert.deepEqual(e.detail.response, response);
+          done();
+        });
+
+        const params = {
+          detail: 'branches',
+          repo: 'test',
+          filter: 'test',
+          offset: 25,
+        };
+        element._paramsChanged(params);
+      });
+    });
   });
 
   suite('Tags', () => {
@@ -459,8 +488,14 @@
           offset: 25,
         };
         element._paramsChanged(params).then(() => {
-          assert.isTrue(element.$.restAPI.getRepoTags.lastCall
-              .calledWithExactly('test', 'test', 25, 25));
+          assert.equal(element.$.restAPI.getRepoTags.lastCall.args[0],
+              'test');
+          assert.equal(element.$.restAPI.getRepoTags.lastCall.args[1],
+              'test');
+          assert.equal(element.$.restAPI.getRepoTags.lastCall.args[2],
+              25);
+          assert.equal(element.$.restAPI.getRepoTags.lastCall.args[3],
+              25);
           done();
         });
       });
@@ -491,5 +526,28 @@
         assert.isTrue(element._handleCloseCreate.called);
       });
     });
+
+    suite('404', () => {
+      test('fires page-error', done => {
+        const response = {status: 404};
+        sandbox.stub(element.$.restAPI, 'getRepoTags',
+            (filter, repo, reposTagsPerPage, opt_offset, errFn) => {
+              errFn(response);
+            });
+
+        element.addEventListener('page-error', e => {
+          assert.deepEqual(e.detail.response, response);
+          done();
+        });
+
+        const params = {
+          repo: 'test',
+          detail: 'tags',
+          filter: 'test',
+          offset: 25,
+        };
+        element._paramsChanged(params);
+      });
+    });
   });
 </script>