Merge "Add support for listing pending checks by scheme prefix"
diff --git a/gr-checks/gr-checkers-list.html b/gr-checks/gr-checkers-list.html
index 36e8f85..6c62e4d 100644
--- a/gr-checks/gr-checkers-list.html
+++ b/gr-checks/gr-checkers-list.html
@@ -121,7 +121,7 @@
       </template>
     </nav>
 
-    <gr-overlay id="createOverlay" with-backdrop>
+    <gr-overlay id="createOverlay">
       <gr-dialog
           id="createDialog"
           confirm-label="Create"
@@ -138,7 +138,7 @@
         </div>
       </gr-dialog>
     </gr-overlay>
-    <gr-overlay id="editOverlay" with-backdrop>
+    <gr-overlay id="editOverlay">
       <gr-dialog
           id="editDialog"
           confirm-label="Save"
diff --git a/gr-checks/gr-checkers-list.js b/gr-checks/gr-checkers-list.js
index 2542832..d2c7256 100644
--- a/gr-checks/gr-checkers-list.js
+++ b/gr-checks/gr-checkers-list.js
@@ -9,7 +9,15 @@
   Polymer({
     is: 'gr-checkers-list',
     properties: {
-      pluginRestApi: Object,
+      /**
+       * Add observer on pluginRestApi to call getCheckers when it's defined
+       * as initially getCheckers was being called before pluginRestApi was
+       * initialised by gr-checks-view
+       */
+      pluginRestApi: {
+        type: Object,
+        observer: '_getCheckers'
+      },
       // Checker that will be passed to the editOverlay modal
       checker: Object,
       _checkers: Array,
@@ -51,10 +59,6 @@
       '_showCheckers(_checkers, _filter)',
     ],
 
-    attached() {
-      this._getCheckers();
-    },
-
     _contains(target, keyword) {
       return target.toLowerCase().includes(keyword.toLowerCase().trim());
     },
@@ -117,8 +121,9 @@
       }
     },
 
