Return changes from mergeable in ChangeJson only if tested

If background mergeability checks are not working for some reason, we
should not blindly report that changes are unmergeable. We have enough
information stored in the change, namely the last SHA-1 tested
against, to know whether a check was ever successfully run. Take
advantage of this in ChangeJson.

Change-Id: I4df800d66ac929e9cd152795acd9f5b671bfd101
diff --git a/Documentation/rest-api-changes.txt b/Documentation/rest-api-changes.txt
index 369d563..1c6b0a3 100644
--- a/Documentation/rest-api-changes.txt
+++ b/Documentation/rest-api-changes.txt
@@ -2808,7 +2808,7 @@
 Only set if link:#reviewed[reviewed] is requested.
 |`mergeable`          |optional|
 Whether the change is mergeable. +
-Not set for merged changes.
+Not set for merged changes, or if the change has not yet been tested.
 |`insertions`         ||
 Number of inserted lines.
 |`deletions`          ||
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java
index 653310d..638a162 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java
@@ -267,7 +267,7 @@
     out.branch = in.getDest().getShortName();
     out.topic = in.getTopic();
     out.changeId = in.getKey().get();
-    out.mergeable = in.getStatus() != Change.Status.MERGED ? in.isMergeable() : null;
+    out.mergeable = isMergeable(in);
     ChangedLines changedLines = cd.changedLines();
     if (changedLines != null) {
       out.insertions = changedLines.insertions;
@@ -330,6 +330,14 @@
     return out;
   }
 
+  private Boolean isMergeable(Change c) {
+    if (c.getStatus() == Change.Status.MERGED
+        || c.getLastSha1MergeTested() == null) {
+      return null;
+    }
+    return c.isMergeable();
+  }
+
   private List<SubmitRecord> submitRecords(ChangeControl ctl, ChangeData cd)
       throws OrmException {
     if (cd.getSubmitRecords() != null) {