Add tests for JSON view of refs

Change-Id: I920e640e830abe3250fe424d38aa52306fa94e61
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
index 67d5edc..9f551df 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
@@ -225,8 +225,8 @@
     }
   }
 
-  private static class RefJsonData {
-    public RefJsonData(Ref ref) {
+  static class RefJsonData {
+    RefJsonData(Ref ref) {
       value = ref.getObjectId().getName();
       if(ref.getPeeledObjectId() != null) {
         peeled = ref.getPeeledObjectId().getName();
@@ -236,8 +236,8 @@
       }
     }
 
-    public String value;
-    public String peeled;
-    public String target;
+    String value;
+    String peeled;
+    String target;
   }
 }
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
index 6f50185..fcd91f3 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
@@ -15,8 +15,15 @@
 package com.google.gitiles;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.net.HttpHeaders;
+import com.google.gitiles.RefServlet.RefJsonData;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+
 import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
 import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
@@ -29,6 +36,8 @@
 import org.junit.Test;
 
 import java.io.IOException;
+import java.util.List;
+import java.util.Map;
 
 /** Tests for {@link Linkifier}. */
 public class RefServletTest {
@@ -185,4 +194,77 @@
         + peeled("refs/tags/atag") + " refs/tags/atag^{}\n",
         res.getActualBodyString());
   }
+
+  @Test
+  public void getRefsJsonAll() throws Exception {
+    Map<String, RefJsonData> result = buildJson("/test/+refs");
+    List<String> keys = ImmutableList.copyOf(result.keySet());
+    assertEquals(ImmutableList.of(
+          "HEAD",
+          "refs/heads/branch",
+          "refs/heads/master",
+          "refs/tags/atag",
+          "refs/tags/ctag"),
+        keys);
+
+    RefJsonData head = result.get(keys.get(0));
+    assertEquals(id("HEAD"), head.value);
+    assertNull(head.peeled);
+    assertEquals("refs/heads/master", head.target);
+
+    RefJsonData branch = result.get(keys.get(1));
+    assertEquals(id("refs/heads/branch"), branch.value);
+    assertNull(branch.peeled);
+    assertNull(branch.target);
+
+    RefJsonData master = result.get(keys.get(2));
+    assertEquals(id("refs/heads/master"), master.value);
+    assertNull(master.peeled);
+    assertNull(master.target);
+
+    RefJsonData atag = result.get(keys.get(3));
+    assertEquals(id("refs/tags/atag"), atag.value);
+    assertEquals(peeled("refs/tags/atag"), atag.peeled);
+    assertNull(atag.target);
+
+    RefJsonData ctag = result.get(keys.get(4));
+    assertEquals(id("refs/tags/ctag"), ctag.value);
+    assertNull(ctag.peeled);
+    assertNull(ctag.target);
+  }
+
+  @Test
+  public void getRefsHeadsJson() throws Exception {
+    Map<String, RefJsonData> result = buildJson("/test/+refs/heads");
+    List<String> keys = ImmutableList.copyOf(result.keySet());
+    assertEquals(ImmutableList.of(
+          "branch",
+          "master"),
+        keys);
+
+    RefJsonData branch = result.get(keys.get(0));
+    assertEquals(id("refs/heads/branch"), branch.value);
+    assertNull(branch.peeled);
+    assertNull(branch.target);
+
+    RefJsonData master = result.get(keys.get(1));
+    assertEquals(id("refs/heads/master"), master.value);
+    assertNull(master.peeled);
+    assertNull(master.target);
+  }
+
+  private Map<String, RefJsonData> buildJson(String path) throws Exception {
+    FakeHttpServletRequest req = FakeHttpServletRequest.newRequest();
+    req.setPathInfo(path);
+    req.setQueryString("format=JSON");
+    FakeHttpServletResponse res = new FakeHttpServletResponse();
+    servlet.service(req, res);
+
+    assertEquals(200, res.getStatus());
+    assertEquals("application/json", res.getHeader(HttpHeaders.CONTENT_TYPE));
+    String body = res.getActualBodyString();
+    String magic = ")]}'\n";
+    assertEquals(magic, body.substring(0, magic.length()));
+    return new Gson().fromJson(body.substring(magic.length()), new TypeToken<Map<String, RefJsonData>>() {}.getType());
+  }
 }