/* * Copyright (C) 2011 lightcouch.org * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.lightcouch.tests; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.Arrays; import java.util.List; import java.util.UUID; import java.util.Vector; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.lightcouch.CouchDbClient; import org.lightcouch.DocumentConflictException; import org.lightcouch.NoDocumentException; import org.lightcouch.Page; import org.lightcouch.ViewResult; import com.google.gson.JsonObject; public class ViewsTest { private static CouchDbClient dbClient; @BeforeClass public static void setUpClass() { dbClient = new CouchDbClient(); dbClient.syncDesignDocsWithDb(); init(); } @AfterClass public static void tearDownClass() { dbClient.shutdown(); } @Test public void queryView() { List<Foo> foos = dbClient.view("example/foo") .includeDocs(true) .query(Foo.class); assertThat(foos.size(), not(0)); } @Test public void byKey() { List<Foo> foos = dbClient.view("example/foo") .includeDocs(true) .key("key-1") .query(Foo.class); assertThat(foos.size(), is(1)); } @Test public void byStartAndEndKey() { List<Foo> foos = dbClient.view("example/foo") .startKey("key-1") .endKey("key-2") .includeDocs(true) .query(Foo.class); assertThat(foos.size(), is(2)); } @Test public void byComplexKey() { int[] complexKey = new int[] { 2011, 10, 15 }; List<Foo> foos = dbClient.view("example/by_date") .key(complexKey) // .key(2011, 10, 15) .includeDocs(true) .reduce(false) .query(Foo.class); assertThat(foos.size(), is(2)); } @Test public void byComplexKeys() { List<int[]> keysToGet = new Vector<int[]>(); keysToGet.add(new int[] { 2011, 10, 15 }); keysToGet.add(new int[] { 2013, 12, 17 }); ViewResult<Integer[], Integer, Foo> fooRows = dbClient.view("example/by_date") .keys(keysToGet) .group(true) .queryView(Integer[].class, Integer.class, Foo.class); assertThat(fooRows.getRows().size(), is(2)); } @Test public void viewResultEntries() { ViewResult<int[], String, Foo> viewResult = dbClient.view("example/by_date") .reduce(false) .queryView(int[].class, String.class, Foo.class); assertThat(viewResult.getRows().size(), is(3)); } @Test public void scalarValues() { int allTags = dbClient.view("example/by_tag").queryForInt(); assertThat(allTags, is(4)); long couchDbTags = dbClient.view("example/by_tag") .key("couchdb") .queryForLong(); assertThat(couchDbTags, is(2L)); String javaTags = dbClient.view("example/by_tag") .key("java") .queryForString(); assertThat(javaTags, is("1")); } @Test(expected = NoDocumentException.class) public void viewWithNoResult_throwsNoDocumentException() { dbClient.view("example/by_tag") .key("javax") .queryForInt(); } @Test public void groupLevel() { ViewResult<int[], Integer, Foo> viewResult = dbClient .view("example/by_date") .groupLevel(2) .queryView(int[].class, Integer.class, Foo.class); assertThat(viewResult.getRows().size(), is(2)); } @Test() public void tempViews() { dbClient.save(new Foo(generateUUID(), "some-val")); List<Foo> list = dbClient.view("_temp_view") .tempView("temp_1") .includeDocs(true) .reduce(false) .query(Foo.class); assertThat(list.size(), not(0)); } @Test public void allDocs() { dbClient.save(new Foo()); List<JsonObject> allDocs = dbClient.view("_all_docs") .query(JsonObject.class); assertThat(allDocs.size(), not(0)); } @Test public void pagination() { for (int i = 0; i < 7; i++) { Foo foo = new Foo(generateUUID(), "some-val"); dbClient.save(foo); } final int rowsPerPage = 3; // first page - page #1 (rows 1 - 3) Page<Foo> page = dbClient.view("example/foo") .queryPage(rowsPerPage, null, Foo.class); assertFalse(page.isHasPrevious()); assertTrue(page.isHasNext()); assertThat(page.getResultFrom(), is(1)); assertThat(page.getResultTo(), is(3)); assertThat(page.getPageNumber(), is(1)); assertThat(page.getResultList().size(), is(3)); String param = page.getNextParam(); // next page - page #2 (rows 4 - 6) page = dbClient.view("example/foo").queryPage(rowsPerPage, param, Foo.class); assertTrue(page.isHasPrevious()); assertTrue(page.isHasNext()); assertThat(page.getResultFrom(), is(4)); assertThat(page.getResultTo(), is(6)); assertThat(page.getPageNumber(), is(2)); assertThat(page.getResultList().size(), is(3)); param = page.getPreviousParam(); // previous page, page #1 (rows 1 - 3) page = dbClient.view("example/foo").queryPage(rowsPerPage, param, Foo.class); assertFalse(page.isHasPrevious()); assertTrue(page.isHasNext()); assertThat(page.getResultFrom(), is(1)); assertThat(page.getResultTo(), is(3)); assertThat(page.getPageNumber(), is(1)); assertThat(page.getResultList().size(), is(3)); } private static void init() { try { Foo foo = null; foo = new Foo("id-1", "key-1"); foo.setTags(Arrays.asList(new String[] { "couchdb", "views" })); foo.setComplexDate(new int[] { 2011, 10, 15 }); dbClient.save(foo); foo = new Foo("id-2", "key-2"); foo.setTags(Arrays.asList(new String[] { "java", "couchdb" })); foo.setComplexDate(new int[] { 2011, 10, 15 }); dbClient.save(foo); foo = new Foo("id-3", "key-3"); foo.setComplexDate(new int[] { 2013, 12, 17 }); dbClient.save(foo); } catch (DocumentConflictException e) { } } private static String generateUUID() { return UUID.randomUUID().toString().replace("-", ""); } }