@Test
  public void dates_should_be_serialized_in_ISO_8601_format() {
    setupNegativeContains("some_id");
    when(httpClient.put(anyString(), anyString()))
        .thenReturn(
            HttpResponseStub.valueOf(201, "{\"ok\":true,\"id\":\"some_id\",\"rev\":\"123D123\"}"));

    DateTime dt = new DateTime(2010, 4, 25, 20, 11, 24, 555, DateTimeZone.forID("+00:00"));
    Date d = dt.toDate();
    System.out.println(d);
    DateDoc dd = new DateDoc();
    dd.setId("some_id");
    dd.setDateTime(dt);
    dd.setDate(dt.toDate());

    dbCon.create(dd);

    ArgumentCaptor<String> ac = ArgumentCaptor.forClass(String.class);
    verify(httpClient).put(eq("/test_db/some_id"), ac.capture());
    String json = ac.getValue();
    assertEqualJson("dates.json", json);

    when(httpClient.get("/test_db/some_id")).thenReturn(HttpResponseStub.valueOf(201, json));

    DateDoc deserialized = dbCon.get(DateDoc.class, dd.getId());
    assertEquals(dt, deserialized.getDateTime());
    assertEquals(d, deserialized.getDate());
  }
 @Test
 public void testDelete() {
   when(httpClient.delete(anyString()))
       .thenReturn(HttpResponseStub.valueOf(200, "{\"ok\":true,\"rev\":\"123D123\"}"));
   dbCon.delete("some_id", "123D123");
   verify(httpClient).delete("/test_db/some_id?rev=123D123");
 }
 @Test
 public void return_null_revisions_when_doc_is_missing() {
   when(httpClient.get("/test_db/some_doc_id?revs_info=true"))
       .thenReturn(HttpResponseStub.valueOf(404, ""));
   List<Revision> l = dbCon.getRevisions("some_doc_id");
   assertNotNull(l);
   assertTrue(l.isEmpty());
 }
 @Test
 public void testEnsureFullCommit() {
   when(httpClient.post("/test_db/_ensure_full_commit", ""))
       .thenReturn(
           HttpResponseStub.valueOf(
               200, "{\"ok\" : true, \"instance_start_time\" : \"1288186189373361\"}"));
   dbCon.ensureFullCommit();
   verify(httpClient).post("/test_db/_ensure_full_commit", "");
 }
  @Test
  public void should_create_db_if_missing() {
    when(httpClient.head("/test_db/"))
        .thenReturn(
            HttpResponseStub.valueOf(404, "{\"error\":\"not_found\",\"reason\":\"no_db_file\"}"));

    dbCon.createDatabaseIfNotExists();
    verify(httpClient).put("/test_db/");
  }
 private void setupGetDocResponse(String... ids) {
   for (String id : ids) {
     when(httpClient.get(TEST_DB_PATH + id))
         .thenReturn(
             HttpResponseStub.valueOf(
                 200,
                 "{\"name\":\"nisse\",\"age\":12,\"_id\":\" " + id + "\",\"_rev\":\"123D123\"}"));
   }
 }
 @Test
 public void testCallUpdateHandler() {
   when(httpClient.put("/test_db/_design/designDocID/_update/functionName/docID?key=value", ""))
       .thenReturn(HttpResponseStub.valueOf(201, "response string"));
   Map<String, String> params = Collections.singletonMap("key", "value");
   assertEquals(
       "response string",
       dbCon.callUpdateHandler("_design/designDocID", "functionName", "docID", params));
 }
 @Test
 public void testDeleteCouchDbDocument() {
   td.setId("some_id");
   td.setRevision("123D123");
   setupGetDocResponse();
   when(httpClient.delete(anyString()))
       .thenReturn(HttpResponseStub.valueOf(200, "{\"ok\":true,\"rev\":\"123D123\"}"));
   dbCon.delete(td);
   verify(httpClient).delete("/test_db/some_id?rev=123D123");
 }
  @Test
  public void should_not_create_db_if_already_exists() {
    when(httpClient.head("/test_db/"))
        .thenReturn(
            HttpResponseStub.valueOf(
                200,
                "{\"test_db\":\"global\",\"doc_count\":1,\"doc_del_count\":0,\"update_seq\":3,\"purge_seq\":0,\"compact_running\":false,\"disk_size\":100,\"instance_start_time\":\"130\",\"disk_format_version\":5,\"committed_update_seq\":3}"));

    dbCon.createDatabaseIfNotExists();
    verify(httpClient, VerificationModeFactory.times(0)).put(anyString());
  }
 @Test
 public void testPurge() {
   String rsp =
       "{\"purged\" : { \"Billy\" : [ \"17-b3eb5ac6fbaef4428d712e66483dcb79\"]},\"purge_seq\" : 11}";
   when(httpClient.post(eq("/test_db/_purge"), anyString()))
       .thenReturn(HttpResponseStub.valueOf(200, rsp));
   Map<String, List<String>> revisionsToPurge = new HashMap<String, List<String>>();
   revisionsToPurge.put("Billy", Collections.singletonList("17-b3eb5ac6fbaef4428d712e66483dcb79"));
   PurgeResult r = dbCon.purge(revisionsToPurge);
   assertEquals(11, r.getPurgeSeq());
   assertTrue(r.getPurged().containsKey("Billy"));
 }
 @Test
 public void create_should_post_if_id_is_missing() {
   when(httpClient.post(anyString(), anyString()))
       .thenReturn(
           HttpResponseStub.valueOf(201, "{\"ok\":true,\"id\":\"some_id\",\"rev\":\"123D123\"}"));
   dbCon.create(td);
   ArgumentCaptor<String> ac = ArgumentCaptor.forClass(String.class);
   verify(httpClient).post(eq(TEST_DB_PATH), ac.capture());
   assertEquals("some_id", td.getId());
   assertEquals("123D123", td.getRevision());
   assertEqualJson("create_with_no_id.json", ac.getValue());
 }
 @Test
 public void save_document_with_utf8_charset() {
   td.setId("some_id");
   td.name = "Örjan Åäö";
   setupNegativeContains(td.getId());
   when(httpClient.put(anyString(), anyString()))
       .thenReturn(
           HttpResponseStub.valueOf(201, "{\"ok\":true,\"id\":\"some_id\",\"rev\":\"123D123\"}"));
   dbCon.create(td);
   ArgumentCaptor<String> ac = ArgumentCaptor.forClass(String.class);
   verify(httpClient).put(eq("/test_db/some_id"), ac.capture());
   assertEqualJson("charset.json", ac.getValue());
 }
 @Test
 public void docId_should_be_escaped_when_id_contains_slash() throws UnsupportedEncodingException {
   String escapedId = "http%3A%2F%2Fsome%2Fopenid%3Fgoog";
   td.setId("http://some/openid?goog");
   setupNegativeContains(escapedId);
   when(httpClient.put(anyString(), anyString()))
       .thenReturn(
           HttpResponseStub.valueOf(201, "{\"ok\":true,\"id\":\"some_id\",\"rev\":\"123D123\"}"));
   dbCon.create(td);
   ArgumentCaptor<String> ac = ArgumentCaptor.forClass(String.class);
   verify(httpClient).put(eq("/test_db/" + escapedId), ac.capture());
   assertEquals("http://some/openid?goog", td.getId());
 }
 @Test
 public void testCreate() {
   td.setId("some_id");
   setupNegativeContains(td.getId());
   when(httpClient.put(anyString(), anyString()))
       .thenReturn(
           HttpResponseStub.valueOf(201, "{\"ok\":true,\"id\":\"some_id\",\"rev\":\"123D123\"}"));
   dbCon.create(td);
   ArgumentCaptor<String> ac = ArgumentCaptor.forClass(String.class);
   verify(httpClient).put(eq("/test_db/some_id"), ac.capture());
   assertEquals("some_id", td.getId());
   assertEquals("123D123", td.getRevision());
   assertEqualJson("create.json", ac.getValue());
 }
 @Test
 public void testCreateFromJsonNode() throws Exception {
   when(httpClient.put(anyString(), anyString()))
       .thenReturn(
           HttpResponseStub.valueOf(201, "{\"ok\":true,\"id\":\"some_id\",\"rev\":\"123D123\"}"));
   JsonNode root =
       new ObjectMapper()
           .readValue(
               getClass().getResourceAsStream("create_from_json_node.json"), JsonNode.class);
   dbCon.create("some_id", root);
   String facit =
       IOUtils.toString(getClass().getResourceAsStream("create_from_json_node.json"), "UTF-8")
           .trim();
   verify(httpClient).put("/test_db/some_id", facit);
 }
 @Test
 public void return_all_docIds_in_db() {
   when(httpClient.get("/test_db/_all_docs"))
       .thenReturn(
           HttpResponseStub.valueOf(
               200,
               "{\"total_rows\": 3, \"offset\": 0, \"rows\": ["
                   + "{\"id\": \"doc1\", \"key\": \"doc1\", \"value\": {\"rev\": \"4324BB\"}},"
                   + "{\"id\": \"doc2\", \"key\": \"doc2\", \"value\": {\"rev\":\"2441HF\"}},"
                   + "{\"id\": \"doc3\", \"key\": \"doc3\", \"value\": {\"rev\":\"74EC24\"}}]}"));
   List<String> all = dbCon.getAllDocIds();
   assertEquals(3, all.size());
   assertEquals("doc1", all.get(0));
   assertEquals("doc2", all.get(1));
   assertEquals("doc3", all.get(2));
 }
  @Test
  public void testCallUpdateHanderWithObject() {

    when(httpClient.put(
            "/test_db/_design/designDocID/_update/functionName/docID",
            "{\"value\":\"value\",\"param\":\"param\"}"))
        .thenReturn(
            HttpResponseStub.valueOf(
                201, "{\"name\":\"nisse\",\"age\":12,\"_id\":\"some_id\",\"_rev\":\"123D123\"}"));

    UpdateHandlerRequest req = new UpdateHandlerRequest();
    req.designDocId("_design/designDocID")
        .functionName("functionName")
        .docId("docID")
        .body(new TestRequest("param", "value"));

    TestDoc updated = dbCon.callUpdateHandler(req, TestDoc.class);

    assertNotNull(updated);
    assertEquals("some_id", updated.getId());
    assertEquals("123D123", updated.getRevision());
    assertEquals("nisse", updated.name);
    assertEquals(12, updated.age);
  }
 private void setupGetDocResponse() {
   when(httpClient.get(anyString()))
       .thenReturn(
           HttpResponseStub.valueOf(
               200, "{\"name\":\"nisse\",\"age\":12,\"_id\":\"some_id\",\"_rev\":\"123D123\"}"));
 }
 @Test(expected = DocumentNotFoundException.class)
 public void throw_exception_when_doc_is_missing() {
   when(httpClient.get(anyString())).thenReturn(HttpResponseStub.valueOf(404, ""));
   dbCon.get(TestDoc.class, "some_id");
 }
 private void setupNegativeContains(String id) {
   when(httpClient.head("/test_db/" + id)).thenReturn(HttpResponseStub.valueOf(404, ""));
 }
 @Test
 public void testGetRevsLimit() {
   when(httpClient.get("/test_db/_revs_limit"))
       .thenReturn(HttpResponseStub.valueOf(201, "\"1500\""));
   assertEquals(1500, dbCon.getRevisionLimit());
 }