package org.ektorp; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import org.ektorp.util.RegexMatcher; import org.junit.Test; public class ViewQueryTest { // 2011-02-18T22%3A13%3A03.738%2B0000 static final String URL_ENCODED_ISO_8601_DATE_FORMAT_REGEX = ".*\\d{4}-\\d{2}-\\d{2}T\\d{2}%3A\\d{2}%3A\\d{2}.\\d{3}\\%2B\\d{4}.*"; ViewQuery query = new ViewQuery() .dbPath("/somedb/") .designDocId("_design/doc") .viewName("viewname"); @Test public void when_allDocs_is_set_no_design_doc_should_be_appended_to_uri() { assertEquals("/somedb/_all_docs", query.allDocs().buildQuery()); } @Test public void default_to_no_parameters() { assertEquals("/somedb/_design/doc/_view/viewname", query.buildQuery()); } @Test public void string_key() throws Exception { String url = query.key("value").buildQuery(); assertTrue(contains(url, "?key=%22value%22")); } @Test public void string_key_with_quotes() throws Exception { String url = query.key("value with a \"quote").buildQuery(); assertTrue(contains(url, "?key=%22value+with+a+%5C%22quote%22")); } @Test public void int_key() throws Exception { String url = query.key(123).buildQuery(); assertTrue(contains(url, "?key=123")); } @Test public void float_key() throws Exception { String url = query.key(123.5).buildQuery(); assertTrue(contains(url, "?key=123.5")); } @Test public void double_key() throws Exception { String url = query.key(123.5d).buildQuery(); assertTrue(contains(url, "?key=123.5")); } @Test public void long_key() throws Exception { String url = query.key(Long.MAX_VALUE).buildQuery(); assertTrue(contains(url, "?key=9223372036854775807")); } @Test public void boolean_key() throws Exception { String url = query.key(true).buildQuery(); assertTrue(contains(url, "?key=true")); } @Test public void complex_key() throws Exception { String url = query.key(ComplexKey.of(2010, 8, 3)).buildQuery(); assertTrue(contains(url, "?key=%5B2010%2C8%2C3%5D")); } @Test public void complex_date_key() throws Exception { String url = query.key(ComplexKey.of(new Date(), 3)).buildQuery(); assertThat(url, RegexMatcher.matches(URL_ENCODED_ISO_8601_DATE_FORMAT_REGEX)); } @Test public void multiple_keys() { assertFalse(query.hasMultipleKeys()); List<Object> keys = new ArrayList<Object>(); keys.add("key1"); keys.add("key2"); keys.add("key3"); query.keys(keys); assertTrue(query.hasMultipleKeys()); assertEquals("{\"keys\":[\"key1\",\"key2\",\"key3\"]}", query.getKeysAsJson()); } @Test public void keys_should_encode_strings_properly() { ViewQuery.Keys keys = ViewQuery.Keys.of("key1", "key2", "key3"); assertEquals("{\"keys\":[\"key1\",\"key2\",\"key3\"]}", keys.toJson()); } @Test public void keys_should_encode_ints_properly() { ViewQuery.Keys keys = ViewQuery.Keys.of(Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3)); assertEquals("{\"keys\":[1,2,3]}", keys.toJson()); } @Test public void keys_should_encode_booleans_properly() { ViewQuery.Keys keys = ViewQuery.Keys.of(Boolean.TRUE, Boolean.FALSE); assertEquals("{\"keys\":[true,false]}", keys.toJson()); } @Test public void keys_should_encode_objects_properly() { List<String> key1 = Arrays.asList("foo1","bar1"); List<String> key2 = Arrays.asList("foo2","bar2"); ViewQuery.Keys keys = ViewQuery.Keys.of(key1, key2); assertEquals("{\"keys\":[[\"foo1\",\"bar1\"],[\"foo2\",\"bar2\"]]}", keys.toJson()); } @Test public void rawKey_should_be_unchanged() throws Exception { String url = query.rawKey("\"value\"").buildQuery(); assertTrue(contains(url, "?key=%22value%22")); } @Test public void rawStartKey_should_be_unchanged() throws Exception { String url = query.rawStartKey("\"value\"").buildQuery(); assertTrue(contains(url, "?startkey=%22value%22")); } @Test public void rawEndKey_should_be_unchanged() throws Exception { String url = query.rawStartKey("\"value\"").buildQuery(); assertTrue(contains(url, "?startkey=%22value%22")); } @Test public void startKey_parameter_added() { String url = query.startKey("value").buildQuery(); assertTrue(contains(url, "?startkey=%22value%22")); } @Test public void startKey_and_endKey_parameter_added() { String url = query .startKey("start") .endKey("end") .buildQuery(); assertTrue(contains(url, "?startkey=%22start%22")); assertTrue(contains(url, "&endkey=%22end%22")); } @Test public void int_start_end_key() throws Exception { String url = query.startKey(123).endKey(321).buildQuery(); assertTrue(contains(url, "?startkey=123&endkey=321")); } @Test public void float_start_end_key() throws Exception { String url = query.startKey(0.0).endKey(321.9).buildQuery(); assertTrue(contains(url, "?startkey=0.0&endkey=321.9")); } @Test public void double_start_end_key() throws Exception { String url = query.startKey(0.0d).endKey(321.9d).buildQuery(); assertTrue(contains(url, "?startkey=0.0&endkey=321.9")); } @Test public void long_start_end_key() throws Exception { String url = query.startKey(0).endKey(Long.MAX_VALUE).buildQuery(); assertTrue(contains(url, "?startkey=0&endkey=9223372036854775807")); } @Test public void boolean_start_end_key() throws Exception { String url = query.startKey(true).endKey(false).buildQuery(); assertTrue(contains(url, "?startkey=true&endkey=false")); } @Test public void complex_start_end_key() throws Exception { String url = query.startKey(ComplexKey.of(2010, 8, 3)).endKey(ComplexKey.of(2010, 12, 24)).buildQuery(); assertTrue(contains(url, "?startkey=%5B2010%2C8%2C3%5D&endkey=%5B2010%2C12%2C24%5D")); } @Test public void startDoc_parameter_added() { String url = query .startDocId("start_dic_id") .buildQuery(); assertTrue(contains(url, "?startkey_docid=start")); } @Test public void include_docs_parameter_added() { String url = query .includeDocs(true) .buildQuery(); assertTrue(contains(url, "?include_docs=true")); } @Test public void update_seq_parameter_added() { String url = query .updateSeq(true) .buildQuery(); assertTrue(contains(url, "?update_seq=true")); } @Test public void stale_ok_parameter_added() { String url = query .staleOk(true) .buildQuery(); assertTrue(contains(url, "?stale=ok")); } @Test public void stale_ok_set_to_false() { String url = query .staleOk(true) .staleOk(false) .buildQuery(); assertFalse(contains(url, "?stale=ok")); } @Test public void stale_ok_update_after() { String url = query .staleOkUpdateAfter() .buildQuery(); assertTrue(contains(url, "?stale=update_after")); } @Test public void reduce_parameter_added() { String url = query .reduce(false) .buildQuery(); assertTrue(contains(url, "?reduce=false")); } @Test(expected=java.lang.IllegalStateException.class) public void throw_exception_when_dbName_is_missing() { new ViewQuery() // .dbPath("/somedb/") .designDocId("_design/doc") .viewName("viewname") .buildQuery(); } @Test(expected=java.lang.IllegalStateException.class) public void throw_exception_when_designDocId_is_missing() { new ViewQuery() .dbPath("/somedb/") // .designDocId("_design/doc") .viewName("viewname") .buildQuery(); } @Test(expected=java.lang.IllegalStateException.class) public void throw_exception_when_viewName_is_missing() { new ViewQuery() .dbPath("/somedb/") .designDocId("_design/doc") // .viewName("viewname") .buildQuery(); } @Test public void viewQuery_used_to_access_list_function() { String url = new ViewQuery() .dbPath("/db/") .designDocId("_design/examples") .listName("index-posts") .viewName("posts-by-tag") .buildQuery(); assertEquals("/db/_design/examples/_list/index-posts/posts-by-tag", url); } @Test public void call_list_function_with_params() { String url = new ViewQuery() .dbPath("/db/") .designDocId("_design/examples") .listName("index-posts") .viewName("posts-by-tag") .queryParam("param1", "value1") .queryParam("param2", "val/ue") .buildQuery(); assertEquals("/db/_design/examples/_list/index-posts/posts-by-tag?param1=value1¶m2=val%2Fue", url); } private boolean contains(String subject, String s) { return subject.indexOf(s) > -1; } }