package com.couchbase.lite.testapp.ektorp.tests; import android.util.Log; import com.couchbase.lite.ektorp.CBLiteHttpClient; import junit.framework.Assert; import org.ektorp.CouchDbConnector; import org.ektorp.CouchDbInstance; import org.ektorp.DocumentNotFoundException; import org.ektorp.UpdateConflictException; import org.ektorp.changes.ChangesCommand; import org.ektorp.changes.DocumentChange; import org.ektorp.http.HttpClient; import org.ektorp.impl.StdCouchDbInstance; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; public class CRUDOperations extends CBLiteEktorpTestCase { public static final String TAG = "Ektorp-CRUDOperations"; public void testCRUDOperations() throws IOException { HttpClient httpClient = new CBLiteHttpClient(manager); CouchDbInstance dbInstance = new StdCouchDbInstance(httpClient); CouchDbConnector dbConnector = dbInstance.createConnector(DEFAULT_TEST_DB, true); TestObject test = new TestObject(1, false, "ektorp"); List<String> stuff = new ArrayList<String>(Arrays.asList("one", "two", "three")); test.setStuff(stuff); Set<String> stuffSet = new HashSet<String>(); stuffSet.add("itemA"); stuffSet.add("itemB"); stuffSet.add("itemC"); test.setStuffSet(stuffSet); dbConnector.create(test); Assert.assertTrue(test.getId().length() >= 10); Assert.assertTrue(test.getRevision().startsWith("1-")); //read it back TestObject read = dbConnector.get(TestObject.class, test.getId()); Assert.assertNotNull(read); Assert.assertEquals(read.getFoo(), test.getFoo()); Assert.assertEquals(read.getBar(), test.getBar()); Assert.assertEquals(read.getBaz(), test.getBaz()); Assert.assertEquals("one", read.getStuff().get(0)); Assert.assertEquals("three", read.getStuff().get(2)); Assert.assertTrue(read.getStuffSet().contains("itemA")); //now update it read.setStatus("updated!"); dbConnector.update(read); Assert.assertEquals(test.getId(), read.getId()); Assert.assertTrue(read.getRevision().startsWith("2-")); //read it back read = dbConnector.get(TestObject.class, read.getId()); Assert.assertNotNull(read); Assert.assertEquals("updated!", read.getStatus()); // try to update the first rev, which should fail: try { dbConnector.update(test); fail("expected update conflict exception"); } catch (UpdateConflictException e) { //expected } // check the changes feed ChangesCommand changesCommand = new ChangesCommand.Builder().continuous(false).since(0l).build(); List<DocumentChange> changes = dbConnector.changes(changesCommand); Log.v(TAG, "changes: " + changes); Assert.assertEquals(1, changes.size()); // delete it try { dbConnector.delete(test); fail("expected update conflict exception"); } catch (UpdateConflictException e) { //expected } String deletedRev = dbConnector.delete(read); Assert.assertTrue(deletedRev.startsWith("3-")); // delete nonexistent doc try { dbConnector.delete("fakeid", "6-"); fail("expected document not found exception"); } catch (DocumentNotFoundException e) { //expected } //read back the deleted document try { read = dbConnector.get(TestObject.class, test.getId()); fail("expected document not found exception"); } catch (DocumentNotFoundException e) { //expected } } }