-    _getCheckers() {
-      this.pluginRestApi.fetchJSON({
+    _getCheckers(pluginRestApi) {
+      if (!pluginRestApi) return;
+      pluginRestApi.fetchJSON({
         method: 'GET',
         url: GET_CHECKERS_URL,
       }).then(checkers => {
diff --git a/gr-checks/gr-checkers-list_test.html b/gr-checks/gr-checkers-list_test.html
new file mode 100644
index 0000000..6b5e0ad
--- /dev/null
+++ b/gr-checks/gr-checkers-list_test.html
@@ -0,0 +1,244 @@
+<!DOCTYPE html>
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<script src="/bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="/bower_components/web-component-tester/browser.js"></script>
+
+<link rel="import" href="/bower_components/polymer/polymer.html">
+
+<title>gr-checkers-list-view</title>
+<link rel="import" href="gr-checkers-list.html">
+
+<test-fixture id="basic">
+  <template is="dom-template">
+    <gr-checkers-list
+      plugin-rest-api="[[pluginRestApi]]"
+    >
+    </gr-checkers-list>
+</template>
+</test-fixture>
+
+<script>
+  const CHECKERS = [
+    {
+        "uuid":"C:D",
+        "name":"A",
+        "description":"B",
+        "repository":"Backend",
+        "status":"ENABLED",
+        "blocking":[
+
+        ],
+        "query":"status:open",
+        "created":"2019-07-25 13:08:43.000000000",
+        "updated":"2019-07-25 13:08:43.000000000"
+    },
+    {
+        "uuid":"aa:bb",
+        "name":"n1",
+        "description":"d1",
+        "repository":"All-Users",
+        "status":"ENABLED",
+        "blocking":[
+
+        ],
+        "query":"status:open",
+        "created":"2019-07-29 13:07:17.000000000",
+        "updated":"2019-07-29 13:07:17.000000000"
+    },
+    {
+        "uuid":"adsf:asdasdas",
+        "name":"ds",
+        "description":"s",
+        "repository":"Scripts",
+        "status":"ENABLED",
+        "blocking":[
+
+        ],
+        "query":"status:open",
+        "created":"2019-07-29 13:28:09.000000000",
+        "updated":"2019-07-29 13:28:09.000000000"
+    },
+    {
+        "uuid":"ijkl:mnop",
+        "name":"abcd",
+        "description":"efgh",
+        "repository":"All-Projects",
+        "status":"ENABLED",
+        "blocking":[
+
+        ],
+        "query":"status:open",
+        "created":"2019-07-29 09:33:25.000000000",
+        "updated":"2019-07-29 09:33:25.000000000"
+    },
+    {
+        "uuid":"ngfnf:mhghgnhghn",
+        "name":"nbvfg",
+        "description":"fjhgj",
+        "repository":"All-Users",
+        "status":"ENABLED",
+        "blocking":[
+
+        ],
+        "query":"status:open",
+        "created":"2019-08-06 14:21:34.000000000",
+        "updated":"2019-08-06 14:21:34.000000000"
+    },
+    {
+        "uuid":"sdfsdf--:sdfsdf333",
+        "name":"sdfsdf",
+        "description":"sdfsdfsd",
+        "repository":"Scripts",
+        "status":"ENABLED",
+        "blocking":[
+
+        ],
+        "query":"status:open",
+        "created":"2019-07-30 13:00:19.000000000",
+        "updated":"2019-07-30 13:00:19.000000000"
+    },
+    {  
+        "uuid":"test:checker1",
+        "name":"Unit Tests",
+        "description":"Random description that should be improved at some point",
+        "repository":"Backend",
+        "status":"ENABLED",
+        "blocking":[
+
+        ],
+        "query":"status:open",
+        "created":"2019-07-22 13:16:52.000000000",
+        "updated":"2019-07-22 14:21:14.000000000"
+    },
+    {
+        "uuid":"test:checker2",
+        "name":"Code Style",
+        "repository":"Backend",
+        "status":"ENABLED",
+        "blocking":[
+
+        ],
+        "query":"status:open",
+        "created":"2019-07-22 13:26:56.000000000",
+        "updated":"2019-07-22 13:26:56.000000000"
+    },
+    {
+        "uuid":"xddf:sdfsdfsdf",
+        "name":"sdfsdf",
+        "description":"sdfsdf",
+        "repository":"Scripts",
+        "status":"ENABLED",
+        "blocking":[
+
+        ],
+        "query":"status:open",
+        "created":"2019-07-29 14:11:59.000000000",
+        "updated":"2019-07-29 14:11:59.000000000"
+    },
+    {
+        "uuid":"zxczxc:bnvnbvnbvn",
+        "name":"zxc",
+        "description":"zxc",
+        "repository":"Scripts",
+        "status":"ENABLED",
+        "blocking":[
+
+        ],
+        "query":"status:open",
+        "created":"2019-07-29 14:00:24.000000000",
+        "updated":"2019-07-29 14:00:24.000000000"
+    },
+    {
+        "uuid":"zxczxc:sdfsdf",
+        "name":"zxc",
+        "description":"zxc",
+        "repository":"Scripts",
+        "status":"ENABLED",
+        "blocking":[
+
+        ],
+        "query":"status:open",
+        "created":"2019-07-29 13:30:47.000000000",
+        "updated":"2019-07-29 13:30:47.000000000"
+    }
+  ];
+</script>
+
+<script>
+
+  suite('gr-checkers-list tests', () => {
+    let element;
+    let sandbox;
+    let fetchJSONSpy, fetchJSONPromise, fetchJSONResolve;
+
+    setup((done) => {
+      sandbox = sinon.sandbox.create();
+
+      fetchJSONSpy = sinon.stub();
+      const fetchJSONPromise = new Promise((resolve, reject) => {
+      fetchJSONResolve = resolve;
+      })
+      fetchJSONSpy.returns(fetchJSONPromise)
+
+      const pluginRestApi = {
+        fetchJSON: fetchJSONSpy,
+      };
+
+      element = fixture('basic', {
+        pluginRestApi
+      });
+      flush(done);
+    });
+
+    teardown(() => { sandbox.restore(); });
+
+    test('renders checker list table headings', () => {
+      const checkersList = element.$$('table')
+      const headings = checkersList.firstElementChild.firstElementChild.
+                        children;
+      const expectedHeadings = ["Checker Name", "Repository", "Status",
+        "Required", "Checker Description", "Edit"];
+      for (let i = 0;i < headings.length;i++) {
+        assert(headings[i].innerText === expectedHeadings[i]);
+      }
+    });
+
+    test('create checker button renders', () => {
+      assert(element.querySelector('#createNewContainer'));
+      const button = element.querySelector('#createNewContainer')
+                            .querySelector('gr-button');
+      assert(button);
+      assert(button.innerText === 'Create New');
+    });
+
+    suite('with checkers', () => {
+      setup((done) => {
+        fetchJSONResolve(CHECKERS);
+        flush(done);
+      })
+      test('renders correct number of checkers', () => {
+        const checkers = element.$$('table > tbody:nth-child(2)')
+                                .querySelectorAll('tr');
+        assert(checkers.length === CHECKERS.length);
+      })
+      test('renders correct checkers', () => {
+        const checkers = element.$$('table > tbody:nth-child(2)')
+                                .querySelectorAll('tr');
+        for (let i = 0;i < checkers.length;i++) {
+          const checkerDetails = checkers[i].querySelectorAll('td');
+          assert(CHECKERS[i].name === checkerDetails[0].innerText);
+          assert(CHECKERS[i].repository === checkerDetails[1].innerText);
+          const status = CHECKERS[i].status || "NO";
+          assert(status === checkerDetails[2].innerText);
+          const checkerRequired = (CHECKERS[i].blocking && 
+                                   CHECKERS[i].blocking.length > 0)
+                                   ? "YES": "NO";
+          assert(checkerRequired === checkerDetails[3].innerText);
+          const description = CHECKERS[i].description || '';
+          assert(description === checkerDetails[4].innerText);
+        }
+      })
+    });
+
+  });
+</script>
diff --git a/java/com/google/gerrit/plugins/checks/acceptance/BUILD b/java/com/google/gerrit/plugins/checks/acceptance/BUILD
index 6a1d023..bea0c25 100644
--- a/java/com/google/gerrit/plugins/checks/acceptance/BUILD
+++ b/java/com/google/gerrit/plugins/checks/acceptance/BUILD
@@ -1,3 +1,5 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
 package(
     default_testonly = True,
     default_visibility = ["//plugins/checks:visibility"],
diff --git a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/BUILD b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/BUILD
index 577bfd4..203bab6 100644
--- a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/BUILD
+++ b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/BUILD
@@ -1,3 +1,5 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
 package(
     default_testonly = True,
     default_visibility = ["//plugins/checks:visibility"],
diff --git a/java/com/google/gerrit/plugins/checks/testing/BUILD b/java/com/google/gerrit/plugins/checks/testing/BUILD
index 6e4e2b7..0f67a93 100644
--- a/java/com/google/gerrit/plugins/checks/testing/BUILD
+++ b/java/com/google/gerrit/plugins/checks/testing/BUILD
@@ -1,3 +1,5 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
 package(
     default_testonly = True,
     default_visibility = ["//plugins/checks:visibility"],
diff --git a/proto/BUILD b/proto/BUILD
index 6e3b839..168ca6f 100644
--- a/proto/BUILD
+++ b/proto/BUILD
@@ -1,3 +1,6 @@
+load("@rules_proto//proto:defs.bzl", "proto_library")
+load("@rules_java//java:defs.bzl", "java_proto_library")
+
 package(default_visibility = ["//plugins/checks:visibility"])
 
 proto_library(