< Summary

Information
Class: ArturRios.Data.MongoDb.Transactions.MongoUnitOfWork
Assembly: ArturRios.Data.MongoDb
File(s): D:\Repositories\dotnet-data\src\ArturRios.Data.MongoDb\Transactions\MongoUnitOfWork.cs
Line coverage
44%
Covered lines: 29
Uncovered lines: 36
Coverable lines: 65
Total lines: 106
Line coverage: 44.6%
Branch coverage
100%
Covered branches: 12
Total branches: 12
Branch coverage: 100%
Method coverage
60%
Covered methods: 3
Fully covered methods: 1
Total methods: 5
Method coverage: 60%
Full method coverage: 20%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
ExecuteInTransactionAsync()100%66100%
ExecuteInTransactionAsync()100%7675%
ExecuteInTransaction(...)100%210%
ExecuteInTransaction(...)100%210%

File(s)

D:\Repositories\dotnet-data\src\ArturRios.Data.MongoDb\Transactions\MongoUnitOfWork.cs

#LineLine coverage
 1using ArturRios.Output;
 2using MongoDB.Driver;
 3
 4namespace ArturRios.Data.MongoDb.Transactions;
 5
 6/// <summary>
 7///     MongoDB implementation of the unit of work. Opens a client session, sets it as the context's
 8///     ambient session so repository operations enlist, and commits/aborts the transaction.
 9/// </summary>
 10/// <param name="client">The Mongo client.</param>
 11/// <param name="context">The Mongo context whose ambient session is managed.</param>
 512public class MongoUnitOfWork(IMongoClient client, MongoContext context) : IMongoUnitOfWork, IAsyncMongoUnitOfWork
 13{
 14    /// <inheritdoc />
 15    public async Task<ProcessOutput> ExecuteInTransactionAsync(Func<Task> work, CancellationToken ct = default)
 216    {
 217        using var session = await client.StartSessionAsync(cancellationToken: ct);
 218        context.Session = session;
 219        session.StartTransaction();
 20        try
 221        {
 222            await work();
 123            await session.CommitTransactionAsync(ct);
 124            return ProcessOutput.New;
 25        }
 126        catch (Exception ex)
 127        {
 128            await session.AbortTransactionAsync(ct);
 129            return ProcessOutput.New.WithError(ex.GetBaseException().Message);
 30        }
 31        finally
 232        {
 233            context.Session = null;
 234        }
 235    }
 36
 37    /// <inheritdoc />
 38    public async Task<DataOutput<TResult>> ExecuteInTransactionAsync<TResult>(Func<Task<TResult>> work,
 39        CancellationToken ct = default)
 140    {
 141        using var session = await client.StartSessionAsync(cancellationToken: ct);
 142        context.Session = session;
 143        session.StartTransaction();
 44        try
 145        {
 146            var result = await work();
 147            await session.CommitTransactionAsync(ct);
 148            return DataOutput<TResult>.New.WithData(result);
 49        }
 050        catch (Exception ex)
 051        {
 052            await session.AbortTransactionAsync(ct);
 053            return DataOutput<TResult>.New.WithError(ex.GetBaseException().Message);
 54        }
 55        finally
 156        {
 157            context.Session = null;
 158        }
 159    }
 60
 61    /// <inheritdoc />
 62    public ProcessOutput ExecuteInTransaction(Action work)
 063    {
 064        using var session = client.StartSession();
 065        context.Session = session;
 066        session.StartTransaction();
 67        try
 068        {
 069            work();
 070            session.CommitTransaction();
 071            return ProcessOutput.New;
 72        }
 073        catch (Exception ex)
 074        {
 075            session.AbortTransaction();
 076            return ProcessOutput.New.WithError(ex.GetBaseException().Message);
 77        }
 78        finally
 079        {
 080            context.Session = null;
 081        }
 082    }
 83
 84    /// <inheritdoc />
 85    public DataOutput<TResult> ExecuteInTransaction<TResult>(Func<TResult> work)
 086    {
 087        using var session = client.StartSession();
 088        context.Session = session;
 089        session.StartTransaction();
 90        try
 091        {
 092            var result = work();
 093            session.CommitTransaction();
 094            return DataOutput<TResult>.New.WithData(result);
 95        }
 096        catch (Exception ex)
 097        {
 098            session.AbortTransaction();
 099            return DataOutput<TResult>.New.WithError(ex.GetBaseException().Message);
 100        }
 101        finally
 0102        {
 0103            context.Session = null;
 0104        }
 0105    }
 106}