using Microsoft.EntityFrameworkCore; using SlipItIn.Server.Data; using SlipItIn.Shared.Models; namespace SlipItIn.Server.Tests; /// /// Hilfsmethoden zum Erstellen isolierter InMemory-DbContexts und Testdaten. /// public static class TestDbHelper { public static IDbContextFactory CreateFactory() { var options = new DbContextOptionsBuilder() .UseInMemoryDatabase(Guid.NewGuid().ToString()) .Options; return new TestDbContextFactory(options); } public static User SeedUser(SlipItInDbContext db, string username = "user", string email = "user@test.local", bool isActive = true) { var user = new User { Username = username, Email = email, PasswordHash = "hash", IsActive = isActive }; db.Users.Add(user); db.SaveChanges(); return user; } public static List SeedPhrases(SlipItInDbContext db, int count, bool isActive = true) { var creator = SeedUser(db, "creator-" + Guid.NewGuid().ToString("N")[..8], Guid.NewGuid().ToString("N")[..8] + "@t.local"); var phrases = Enumerable.Range(1, count) .Select(i => new Phrase { Text = $"Phrase {i}", CreatorId = creator.Id, IsActive = isActive }) .ToList(); db.Phrases.AddRange(phrases); db.SaveChanges(); return phrases; } /// Erstellt ein Spiel inkl. Host-Spieler über den echten GameService-Pfad (direkt in DB). public static (Game game, Player hostPlayer) SeedGame(SlipItInDbContext db, User host, GameStatus status = GameStatus.Lobby) { var game = new Game { LobbyCode = Guid.NewGuid().ToString("N")[..6].ToUpper(), HostId = host.Id, Status = status }; var hostPlayer = new Player { UserId = host.Id, Game = game }; game.Players.Add(hostPlayer); db.Games.Add(game); db.SaveChanges(); return (game, hostPlayer); } private class TestDbContextFactory(DbContextOptions options) : IDbContextFactory { public SlipItInDbContext CreateDbContext() => new(options); public Task CreateDbContextAsync(CancellationToken cancellationToken = default) => Task.FromResult(new SlipItInDbContext(options)); } }