using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage; using Musify.Domain.Entities; using AppIDatabase = Musify.Application.Contracts.IDatabase; using IDatabaseTransaction = Musify.Application.Contracts.IDatabaseTransaction; namespace Musify.Application.Tests.Infrastructure; public sealed class TestDatabase(DbContextOptions options) : DbContext(options), AppIDatabase { public DbSet Users => Set(); public DbSet Tracks => Set(); public DbSet PlayLists => Set(); public DbSet UserHasTracks => Set(); public DbSet PlayListHasTracks => Set(); public DbSet Uploads => Set(); public DbSet UploadIntents => Set(); public async Task BeginTransactionAsync( System.Data.IsolationLevel isolationLevel, CancellationToken cancellationToken) { var transaction = await Database.BeginTransactionAsync(isolationLevel, cancellationToken); return new TestDatabaseTransaction(transaction); } private sealed class TestDatabaseTransaction(IDbContextTransaction inner) : IDatabaseTransaction { public Task CommitAsync(CancellationToken cancellationToken = default) => inner.CommitAsync(cancellationToken); public ValueTask DisposeAsync() => inner.DisposeAsync(); } }