using LANCommander.Server.Data; using LANCommander.Server.Services.Mappers; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; using Shouldly; using Entities = global::LANCommander.Server.Data.Models; namespace LANCommander.Server.Tests.Mapping; /// /// Proves every Mapperly queryable projection (ProjectToX) translates to SQL. These run against /// a real SQLite database (unlike the InMemory provider, which evaluates LINQ client-side and would /// silently accept an untranslatable projection). Materializing each projection over an empty table is /// enough: EF still builds and executes the SQL, so a non-translatable expression throws here. /// public class ProjectionTranslationTests : IDisposable { private readonly SqliteConnection _connection; private readonly DatabaseContext _context; private readonly SdkMapper _sdk = new(); private readonly ManifestMapper _manifest = new(); public ProjectionTranslationTests() { _connection = new SqliteConnection("DataSource=:memory:"); _connection.Open(); var options = new DbContextOptionsBuilder() .UseSqlite(_connection) .Options; _context = new DatabaseContext(options); _context.Database.EnsureCreated(); } // ---- SDK projections ----------------------------------------------------------------------- [Fact] public void ProjectToSdkArchive_Translates() => _sdk.ProjectToSdkArchive(_context.Set()).ToList().ShouldNotBeNull(); [Fact] public void ProjectToSdkGameSave_Translates() => _sdk.ProjectToSdkGameSave(_context.Set()).ToList().ShouldNotBeNull(); [Fact] public void ProjectToSdkUser_Translates() => _sdk.ProjectToSdkUser(_context.Set()).ToList().ShouldNotBeNull(); [Fact] public void ProjectToSdkScript_Translates() => _sdk.ProjectToSdkScript(_context.Set()).ToList().ShouldNotBeNull(); // ---- Manifest projections ------------------------------------------------------------------ [Fact] public void ProjectToManifestTool_Translates() => _manifest.ProjectToManifestTool(_context.Set()).ToList().ShouldNotBeNull(); [Fact] public void ProjectToManifestTag_Translates() => _manifest.ProjectToManifestTag(_context.Set()).ToList().ShouldNotBeNull(); [Fact] public void ProjectToManifestServerHttpPath_Translates() => _manifest.ProjectToManifestServerHttpPath(_context.Set()).ToList().ShouldNotBeNull(); [Fact] public void ProjectToManifestServerConsole_Translates() => _manifest.ProjectToManifestServerConsole(_context.Set()).ToList().ShouldNotBeNull(); [Fact] public void ProjectToManifestSavePath_Translates() => _manifest.ProjectToManifestSavePath(_context.Set()).ToList().ShouldNotBeNull(); [Fact] public void ProjectToManifestCompany_Translates() => _manifest.ProjectToManifestCompany(_context.Set()).ToList().ShouldNotBeNull(); [Fact] public void ProjectToManifestPlaySession_Translates() => _manifest.ProjectToManifestPlaySession(_context.Set()).ToList().ShouldNotBeNull(); [Fact] public void ProjectToManifestPlatform_Translates() => _manifest.ProjectToManifestPlatform(_context.Set()).ToList().ShouldNotBeNull(); [Fact] public void ProjectToManifestMultiplayerMode_Translates() => _manifest.ProjectToManifestMultiplayerMode(_context.Set()).ToList().ShouldNotBeNull(); [Fact] public void ProjectToManifestMedia_Translates() => _manifest.ProjectToManifestMedia(_context.Set()).ToList().ShouldNotBeNull(); [Fact] public void ProjectToManifestKey_Translates() => _manifest.ProjectToManifestKey(_context.Set()).ToList().ShouldNotBeNull(); [Fact] public void ProjectToManifestGenre_Translates() => _manifest.ProjectToManifestGenre(_context.Set()).ToList().ShouldNotBeNull(); [Fact] public void ProjectToManifestEngine_Translates() => _manifest.ProjectToManifestEngine(_context.Set()).ToList().ShouldNotBeNull(); [Fact] public void ProjectToManifestGameCustomField_Translates() => _manifest.ProjectToManifestGameCustomField(_context.Set()).ToList().ShouldNotBeNull(); [Fact] public void ProjectToManifestCollection_Translates() => _manifest.ProjectToManifestCollection(_context.Set()).ToList().ShouldNotBeNull(); [Fact] public void ProjectToManifestAction_Translates() => _manifest.ProjectToManifestAction(_context.Set()).ToList().ShouldNotBeNull(); public void Dispose() { _context.Dispose(); _connection.Dispose(); } }