Skip to content

Commit

Permalink
Fixed end-user transactions and added unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
TwentyFourMinutes committed Jun 25, 2021
1 parent 0df7977 commit 8eb7708
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 5 deletions.
2 changes: 1 addition & 1 deletion src/Venflow/Venflow.Tests/Models/Person.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@ public class Person
[NotMapped]
public string Stuff { get; set; }

public List<Email> Emails { get; set; }
public IList<Email> Emails { get; set; }
}
}
94 changes: 94 additions & 0 deletions src/Venflow/Venflow.Tests/TransactionTests/TransactionTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.Threading.Tasks;
using Npgsql;
using Venflow.Tests.Models;
using Xunit;

namespace Venflow.Tests.TransactionTests
{
public class TransactionTests : TestBase
{
[Fact]
public async Task ReuseTransactionAsync()
{
await using var transaction = await Database.BeginTransactionAsync();

Assert.Equal(transaction, await Database.BeginTransactionAsync());
}

[Fact]
public async Task RollbackToTransactionSavepointAsync()
{
await using var transaction = await Database.BeginTransactionAsync();

await Assert.ThrowsAsync<NotImplementedException>(() => Database.People.InsertAsync(new Person { Emails = new ThrowingEmailList() }));

var transactionType = transaction.GetType();
var npgsqlTransactionType = typeof(NpgsqlTransaction);

Assert.False((bool)transactionType.GetProperty("IsDisposed", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(transaction));
Assert.False((bool)npgsqlTransactionType.GetProperty("IsCompleted", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(transaction.GetNpgsqlTransaction()));
}

private class ThrowingEmailList : IList<Email>
{
public Email this[int index] { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }

public int Count => throw new NotImplementedException();
public bool IsReadOnly => throw new NotImplementedException();

public void Add(Email item)
{
throw new System.NotImplementedException();
}

public void Clear()
{
throw new System.NotImplementedException();
}

public bool Contains(Email item)
{
throw new System.NotImplementedException();
}

public void CopyTo(Email[] array, int arrayIndex)
{
throw new System.NotImplementedException();
}

public IEnumerator<Email> GetEnumerator()
{
throw new System.NotImplementedException();
}

public int IndexOf(Email item)
{
throw new System.NotImplementedException();
}

public void Insert(int index, Email item)
{
throw new System.NotImplementedException();
}

public bool Remove(Email item)
{
throw new System.NotImplementedException();
}

public void RemoveAt(int index)
{
throw new System.NotImplementedException();
}

IEnumerator IEnumerable.GetEnumerator()
{
throw new System.NotImplementedException();
}
}
}
}
9 changes: 5 additions & 4 deletions src/Venflow/Venflow/Database.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,9 @@ protected Database(DatabaseOptionsBuilder optionsBuilder)
await ValidateConnectionAsync();

#if NET48
return !HasActiveTransaction ? _activeTransaction : _activeTransaction = new DatabaseTransaction(GetConnection().BeginTransaction());
return HasActiveTransaction ? _activeTransaction! : _activeTransaction = new DatabaseTransaction(GetConnection().BeginTransaction());
#else
return !HasActiveTransaction ? _activeTransaction : _activeTransaction = new DatabaseTransaction(await GetConnection().BeginTransactionAsync(cancellationToken));
return HasActiveTransaction ? _activeTransaction! : _activeTransaction = new DatabaseTransaction(await GetConnection().BeginTransactionAsync(cancellationToken));
#endif
}

Expand All @@ -103,9 +103,9 @@ protected Database(DatabaseOptionsBuilder optionsBuilder)
await ValidateConnectionAsync();

#if NET48
return !HasActiveTransaction ? _activeTransaction : _activeTransaction = new DatabaseTransaction(GetConnection().BeginTransaction());
return HasActiveTransaction ? _activeTransaction! : _activeTransaction = new DatabaseTransaction(GetConnection().BeginTransaction());
#else
return !HasActiveTransaction ? _activeTransaction : _activeTransaction = new DatabaseTransaction(await GetConnection().BeginTransactionAsync(isolationLevel, cancellationToken));
return HasActiveTransaction ? _activeTransaction! : _activeTransaction = new DatabaseTransaction(await GetConnection().BeginTransactionAsync(isolationLevel, cancellationToken));
#endif
}

Expand All @@ -123,6 +123,7 @@ protected Database(DatabaseOptionsBuilder optionsBuilder)
#if NET48
return _activeTransaction = new DatabaseTransaction(GetConnection().BeginTransaction());
#else

return _activeTransaction = new DatabaseTransaction(await GetConnection().BeginTransactionAsync(cancellationToken));
#endif
}
Expand Down

0 comments on commit 8eb7708

Please sign in to comment.