예제 #1
0
        public void TestConflictHandlerWhenDocumentIsPurged()
        {
            using (var doc = new MutableDocument("doc1")) {
                doc.SetString("firstName", "Tiger");
                Db.Save(doc);
            }

            using (var doc = Db.GetDocument("doc1")) {
                doc.Generation.Should().Be(1);
            }

            using (var doc1 = Db.GetDocument("doc1"))
                using (var doc1b = doc1.ToMutable()) {
                    Db.Purge("doc1");
                    doc1b.SetString("nickName", "Scott");
                    Db.Invoking(d => Db.Save(doc1b, (updated, current) =>
                    {
                        return(true);
                    })).Should().Throw <CouchbaseLiteException>()
                    .Where(
                        e => e.Error == CouchbaseLiteError.NotFound &&
                        e.Domain == CouchbaseLiteErrorType.CouchbaseLite,
                        "because the document is purged");
                }
        }
예제 #2
0
        public void TestPurgeDocOnDeletedDB()
        {
            var doc = GenerateDocument("doc1");

            DeleteDB(Db);
            Db.Invoking(d => d.Purge(doc))
            .ShouldThrow <InvalidOperationException>()
            .WithMessage("Attempt to perform an operation on a closed database",
                         "because this operation is invalid");
        }
예제 #3
0
 public void TestDeleteDBOpenByOtherInstance()
 {
     using (var otherDB = OpenDB(Db.Name)) {
         Db.Invoking(d => d.Delete())
         .ShouldThrow <CouchbaseLiteException>()
         .Where(e => e.Error == CouchbaseLiteError.Busy &&
                e.Domain == CouchbaseLiteErrorType.CouchbaseLite,
                "because an in-use database cannot be deleted");
     }
 }
예제 #4
0
 public void TestDeleteDBOpenByOtherInstance()
 {
     using (var otherDB = OpenDB(Db.Name)) {
         Db.Invoking(d => d.Delete())
         .ShouldThrow <LiteCoreException>()
         .Which.Error.Should()
         .Match <C4Error>(e => e.code == (int)C4ErrorCode.Busy &&
                          e.domain == C4ErrorDomain.LiteCoreDomain,
                          "because an in-use database cannot be deleted");
     }
 }
예제 #5
0
        public void TestGetDocFromClosedDB()
        {
            using (var doc = GenerateDocument("doc1")) {
                Db.Close();

                Db.Invoking(d => d.GetDocument("doc1"))
                .ShouldThrow <InvalidOperationException>()
                .WithMessage("Attempt to perform an operation on a closed database",
                             "because this operation is invalid");
            }
        }
예제 #6
0
 public void TestDeleteThenCallInBatch()
 {
     Db.Invoking(d => d.InBatch(() =>
     {
         Db.Delete();
     }))
     .ShouldThrow <CouchbaseLiteException>()
     .Where(
         e => e.Error == CouchbaseLiteError.TransactionNotClosed && e.Domain == CouchbaseLiteErrorType.CouchbaseLite,
         "because a database can't be closed in the middle of a batch");
 }
예제 #7
0
        public void TestPurgePreSaveDoc()
        {
            var doc = new MutableDocument("doc1");

            doc.SetInt("key", 1);

            Db.Invoking(db => db.Purge(doc)).ShouldThrow <CouchbaseLiteException>()
            .Where(e => e.Error == CouchbaseLiteError.NotFound);

            Db.Count.Should().Be(0UL, "because the database should still be empty");
        }
예제 #8
0
        public void TestConflictResolverGivesUp()
        {
            ConflictResolver = new GiveUp();
            ReopenDB();
            var doc = SetupConflict();

            Db.Invoking(d => d.Save(doc))
            .ShouldThrow <LiteCoreException>()
            .Which.Error.code.Should()
            .Be((int)C4ErrorCode.Conflict, "because the conflict resolver gave up");
        }
예제 #9
0
 public void TestDeleteThenCallInBatch()
 {
     Db.Invoking(d => d.InBatch(() =>
     {
         Db.Delete();
     }))
     .ShouldThrow <LiteCoreException>()
     .Which.Error.Should()
     .Match <C4Error>(
         e => e.code == (int)C4ErrorCode.TransactionNotClosed && e.domain == C4ErrorDomain.LiteCoreDomain,
         "because a database can't be closed in the middle of a batch");
 }
예제 #10
0
        public void TestDeletePreSaveDoc()
        {
            var doc = new MutableDocument("doc1");

            doc.SetInt("key", 1);

            Db.Invoking(d => d.Delete(doc))
            .ShouldThrow <CouchbaseLiteException>()
            .Which.Status.Should()
            .Be(StatusCode.NotAllowed, "because deleting an unsaved document is not allowed");
            Db.Count.Should().Be(0UL, "because the database should still be empty");
        }
예제 #11
0
        public void TestSaveDocToDeletedDB()
        {
            DeleteDB(Db);
            var doc = new MutableDocument("doc1");

            doc.SetInt("key", 1);

            Db.Invoking(d => d.Save(doc))
            .ShouldThrow <InvalidOperationException>()
            .WithMessage("Attempt to perform an operation on a closed database",
                         "because this operation is invalid");
        }
예제 #12
0
        public void TestDeletePreSaveDoc()
        {
            var doc = new MutableDocument("doc1");

            doc.SetInt("key", 1);

            Db.Invoking(d => d.Delete(doc))
            .ShouldThrow <CouchbaseLiteException>()
            .Where(
                e => e.Error == CouchbaseLiteError.NotFound &&
                e.Domain == CouchbaseLiteErrorType.CouchbaseLite,
                "because deleting an unsaved document is not allowed");
            Db.Count.Should().Be(0UL, "because the database should still be empty");
        }
예제 #13
0
        public void TestPurgeSameDocTwice()
        {
            var docID = "doc1";
            var doc   = GenerateDocument(docID);

            var doc1 = Db.GetDocument(docID);

            doc1.Should().NotBeNull("because the document was just created and it should exist");

            PurgeDocAndVerify(doc);
            Db.Count.Should().Be(0UL, "because the only document was purged");

            // Second purge and throw error
            Db.Invoking(db => db.Purge(doc)).Should().Throw <CouchbaseLiteException>().Where(e =>
                                                                                             e.Error == CouchbaseLiteError.NotFound && e.Domain == CouchbaseLiteErrorType.CouchbaseLite);
        }
예제 #14
0
        public void TestConflictWithoutCommonAncestor()
        {
            ConflictResolver = new NoCommonAncestorValidator();
            ReopenDB();

            var props = new Dictionary <string, object> {
                ["hello"] = "world"
            };

            var doc = new MutableDocument("doc1", props);

            Db.Save(doc);

            doc = Db.GetDocument(doc.Id).ToMutable();
            doc.SetInt("university", 1);
            Db.Save(doc);

            // Create a conflict
            doc = new MutableDocument(doc.Id, props);
            doc.SetInt("university", 2);

            Db.Invoking(d => d.Save(doc)).ShouldThrow <LiteCoreException>().Which.Error.Should()
            .Be(new C4Error(C4ErrorCode.Conflict));
        }
예제 #15
0
 public void TestDeleteTwice()
 {
     Db.Delete();
     Db.Invoking(d => d.Delete()).ShouldThrow <InvalidOperationException>();
 }
예제 #16
0
 public void TestCloseThenDeleteDatabase()
 {
     Db.Dispose();
     Db.Invoking(DeleteDB).ShouldThrow <InvalidOperationException>();
 }