public void ShouldRunTransactionWithoutRetries() { var work = new ConfigurableTransactionWork("CREATE (:WithoutRetry) RETURN 5"); NewSession() .WriteTransaction(work.Work) .WaitForCompletion() .AssertEqual( OnNext(0, 5), OnCompleted <int>(0)); work.Invocations.Should().Be(1); CountNodes("WithoutRetry").Should().Be(1); }
public void ShouldFailOnTransactionThatCannotBeRetried() { var work = new ConfigurableTransactionWork("UNWIND [10, 5, 0] AS x CREATE (:Hi) RETURN 10/x"); NewSession() .WriteTransaction(work.Work) .WaitForCompletion() .AssertEqual( OnNext(0, 1), OnNext(0, 2), OnError <int>(0, MatchesException <ClientException>(e => e.Message.Contains("/ by zero")))); work.Invocations.Should().Be(1); CountNodes("Hi").Should().Be(0); }
public void ShouldFailEvenAfterATransientError() { var work = new ConfigurableTransactionWork("CREATE (:Person) RETURN 1") { SyncFailures = new[] { new TransientException("code", "error") }, ReactiveFailures = new[] { new DatabaseException("offline", "database is offline") } }; NewSession() .WriteTransaction(work.Work) .WaitForCompletion() .AssertEqual( OnError <int>(0, MatchesException <DatabaseException>(e => e.Message.Contains("database is offline")))); work.Invocations.Should().Be(2); CountNodes("Person").Should().Be(0); }
public void ShouldRunTransactionWithRetriesOnSynchronousFailures() { var work = new ConfigurableTransactionWork("CREATE (:WithSyncFailure) RETURN 7") { SyncFailures = new Exception[] { new ServiceUnavailableException("service is unavailable"), new SessionExpiredException("expired"), new TransientException("transient", "transient error") } }; NewSession() .WriteTransaction(work.Work) .WaitForCompletion() .AssertEqual( OnNext(0, 7), OnCompleted <int>(0)); work.Invocations.Should().Be(4); CountNodes("WithSyncFailure").Should().Be(1); }